static PetscErrorCode MatShellPostScaleLeft(Mat A,Vec x) { Mat_Shell *shell = (Mat_Shell*)A->data; PetscErrorCode ierr; PetscFunctionBegin; if (shell->left) {ierr = VecPointwiseMult(x,x,shell->left);CHKERRQ(ierr);} PetscFunctionReturn(0); }
void N_VProd_Petsc(N_Vector x, N_Vector y, N_Vector z) { Vec *xv = NV_PVEC_PTC(x); Vec *yv = NV_PVEC_PTC(y); Vec *zv = NV_PVEC_PTC(z); VecPointwiseMult(*zv, *xv, *yv); return; }
/* SampleShellPCApply - This routine demonstrates the use of a user-provided preconditioner. Input Parameters: + pc - preconditioner object - x - input vector Output Parameter: . y - preconditioned vector Notes: This code implements the Jacobi preconditioner, merely as an example of working with a PCSHELL. Note that the Jacobi method is already provided within PETSc. */ PetscErrorCode SampleShellPCApply(PC pc,Vec x,Vec y) { SampleShellPC *shell; PetscErrorCode ierr; ierr = PCShellGetContext(pc,(void**)&shell);CHKERRQ(ierr); ierr = VecPointwiseMult(y,x,shell->diag);CHKERRQ(ierr); return 0; }
static PetscErrorCode Tao_ASLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn, Vec G, void *ptr) { Tao tao = (Tao)ptr; TAO_SSLS *asls = (TAO_SSLS *)tao->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr); ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,asls->ff);CHKERRQ(ierr); ierr = VecNorm(asls->ff,NORM_2,&asls->merit);CHKERRQ(ierr); *fcn = 0.5*asls->merit*asls->merit; ierr = TaoComputeJacobian(tao,tao->solution,tao->jacobian,tao->jacobian_pre);CHKERRQ(ierr); ierr = MatDFischer(tao->jacobian, tao->solution, tao->constraints,tao->XL, tao->XU, asls->t1, asls->t2,asls->da, asls->db);CHKERRQ(ierr); ierr = VecPointwiseMult(asls->t1, asls->ff, asls->db);CHKERRQ(ierr); ierr = MatMultTranspose(tao->jacobian,asls->t1,G);CHKERRQ(ierr); ierr = VecPointwiseMult(asls->t1, asls->ff, asls->da);CHKERRQ(ierr); ierr = VecAXPY(G,1.0,asls->t1);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PostScaleRight(Mat N,Vec x) { Mat_SubMatrix *Na = (Mat_SubMatrix*)N->data; PetscErrorCode ierr; PetscFunctionBegin; if (Na->right) { ierr = VecPointwiseMult(x,x,Na->right);CHKERRQ(ierr); } PetscFunctionReturn(0); }
static PetscErrorCode PCApply_LSC(PC pc,Vec x,Vec y) { PC_LSC *lsc = (PC_LSC*)pc->data; Mat A,B,C; PetscErrorCode ierr; PetscFunctionBegin; ierr = MatSchurComplementGetSubMatrices(pc->mat,&A,NULL,&B,&C,NULL);CHKERRQ(ierr); ierr = KSPSolve(lsc->kspL,x,lsc->x1);CHKERRQ(ierr); ierr = MatMult(B,lsc->x1,lsc->x0);CHKERRQ(ierr); if (lsc->scale) { ierr = VecPointwiseMult(lsc->x0,lsc->x0,lsc->scale);CHKERRQ(ierr); } ierr = MatMult(A,lsc->x0,lsc->y0);CHKERRQ(ierr); if (lsc->scale) { ierr = VecPointwiseMult(lsc->y0,lsc->y0,lsc->scale);CHKERRQ(ierr); } ierr = MatMult(C,lsc->y0,lsc->x1);CHKERRQ(ierr); ierr = KSPSolve(lsc->kspL,lsc->x1,y);CHKERRQ(ierr); PetscFunctionReturn(0); }
void Delta::ZeroMean(Vec &delta) { // Compute mean double sum, npts, norm; VecPointwiseMult(delta, W, delta); VecSum(delta, &sum); VecSum(W, &npts); norm = sum/npts; // Subtract mean VecAXPY(delta, -norm, W); }
static PetscErrorCode PCApplySymmetricLeftOrRight_Jacobi(PC pc,Vec x,Vec y) { PetscErrorCode ierr; PC_Jacobi *jac = (PC_Jacobi*)pc->data; PetscFunctionBegin; if (!jac->diagsqrt) { ierr = PCSetUp_Jacobi_Symmetric(pc);CHKERRQ(ierr); } VecPointwiseMult(y,x,jac->diagsqrt); PetscFunctionReturn(0); }
static PetscErrorCode PCBDDCScalingRestriction_Basic(PC pc, Vec global_vector, Vec local_interface_vector) { PetscErrorCode ierr; PC_IS *pcis = (PC_IS*)pc->data; PetscFunctionBegin; ierr = VecScatterBegin(pcis->global_to_B,global_vector,local_interface_vector,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(pcis->global_to_B,global_vector,local_interface_vector,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); /* Apply partition of unity */ ierr = VecPointwiseMult(local_interface_vector,pcis->D,local_interface_vector);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PEPComputeVectors_Schur(PEP pep) { PetscErrorCode ierr; PetscInt n,i; Mat Z; Vec v; #if !defined(PETSC_USE_COMPLEX) Vec v1; PetscScalar tmp; PetscReal norm,normi; #endif PetscFunctionBegin; ierr = DSGetDimensions(pep->ds,&n,NULL,NULL,NULL,NULL);CHKERRQ(ierr); ierr = DSVectors(pep->ds,DS_MAT_X,NULL,NULL);CHKERRQ(ierr); ierr = DSGetMat(pep->ds,DS_MAT_X,&Z);CHKERRQ(ierr); ierr = BVSetActiveColumns(pep->V,0,n);CHKERRQ(ierr); ierr = BVMultInPlace(pep->V,Z,0,n);CHKERRQ(ierr); ierr = MatDestroy(&Z);CHKERRQ(ierr); /* Fix eigenvectors if balancing was used */ if ((pep->scale==PEP_SCALE_DIAGONAL || pep->scale==PEP_SCALE_BOTH) && pep->Dr && (pep->refine!=PEP_REFINE_MULTIPLE)) { for (i=0;i<n;i++) { ierr = BVGetColumn(pep->V,i,&v);CHKERRQ(ierr); ierr = VecPointwiseMult(v,v,pep->Dr);CHKERRQ(ierr); ierr = BVRestoreColumn(pep->V,i,&v);CHKERRQ(ierr); } } /* normalization */ for (i=0;i<n;i++) { #if !defined(PETSC_USE_COMPLEX) if (pep->eigi[i] != 0.0) { ierr = BVGetColumn(pep->V,i,&v);CHKERRQ(ierr); ierr = BVGetColumn(pep->V,i+1,&v1);CHKERRQ(ierr); ierr = VecNorm(v,NORM_2,&norm);CHKERRQ(ierr); ierr = VecNorm(v1,NORM_2,&normi);CHKERRQ(ierr); tmp = 1.0 / SlepcAbsEigenvalue(norm,normi); ierr = VecScale(v,tmp);CHKERRQ(ierr); ierr = VecScale(v1,tmp);CHKERRQ(ierr); ierr = BVRestoreColumn(pep->V,i,&v);CHKERRQ(ierr); ierr = BVRestoreColumn(pep->V,i+1,&v1);CHKERRQ(ierr); i++; } else #endif { ierr = BVGetColumn(pep->V,i,&v);CHKERRQ(ierr); ierr = VecNormalize(v,NULL);CHKERRQ(ierr); ierr = BVRestoreColumn(pep->V,i,&v);CHKERRQ(ierr); } } PetscFunctionReturn(0); }
static PetscErrorCode PCApply_Jacobi(PC pc,Vec x,Vec y) { PC_Jacobi *jac = (PC_Jacobi*)pc->data; PetscErrorCode ierr; PetscFunctionBegin; if (!jac->diag) { ierr = PCSetUp_Jacobi_NonSymmetric(pc);CHKERRQ(ierr); } ierr = VecPointwiseMult(y,x,jac->diag);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode RHSFunction(TS ts,PetscReal t,Vec globalin,Vec globalout,void *ctx) { PetscErrorCode ierr; AppCtx *appctx = (AppCtx*)ctx; PetscFunctionBegin; ierr = MatMult(appctx->SEMop.grad,globalin,globalout);CHKERRQ(ierr); /* grad u */ ierr = VecPointwiseMult(globalout,globalin,globalout);CHKERRQ(ierr); /* u grad u */ ierr = VecScale(globalout, -1.0);CHKERRQ(ierr); ierr = MatMultAdd(appctx->SEMop.keptstiff,globalin,globalout,globalout);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PressurePoissonUpdate( ) { PetscErrorCode ierr; PetscFunctionBegin; PetscLogEventBegin(EVENT_PressurePoissonUpdate,0,0,0,0); // PetscLogEventRegister(&EVENT_PressurePoissonUpdate,"PressurePoissonUpdate", 0); VecSet(rhsC->v, 0.); // TODO: this is important when reusing vecs, need to reset back to zero after time step ierr = IIMComputeCorrection2D(iim,JumpConditionPressure,ls,rhsC); CHKERRQ(ierr); IIMDiscreteCompatabilityCondition(ls, rhsC); ierr = KSPSolve(ksp, rhsC->v, p->v); CHKERRQ(ierr); IrregularNodeListWrite(ls,t); ierr = IIMPressureGradient(ls,p,px,py); CHKERRQ(ierr); ierr = IIMComputeCorrection2D(iim,JumpConditionXVelocity,ls,px); CHKERRQ(ierr); px->v2[d1/2][d2/2] = 0.; ierr = KSPSolve(ksp, px->v, u->v); CHKERRQ(ierr); ierr = IIMComputeCorrection2D(iim,JumpConditionYVelocity,ls,py); CHKERRQ(ierr); py->v2[d1/2][d2/2] = 0.; ierr = KSPSolve(ksp, py->v, v->v); CHKERRQ(ierr); VecPointwiseMult(u2, u->v, u->v); VecPointwiseMult(v2, u->v, u->v); VecWAXPY(magVel, 1, u2, v2); VecSqrt( magVel ); VecNorm(magVel, NORM_INFINITY, &maxVel); dt = PetscMin(1/(2*maxVel),.1); LevelSetAdvect2D(dt, u, v, ls, lstemp); printf("\tmaxVel: %f",maxVel); printf("\tdt: %f\n",dt); PetscLogEventEnd(EVENT_PressurePoissonUpdate,0,0,0,0); PetscFunctionReturn(0); }
PetscErrorCode BSSCR_PCScGtKGBBtContainsConstantNullSpace( PC pc, PetscTruth *has_cnst_nullsp ) { PC_SC_GtKG ctx = (PC_SC_GtKG)pc->data; PetscInt N; PetscScalar sum; PetscReal nrm; Vec l,r; Mat BBt,A; Stg_KSPGetOperators( ctx->ksp_BBt, &BBt, PETSC_NULL, PETSC_NULL ); A = BBt; MatGetVecs( A, &r, &l ); // l = A r VecGetSize(r,&N); sum = 1.0/N; VecSet(r,sum); /* scale */ VecPointwiseMult( r, r, ctx->Y2 ); /* {l} = [A] {r} */ MatMult( A,r, l ); /* scale */ VecPointwiseMult( l, l, ctx->X2 ); VecNorm(l,NORM_2,&nrm); if (nrm < 1.e-7) { *has_cnst_nullsp = PETSC_TRUE; } else { *has_cnst_nullsp = PETSC_FALSE; } Stg_VecDestroy(&l); Stg_VecDestroy(&r); PetscFunctionReturn(0); }
static PetscErrorCode IPMComputeKKT(Tao tao) { TAO_IPM *ipmP = (TAO_IPM *)tao->data; PetscScalar norm; PetscErrorCode ierr; PetscFunctionBegin; ierr = VecCopy(tao->gradient,ipmP->rd);CHKERRQ(ierr); if (ipmP->me > 0) { /* rd = gradient + Ae'*lamdae */ ierr = MatMultTranspose(tao->jacobian_equality,ipmP->lamdae,ipmP->work);CHKERRQ(ierr); ierr = VecAXPY(ipmP->rd, 1.0, ipmP->work);CHKERRQ(ierr); /* rpe = ce(x) */ ierr = VecCopy(tao->constraints_equality,ipmP->rpe);CHKERRQ(ierr); } if (ipmP->nb > 0) { /* rd = rd - Ai'*lamdai */ ierr = MatMultTranspose(ipmP->Ai,ipmP->lamdai,ipmP->work);CHKERRQ(ierr); ierr = VecAXPY(ipmP->rd, -1.0, ipmP->work);CHKERRQ(ierr); /* rpi = cin - s */ ierr = VecCopy(ipmP->ci,ipmP->rpi);CHKERRQ(ierr); ierr = VecAXPY(ipmP->rpi, -1.0, ipmP->s);CHKERRQ(ierr); /* com = s .* lami */ ierr = VecPointwiseMult(ipmP->complementarity, ipmP->s,ipmP->lamdai);CHKERRQ(ierr); } /* phi = ||rd; rpe; rpi; com|| */ ierr = VecDot(ipmP->rd,ipmP->rd,&norm);CHKERRQ(ierr); ipmP->phi = norm; if (ipmP->me > 0 ) { ierr = VecDot(ipmP->rpe,ipmP->rpe,&norm);CHKERRQ(ierr); ipmP->phi += norm; } if (ipmP->nb > 0) { ierr = VecDot(ipmP->rpi,ipmP->rpi,&norm);CHKERRQ(ierr); ipmP->phi += norm; ierr = VecDot(ipmP->complementarity,ipmP->complementarity,&norm);CHKERRQ(ierr); ipmP->phi += norm; /* mu = s'*lami/nb */ ierr = VecDot(ipmP->s,ipmP->lamdai,&ipmP->mu);CHKERRQ(ierr); ipmP->mu /= ipmP->nb; } else { ipmP->mu = 1.0; } ipmP->phi = PetscSqrtScalar(ipmP->phi); PetscFunctionReturn(0); }
static PetscErrorCode PCBDDCScalingExtension_Basic(PC pc, Vec local_interface_vector, Vec global_vector) { PC_IS* pcis = (PC_IS*)pc->data; PC_BDDC* pcbddc = (PC_BDDC*)pc->data; PetscErrorCode ierr; PetscFunctionBegin; /* Apply partition of unity */ ierr = VecPointwiseMult(pcbddc->work_scaling,pcis->D,local_interface_vector);CHKERRQ(ierr); ierr = VecSet(global_vector,0.0);CHKERRQ(ierr); ierr = VecScatterBegin(pcis->global_to_B,pcbddc->work_scaling,global_vector,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); ierr = VecScatterEnd(pcis->global_to_B,pcbddc->work_scaling,global_vector,ADD_VALUES,SCATTER_REVERSE);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatMultHermitian_Normal(Mat N,Vec x,Vec y) { Mat_Normal *Na = (Mat_Normal*)N->data; PetscErrorCode ierr; Vec in; PetscFunctionBegin; in = x; if (Na->right) { if (!Na->rightwork) { ierr = VecDuplicate(Na->right,&Na->rightwork);CHKERRQ(ierr); } ierr = VecPointwiseMult(Na->rightwork,Na->right,in);CHKERRQ(ierr); in = Na->rightwork; } ierr = MatMult(Na->A,in,Na->w);CHKERRQ(ierr); ierr = MatMultHermitianTranspose(Na->A,Na->w,y);CHKERRQ(ierr); if (Na->left) { ierr = VecPointwiseMult(y,Na->left,y);CHKERRQ(ierr); } ierr = VecScale(y,Na->scale);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode MatDiagonalScale_SubMatrix(Mat N,Vec left,Vec right) { Mat_SubMatrix *Na = (Mat_SubMatrix*)N->data; PetscErrorCode ierr; PetscFunctionBegin; if (left) { if (!Na->left) { ierr = VecDuplicate(left,&Na->left);CHKERRQ(ierr); ierr = VecCopy(left,Na->left);CHKERRQ(ierr); } else { ierr = VecPointwiseMult(Na->left,left,Na->left);CHKERRQ(ierr); } } if (right) { if (!Na->right) { ierr = VecDuplicate(right,&Na->right);CHKERRQ(ierr); ierr = VecCopy(right,Na->right);CHKERRQ(ierr); } else { ierr = VecPointwiseMult(Na->right,right,Na->right);CHKERRQ(ierr); } } PetscFunctionReturn(0); }
static PetscErrorCode DMRestrictHook_TSEIMEX(DM fine,Mat restrct,Vec rscale,Mat inject,DM coarse,void *ctx) { TS ts = (TS)ctx; PetscErrorCode ierr; Vec Z,Z_c; PetscFunctionBegin; ierr = TSEIMEXGetVecs(ts,fine,&Z,NULL,NULL,NULL);CHKERRQ(ierr); ierr = TSEIMEXGetVecs(ts,coarse,&Z_c,NULL,NULL,NULL);CHKERRQ(ierr); ierr = MatRestrict(restrct,Z,Z_c);CHKERRQ(ierr); ierr = VecPointwiseMult(Z_c,rscale,Z_c);CHKERRQ(ierr); ierr = TSEIMEXRestoreVecs(ts,fine,&Z,NULL,NULL,NULL);CHKERRQ(ierr); ierr = TSEIMEXRestoreVecs(ts,coarse,&Z_c,NULL,NULL,NULL);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDiagonalScale_Composite(Mat inA,Vec left,Vec right) { Mat_Composite *a = (Mat_Composite*)inA->data; PetscErrorCode ierr; PetscFunctionBegin; if (left) { if (!a->left) { ierr = VecDuplicate(left,&a->left);CHKERRQ(ierr); ierr = VecCopy(left,a->left);CHKERRQ(ierr); } else { ierr = VecPointwiseMult(a->left,left,a->left);CHKERRQ(ierr); } } if (right) { if (!a->right) { ierr = VecDuplicate(right,&a->right);CHKERRQ(ierr); ierr = VecCopy(right,a->right);CHKERRQ(ierr); } else { ierr = VecPointwiseMult(a->right,right,a->right);CHKERRQ(ierr); } } PetscFunctionReturn(0); }
static PetscErrorCode VecPointwiseMult_Nest(Vec w,Vec x,Vec y) { Vec_Nest *bx = (Vec_Nest*)x->data; Vec_Nest *by = (Vec_Nest*)y->data; Vec_Nest *bw = (Vec_Nest*)w->data; PetscInt i,nr; PetscErrorCode ierr; PetscFunctionBegin; VecNestCheckCompatible3(w,1,x,3,y,4); nr = bx->nb; for (i=0; i<nr; i++) { ierr = VecPointwiseMult(bw->v[i],bx->v[i],by->v[i]);CHKERRQ(ierr); } PetscFunctionReturn(0); }
static PetscErrorCode PCApplyTranspose_SVD(PC pc,Vec x,Vec y) { PC_SVD *jac = (PC_SVD*)pc->data; Vec work = jac->work,xred,yred; PetscErrorCode ierr; PetscFunctionBegin; ierr = PCSVDGetVec(pc,PC_LEFT,READ,x,&xred);CHKERRQ(ierr); ierr = PCSVDGetVec(pc,PC_RIGHT,WRITE,y,&yred);CHKERRQ(ierr); ierr = MatMultTranspose(jac->Vt,work,yred);CHKERRQ(ierr); ierr = VecPointwiseMult(work,work,jac->diag);CHKERRQ(ierr); ierr = MatMultTranspose(jac->U,xred,work);CHKERRQ(ierr); ierr = PCSVDRestoreVec(pc,PC_LEFT,READ,x,&xred);CHKERRQ(ierr); ierr = PCSVDRestoreVec(pc,PC_RIGHT,WRITE,y,&yred);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode MatShellPreScaleLeft(Mat A,Vec x,Vec *xx) { Mat_Shell *shell = (Mat_Shell*)A->data; PetscErrorCode ierr; PetscFunctionBegin; *xx = PETSC_NULL; if (!shell->left) { *xx = x; } else { if (!shell->left_work) {ierr = VecDuplicate(shell->left,&shell->left_work);CHKERRQ(ierr);} ierr = VecPointwiseMult(shell->left_work,x,shell->left);CHKERRQ(ierr); *xx = shell->left_work; } PetscFunctionReturn(0); }
static PetscErrorCode PreScaleRight(Mat N,Vec x,Vec *xx) { Mat_SubMatrix *Na = (Mat_SubMatrix*)N->data; PetscErrorCode ierr; PetscFunctionBegin; if (!Na->right) { *xx = x; } else { if (!Na->orwork) { ierr = VecDuplicate(Na->right,&Na->orwork);CHKERRQ(ierr); } ierr = VecPointwiseMult(Na->orwork,x,Na->right);CHKERRQ(ierr); *xx = Na->orwork; } PetscFunctionReturn(0); }
/*@ SNESFASRestrict - restrict a Vec to the next coarser level Collective Input Arguments: + fine - SNES from which to restrict - Xfine - vector to restrict Output Arguments: . Xcoarse - result of restriction Level: developer .seealso: SNESFASSetRestriction(), SNESFASSetInjection() @*/ PetscErrorCode SNESFASRestrict(SNES fine,Vec Xfine,Vec Xcoarse) { PetscErrorCode ierr; SNES_FAS *fas = (SNES_FAS*)fine->data; PetscFunctionBegin; PetscValidHeaderSpecific(fine,SNES_CLASSID,1); PetscValidHeaderSpecific(Xfine,VEC_CLASSID,2); PetscValidHeaderSpecific(Xcoarse,VEC_CLASSID,3); if (fas->inject) { ierr = MatRestrict(fas->inject,Xfine,Xcoarse);CHKERRQ(ierr); } else { ierr = MatRestrict(fas->restrct,Xfine,Xcoarse);CHKERRQ(ierr); ierr = VecPointwiseMult(Xcoarse,fas->rscale,Xcoarse);CHKERRQ(ierr); } PetscFunctionReturn(0); }
static PetscErrorCode PCApply_Eisenstat(PC pc,Vec x,Vec y) { PC_Eisenstat *eis = (PC_Eisenstat*)pc->data; PetscErrorCode ierr; PetscBool hasop; PetscFunctionBegin; if (eis->usediag) { ierr = MatHasOperation(pc->pmat,MATOP_MULT_DIAGONAL_BLOCK,&hasop);CHKERRQ(ierr); if (hasop) { ierr = MatMultDiagonalBlock(pc->pmat,x,y);CHKERRQ(ierr); } else { ierr = VecPointwiseMult(y,x,eis->diag);CHKERRQ(ierr); } } else {ierr = VecCopy(x,y);CHKERRQ(ierr);} PetscFunctionReturn(0); }
PetscErrorCode MatMult_GlobalToLocalNormal(Mat CtC, Vec x, Vec y) { DM dm; Vec local, mask; projectConstraintsCtx *ctx; PetscErrorCode ierr; PetscFunctionBegin; ierr = MatShellGetContext(CtC,&ctx);CHKERRQ(ierr); dm = ctx->dm; mask = ctx->mask; ierr = DMGetLocalVector(dm,&local);CHKERRQ(ierr); ierr = DMGlobalToLocalBegin(dm,x,INSERT_VALUES,local);CHKERRQ(ierr); ierr = DMGlobalToLocalEnd(dm,x,INSERT_VALUES,local);CHKERRQ(ierr); if (mask) {ierr = VecPointwiseMult(local,mask,local);CHKERRQ(ierr);} ierr = VecSet(y,0.);CHKERRQ(ierr); ierr = DMLocalToGlobalBegin(dm,local,ADD_VALUES,y);CHKERRQ(ierr); ierr = DMLocalToGlobalEnd(dm,local,ADD_VALUES,y);CHKERRQ(ierr); ierr = DMRestoreLocalVector(dm,&local);CHKERRQ(ierr); PetscFunctionReturn(0); }
inline PetscErrorCode ScatSMatMultFFT(Mat mat,Vec xx,Vec yy) { PetscInt N; Vec FFTVec; PetscErrorCode ierr; PetscFunctionBegin; ierr = VecGetSize(xx,&N);CHKERRQ(ierr); //Convert to use 3D convolution theorem: ierr = VecSet(RealSpaceCube,0);CHKERRQ(ierr); ierr = VecCopyN1(xx,RealSpaceCube,N);CHKERRQ(ierr); // Apply FFTW_FORWARD for xx: fftwf_execute(fplan); ierr = PetscMemoryGetCurrentUsage(&mem);CHKERRQ(ierr);PetscPrintf(PETSC_COMM_WORLD,"Apply FFT:\t\tMem used: %G \t",mem);GetTime(0); ierr = VecDuplicate(RealSpaceCube,&FFTVec);CHKERRQ(ierr); ierr = VecCopy(RealSpaceCube,FFTVec);CHKERRQ(ierr); //Prepare the matrix mat to multiply with xx, mat*xx=yy: ierr = FFTPaddedGreenCube(dim);CHKERRQ(ierr); ierr = PetscMemoryGetCurrentUsage(&mem);CHKERRQ(ierr);PetscPrintf(PETSC_COMM_WORLD,"Pad Green cube:\t\tMem used: %G \t",mem);GetTime(0); //Matrix-vector multiplication in Fourier space: ierr = VecPointwiseMult(RealSpaceCube,RealSpaceCube,FFTVec);CHKERRQ(ierr); ierr = PetscMemoryGetCurrentUsage(&mem);CHKERRQ(ierr);PetscPrintf(PETSC_COMM_WORLD,"Multiply vectors:\tMem used: %G \t",mem);GetTime(0); ierr = VecDestroy(&FFTVec);CHKERRQ(ierr); // Apply FFTW_BACKWARD: fftwf_execute(bplan); ierr = PetscMemoryGetCurrentUsage(&mem);CHKERRQ(ierr);PetscPrintf(PETSC_COMM_WORLD,"Apply iFFT:\t\tMem used: %G \t",mem);GetTime(0); ierr = VecCopyN1(RealSpaceCube,yy,N);CHKERRQ(ierr); ierr = PetscMemoryGetCurrentUsage(&mem);CHKERRQ(ierr);PetscPrintf(PETSC_COMM_WORLD,"Assembly result:\tMem used: %G \t",mem);GetTime(0); PetscFunctionReturn(0); }
PetscErrorCode FormJacobian(SNES snes,Vec X,Mat *J,Mat *B,MatStructure *flag,void *ptr) { AppCtx *user = (AppCtx *) ptr; PetscErrorCode ierr; KSP ksp; PC pc; PetscBool ismg; *flag = SAME_NONZERO_PATTERN; ierr = FormJacobian_Grid(user,&user->fine,X,J,B);CHKERRQ(ierr); /* create coarse grid jacobian for preconditioner */ ierr = SNESGetKSP(snes,&ksp);CHKERRQ(ierr); ierr = KSPGetPC(ksp,&pc);CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)pc,PCMG,&ismg);CHKERRQ(ierr); if (ismg) { ierr = KSPSetOperators(user->ksp_fine,user->fine.J,user->fine.J,SAME_NONZERO_PATTERN);CHKERRQ(ierr); /* restrict X to coarse grid */ ierr = MatMult(user->R,X,user->coarse.x);CHKERRQ(ierr); ierr = VecPointwiseMult(user->coarse.x,user->coarse.x,user->Rscale);CHKERRQ(ierr); /* form Jacobian on coarse grid */ if (user->redundant_build) { /* get copy of coarse X onto each processor */ ierr = VecScatterBegin(user->tolocalall,user->coarse.x,user->localall,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = VecScatterEnd(user->tolocalall,user->coarse.x,user->localall,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr); ierr = FormJacobian_Coarse(user,&user->coarse,user->localall,&user->coarse.J,&user->coarse.J);CHKERRQ(ierr); } else { /* coarse grid Jacobian computed in parallel */ ierr = FormJacobian_Grid(user,&user->coarse,user->coarse.x,&user->coarse.J,&user->coarse.J);CHKERRQ(ierr); } ierr = KSPSetOperators(user->ksp_coarse,user->coarse.J,user->coarse.J,SAME_NONZERO_PATTERN);CHKERRQ(ierr); } return 0; }
// input weight, epspml, Qabs, omega;| output: epspmlQ, epscoef; PetscErrorCode EpsCombine(Mat D, Vec weight, Vec epspml, Vec epspmlQ, Vec epscoef, double Qabs, double omega, Vec epsilon) { PetscErrorCode ierr; // compute epspmlQ = epspml*(1+i/Qabs); ierr =MatMult(D,epspml,epspmlQ); CHKERRQ(ierr); ierr =VecScale(epspmlQ, 1.0/Qabs); CHKERRQ(ierr); ierr =VecAXPY(epspmlQ, 1.0, epspml); CHKERRQ(ierr); // compute epscoef = omega^2*epsilon*epspmlQ; VecCopy(epspmlQ,epscoef); ierr = VecPointwiseMult(epscoef,epscoef,epsilon); CHKERRQ(ierr); double omegasqr=omega*omega; ierr = VecScale(epscoef,omegasqr); PetscFunctionReturn(0); }