本文整理汇总了C++中VecWAXPY函数的典型用法代码示例。如果您正苦于以下问题:C++ VecWAXPY函数的具体用法?C++ VecWAXPY怎么用?C++ VecWAXPY使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了VecWAXPY函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: PCApply_Composite_Multiplicative
static PetscErrorCode PCApply_Composite_Multiplicative(PC pc,Vec x,Vec y)
{
PetscErrorCode ierr;
PC_Composite *jac = (PC_Composite*)pc->data;
PC_CompositeLink next = jac->head;
Mat mat = pc->pmat;
PetscFunctionBegin;
if (!next) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONGSTATE,"No composite preconditioners supplied via PCCompositeAddPC() or -pc_composite_pcs");
if (next->next && !jac->work2) { /* allocate second work vector */
ierr = VecDuplicate(jac->work1,&jac->work2);CHKERRQ(ierr);
}
if (pc->useAmat) mat = pc->mat;
ierr = PCApply(next->pc,x,y);CHKERRQ(ierr); /* y <- B x */
while (next->next) {
next = next->next;
ierr = MatMult(mat,y,jac->work1);CHKERRQ(ierr); /* work1 <- A y */
ierr = VecWAXPY(jac->work2,-1.0,jac->work1,x);CHKERRQ(ierr); /* work2 <- x - work1 */
ierr = VecSet(jac->work1,0.0);CHKERRQ(ierr); /* zero since some PC's may not set all entries in the result */
ierr = PCApply(next->pc,jac->work2,jac->work1);CHKERRQ(ierr); /* work1 <- C work2 */
ierr = VecAXPY(y,1.0,jac->work1);CHKERRQ(ierr); /* y <- y + work1 = B x + C (x - A B x) = (B + C (1 - A B)) x */
}
if (jac->type == PC_COMPOSITE_SYMMETRIC_MULTIPLICATIVE) {
while (next->previous) {
next = next->previous;
ierr = MatMult(mat,y,jac->work1);CHKERRQ(ierr);
ierr = VecWAXPY(jac->work2,-1.0,jac->work1,x);CHKERRQ(ierr);
ierr = VecSet(jac->work1,0.0);CHKERRQ(ierr); /* zero since some PC's may not set all entries in the result */
ierr = PCApply(next->pc,jac->work2,jac->work1);CHKERRQ(ierr);
ierr = VecAXPY(y,1.0,jac->work1);CHKERRQ(ierr);
}
}
PetscFunctionReturn(0);
}
示例2: TSAlpha_StageVecs
static PetscErrorCode TSAlpha_StageVecs(TS ts,Vec X)
{
TS_Alpha *th = (TS_Alpha*)ts->data;
Vec X1 = X, V1 = th->V1, A1 = th->A1;
Vec Xa = th->Xa, Va = th->Va, Aa = th->Aa;
Vec X0 = th->X0, V0 = th->V0, A0 = th->A0;
PetscReal dt = ts->time_step;
PetscReal Alpha_m = th->Alpha_m;
PetscReal Alpha_f = th->Alpha_f;
PetscReal Gamma = th->Gamma;
PetscReal Beta = th->Beta;
PetscErrorCode ierr;
PetscFunctionBegin;
/* A1 = ... */
ierr = VecWAXPY(A1,-1.0,X0,X1);CHKERRQ(ierr);
ierr = VecAXPY (A1,-dt,V0);CHKERRQ(ierr);
ierr = VecAXPBY(A1,-(1-2*Beta)/(2*Beta),1/(dt*dt*Beta),A0);CHKERRQ(ierr);
/* V1 = ... */
ierr = VecWAXPY(V1,(1.0-Gamma)/Gamma,A0,A1);CHKERRQ(ierr);
ierr = VecAYPX (V1,dt*Gamma,V0);CHKERRQ(ierr);
/* Xa = X0 + Alpha_f*(X1-X0) */
ierr = VecWAXPY(Xa,-1.0,X0,X1);CHKERRQ(ierr);
ierr = VecAYPX (Xa,Alpha_f,X0);CHKERRQ(ierr);
/* Va = V0 + Alpha_f*(V1-V0) */
ierr = VecWAXPY(Va,-1.0,V0,V1);CHKERRQ(ierr);
ierr = VecAYPX (Va,Alpha_f,V0);CHKERRQ(ierr);
/* Aa = A0 + Alpha_m*(A1-A0) */
ierr = VecWAXPY(Aa,-1.0,A0,A1);CHKERRQ(ierr);
ierr = VecAYPX (Aa,Alpha_m,A0);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例3: PETSCEXCEPT
void PetscVecTools::WAXPY(Vec w, double a, Vec x, Vec y)
{
#if (PETSC_VERSION_MAJOR == 2 && PETSC_VERSION_MINOR == 2) //PETSc 2.2
PETSCEXCEPT( VecWAXPY(&a, x, y, w) );
#else
PETSCEXCEPT( VecWAXPY(w, a, x, y) );
#endif
}
示例4: ComputeShearStress
PetscErrorCode ComputeShearStress(UserContext *uc)
{
PetscErrorCode ierr;
Vec u2, v2;
PetscReal scale = VISCOSITY / DELTA_Z;
// mu * (u^2 + v^2)^0.5 / dz
PetscFunctionBegin;
PetscLogEventBegin(EVENT_ComputeShearStress,0,0,0,0);
VecDuplicate(uc->v, &uc->ss);
VecDuplicate(uc->v, &u2);
VecDuplicate(uc->v, &v2);
VecPointwiseMult( u2, uc->u, uc->u);
VecPointwiseMult( v2, uc->v, uc->v);
VecWAXPY(uc->ss, one, u2, v2);
VecSqrt(uc->ss);
VecScale(uc->ss, scale);
VecDestroy(u2);
VecDestroy(v2);
PetscLogEventEnd(EVENT_ComputeShearStress,0,0,0,0);
PetscFunctionReturn(0);
}
示例5: VecWAXPY_MultiVec
PetscErrorCode VecWAXPY_MultiVec(Vec w, PetscScalar alpha, Vec x, Vec y)
{
#if !defined(NDEBUG)
TBOX_ASSERT(w);
TBOX_ASSERT(x);
TBOX_ASSERT(y);
#endif
Vec_MultiVec* mw = static_cast<Vec_MultiVec*>(w->data);
Vec_MultiVec* mx = static_cast<Vec_MultiVec*>(x->data);
Vec_MultiVec* my = static_cast<Vec_MultiVec*>(y->data);
#if !defined(NDEBUG)
TBOX_ASSERT(mw);
TBOX_ASSERT(mx);
TBOX_ASSERT(my);
TBOX_ASSERT(mw->n == mx->n);
TBOX_ASSERT(mw->n == my->n);
#endif
PetscErrorCode ierr;
for (PetscInt k = 0; k < mw->n; ++k)
{
ierr = VecWAXPY(mw->array[k], alpha, mx->array[k], my->array[k]);
CHKERRQ(ierr);
}
ierr = PetscObjectStateIncrease(reinterpret_cast<PetscObject>(w));
CHKERRQ(ierr);
PetscFunctionReturn(0);
} // VecWAXPY_MultiVec
示例6: F
/*
F(U,V) = U - V
*/
PetscErrorCode F(PetscReal t,Vec U,Vec V,Vec F)
{
PetscErrorCode ierr;
PetscFunctionBeginUser;
ierr = VecWAXPY(F,-1.0,V,U);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例7: MatMult
PetscErrorCode NavierStokesSolver::projectionStep()
{
// q = q^* - B^N Q \lambda
PetscErrorCode ierr;
ierr = MatMult(BNQ, lambda, temp); CHKERRQ(ierr);
ierr = VecWAXPY(q, -1.0, temp, qStar); CHKERRQ(ierr);
return 0;
}
示例8: VecWAXPY
PetscErrorCode NavierStokesSolver::generateRHS1()
{
PetscErrorCode ierr;
ierr = VecWAXPY(rhs1, 1.0, rn, bc1); CHKERRQ(ierr);
ierr = VecPointwiseMult(rhs1, MHat, rhs1); CHKERRQ(ierr);
return 0;
}
示例9: TSAlphaAdaptDefault
PetscErrorCode TSAlphaAdaptDefault(TS ts,PetscReal t,Vec X,Vec Xdot, PetscReal *nextdt,PetscBool *ok,void *ctx)
{
TS_Alpha *th;
SNESConvergedReason snesreason;
PetscReal dt,normX,normE,Emax,scale;
PetscErrorCode ierr;
PetscFunctionBegin;
PetscValidHeaderSpecific(ts,TS_CLASSID,1);
#if PETSC_USE_DEBUG
{
PetscBool match;
ierr = PetscObjectTypeCompare((PetscObject)ts,TSALPHA,&match);CHKERRQ(ierr);
if (!match) SETERRQ(((PetscObject)ts)->comm,1,"Only for TSALPHA");
}
#endif
th = (TS_Alpha*)ts->data;
ierr = SNESGetConvergedReason(ts->snes,&snesreason);CHKERRQ(ierr);
if (snesreason < 0) {
*ok = PETSC_FALSE;
*nextdt *= th->scale_min;
goto finally;
}
/* first-order aproximation to the local error */
/* E = (X0 + dt*Xdot) - X */
ierr = TSGetTimeStep(ts,&dt);CHKERRQ(ierr);
if (!th->E) {ierr = VecDuplicate(th->X0,&th->E);CHKERRQ(ierr);}
ierr = VecWAXPY(th->E,dt,Xdot,th->X0);CHKERRQ(ierr);
ierr = VecAXPY(th->E,-1,X);CHKERRQ(ierr);
ierr = VecNorm(th->E,NORM_2,&normE);CHKERRQ(ierr);
/* compute maximum allowable error */
ierr = VecNorm(X,NORM_2,&normX);CHKERRQ(ierr);
if (normX == 0) {ierr = VecNorm(th->X0,NORM_2,&normX);CHKERRQ(ierr);}
Emax = th->rtol * normX + th->atol;
/* compute next time step */
if (normE > 0) {
scale = th->rho * PetscRealPart(PetscSqrtScalar((PetscScalar)(Emax/normE)));
scale = PetscMax(scale,th->scale_min);
scale = PetscMin(scale,th->scale_max);
if (!(*ok))
scale = PetscMin(1.0,scale);
*nextdt *= scale;
}
/* accept or reject step */
if (normE <= Emax)
*ok = PETSC_TRUE;
else
*ok = PETSC_FALSE;
finally:
*nextdt = PetscMax(*nextdt,th->dt_min);
*nextdt = PetscMin(*nextdt,th->dt_max);
PetscFunctionReturn(0);
}
示例10: main
int main(int argc,char **args)
{
Mat C;
Vec u,x,b,e;
PetscInt i,n = 10,midx[3];
PetscErrorCode ierr;
PetscScalar v[3];
PetscReal omega = 1.0,norm;
PetscInitialize(&argc,&args,(char*)0,help);
ierr = PetscOptionsGetReal(NULL,"-omega",&omega,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-n",&n,NULL);CHKERRQ(ierr);
ierr = MatCreate(PETSC_COMM_SELF,&C);CHKERRQ(ierr);
ierr = MatSetSizes(C,n,n,n,n);CHKERRQ(ierr);
ierr = MatSetType(C,MATSEQDENSE);CHKERRQ(ierr);
ierr = MatSetUp(C);CHKERRQ(ierr);
ierr = VecCreateSeq(PETSC_COMM_SELF,n,&b);CHKERRQ(ierr);
ierr = VecCreateSeq(PETSC_COMM_SELF,n,&x);CHKERRQ(ierr);
ierr = VecCreateSeq(PETSC_COMM_SELF,n,&u);CHKERRQ(ierr);
ierr = VecCreateSeq(PETSC_COMM_SELF,n,&e);CHKERRQ(ierr);
ierr = VecSet(u,1.0);CHKERRQ(ierr);
ierr = VecSet(x,0.0);CHKERRQ(ierr);
v[0] = -1.; v[1] = 2.; v[2] = -1.;
for (i=1; i<n-1; i++) {
midx[0] = i-1; midx[1] = i; midx[2] = i+1;
ierr = MatSetValues(C,1,&i,3,midx,v,INSERT_VALUES);CHKERRQ(ierr);
}
i = 0; midx[0] = 0; midx[1] = 1;
v[0] = 2.0; v[1] = -1.;
ierr = MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);CHKERRQ(ierr);
i = n-1; midx[0] = n-2; midx[1] = n-1;
v[0] = -1.0; v[1] = 2.;
ierr = MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);CHKERRQ(ierr);
ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatMult(C,u,b);CHKERRQ(ierr);
for (i=0; i<n; i++) {
ierr = MatSOR(C,b,omega,SOR_FORWARD_SWEEP,0.0,1,1,x);CHKERRQ(ierr);
ierr = VecWAXPY(e,-1.0,x,u);CHKERRQ(ierr);
ierr = VecNorm(e,NORM_2,&norm);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_SELF,"2-norm of error %g\n",(double)norm);CHKERRQ(ierr);
}
ierr = MatDestroy(&C);CHKERRQ(ierr);
ierr = VecDestroy(&x);CHKERRQ(ierr);
ierr = VecDestroy(&b);CHKERRQ(ierr);
ierr = VecDestroy(&u);CHKERRQ(ierr);
ierr = VecDestroy(&e);CHKERRQ(ierr);
ierr = PetscFinalize();
return 0;
}
示例11: CalculateError
PetscErrorCode CalculateError(Vec solution,Vec u,Vec r,PetscReal *e)
{
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = VecNorm(r,NORM_2,e+2);CHKERRQ(ierr);
ierr = VecWAXPY(r,-1.0,u,solution);CHKERRQ(ierr);
ierr = VecNorm(r,NORM_2,e);CHKERRQ(ierr);
ierr = VecNorm(r,NORM_1,e+1);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例12: SNESTSFormFunction_Alpha
static PetscErrorCode SNESTSFormFunction_Alpha(SNES snes,Vec x,Vec y,TS ts)
{
TS_Alpha *th = (TS_Alpha*)ts->data;
Vec X0 = th->X0, V0 = th->V0;
Vec X1 = x, V1 = th->V1, R = y;
PetscErrorCode ierr;
PetscFunctionBegin;
/* V1 = (1-1/Gamma)*V0 + 1/(Gamma*dT)*(X1-X0) */
ierr = VecWAXPY(V1,-1,X0,X1);CHKERRQ(ierr);
ierr = VecAXPBY(V1,1-1/th->Gamma,1/(th->Gamma*ts->time_step),V0);CHKERRQ(ierr);
/* Xa = X0 + Alpha_f*(X1-X0) */
ierr = VecWAXPY(th->Xa,-1,X0,X1);CHKERRQ(ierr);
ierr = VecAYPX(th->Xa,th->Alpha_f,X0);CHKERRQ(ierr);
/* Va = V0 + Alpha_m*(V1-V0) */
ierr = VecWAXPY(th->Va,-1,V0,V1);CHKERRQ(ierr);
ierr = VecAYPX(th->Va,th->Alpha_m,V0);CHKERRQ(ierr);
/* F = Function(ta,Xa,Va) */
ierr = TSComputeIFunction(ts,th->stage_time,th->Xa,th->Va,R,PETSC_FALSE);CHKERRQ(ierr);
ierr = VecScale(R,1/th->Alpha_f);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例13: CompareGhostedCoords
static PetscErrorCode CompareGhostedCoords(Vec gc1,Vec gc2)
{
PetscErrorCode ierr;
PetscReal nrm,gnrm;
Vec tmp;
PetscFunctionBegin;
ierr = VecDuplicate(gc1,&tmp);CHKERRQ(ierr);
ierr = VecWAXPY(tmp,-1.0,gc1,gc2);CHKERRQ(ierr);
ierr = VecNorm(tmp,NORM_INFINITY,&nrm);CHKERRQ(ierr);
ierr = MPI_Allreduce(&nrm,&gnrm,1,MPIU_REAL,MPIU_MAX,PETSC_COMM_WORLD);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,"norm of difference of ghosted coordinates %8.2e\n",gnrm);CHKERRQ(ierr);
ierr = VecDestroy(&tmp);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例14: CheckProblem1
PetscErrorCode CheckProblem1(Mat A, Vec b, Vec u)
{
Vec errorVec;
PetscReal norm, error;
PetscErrorCode ierr;
PetscFunctionBeginUser;
ierr = VecDuplicate(b, &errorVec);CHKERRQ(ierr);
ierr = VecWAXPY(errorVec, -1.0, b, u);CHKERRQ(ierr);
ierr = VecNorm(errorVec, NORM_2, &error);CHKERRQ(ierr);
ierr = VecNorm(b, NORM_2, &norm);CHKERRQ(ierr);
if (error/norm > 1e-12) SETERRQ1(((PetscObject) A)->comm, PETSC_ERR_ARG_WRONG, "Relative error %g is too large", error/norm);
ierr = VecDestroy(&errorVec);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例15: MatMultTransposeAdd_Shell
PetscErrorCode MatMultTransposeAdd_Shell(Mat A,Vec x,Vec y,Vec z)
{
Mat_Shell *shell = (Mat_Shell*)A->data;
PetscErrorCode ierr;
PetscFunctionBegin;
if (y == z) {
if (!shell->left_add_work) {ierr = VecDuplicate(z,&shell->left_add_work);CHKERRQ(ierr);}
ierr = MatMultTranspose(A,x,shell->left_add_work);CHKERRQ(ierr);
ierr = VecWAXPY(z,1.0,shell->left_add_work,y);CHKERRQ(ierr);
} else {
ierr = MatMultTranspose(A,x,z);CHKERRQ(ierr);
ierr = VecAXPY(z,1.0,y);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}