[cig-commits] commit: Make viscosity coarsening handle 3D

Mercurial hg at geodynamics.org
Sun Apr 17 19:42:39 PDT 2011


changeset:   173:b6ae952233b7
user:        Walter Landry <wlandry at caltech.edu>
date:        Sat Apr 16 23:07:29 2011 -0700
files:       Cell_Viscosity_Coarsen.C Edge_Viscosity_Coarsen.C viscosity_coarsen.h
description:
Make viscosity coarsening handle 3D


diff -r 62ac5744b300 -r b6ae952233b7 Cell_Viscosity_Coarsen.C
--- a/Cell_Viscosity_Coarsen.C	Sat Apr 16 23:06:54 2011 -0700
+++ b/Cell_Viscosity_Coarsen.C	Sat Apr 16 23:07:29 2011 -0700
@@ -35,35 +35,56 @@ void SAMRAI::geom::Cell_Viscosity_Coarse
                                                    const hier::IntVector& ratio)
   const
 {
-  const tbox::Dimension& dim(getDim());
+  const tbox::Dimension& dimension(getDim());
+  const int dim(dimension.getValue());
 
-  TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dim, coarse, fine, coarse_box, ratio);
+  TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dimension, coarse, fine, coarse_box, ratio);
 
   tbox::Pointer<pdat::CellData<double> >
-    cell_viscosity_fine = fine.getPatchData(src_component);
-  tbox::Pointer<pdat::NodeData<double> >
-    edge_viscosity_fine = fine.getPatchData(edge_viscosity_id);
+    cell_viscosity_fine_ptr = fine.getPatchData(src_component);
+  pdat::CellData<double> &cell_viscosity_fine(*cell_viscosity_fine_ptr);
+  tbox::Pointer<pdat::NodeData<double> > edge_viscosity_fine_2D_ptr;
+  tbox::Pointer<pdat::EdgeData<double> > edge_viscosity_fine_3D_ptr;
+  if(dim==2)
+    edge_viscosity_fine_2D_ptr = fine.getPatchData(edge_viscosity_id);
+  else
+    edge_viscosity_fine_3D_ptr = fine.getPatchData(edge_viscosity_id);
+
   tbox::Pointer<pdat::CellData<double> >
-    cell_viscosity_coarse = coarse.getPatchData(dst_component);
+    cell_viscosity_coarse_ptr = coarse.getPatchData(dst_component);
+  pdat::CellData<double> &cell_viscosity_coarse(*cell_viscosity_coarse_ptr);
 
-  TBOX_ASSERT(!cell_viscosity_coarse.isNull());
-  TBOX_ASSERT(!cell_viscosity_fine.isNull());
-  TBOX_ASSERT(cell_viscosity_fine->getDepth() == cell_viscosity_coarse->getDepth());
-  TBOX_ASSERT(cell_viscosity_coarse->getDepth() == 1);
+  TBOX_ASSERT(!cell_viscosity_coarse_ptr.isNull());
+  TBOX_ASSERT(!cell_viscosity_fine_ptr.isNull());
+  TBOX_ASSERT(cell_viscosity_fine.getDepth() == cell_viscosity_coarse.getDepth());
+  TBOX_ASSERT(cell_viscosity_coarse.getDepth() == 1);
 
   const tbox::Pointer<CartesianPatchGeometry> cgeom =
     coarse.getPatchGeometry();
 
-  hier::Index ip(1,0), jp(0,1);
-   for(int j=coarse_box.lower(1); j<=coarse_box.upper(1); ++j)
-     for(int i=coarse_box.lower(0); i<=coarse_box.upper(0); ++i)
-       {
-         pdat::CellIndex coarse_cell(hier::Index(i,j));
+  hier::Index ip(hier::Index::getZeroIndex(dimension)), jp(ip), kp(ip);
+  ip[0]=1;
+  jp[1]=1;
+  if(dim>2)
+    kp[2]=1;
 
-         (*cell_viscosity_coarse)(coarse_cell)=
-           viscosity_coarsen(*cell_viscosity_fine,*edge_viscosity_fine,
-                             coarse_cell*2+ip+jp);
-       }
+  for(pdat::CellIterator ci(coarse_box); ci; ci++)
+    {
+      pdat::CellIndex coarse_cell(*ci);
+
+      if(dim==2)
+        {
+          cell_viscosity_coarse(coarse_cell)=
+            viscosity_coarsen_2D(cell_viscosity_fine,*edge_viscosity_fine_2D_ptr,
+                                 coarse_cell*2+ip+jp);
+        }
+      else
+        {
+          cell_viscosity_coarse(coarse_cell)=
+            viscosity_coarsen_3D(cell_viscosity_fine,*edge_viscosity_fine_3D_ptr,
+                                 coarse_cell*2);
+        }
+    }
 }
 
 #endif
