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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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); 
}
Exemplo n.º 4
0
void PETSC_STDCALL  dmdalocaltolocalend_(DM da,Vec g,InsertMode *mode,Vec l, int *__ierr ) {
    *__ierr = DMDALocalToLocalEnd(
                  (DM)PetscToPointer((da) ),
                  (Vec)PetscToPointer((g) ),*mode,
                  (Vec)PetscToPointer((l) ));
}