[cig-commits] commit: Added proper grid-spacing info to user context on all levels

Mercurial hg at geodynamics.org
Thu May 29 11:26:21 PDT 2008


changeset:   126:b68f2b824135
user:        Marc Spiegelman <mspieg at ldeo.columbia.edu>
date:        Sun Mar 16 22:44:05 2008 -0400
files:       src/SolitaryWave2DSL.c
description:
Added proper grid-spacing info to user context on all levels
M   src/SolitaryWave2DSL.c


diff -r 52c28b2751ed -r b68f2b824135 src/SolitaryWave2DSL.c
--- a/src/SolitaryWave2DSL.c	Sun Mar 16 14:39:01 2008 -0400
+++ b/src/SolitaryWave2DSL.c	Sun Mar 16 22:44:05 2008 -0400
@@ -52,7 +52,7 @@ int main(int argc,char **argv)
   DMMG           *dmmg;               /* multilevel grid structure */
   AppCtx         userInit, *user;     /* user-defined work contexts, userInit is for initializing parameters */
   Parameter      *param;
-  GridInfo       grid;
+  GridInfo       grid, *gridLevels;
   TStepCtx       tsCtx;
   MPI_Comm       comm;
   PetscErrorCode ierr;
@@ -104,10 +104,19 @@ int main(int argc,char **argv)
   ierr = DASetFieldName(DMMGGetDA(dmmg),0,"C");CHKERRQ(ierr);
   ierr = DASetFieldName(DMMGGetDA(dmmg),1,"phi");CHKERRQ(ierr);
 
-  /*   store fine grid information calculated from the da ancalculate courant scaled velocity  */
+  /*   store fine grid information calculated from the da and calculate courant scaled velocity  */
   ierr = DAGetInfo(DMMGGetDA(dmmg),0,&grid.niFine,&grid.njFine,0,0,0,0,0,PETSC_NULL,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
-  grid.dx = param->width / (PetscReal) grid.niFine;
-  grid.dz = param->height / (PetscReal) grid.njFine;
+  /* set correct grid spacing depending on periodicity of boundary conditions */
+  if ( param->xBoundaryFlag == 0 ) {
+    grid.dx = param->width / (PetscReal) grid.niFine;
+  } else {
+    grid.dx = param->width / (PetscReal) (grid.niFine - 1);
+  }
+  if ( param->zBoundaryFlag == 0 ) {
+    grid.dz = param->height / (PetscReal) grid.njFine;
+  } else {
+    grid.dz = param->height / (PetscReal) (grid.njFine -1);
+  }
   tsCtx.W0Scaled = param->W0/grid.dz;
 
   /* create DA for characteristics solve (stencil width =2) */
@@ -118,18 +127,21 @@ int main(int argc,char **argv)
      Create user context, set problem data, create vector data structures on all grids
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */   
   ierr = PetscMalloc(param->mgLevels*sizeof(AppCtx),&user);CHKERRQ(ierr);
+  ierr = PetscMalloc(param->mgLevels*sizeof(GridInfo),&gridLevels);CHKERRQ(ierr);
   /* just create extra vectors for fineLevel */
   i=fineLevel;
   ierr = DACreateGlobalVector(grid.daC, &(user[i].Xold));CHKERRQ(ierr); 
   ierr = VecDuplicate(user[i].Xold,&(user[i].Xstar));CHKERRQ(ierr); 
   ierr = VecDuplicate(user[i].Xold,&(user[i].Velocity));CHKERRQ(ierr); 
   ierr = VecDuplicate(dmmg[i]->x, &(user[i].func));CHKERRQ(ierr);
-  for (i=0; i< param->mgLevels; i++) {
+  for (i=fineLevel; i>= 0 ; i--) {
     user[i].bag = userInit.bag;
-    user[i].grid = userInit.grid;
-    if ( i > 0 ) {
-      user[i].grid.dx = 2*user[i-1].grid.dx;
-      user[i].grid.dz = 2*user[i-1].grid.dz;
+    user[i].tsCtx = userInit.tsCtx;
+    ierr = PetscMemcpy(&gridLevels[i],&grid,sizeof(GridInfo));
+    user[i].grid = &gridLevels[i];
+    if ( i < fineLevel ) {
+      user[i].grid->dx = 2*user[i+1].grid->dx;
+      user[i].grid->dz = 2*user[i+1].grid->dz;
     }
     dmmg[i]->user = &user[i];
   }



More information about the cig-commits mailing list