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]; }
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); }
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); }