diff -r 62ac5744b300 -r b6ae952233b7 Edge_Viscosity_Coarsen.C
--- a/Edge_Viscosity_Coarsen.C	Sat Apr 16 23:06:54 2011 -0700
+++ b/Edge_Viscosity_Coarsen.C	Sat Apr 16 23:07:29 2011 -0700
@@ -34,35 +34,84 @@ void SAMRAI::geom::Edge_Viscosity_Coarse
                                       const hier::Box& coarse_box,
                                       const hier::IntVector& ratio) const
 {
-  const tbox::Dimension& dim(getDim());
+  const tbox::Dimension& dimension(getDim());
+  const int dim(dimension.getValue());
 
-  TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dim, coarse, fine, coarse_box, ratio);
+  TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dimension, coarse, fine, coarse_box, ratio);
 
   tbox::Pointer<pdat::CellData<double> >
-    cell_viscosity_fine = fine.getPatchData(cell_viscosity_id);
-  tbox::Pointer<pdat::NodeData<double> >
-    edge_viscosity_fine = fine.getPatchData(src_component);
-  tbox::Pointer<pdat::NodeData<double> >
-    edge_viscosity_coarse = coarse.getPatchData(dst_component);
+    cell_viscosity_fine_ptr = fine.getPatchData(cell_viscosity_id);
+  pdat::CellData<double> &cell_viscosity_fine(*cell_viscosity_fine_ptr);
 
-  TBOX_ASSERT(!edge_viscosity_coarse.isNull());
-  TBOX_ASSERT(!edge_viscosity_fine.isNull());
-  TBOX_ASSERT(edge_viscosity_fine->getDepth() == edge_viscosity_coarse->getDepth());
-  TBOX_ASSERT(edge_viscosity_coarse->getDepth() == 1);
+  tbox::Pointer<pdat::NodeData<double> > edge_viscosity_fine_2D_ptr;
+  tbox::Pointer<pdat::EdgeData<double> > edge_viscosity_fine_3D_ptr;
+  if(dim==2)
+    {
+      edge_viscosity_fine_2D_ptr = fine.getPatchData(src_component);
+      TBOX_ASSERT(!edge_viscosity_fine_2D_ptr.isNull());
+    }
+  else
+    {
+      edge_viscosity_fine_3D_ptr = fine.getPatchData(src_component);
+      TBOX_ASSERT(!edge_viscosity_fine_3D_ptr.isNull());
+    }
+
+  tbox::Pointer<pdat::NodeData<double> > edge_viscosity_coarse_2D_ptr;
+  tbox::Pointer<pdat::EdgeData<double> > edge_viscosity_coarse_3D_ptr;
+  if(dim==2)
+    {
+      edge_viscosity_coarse_2D_ptr = coarse.getPatchData(dst_component);
+      TBOX_ASSERT(!edge_viscosity_coarse_2D_ptr.isNull());
+      TBOX_ASSERT(edge_viscosity_fine_2D_ptr->getDepth()
+                  == edge_viscosity_coarse_2D_ptr->getDepth());
+      TBOX_ASSERT(edge_viscosity_coarse_2D_ptr->getDepth() == 1);
+    }
+  else
+    {
+      edge_viscosity_coarse_3D_ptr = coarse.getPatchData(dst_component);
+      TBOX_ASSERT(!edge_viscosity_coarse_3D_ptr.isNull());
+      TBOX_ASSERT(edge_viscosity_fine_3D_ptr->getDepth()
+                  == edge_viscosity_coarse_3D_ptr->getDepth());
+      TBOX_ASSERT(edge_viscosity_coarse_3D_ptr->getDepth() == 1);
+    }
+
 
   const tbox::Pointer<CartesianPatchGeometry> cgeom =
     coarse.getPatchGeometry();
