int main(int argc,char **argv) { SNES snes; /* nonlinear solver context */ Vec r; /* solution, residual vectors */ PetscErrorCode ierr; AppCtx user; /* user-defined work context */ PetscViewer viewer; PetscInitialize(&argc,&argv,(char*)0,help); ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,"videfinition",FILE_MODE_READ,&viewer);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_SELF,&user.M);CHKERRQ(ierr); ierr = MatLoad(user.M,viewer);CHKERRQ(ierr); ierr = MatDuplicate(user.M,MAT_COPY_VALUES,&user.Jac);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_SELF,&user.q);CHKERRQ(ierr); ierr = VecLoad(user.q,viewer);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_SELF,&user.lb);CHKERRQ(ierr); ierr = VecLoad(user.lb,viewer);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_SELF,&user.ub);CHKERRQ(ierr);ierr = VecLoad(user.ub,viewer);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_SELF,&user.zz);CHKERRQ(ierr);ierr = VecLoad(user.zz,viewer);CHKERRQ(ierr); ierr = VecView(user.zz,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); /* ierr = VecSet(user.zz,0.01);CHKERRQ(ierr);*/ ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); ierr = VecDuplicate(user.q,&r);CHKERRQ(ierr); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create nonlinear solver context - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ ierr = SNESCreate(PETSC_COMM_WORLD,&snes);CHKERRQ(ierr); ierr = SNESSetFunction(snes,r,FormFunction1,&user);CHKERRQ(ierr); ierr = SNESSetJacobian(snes,user.Jac,user.Jac,FormJacobian1,&user);CHKERRQ(ierr); ierr = SNESVISetVariableBounds(snes,user.lb,user.ub);CHKERRQ(ierr); ierr = SNESSetFromOptions(snes);CHKERRQ(ierr); ierr = SNESSolve(snes,NULL,user.zz);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)user.zz,"x*");CHKERRQ(ierr); ierr = VecView(user.zz,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject)r,"f(x*)");CHKERRQ(ierr); ierr = FormFunction1(snes,user.zz,r,&user);CHKERRQ(ierr); ierr = VecView(r,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
static PetscErrorCode SNESSetUp_Composite(SNES snes) { PetscErrorCode ierr; DM dm; SNES_Composite *jac = (SNES_Composite*)snes->data; SNES_CompositeLink next = jac->head; PetscInt n=0,i; Vec F; PetscFunctionBegin; ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr); if (snes->ops->computevariablebounds) { /* SNESVI only ever calls computevariablebounds once, so calling it once here is justified */ if (!snes->xl) {ierr = VecDuplicate(snes->vec_sol,&snes->xl);CHKERRQ(ierr);} if (!snes->xu) {ierr = VecDuplicate(snes->vec_sol,&snes->xu);CHKERRQ(ierr);} ierr = (*snes->ops->computevariablebounds)(snes,snes->xl,snes->xu);CHKERRQ(ierr); } while (next) { n++; ierr = SNESSetDM(next->snes,dm);CHKERRQ(ierr); ierr = SNESSetApplicationContext(next->snes, snes->user);CHKERRQ(ierr); if (snes->xl && snes->xu) { if (snes->ops->computevariablebounds) { ierr = SNESVISetComputeVariableBounds(next->snes, snes->ops->computevariablebounds);CHKERRQ(ierr); } else { ierr = SNESVISetVariableBounds(next->snes,snes->xl,snes->xu);CHKERRQ(ierr); } } next = next->next; } jac->nsnes = n; ierr = SNESGetFunction(snes,&F,NULL,NULL);CHKERRQ(ierr); if (jac->type == SNES_COMPOSITE_ADDITIVEOPTIMAL) { ierr = VecDuplicateVecs(F,jac->nsnes,&jac->Xes);CHKERRQ(ierr); ierr = PetscMalloc1(n,&jac->Fes);CHKERRQ(ierr); ierr = PetscMalloc1(n,&jac->fnorms);CHKERRQ(ierr); next = jac->head; i = 0; while (next) { ierr = SNESGetFunction(next->snes,&F,NULL,NULL);CHKERRQ(ierr); jac->Fes[i] = F; ierr = PetscObjectReference((PetscObject)F);CHKERRQ(ierr); next = next->next; i++; } /* allocate the subspace direct solve area */ jac->nrhs = 1; jac->lda = jac->nsnes; jac->ldb = jac->nsnes; jac->n = jac->nsnes; ierr = PetscMalloc1(jac->n*jac->n,&jac->h);CHKERRQ(ierr); ierr = PetscMalloc1(jac->n,&jac->beta);CHKERRQ(ierr); ierr = PetscMalloc1(jac->n,&jac->s);CHKERRQ(ierr); ierr = PetscMalloc1(jac->n,&jac->g);CHKERRQ(ierr); jac->lwork = 12*jac->n; #if PETSC_USE_COMPLEX ierr = PetscMalloc1(jac->lwork,&jac->rwork);CHKERRQ(ierr); #endif ierr = PetscMalloc1(jac->lwork,&jac->work);CHKERRQ(ierr); } PetscFunctionReturn(0); }
int main(int argc, char **argv) { PetscErrorCode info; /* used to check for functions returning nonzeros */ Vec x; /* variables vector */ Vec xl,xu; /* lower and upper bound on variables */ PetscBool flg; /* A return variable when checking for user options */ SNESConvergedReason reason; AppCtx user; /* user-defined work context */ SNES snes; Vec r; PetscReal zero=0.0,thnd=1000; /* Initialize PETSC */ PetscInitialize(&argc, &argv,(char*)0,help); #if defined(PETSC_USE_COMPLEX) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"This example does not work for scalar type complex\n"); #endif /* Set the default values for the problem parameters */ user.nx = 50; user.ny = 50; user.ecc = 0.1; user.b = 10.0; /* Check for any command line arguments that override defaults */ info = PetscOptionsGetReal(NULL,"-ecc",&user.ecc,&flg);CHKERRQ(info); info = PetscOptionsGetReal(NULL,"-b",&user.b,&flg);CHKERRQ(info); /* A two dimensional distributed array will help define this problem, which derives from an elliptic PDE on two dimensional domain. From the distributed array, Create the vectors. */ info = DMDACreate2d(PETSC_COMM_WORLD, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE,DMDA_STENCIL_STAR,-50,-50,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&user.da);CHKERRQ(info); info = DMDAGetInfo(user.da,PETSC_IGNORE,&user.nx,&user.ny,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE);CHKERRQ(info); PetscPrintf(PETSC_COMM_WORLD,"\n---- Journal Bearing Problem -----\n"); PetscPrintf(PETSC_COMM_WORLD,"mx: %d, my: %d, ecc: %4.3f, b:%3.1f \n", user.nx,user.ny,user.ecc,user.b); /* Extract global and local vectors from DA; the vector user.B is used solely as work space for the evaluation of the function, gradient, and Hessian. Duplicate for remaining vectors that are the same types. */ info = DMCreateGlobalVector(user.da,&x);CHKERRQ(info); /* Solution */ info = VecDuplicate(x,&user.B);CHKERRQ(info); /* Linear objective */ info = VecDuplicate(x,&r);CHKERRQ(info); /* Create matrix user.A to store quadratic, Create a local ordering scheme. */ info = DMCreateMatrix(user.da,MATAIJ,&user.A);CHKERRQ(info); /* User defined function -- compute linear term of quadratic */ info = ComputeB(&user);CHKERRQ(info); /* Create nonlinear solver context */ info = SNESCreate(PETSC_COMM_WORLD,&snes);CHKERRQ(info); /* Set function evaluation and Jacobian evaluation routines */ info = SNESSetFunction(snes,r,FormGradient,&user);CHKERRQ(info); info = SNESSetJacobian(snes,user.A,user.A,FormHessian,&user);CHKERRQ(info); /* Set the initial solution guess */ info = VecSet(x, zero);CHKERRQ(info); info = SNESSetFromOptions(snes);CHKERRQ(info); /* Set variable bounds */ info = VecDuplicate(x,&xl);CHKERRQ(info); info = VecDuplicate(x,&xu);CHKERRQ(info); info = VecSet(xl,zero);CHKERRQ(info); info = VecSet(xu,thnd);CHKERRQ(info); info = SNESVISetVariableBounds(snes,xl,xu);CHKERRQ(info); /* Solve the application */ info = SNESSolve(snes,NULL,x);CHKERRQ(info); info = SNESGetConvergedReason(snes,&reason);CHKERRQ(info); if (reason <= 0) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"The SNESVI solver did not converge, adjust some parameters, or check the function evaluation routines\n"); /* Free memory */ info = VecDestroy(&x);CHKERRQ(info); info = VecDestroy(&xl);CHKERRQ(info); info = VecDestroy(&xu);CHKERRQ(info); info = VecDestroy(&r);CHKERRQ(info); info = MatDestroy(&user.A);CHKERRQ(info); info = VecDestroy(&user.B);CHKERRQ(info); info = DMDestroy(&user.da);CHKERRQ(info); info = SNESDestroy(&snes);CHKERRQ(info); info = PetscFinalize(); return 0; }
int main(int argc,char **argv) { PetscErrorCode ierr; ObsCtx user; SNES snes; DM da; Vec u, /* solution */ Xu; /* upper bound */ DMDALocalInfo info; PetscReal error1,errorinf; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = DMDACreate2d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE, DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,11,11,/* default to 10x10 grid */ PETSC_DECIDE,PETSC_DECIDE, /* number of processors in each dimension */1,/* dof = 1 */1,/* s = 1; stencil extends out one cell */ NULL,NULL,/* do not specify processor decomposition */&da);CHKERRQ(ierr); ierr = DMSetFromOptions(da);CHKERRQ(ierr); ierr = DMSetUp(da);CHKERRQ(ierr); ierr = DMCreateGlobalVector(da,&u);CHKERRQ(ierr); ierr = VecDuplicate(u,&(user.uexact));CHKERRQ(ierr); ierr = VecDuplicate(u,&(user.psi));CHKERRQ(ierr); ierr = DMDASetUniformCoordinates(da,-2.0,2.0,-2.0,2.0,0.0,1.0);CHKERRQ(ierr); ierr = DMSetApplicationContext(da,&user);CHKERRQ(ierr); ierr = FormPsiAndExactSoln(da);CHKERRQ(ierr); ierr = VecSet(u,0.0);CHKERRQ(ierr); ierr = SNESCreate(PETSC_COMM_WORLD,&snes);CHKERRQ(ierr); ierr = SNESSetDM(snes,da);CHKERRQ(ierr); ierr = SNESSetApplicationContext(snes,&user);CHKERRQ(ierr); ierr = SNESSetType(snes,SNESVINEWTONRSLS);CHKERRQ(ierr); /* set upper and lower bound constraints for VI */ ierr = VecDuplicate(u,&Xu);CHKERRQ(ierr); ierr = VecSet(Xu,PETSC_INFINITY);CHKERRQ(ierr); ierr = SNESVISetVariableBounds(snes,user.psi,Xu);CHKERRQ(ierr); ierr = VecDestroy(&Xu);CHKERRQ(ierr); ierr = DMDASNESSetFunctionLocal(da,INSERT_VALUES,(PetscErrorCode (*)(DMDALocalInfo*,void*,void*,void*))FormFunctionLocal,&user);CHKERRQ(ierr); ierr = DMDASNESSetJacobianLocal(da,(PetscErrorCode (*)(DMDALocalInfo*,void*,Mat,Mat,void*))FormJacobianLocal,&user);CHKERRQ(ierr); ierr = SNESSetFromOptions(snes);CHKERRQ(ierr); /* report on setup */ ierr = DMDAGetLocalInfo(da,&info); CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"setup done: grid Mx,My = %D,%D with spacing dx,dy = %.4f,%.4f\n", info.mx,info.my,(double)(4.0/(PetscReal)(info.mx-1)),(double)(4.0/(PetscReal)(info.my-1)));CHKERRQ(ierr); /* solve nonlinear system */ ierr = SNESSolve(snes,NULL,u);CHKERRQ(ierr); /* compare to exact */ ierr = VecAXPY(u,-1.0,user.uexact);CHKERRQ(ierr); /* u <- u - uexact */ ierr = VecNorm(u,NORM_1,&error1);CHKERRQ(ierr); error1 /= (PetscReal)info.mx * (PetscReal)info.my; ierr = VecNorm(u,NORM_INFINITY,&errorinf);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"errors: av |u-uexact| = %.3e |u-uexact|_inf = %.3e\n",(double)error1,(double)errorinf);CHKERRQ(ierr); /* Free work space. */ ierr = VecDestroy(&u);CHKERRQ(ierr); ierr = VecDestroy(&(user.psi));CHKERRQ(ierr); ierr = VecDestroy(&(user.uexact));CHKERRQ(ierr); ierr = SNESDestroy(&snes);CHKERRQ(ierr); ierr = DMDestroy(&da);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }