PetscErrorCode NavierStokesSolver :: createLocalToGlobalMappingsLambda() { PetscErrorCode ierr; PetscInt m,n,i,j,mstart,nstart; PetscReal **lp; PetscInt localIdx; ierr = VecGetOwnershipRange(lambda, &localIdx, NULL); CHKERRQ(ierr); //populate local vector with global indices //values outside the domain are never accessed and not set //P ierr = DMCreateLocalVector(pda, &pMapping); CHKERRQ(ierr); ierr = DMDAVecGetArray(pda, pMapping, &lp); CHKERRQ(ierr); ierr = DMDAGetCorners(pda, &mstart, &nstart, NULL, &m, &n, NULL); CHKERRQ(ierr); for(j=nstart; j<nstart+n; j++) { for(i=mstart; i < mstart+m; i++) { lp[j][i] = localIdx; localIdx++; } } ierr = DMDAVecRestoreArray(pda, pMapping, &lp); CHKERRQ(ierr); ierr = DMDALocalToLocalBegin(pda, pMapping, INSERT_VALUES, pMapping); CHKERRQ(ierr); ierr = DMDALocalToLocalEnd(pda, pMapping, INSERT_VALUES, pMapping); CHKERRQ(ierr); return 0; }
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; }
/* RHSFunction: evaluates nonlinear function in ODE form X' = F(X,t). But our case is autonomous, so F = F(X) = F(W,P) and F has no t dependence. */ PetscErrorCode RHSFunction(TS ts,PetscReal t_unused,Vec X,Vec F,void *ptr) { PetscErrorCode ierr; PorousCtx *user = (PorousCtx*)ptr; DM da = user->da; Vec dPstag,localX; PetscInt i,j,Mx,My,xs,ys,xm,ym; PetscReal dx = user->dx, dy = user->dy, c1, c2, c3, sig, q, Ymin, Wmin, Wij, Weast, Wwest, Wnorth, Wsouth, dQx, dQy, divQ, dPcentx, dPcenty, WdPsqr, Pij, pi, Nn, Prelpow, zz; WPnode **wp, **f; Hbnode **hb; staggradnode **stag; PetscFunctionBegin; ierr = DMDAGetInfo(da,PETSC_IGNORE,&Mx,&My,PETSC_IGNORE,PETSC_IGNORE, PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE, PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE); ierr = DMDAGetCorners(da,&xs,&ys,PETSC_NULL,&xm,&ym,PETSC_NULL);CHKERRQ(ierr); user->fcncount = user->fcncount + 1; ierr = checkPositivity(user,X);CHKERRQ(ierr); c1 = user->Kconst / (user->rhow * user->g); c2 = c1 / (user->rhow * user->Lfusion); c3 = c1 / (user->rhoi * user->Lfusion); sig = user->sigma; q = 1.0 / sig; Ymin = user->Ymin; Wmin = user->Wmin; /* we will be differencing X = (W,P) */ ierr = DMGetLocalVector(da,&localX);CHKERRQ(ierr); ierr = DMGlobalToLocalBegin(da,X,INSERT_VALUES,localX);CHKERRQ(ierr); ierr = DMGlobalToLocalEnd(da,X,INSERT_VALUES,localX);CHKERRQ(ierr); ierr = DMGetLocalVector(da,&dPstag);CHKERRQ(ierr); /* space for staggered grad */ ierr = DMDAVecGetArray(da,localX,&wp);CHKERRQ(ierr); ierr = DMDAVecGetArray(da,dPstag,&stag);CHKERRQ(ierr); for (j=ys; j<ys+ym; j++) { for (i=xs; i<xs+xm; i++) { if (i == Mx-1) { stag[j][i].ddxE = 0.0; /* value will not be referenced */ } else { stag[j][i].ddxE = (wp[j][i+1].P - wp[j][i].P) / dx; } if (j == My-1) { stag[j][i].ddyN = 0.0; /* value will not be referenced */ } else { stag[j][i].ddyN = (wp[j+1][i].P - wp[j][i].P) / dy; } } } ierr = DMDAVecRestoreArray(da,dPstag,&stag);CHKERRQ(ierr); ierr = DMDAVecRestoreArray(da,localX,&wp);CHKERRQ(ierr); /* we will be differencing dPstag = (ddxE,ddyN) */ ierr = DMDALocalToLocalBegin(da,dPstag,INSERT_VALUES,dPstag);CHKERRQ(ierr); ierr = DMDALocalToLocalEnd(da,dPstag,INSERT_VALUES,dPstag);CHKERRQ(ierr); ierr = DMDAVecGetArray(da,localX,&wp);CHKERRQ(ierr); ierr = DMDAVecGetArray(da,F,&f);CHKERRQ(ierr); ierr = DMDAVecGetArray(da,user->geom,&hb);CHKERRQ(ierr); ierr = DMDAVecGetArray(da,dPstag,&stag);CHKERRQ(ierr); for (j=ys; j<ys+ym; j++) { for (i=xs; i<xs+xm; i++) { if (i == 0 || j == 0 || i == Mx-1 || j == My-1) { f[j][i].W = 0.0; /* no change at Dirichlet boundary conditions */ f[j][i].P = 0.0; } else { Wij = wp[j][i].W; Weast = 0.5 * (wp[j][i+1].W + Wij); Wwest = 0.5 * (wp[j][i-1].W + Wij); Wnorth = 0.5 * (wp[j+1][i].W + Wij); Wsouth = 0.5 * (wp[j-1][i].W + Wij); dPcentx = (wp[j][i+1].P - wp[j][i-1].P) / dx; dPcenty = (wp[j+1][i].P - wp[j-1][i].P) / dy; WdPsqr = Wij * ( dPcentx * dPcentx + dPcenty * dPcenty ); /* W_t = c1 div (W grad P) + c2 W |grad P|^2 */ dQx = Weast * stag[j][i].ddxE - Wwest * stag[j][i-1].ddxE; dQy = Wnorth * stag[j][i].ddyN - Wsouth * stag[j-1][i].ddyN; divQ = dQx / dx + dQy / dy; f[j][i].W = c1 * divQ + user->Cmelt * c2 * WdPsqr; /* P_t = sigma P/(W+Wmin) [ W_t - Cmelt c3 (P/pi)^q) W |grad P|^2 + Creep A max{0,N}^n (W - (P/pi)^q Ymin) ] */ pi = user->rhoi * user->g * hb[j][i].H; Pij = wp[j][i].P; Nn = pow(PetscMax(0.0,pi - Pij),user->nglen); Prelpow = pow(Pij / pi,q); zz = f[j][i].W - user->Cmelt * c3 * Prelpow * WdPsqr + user->Creep * user->Aglen * Nn * (Wij - Prelpow * Ymin); f[j][i].P = sig * (Pij / (Wij + Wmin)) * zz; } } } ierr = DMDAVecRestoreArray(da,localX,&wp);CHKERRQ(ierr); ierr = DMDAVecRestoreArray(da,F,&f);CHKERRQ(ierr); ierr = DMDAVecRestoreArray(da,user->geom,&hb);CHKERRQ(ierr); ierr = DMDAVecRestoreArray(da,dPstag,&stag);CHKERRQ(ierr); ierr = DMRestoreLocalVector(da,&localX);CHKERRQ(ierr); ierr = DMRestoreLocalVector(da,&dPstag);CHKERRQ(ierr); PetscFunctionReturn(0); }
void PETSC_STDCALL dmdalocaltolocalbegin_(DM da,Vec g,InsertMode *mode,Vec l, int *__ierr ) { *__ierr = DMDALocalToLocalBegin( (DM)PetscToPointer((da) ), (Vec)PetscToPointer((g) ),*mode, (Vec)PetscToPointer((l) )); }