-  hier::Index ip(1,0), jp(0,1);
-   for(int j=coarse_box.lower(1); j<=coarse_box.upper(1)+1; ++j)
-     for(int i=coarse_box.lower(0); i<=coarse_box.upper(0)+1; ++i)
-       {
-         pdat::NodeIndex coarse_edge(hier::Index(i,j),
-                                     pdat::NodeIndex::LowerLeft);
 
-         (*edge_viscosity_coarse)(coarse_edge)=
-           viscosity_coarsen(*cell_viscosity_fine,*edge_viscosity_fine,
-                             coarse_edge*2);
-       }
+  hier::Index ip(hier::Index::getZeroIndex(dimension)), jp(ip), kp(ip);
+  ip[0]=1;
+  jp[1]=1;
+  if(dim>2)
+    kp[2]=1;
+  hier::Index pp[]={ip,jp,kp};
+
+  if(dim==2)
+    {
+      for(pdat::NodeIterator ni(coarse_box); ni; ni++)
+        {
+          pdat::NodeIndex coarse_edge(*ni);
+
+          (*edge_viscosity_coarse_2D_ptr)(coarse_edge)=
+            viscosity_coarsen_2D(cell_viscosity_fine,*edge_viscosity_fine_2D_ptr,
+                                 coarse_edge*2);
+        }
+    }
+  else
+    {
+      for(int axis=0;axis<3;++axis)
+        {
+          const int axis2((axis+1)%3), axis3((axis+2)%3);
+          for(pdat::EdgeIterator ni(coarse_box,axis); ni; ni++)
+            {
+              pdat::EdgeIndex coarse_edge(*ni);
+
+              (*edge_viscosity_coarse_3D_ptr)(coarse_edge)=
+                viscosity_coarsen_3D(cell_viscosity_fine,
+                                     *edge_viscosity_fine_3D_ptr,
+                                     coarse_edge*2-pp[axis2]-pp[axis3]);
+            }
+        }
+    }
 }
-
 #endif
diff -r 62ac5744b300 -r b6ae952233b7 viscosity_coarsen.h
--- a/viscosity_coarsen.h	Sat Apr 16 23:06:54 2011 -0700
+++ b/viscosity_coarsen.h	Sat Apr 16 23:07:29 2011 -0700
@@ -32,11 +32,12 @@
 
 #include "SAMRAI/pdat/CellVariable.h"
 #include "SAMRAI/pdat/NodeVariable.h"
+#include "SAMRAI/pdat/EdgeVariable.h"
 #include "SAMRAI/hier/Index.h"
 
-inline double viscosity_coarsen(const SAMRAI::pdat::CellData<double> &cell,
-                                const SAMRAI::pdat::NodeData<double> &edge,
-                                const SAMRAI::hier::Index &fine)
+inline double viscosity_coarsen_2D(const SAMRAI::pdat::CellData<double> &cell,
+                                   const SAMRAI::pdat::NodeData<double> &edge,
+                                   const SAMRAI::hier::Index &fine)
 {
   SAMRAI::hier::Index ip(1,0), jp(0,1);
   SAMRAI::pdat::CellIndex fine_cell(fine);
@@ -48,4 +49,30 @@ inline double viscosity_coarsen(const SA
        + edge(fine_edge-jp))/16;
 }
 
+inline double viscosity_coarsen_3D(const SAMRAI::pdat::CellData<double> &cell,
+                                   const SAMRAI::pdat::EdgeData<double> &edge,
+                                   const SAMRAI::hier::Index &fine)
+{
+  SAMRAI::hier::Index ip(1,0,0), jp(0,1,0), kp(0,0,1);
+  SAMRAI::pdat::CellIndex fine_cell(fine);
+  SAMRAI::pdat::EdgeIndex
+    fine_edge_x(fine_cell,SAMRAI::pdat::EdgeIndex::X,
+                SAMRAI::pdat::EdgeIndex::LowerLeft),
+    fine_edge_y(fine_cell,SAMRAI::pdat::EdgeIndex::Y,
+                SAMRAI::pdat::EdgeIndex::LowerLeft),
+    fine_edge_z(fine_cell,SAMRAI::pdat::EdgeIndex::Z,
+                SAMRAI::pdat::EdgeIndex::LowerLeft);
+  return (cell(fine_cell)
+          + cell(fine_cell+ip)
+          + cell(fine_cell+jp)
+          + cell(fine_cell+kp)
+          + cell(fine_cell+ip+jp)
+          + cell(fine_cell+ip+kp)
+          + cell(fine_cell+jp+kp)
+          + cell(fine_cell+ip+jp+kp))/32
+    + (edge(fine_edge_x+jp+kp) + edge(fine_edge_x+ip+jp+kp)
+       + edge(fine_edge_y+ip+kp) + edge(fine_edge_y+ip+jp+kp)
+       + edge(fine_edge_z+ip+jp) + edge(fine_edge_z+ip+jp+kp))/8;
+}
+
 #endif



More information about the CIG-COMMITS mailing list