Esempio n. 1
0
PetscErrorCode VecPointwiseMult_kernel(PetscInt thread_id,Vec win,Vec xin,Vec yin)
{
    PetscErrorCode    ierr;
    PetscInt          *trstarts=win->map->trstarts;
    PetscInt          i;
    const PetscScalar *xx,*yy;
    PetscScalar       *ww;

    ierr = VecGetArrayRead(xin,&xx);
    CHKERRQ(ierr);
    ierr = VecGetArrayRead(yin,&yy);
    CHKERRQ(ierr);
    ierr = VecGetArray(win,&ww);
    CHKERRQ(ierr);
    if (ww == xx) {
        for (i=trstarts[thread_id]; i < trstarts[thread_id+1]; i++) ww[i] *= yy[i];
    } else if (ww == yy) {
        for (i=trstarts[thread_id]; i < trstarts[thread_id+1]; i++) ww[i] *= xx[i];
    } else {
#if defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
        PetscInt start,n;
        start = trstarts[thread_id];
        n     = trstarts[thread_id+1] - trstarts[thread_id];
        fortranxtimesy_(xx+start,yy+start,ww+start,&n);
    }
#else
        for (i=trstarts[thread_id]; i < trstarts[thread_id+1]; i++) ww[i] = xx[i] * yy[i];
    }
Esempio n. 2
0
PetscErrorCode VecPointwiseMult_Seq(Vec win,Vec xin,Vec yin)
{
  PetscErrorCode ierr;
  PetscInt       n = win->map->n,i;
  PetscScalar    *ww,*xx,*yy; /* cannot make xx or yy const since might be ww */

  PetscFunctionBegin;
  ierr = VecGetArrayRead(xin,(const PetscScalar**)&xx);CHKERRQ(ierr);
  ierr = VecGetArrayRead(yin,(const PetscScalar**)&yy);CHKERRQ(ierr);
  ierr = VecGetArray(win,&ww);CHKERRQ(ierr);
  if (ww == xx) {
    for (i=0; i<n; i++) ww[i] *= yy[i];
  } else if (ww == yy) {
    for (i=0; i<n; i++) ww[i] *= xx[i];
  } else {
#if defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
    fortranxtimesy_(xx,yy,ww,&n);
#else
    for (i=0; i<n; i++) ww[i] = xx[i] * yy[i];
#endif
  }
  ierr = VecRestoreArrayRead(xin,(const PetscScalar**)&xx);CHKERRQ(ierr);
  ierr = VecRestoreArrayRead(yin,(const PetscScalar**)&yy);CHKERRQ(ierr);
  ierr = VecRestoreArray(win,&ww);CHKERRQ(ierr);
  ierr = PetscLogFlops(n);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}
Esempio n. 3
0
PetscErrorCode VecPointwiseMult_Seq(Vec win,Vec xin,Vec yin)
{
  Vec_Seq        *w = (Vec_Seq *)win->data;
  PetscErrorCode ierr;
  PetscInt       n = win->map->n,i;
  PetscScalar    *ww = w->array,*xx,*yy;

  PetscFunctionBegin;
  ierr = VecGetArray(xin,&xx);CHKERRQ(ierr);
  if (xin != yin) {
    ierr = VecGetArray(yin,&yy);CHKERRQ(ierr);
  } else {
    yy = xx;
  }

  if (ww == xx) {
    for (i=0; i<n; i++) ww[i] *= yy[i];
  } else if (ww == yy) {
    for (i=0; i<n; i++) ww[i] *= xx[i];
  } else {
    /*  This was suppose to help on SGI but didn't really seem to
          PetscReal * PETSC_RESTRICT www = ww;
          PetscReal * PETSC_RESTRICT yyy = yy;
          PetscReal * PETSC_RESTRICT xxx = xx;
          for (i=0; i<n; i++) www[i] = xxx[i] * yyy[i];
    */
#if defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
    fortranxtimesy_(xx,yy,ww,&n);
#else
    for (i=0; i<n; i++) ww[i] = xx[i] * yy[i];
#endif
  }
  ierr = VecRestoreArray(xin,&xx);CHKERRQ(ierr);
  if (xin != yin) {
    ierr = VecRestoreArray(yin,&yy);CHKERRQ(ierr);
  }
  ierr = PetscLogFlops(n);CHKERRQ(ierr);
  PetscFunctionReturn(0);
}