[cig-commits] commit: Add the ability to specify p_initial from an array in the input file

Mercurial hg at geodynamics.org
Mon May 2 20:31:27 PDT 2011


changeset:   231:d7182b7d8100
user:        Walter Landry <wlandry at caltech.edu>
date:        Mon May 02 20:12:48 2011 -0700
files:       src/FACStokes.h src/FACStokes/FACStokes.C src/FACStokes/solveStokes.C
description:
Add the ability to specify p_initial from an array in the input file


diff -r d169949d507e -r d7182b7d8100 src/FACStokes.h
--- a/src/FACStokes.h	Mon May 02 20:11:44 2011 -0700
+++ b/src/FACStokes.h	Mon May 02 20:12:48 2011 -0700
@@ -193,6 +193,9 @@ namespace SAMRAI {
 
     tbox::Array<double> v_rhs, v_rhs_xyz_max, v_rhs_xyz_min;
     tbox::Array<int> v_rhs_ijk;
+
+    tbox::Array<double> p_initial, p_initial_xyz_max, p_initial_xyz_min;
+    tbox::Array<int> p_initial_ijk;
     //@}
 
   };
diff -r d169949d507e -r d7182b7d8100 src/FACStokes/FACStokes.C
--- a/src/FACStokes/FACStokes.C	Mon May 02 20:11:44 2011 -0700
+++ b/src/FACStokes/FACStokes.C	Mon May 02 20:12:48 2011 -0700
@@ -161,6 +161,14 @@ namespace SAMRAI {
         v_rhs=database->getDoubleArray("v_rhs_data");
       }
 
+    if(database->keyExists("p_initial_data"))
+      {
+        p_initial_ijk=database->getIntegerArray("p_initial_ijk");
+        p_initial_xyz_min=database->getDoubleArray("p_initial_coord_min");
+        p_initial_xyz_max=database->getDoubleArray("p_initial_coord_max");
+        p_initial=database->getDoubleArray("p_initial_data");
+      }
+
     /*
      * Specify an implementation of solv::RobinBcCoefStrategy for the
      * solver to use.  We use the implementation
diff -r d169949d507e -r d7182b7d8100 src/FACStokes/solveStokes.C
--- a/src/FACStokes/solveStokes.C	Mon May 02 20:11:44 2011 -0700
+++ b/src/FACStokes/solveStokes.C	Mon May 02 20:12:48 2011 -0700
@@ -49,15 +49,79 @@ int SAMRAI::FACStokes::solveStokes()
 
       tbox::Pointer<geom::CartesianPatchGeometry>
         geom = patch->getPatchGeometry();
-      hier::Box pbox = p->getBox();
-      for(pdat::CellIterator ci(p->getGhostBox()); ci; ci++)
+
+      if(p_initial.empty())
         {
-          pdat::CellIndex c=ci();
-          double y=geom->getXLower()[1]
-            + geom->getDx()[1]*(c[1]-pbox.lower()[1] + 0.5);
-          (*p)(c)=-y;
+          p->fill(0.0);
         }
-      // p->fill(0.0);
+      else
+        {
+          const int dim=d_dim.getValue();
+          const double *dx=geom->getDx();
+          double dx_p[dim];
+          for(int d=0;d<dim;++d)
+            dx_p[d]=(p_initial_xyz_max[d]
+                     - p_initial_xyz_min[d])/(p_initial_ijk[d]-1);
+          int di[dim];
+          di[0]=1;
+          for(int d=1;d<dim;++d)
+            di[d]=di[d-1]*p_initial_ijk[d-1];
+
+          hier::Box pbox = p->getBox();
+          for(pdat::CellIterator ci(p->getGhostBox()); ci; ci++)
+            {
+              pdat::CellIndex c=ci();
+              double xyz[dim], weight[dim][2];
+              for(int d=0;d<dim;++d)
+                xyz[d]=geom->getXLower()[d]
+                  + dx[d]*(c[d]-pbox.lower()[d] + 0.5);
+
+              int ijk(0);
+              int ddi[dim];
+              for(int d=0;d<dim;++d)
+                {
+                  int i=static_cast<int>(xyz[d]*(p_initial_ijk[d]-1)
+                                         /(p_initial_xyz_max[d]
+                                           - p_initial_xyz_min[d]));
+                  i=std::max(0,std::min(p_initial_ijk[d]-1,i));
+                  ijk+=i*di[d];
+
+                  if(i==p_initial_ijk[d]-1)
+                    {
+                      weight[d][0]=1;
+                      weight[d][1]=0;
+                      ddi[d]=0;
+                    }
+                  else
+                    {
+                      weight[d][1]=
+                        (xyz[d]-(i*dx_p[d] + p_initial_xyz_min[d]))/dx_p[d];
+                      weight[d][0]=1-weight[d][1];
+                      ddi[d]=di[d];
+                    }
+                }
+
+              if(dim==2)
+                {
+                  (*p)(c)=p_initial[ijk]*weight[0][0]*weight[1][0]
+                    + p_initial[ijk+ddi[0]]*weight[0][1]*weight[1][0]
+                    + p_initial[ijk+ddi[1]]*weight[0][0]*weight[1][1]
+                    + p_initial[ijk+ddi[0]+ddi[1]]*weight[0][1]*weight[1][1];
+                }
+              else
+                {
+                  (*p)(c)=p_initial[ijk]*weight[0][0]*weight[1][0]*weight[2][0]
+                    + p_initial[ijk+ddi[0]]*weight[0][1]*weight[1][0]*weight[2][0]
+                    + p_initial[ijk+ddi[1]]*weight[0][0]*weight[1][1]*weight[2][0]
+                    + p_initial[ijk+ddi[0]+ddi[1]]*weight[0][1]*weight[1][1]*weight[2][0]
+                    
+                    + p_initial[ijk+ddi[2]]*weight[0][0]*weight[1][0]*weight[2][1]
+                    + p_initial[ijk+ddi[0]+ddi[2]]*weight[0][1]*weight[1][0]*weight[2][1]
+                    + p_initial[ijk+ddi[1]+ddi[2]]*weight[0][0]*weight[1][1]*weight[2][1]
+                    + p_initial[ijk+ddi[0]+ddi[1]+ddi[2]]*weight[0][1]*weight[1][1]*weight[2][1];
+                }
+            }
+        }
 
       tbox::Pointer<pdat::SideData<double> >
         v = patch->getPatchData(v_id);



More information about the CIG-COMMITS mailing list