本文整理汇总了C++中PetscOptionsHasName函数的典型用法代码示例。如果您正苦于以下问题:C++ PetscOptionsHasName函数的具体用法?C++ PetscOptionsHasName怎么用?C++ PetscOptionsHasName使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PetscOptionsHasName函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: MSA_Plate
/*
MSA_Plate - Calculates an obstacle for surface to stretch over.
*/
PetscErrorCode MSA_Plate(Vec XL,Vec XU,void *ctx)
{
AppCtx *user=(AppCtx *)ctx;
PetscErrorCode info;
PetscInt i,j;
PetscInt xs,ys,xm,ym;
PetscInt mx=user->mx, my=user->my, bmy, bmx;
PetscScalar t1,t2,t3;
PetscScalar **xl;
PetscScalar lb=-SNES_VI_INF, ub=SNES_VI_INF;
PetscBool cylinder;
user->bmy = PetscMax(0,user->bmy);user->bmy = PetscMin(my,user->bmy);
user->bmx = PetscMax(0,user->bmx);user->bmx = PetscMin(mx,user->bmx);
bmy=user->bmy, bmx=user->bmx;
info = DMDAGetCorners(user->da,&xs,&ys,PETSC_NULL,&xm,&ym,PETSC_NULL); CHKERRQ(info);
info = VecSet(XL, lb); CHKERRQ(info);
info = DMDAVecGetArray(user->da,XL,&xl);CHKERRQ(info);
info = VecSet(XU, ub); CHKERRQ(info);
info = PetscOptionsHasName(PETSC_NULL,"-cylinder",&cylinder); CHKERRQ(info);
/* Compute the optional lower box */
if (cylinder){
for (i=xs; i< xs+xm; i++){
for (j=ys; j<ys+ym; j++){
t1=(2.0*i-mx)*bmy;
t2=(2.0*j-my)*bmx;
t3=bmx*bmx*bmy*bmy;
if ( t1*t1 + t2*t2 <= t3 ){
xl[j][i] = user->bheight;
}
}
}
} else {
/* Compute the optional lower box */
for (i=xs; i< xs+xm; i++){
for (j=ys; j<ys+ym; j++){
if (i>=(mx-bmx)/2 && i<mx-(mx-bmx)/2 &&
j>=(my-bmy)/2 && j<my-(my-bmy)/2 ){
xl[j][i] = user->bheight;
}
}
}
}
info = DMDAVecRestoreArray(user->da,XL,&xl); CHKERRQ(info);
PetscFunctionReturn(0);
}
示例2: limits
/*@
PetscDrawAxisSetLimits - Sets the limits (in user coords) of the axis
Not Collective (ignored on all processors except processor 0 of PetscDrawAxis)
Input Parameters:
+ axis - the axis
. xmin,xmax - limits in x
- ymin,ymax - limits in y
Options Database:
. -drawaxis_hold - hold the initial set of axis limits for future plotting
Level: advanced
.seealso: PetscDrawAxisSetHoldLimits()
@*/
PetscErrorCode PetscDrawAxisSetLimits(PetscDrawAxis axis,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax)
{
PetscErrorCode ierr;
PetscFunctionBegin;
if (!axis) PetscFunctionReturn(0);
if (axis->hold) PetscFunctionReturn(0);
axis->xlow = xmin;
axis->xhigh= xmax;
axis->ylow = ymin;
axis->yhigh= ymax;
ierr = PetscOptionsHasName(((PetscObject)axis)->prefix,"-drawaxis_hold",&axis->hold);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例3: PetscDrawBarDestroy
/*@
PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
Collective over PetscDrawBar
Options Database:
. -bar_sort - sort the entries before drawing the bar graph
Level: intermediate
.seealso: PetscDrawBarDestroy(), PetscDrawBarCreate()
@*/
PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar)
{
PetscErrorCode ierr;
PetscBool set;
PetscReal tol = bar->sorttolerance;
PetscFunctionBegin;
ierr = PetscOptionsHasName(NULL,"-bar_sort",&set);CHKERRQ(ierr);
if (set) {
ierr = PetscOptionsGetReal(NULL,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
示例4: MatView_MFFD
/*
MatMFFDView_MFFD - Views matrix-free parameters.
*/
PetscErrorCode MatView_MFFD(Mat J,PetscViewer viewer)
{
PetscErrorCode ierr;
MatMFFD ctx = (MatMFFD)J->data;
PetscBool iascii, viewbase, viewfunction;
const char *prefix;
PetscFunctionBegin;
ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
if (iascii) {
ierr = PetscViewerASCIIPrintf(viewer,"Matrix-free approximation:\n");CHKERRQ(ierr);
ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
ierr = PetscViewerASCIIPrintf(viewer,"err=%G (relative error in function evaluation)\n",ctx->error_rel);CHKERRQ(ierr);
if (!((PetscObject)ctx)->type_name) {
ierr = PetscViewerASCIIPrintf(viewer,"The compute h routine has not yet been set\n");CHKERRQ(ierr);
} else {
ierr = PetscViewerASCIIPrintf(viewer,"Using %s compute h routine\n",((PetscObject)ctx)->type_name);CHKERRQ(ierr);
}
if (ctx->ops->view) {
ierr = (*ctx->ops->view)(ctx,viewer);CHKERRQ(ierr);
}
ierr = PetscObjectGetOptionsPrefix((PetscObject)J, &prefix);CHKERRQ(ierr);
ierr = PetscOptionsHasName(prefix, "-mat_mffd_view_base", &viewbase);CHKERRQ(ierr);
if (viewbase) {
ierr = PetscViewerASCIIPrintf(viewer, "Base:\n");CHKERRQ(ierr);
ierr = VecView(ctx->current_u, viewer);CHKERRQ(ierr);
}
ierr = PetscOptionsHasName(prefix, "-mat_mffd_view_function", &viewfunction);CHKERRQ(ierr);
if (viewfunction) {
ierr = PetscViewerASCIIPrintf(viewer, "Function:\n");CHKERRQ(ierr);
ierr = VecView(ctx->current_f, viewer);CHKERRQ(ierr);
}
ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
}
PetscFunctionReturn(0);
}
示例5: limits
/*@
PetscDrawAxisSetLimits - Sets the limits (in user coords) of the axis
Not Collective (ignored on all processors except processor 0 of PetscDrawAxis)
Input Parameters:
+ axis - the axis
. xmin,xmax - limits in x
- ymin,ymax - limits in y
Options Database:
. -drawaxis_hold - hold the initial set of axis limits for future plotting
Level: advanced
.seealso: PetscDrawAxisSetHoldLimits()
@*/
PetscErrorCode PetscDrawAxisSetLimits(PetscDrawAxis axis,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax)
{
PetscErrorCode ierr;
PetscFunctionBegin;
if (!axis) PetscFunctionReturn(0);
PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
if (axis->hold) PetscFunctionReturn(0);
axis->xlow = xmin;
axis->xhigh= xmax;
axis->ylow = ymin;
axis->yhigh= ymax;
ierr = PetscOptionsHasName(((PetscObject)axis)->options,((PetscObject)axis)->prefix,"-drawaxis_hold",&axis->hold);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例6: PetscOptionsCheckInitial_Components
PetscErrorCode PetscOptionsCheckInitial_Components(void)
{
PetscBool flg1;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscOptionsHasName(NULL,"-help",&flg1);CHKERRQ(ierr);
if (flg1) {
#if defined(PETSC_USE_LOG)
MPI_Comm comm = PETSC_COMM_WORLD;
ierr = (*PetscHelpPrintf)(comm,"------Additional PETSc component options--------\n");CHKERRQ(ierr);
ierr = (*PetscHelpPrintf)(comm," -log_summary_exclude: <vec,mat,pc.ksp,snes>\n");CHKERRQ(ierr);
ierr = (*PetscHelpPrintf)(comm," -info_exclude: <null,vec,mat,pc,ksp,snes,ts>\n");CHKERRQ(ierr);
ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr);
#endif
}
PetscFunctionReturn(0);
}
示例7: PetscStackCreate
PetscErrorCode PetscStackCreate(void)
{
PetscStack *petscstack_in;
if (PetscStackActive()) return 0;
petscstack_in = (PetscStack*)malloc(sizeof(PetscStack));
petscstack_in->currentsize = 0;
PetscThreadLocalSetValue((PetscThreadKey*)&petscstack,petscstack_in);
#if defined(PETSC_HAVE_AMS)
{
PetscBool flg = PETSC_FALSE;
PetscOptionsHasName(NULL,"-stack_view",&flg);
if (flg) PetscStackViewAMS();
}
#endif
return 0;
}
示例8: main
int main(int argc,char **args)
{
Mat C;
PetscInt i,j,m = 5,n = 5,Ii,J;
PetscErrorCode ierr;
PetscScalar v,five = 5.0;
IS isrow;
PetscBool keepnonzeropattern;
ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
/* create the matrix for the five point stencil, YET AGAIN*/
ierr = MatCreate(PETSC_COMM_SELF,&C);CHKERRQ(ierr);
ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr);
ierr = MatSetFromOptions(C);CHKERRQ(ierr);
ierr = MatSetUp(C);CHKERRQ(ierr);
for (i=0; i<m; i++) {
for (j=0; j<n; j++) {
v = -1.0; Ii = j + n*i;
if (i>0) {J = Ii - n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);}
if (i<m-1) {J = Ii + n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);}
if (j>0) {J = Ii - 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);}
if (j<n-1) {J = Ii + 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);CHKERRQ(ierr);}
v = 4.0; ierr = MatSetValues(C,1,&Ii,1,&Ii,&v,INSERT_VALUES);CHKERRQ(ierr);
}
}
ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = ISCreateStride(PETSC_COMM_SELF,(m*n)/2,0,2,&isrow);CHKERRQ(ierr);
ierr = PetscOptionsHasName(NULL,NULL,"-keep_nonzero_pattern",&keepnonzeropattern);CHKERRQ(ierr);
if (keepnonzeropattern) {
ierr = MatSetOption(C,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE);CHKERRQ(ierr);
}
ierr = MatZeroRowsIS(C,isrow,five,0,0);CHKERRQ(ierr);
ierr = MatView(C,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr);
ierr = ISDestroy(&isrow);CHKERRQ(ierr);
ierr = MatDestroy(&C);CHKERRQ(ierr);
ierr = PetscFinalize();
return ierr;
}
示例9: TestMatZeroRows_Basic
PetscErrorCode TestMatZeroRows_Basic(Mat A,IS is,PetscScalar diag)
{
Mat B;
PetscErrorCode ierr;
PetscBool keepnonzeropattern;
/* Now copy A into B, and test it with MatZeroRows() */
ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
ierr = PetscOptionsHasName(NULL,NULL,"-keep_nonzero_pattern",&keepnonzeropattern);CHKERRQ(ierr);
if (keepnonzeropattern) {
ierr = MatSetOption(B,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE);CHKERRQ(ierr);
}
ierr = MatZeroRowsIS(B,is,diag,0,0);CHKERRQ(ierr);
ierr = MatView(B,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
ierr = MatDestroy(&B);CHKERRQ(ierr);
return 0;
}
示例10: GetListofEdges_Water
PetscErrorCode GetListofEdges_Water(WATERDATA *water,PetscInt *edgelist)
{
PetscErrorCode ierr;
PetscInt i,j,node1,node2;
Pipe *pipe;
Pump *pump;
PetscBool netview=PETSC_FALSE;
PetscFunctionBegin;
ierr = PetscOptionsHasName(NULL,NULL, "-water_view",&netview);CHKERRQ(ierr);
for (i=0; i < water->nedge; i++) {
if (water->edge[i].type == EDGE_TYPE_PIPE) {
pipe = &water->edge[i].pipe;
node1 = pipe->node1;
node2 = pipe->node2;
if (netview) {
ierr = PetscPrintf(PETSC_COMM_SELF,"edge %d, pipe v[%d] -> v[%d]\n",i,node1,node2);CHKERRQ(ierr);
}
} else {
pump = &water->edge[i].pump;
node1 = pump->node1;
node2 = pump->node2;
if (netview) {
ierr = PetscPrintf(PETSC_COMM_SELF,"edge %d, pump v[%d] -> v[%d]\n",i,node1,node2);CHKERRQ(ierr);
}
}
for (j=0; j < water->nvertex; j++) {
if (water->vertex[j].id == node1) {
edgelist[2*i] = j;
break;
}
}
for (j=0; j < water->nvertex; j++) {
if (water->vertex[j].id == node2) {
edgelist[2*i+1] = j;
break;
}
}
}
PetscFunctionReturn(0);
}
示例11: main
int main(int argc,char **args)
{
PetscErrorCode ierr;
Mat A,AT,B,C;
PetscViewer viewer;
PetscBool flg;
char file[PETSC_MAX_PATH_LEN];
PetscInitialize(&argc,&args,(char *)0,help);
ierr = PetscOptionsGetString(PETSC_NULL,"-fA",file,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Input fileA not specified");
ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
ierr = MatSetType(A,MATAIJ);CHKERRQ(ierr);
ierr = MatLoad(A,viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
ierr = PetscOptionsGetString(PETSC_NULL,"-fB",file,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr);
if (!flg) SETERRQ(PETSC_COMM_WORLD,1,"Input fileB not specified");
ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&viewer);CHKERRQ(ierr);
ierr = MatCreate(PETSC_COMM_WORLD,&B);CHKERRQ(ierr);
ierr = MatSetType(B,MATDENSE);CHKERRQ(ierr);
ierr = MatLoad(B,viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
ierr = MatTranspose(A,MAT_INITIAL_MATRIX,&AT);CHKERRQ(ierr);
ierr = MatMatMult(AT,B,MAT_INITIAL_MATRIX,PETSC_DEFAULT,&C);
ierr = PetscOptionsHasName(PETSC_NULL,"-view_C",&flg);CHKERRQ(ierr);
if (flg){
ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"C.dat",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr);
ierr = PetscViewerSetFormat(viewer,PETSC_VIEWER_NATIVE);CHKERRQ(ierr);
ierr = MatView(C,viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
}
ierr = MatDestroy(&A);CHKERRQ(ierr);
ierr = MatDestroy(&B);CHKERRQ(ierr);
ierr = MatDestroy(&AT);CHKERRQ(ierr);
ierr = MatDestroy(&C);CHKERRQ(ierr);
ierr = PetscFinalize();
return 0;
}
示例12: DMTSCheckFromOptions
PetscErrorCode DMTSCheckFromOptions(TS ts, Vec u, PetscErrorCode (**exactFuncs)(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx), void **ctxs)
{
DM dm;
SNES snes;
Vec sol;
PetscBool check;
PetscErrorCode ierr;
PetscFunctionBegin;
ierr = PetscOptionsHasName(((PetscObject)ts)->options,((PetscObject)ts)->prefix, "-dmts_check", &check);CHKERRQ(ierr);
if (!check) PetscFunctionReturn(0);
ierr = VecDuplicate(u, &sol);CHKERRQ(ierr);
ierr = TSSetSolution(ts, sol);CHKERRQ(ierr);
ierr = TSGetDM(ts, &dm);CHKERRQ(ierr);
ierr = TSSetUp(ts);CHKERRQ(ierr);
ierr = TSGetSNES(ts, &snes);CHKERRQ(ierr);
ierr = SNESSetSolution(snes, sol);CHKERRQ(ierr);
ierr = DMSNESCheckFromOptions_Internal(snes, dm, u, sol, exactFuncs, ctxs);CHKERRQ(ierr);
ierr = VecDestroy(&sol);CHKERRQ(ierr);
PetscFunctionReturn(0);
}
示例13: main
int main(int Argc,char **Args)
{
PetscInt x_mesh = 15,levels = 3,cycles = 1,use_jacobi = 0;
PetscInt i,smooths = 1,*N,its;
PetscErrorCode ierr;
PCMGType am = PC_MG_MULTIPLICATIVE;
Mat cmat,mat[20],fmat;
KSP cksp,ksp[20],kspmg;
PetscReal e[3]; /* l_2 error,max error, residual */
const char *shellname;
Vec x,solution,X[20],R[20],B[20];
PC pcmg,pc;
PetscBool flg;
PetscInitialize(&Argc,&Args,(char*)0,help);
ierr = PetscOptionsGetInt(NULL,"-x",&x_mesh,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-l",&levels,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-c",&cycles,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-smooths",&smooths,NULL);CHKERRQ(ierr);
ierr = PetscOptionsHasName(NULL,"-a",&flg);CHKERRQ(ierr);
if (flg) am = PC_MG_ADDITIVE;
ierr = PetscOptionsHasName(NULL,"-f",&flg);CHKERRQ(ierr);
if (flg) am = PC_MG_FULL;
ierr = PetscOptionsHasName(NULL,"-j",&flg);CHKERRQ(ierr);
if (flg) use_jacobi = 1;
ierr = PetscMalloc1(levels,&N);CHKERRQ(ierr);
N[0] = x_mesh;
for (i=1; i<levels; i++) {
N[i] = N[i-1]/2;
if (N[i] < 1) SETERRQ(PETSC_COMM_WORLD,1,"Too many levels");
}
ierr = Create1dLaplacian(N[levels-1],&cmat);CHKERRQ(ierr);
ierr = KSPCreate(PETSC_COMM_WORLD,&kspmg);CHKERRQ(ierr);
ierr = KSPGetPC(kspmg,&pcmg);CHKERRQ(ierr);
ierr = KSPSetFromOptions(kspmg);CHKERRQ(ierr);
ierr = PCSetType(pcmg,PCMG);CHKERRQ(ierr);
ierr = PCMGSetLevels(pcmg,levels,NULL);CHKERRQ(ierr);
ierr = PCMGSetType(pcmg,am);CHKERRQ(ierr);
ierr = PCMGGetCoarseSolve(pcmg,&cksp);CHKERRQ(ierr);
ierr = KSPSetOperators(cksp,cmat,cmat);CHKERRQ(ierr);
ierr = KSPGetPC(cksp,&pc);CHKERRQ(ierr);
ierr = PCSetType(pc,PCLU);CHKERRQ(ierr);
ierr = KSPSetType(cksp,KSPPREONLY);CHKERRQ(ierr);
/* zero is finest level */
for (i=0; i<levels-1; i++) {
ierr = PCMGSetResidual(pcmg,levels - 1 - i,residual,(Mat)0);CHKERRQ(ierr);
ierr = MatCreateShell(PETSC_COMM_WORLD,N[i+1],N[i],N[i+1],N[i],(void*)0,&mat[i]);CHKERRQ(ierr);
ierr = MatShellSetOperation(mat[i],MATOP_MULT,(void (*)(void))restrct);CHKERRQ(ierr);
ierr = MatShellSetOperation(mat[i],MATOP_MULT_TRANSPOSE_ADD,(void (*)(void))interpolate);CHKERRQ(ierr);
ierr = PCMGSetInterpolation(pcmg,levels - 1 - i,mat[i]);CHKERRQ(ierr);
ierr = PCMGSetRestriction(pcmg,levels - 1 - i,mat[i]);CHKERRQ(ierr);
ierr = PCMGSetCyclesOnLevel(pcmg,levels - 1 - i,cycles);CHKERRQ(ierr);
/* set smoother */
ierr = PCMGGetSmoother(pcmg,levels - 1 - i,&ksp[i]);CHKERRQ(ierr);
ierr = KSPGetPC(ksp[i],&pc);CHKERRQ(ierr);
ierr = PCSetType(pc,PCSHELL);CHKERRQ(ierr);
ierr = PCShellSetName(pc,"user_precond");CHKERRQ(ierr);
ierr = PCShellGetName(pc,&shellname);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,"level=%D, PCShell name is %s\n",i,shellname);CHKERRQ(ierr);
/* this is a dummy! since KSP requires a matrix passed in */
ierr = KSPSetOperators(ksp[i],mat[i],mat[i]);CHKERRQ(ierr);
/*
We override the matrix passed in by forcing it to use Richardson with
a user provided application. This is non-standard and this practice
should be avoided.
*/
ierr = PCShellSetApplyRichardson(pc,gauss_seidel);CHKERRQ(ierr);
if (use_jacobi) {
ierr = PCShellSetApplyRichardson(pc,jacobi);CHKERRQ(ierr);
}
ierr = KSPSetType(ksp[i],KSPRICHARDSON);CHKERRQ(ierr);
ierr = KSPSetInitialGuessNonzero(ksp[i],PETSC_TRUE);CHKERRQ(ierr);
ierr = KSPSetTolerances(ksp[i],PETSC_DEFAULT,PETSC_DEFAULT,PETSC_DEFAULT,smooths);CHKERRQ(ierr);
ierr = VecCreateSeq(PETSC_COMM_SELF,N[i],&x);CHKERRQ(ierr);
X[levels - 1 - i] = x;
if (i > 0) {
ierr = PCMGSetX(pcmg,levels - 1 - i,x);CHKERRQ(ierr);
}
ierr = VecCreateSeq(PETSC_COMM_SELF,N[i],&x);CHKERRQ(ierr);
B[levels -1 - i] = x;
if (i > 0) {
ierr = PCMGSetRhs(pcmg,levels - 1 - i,x);CHKERRQ(ierr);
}
ierr = VecCreateSeq(PETSC_COMM_SELF,N[i],&x);CHKERRQ(ierr);
R[levels - 1 - i] = x;
ierr = PCMGSetR(pcmg,levels - 1 - i,x);CHKERRQ(ierr);
//.........这里部分代码省略.........
示例14: main
int main(int argc,char **argv)
{
PetscMPIInt rank;
PetscInt M=8,dof=1,stencil_width=1,i,start,end,P=5,N = 6,m=PETSC_DECIDE,n=PETSC_DECIDE,p=PETSC_DECIDE,pt = 0,st = 0;
PetscErrorCode ierr;
PetscBool flg = PETSC_FALSE,flg2,flg3;
DMDABoundaryType periodic;
DMDAStencilType stencil_type;
DM da;
Vec local,global,local_copy;
PetscScalar value;
PetscReal norm,work;
PetscViewer viewer;
char filename[64];
FILE *file;
ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-M",&M,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-N",&N,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-dof",&dof,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-stencil_width",&stencil_width,NULL);CHKERRQ(ierr);
ierr = PetscOptionsGetInt(NULL,"-periodic",&pt,NULL);CHKERRQ(ierr);
periodic = (DMDABoundaryType) pt;
ierr = PetscOptionsGetInt(NULL,"-stencil_type",&st,NULL);CHKERRQ(ierr);
stencil_type = (DMDAStencilType) st;
ierr = PetscOptionsHasName(NULL,"-2d",&flg2);CHKERRQ(ierr);
ierr = PetscOptionsHasName(NULL,"-3d",&flg3);CHKERRQ(ierr);
if (flg2) {
ierr = DMDACreate2d(PETSC_COMM_WORLD,periodic,periodic,stencil_type,M,N,m,n,dof,stencil_width,
NULL,NULL,&da);CHKERRQ(ierr);
} else if (flg3) {
ierr = DMDACreate3d(PETSC_COMM_WORLD,periodic,periodic,periodic,stencil_type,M,N,P,m,n,p,dof,stencil_width,
NULL,NULL,NULL,&da);CHKERRQ(ierr);
} else {
ierr = DMDACreate1d(PETSC_COMM_WORLD,periodic,M,dof,stencil_width,NULL,&da);CHKERRQ(ierr);
}
ierr = DMCreateGlobalVector(da,&global);CHKERRQ(ierr);
ierr = DMCreateLocalVector(da,&local);CHKERRQ(ierr);
ierr = VecDuplicate(local,&local_copy);CHKERRQ(ierr);
/* zero out vectors so that ghostpoints are zero */
value = 0;
ierr = VecSet(local,value);CHKERRQ(ierr);
ierr = VecSet(local_copy,value);CHKERRQ(ierr);
ierr = VecGetOwnershipRange(global,&start,&end);CHKERRQ(ierr);
for (i=start; i<end; i++) {
value = i + 1;
ierr = VecSetValues(global,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr);
}
ierr = VecAssemblyBegin(global);CHKERRQ(ierr);
ierr = VecAssemblyEnd(global);CHKERRQ(ierr);
ierr = DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);CHKERRQ(ierr);
ierr = DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);CHKERRQ(ierr);
ierr = DMDALocalToLocalBegin(da,local,INSERT_VALUES,local_copy);CHKERRQ(ierr);
ierr = DMDALocalToLocalEnd(da,local,INSERT_VALUES,local_copy);CHKERRQ(ierr);
ierr = PetscOptionsGetBool(NULL,"-save",&flg,NULL);CHKERRQ(ierr);
if (flg) {
ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
sprintf(filename,"local.%d",rank);
ierr = PetscViewerASCIIOpen(PETSC_COMM_SELF,filename,&viewer);CHKERRQ(ierr);
ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr);
ierr = VecView(local,viewer);CHKERRQ(ierr);
fprintf(file,"Vector with correct ghost points\n");
ierr = VecView(local_copy,viewer);CHKERRQ(ierr);
ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
}
ierr = VecAXPY(local_copy,-1.0,local);CHKERRQ(ierr);
ierr = VecNorm(local_copy,NORM_MAX,&work);CHKERRQ(ierr);
ierr = MPI_Allreduce(&work,&norm,1,MPIU_REAL,MPIU_MAX,PETSC_COMM_WORLD);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of difference %G should be zero\n",norm);CHKERRQ(ierr);
ierr = VecDestroy(&local_copy);CHKERRQ(ierr);
ierr = VecDestroy(&local);CHKERRQ(ierr);
ierr = VecDestroy(&global);CHKERRQ(ierr);
ierr = DMDestroy(&da);CHKERRQ(ierr);
ierr = PetscFinalize();
return 0;
}
示例15: main
int main(int argc,char **argv)
{
PetscErrorCode ierr;
DS ds;
SlepcSC sc;
PetscScalar *A,*B,*wr,*wi;
PetscReal re,im;
PetscInt i,j,n=10,ld;
PetscViewer viewer;
PetscBool verbose;
SlepcInitialize(&argc,&argv,(char*)0,help);
ierr = PetscOptionsGetInt(NULL,"-n",&n,NULL);CHKERRQ(ierr);
ierr = PetscPrintf(PETSC_COMM_WORLD,"Solve a Dense System of type GNHEP - dimension %D.\n",n);CHKERRQ(ierr);
ierr = PetscOptionsHasName(NULL,"-verbose",&verbose);CHKERRQ(ierr);
/* Create DS object */
ierr = DSCreate(PETSC_COMM_WORLD,&ds);CHKERRQ(ierr);
ierr = DSSetType(ds,DSGNHEP);CHKERRQ(ierr);
ierr = DSSetFromOptions(ds);CHKERRQ(ierr);
ld = n+2; /* test leading dimension larger than n */
ierr = DSAllocate(ds,ld);CHKERRQ(ierr);
ierr = DSSetDimensions(ds,n,0,0,0);CHKERRQ(ierr);
/* Set up viewer */
ierr = PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);CHKERRQ(ierr);
ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO_DETAIL);CHKERRQ(ierr);
ierr = DSView(ds,viewer);CHKERRQ(ierr);
ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
if (verbose) {
ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr);
}
/* Fill A with Grcar matrix */
ierr = DSGetArray(ds,DS_MAT_A,&A);CHKERRQ(ierr);
ierr = PetscMemzero(A,sizeof(PetscScalar)*ld*n);CHKERRQ(ierr);
for (i=1;i<n;i++) A[i+(i-1)*ld]=-1.0;
for (j=0;j<4;j++) {
for (i=0;i<n-j;i++) A[i+(i+j)*ld]=1.0;
}
ierr = DSRestoreArray(ds,DS_MAT_A,&A);CHKERRQ(ierr);
/* Fill B with an identity matrix */
ierr = DSGetArray(ds,DS_MAT_B,&B);CHKERRQ(ierr);
ierr = PetscMemzero(B,sizeof(PetscScalar)*ld*n);CHKERRQ(ierr);
for (i=0;i<n;i++) B[i+i*ld]=1.0;
ierr = DSRestoreArray(ds,DS_MAT_B,&B);CHKERRQ(ierr);
if (verbose) {
ierr = PetscPrintf(PETSC_COMM_WORLD,"Initial - - - - - - - - -\n");CHKERRQ(ierr);
ierr = DSView(ds,viewer);CHKERRQ(ierr);
}
/* Solve */
ierr = PetscMalloc2(n,&wr,n,&wi);CHKERRQ(ierr);
ierr = DSGetSlepcSC(ds,&sc);CHKERRQ(ierr);
sc->comparison = SlepcCompareLargestMagnitude;
sc->comparisonctx = NULL;
sc->map = NULL;
sc->mapobj = NULL;
ierr = DSSolve(ds,wr,wi);CHKERRQ(ierr);
ierr = DSSort(ds,wr,wi,NULL,NULL,NULL);CHKERRQ(ierr);
if (verbose) {
ierr = PetscPrintf(PETSC_COMM_WORLD,"After solve - - - - - - - - -\n");CHKERRQ(ierr);
ierr = DSView(ds,viewer);CHKERRQ(ierr);
}
/* Print eigenvalues */
ierr = PetscPrintf(PETSC_COMM_WORLD,"Computed eigenvalues =\n",n);CHKERRQ(ierr);
for (i=0;i<n;i++) {
#if defined(PETSC_USE_COMPLEX)
re = PetscRealPart(wr[i]);
im = PetscImaginaryPart(wr[i]);
#else
re = wr[i];
im = wi[i];
#endif
if (PetscAbs(im)<1e-10) {
ierr = PetscViewerASCIIPrintf(viewer," %.5f\n",(double)re);CHKERRQ(ierr);
} else {
ierr = PetscViewerASCIIPrintf(viewer," %.5f%+.5fi\n",(double)re,(double)im);CHKERRQ(ierr);
}
}
ierr = PetscFree2(wr,wi);CHKERRQ(ierr);
ierr = DSDestroy(&ds);CHKERRQ(ierr);
ierr = SlepcFinalize();
return 0;
}