[cig-commits] commit: Make P_MDPI_Refine handle 3D

Mercurial hg at geodynamics.org
Sat Apr 16 11:08:41 PDT 2011


changeset:   167:92222e5c5cb9
user:        Walter Landry <wlandry at caltech.edu>
date:        Sat Apr 16 10:56:28 2011 -0700
files:       P_MDPI_Refine.C
description:
Make P_MDPI_Refine handle 3D


diff -r 684c3f5e7c1d -r 92222e5c5cb9 P_MDPI_Refine.C
--- a/P_MDPI_Refine.C	Sat Apr 16 10:55:59 2011 -0700
+++ b/P_MDPI_Refine.C	Sat Apr 16 10:56:28 2011 -0700
@@ -72,9 +72,12 @@ void SAMRAI::geom::P_MDPI_Refine::refine
    tbox::Pointer<pdat::CellData<double> >
      cell_viscosity_ptr = fine_patch.getPatchData(cell_viscosity_id);
    pdat::CellData<double> &cell_viscosity(*cell_viscosity_ptr);
-   tbox::Pointer<pdat::NodeData<double> >
-     edge_viscosity_ptr = fine_patch.getPatchData(edge_viscosity_id);
-   pdat::NodeData<double> &edge_viscosity(*edge_viscosity_ptr);
+   tbox::Pointer<pdat::NodeData<double> > edge_viscosity2D_ptr;
+   tbox::Pointer<pdat::EdgeData<double> > edge_viscosity3D_ptr;
+   if(dim.getValue()==2)
+     edge_viscosity2D_ptr = fine_patch.getPatchData(edge_viscosity_id);
+   else
+     edge_viscosity3D_ptr = fine_patch.getPatchData(edge_viscosity_id);
 
 #ifdef DEBUG_CHECK_ASSERTIONS
    TBOX_ASSERT(!p_ptr.isNull());
@@ -88,65 +91,71 @@ void SAMRAI::geom::P_MDPI_Refine::refine
 
    hier::Box gbox=p_fine.getGhostBox();
 
-   const double dx = geom->getDx()[0];
-   const double dy = geom->getDx()[1];
+   double Dx[dim.getValue()];
+   for(int d=0;d<dim.getValue();++d)
+     Dx[d]=geom->getDx()[d];
 
-   for(int j=fine_box.lower(1); j<=fine_box.upper(1); ++j)
-     for(int i=fine_box.lower(0); i<=fine_box.upper(0); ++i)
-       {
-         pdat::CellIndex fine(tbox::Dimension(2));
-         fine[0]=i;
-         fine[1]=j;
+   hier::Box gbox_interior(gbox);
+   gbox_interior.grow(hier::Index::getOneIndex(dim)*(-1));
 
-         pdat::CellIndex ip(fine), jp(fine);
-         ip[0]=1;
-         ip[1]=0;
-         jp[0]=0;
-         jp[1]=1;
-         pdat::CellIndex center(hier::Index::coarsen(fine,hier::Index(2,2)));
+   hier::Box cell_box(hier::Index::getZeroIndex(dim),
+                      hier::Index::getOneIndex(dim)*2);
 
-         if(fine[0]>gbox.lower(0) && fine[0]<gbox.upper(0)
-            && fine[1]>gbox.lower(1) && fine[1]<gbox.upper(1))
-           {
-             double dRc_dp_total(0), dRc_dp_fine(0);
-             /* This is horribly inefficient */
-             for(int xx=0;xx<2;++xx)
-               for(int yy=0;yy<2;++yy)
-                 {
-                   pdat::CellIndex c_fine(center*2);
-                   c_fine[0]+=xx;
-                   c_fine[1]+=yy;
+   for(pdat::CellIterator ci(fine_box); ci; ci++)
+     {
+       pdat::CellIndex fine(*ci);
+       pdat::CellIndex
+         center(hier::Index::coarsen(fine,hier::Index::getOneIndex(dim)*2));
+
+       if(gbox_interior.contains(fine))
+         {
+           double dRc_dp_total(0), dRc_dp_fine(0);
+           /* This is horribly inefficient */
+
+           for(pdat::CellIterator ii(cell_box); ii; ii++)
+               {
+                 pdat::CellIndex c_fine(center*2);
+                 c_fine+=ii;
                
-                   pdat::SideIndex x(c_fine,0,pdat::SideIndex::Lower),
-                     y(c_fine,1,pdat::SideIndex::Lower);
+                 double dRc_dp_weight;
+                 if(dim.getValue()==2)
+                   {
+                     pdat::SideIndex x(c_fine,0,pdat::SideIndex::Lower),
+                       y(c_fine,1,pdat::SideIndex::Lower);
+                     dRc_dp_weight=dRc_dp_2D(fine_box,c_fine,x,y,
+                                             cell_viscosity,
+                                             *edge_viscosity2D_ptr,v,Dx[0],Dx[1]);
+                   }
+                 else
+                   {
+                     const hier::Index ip(1,0,0), jp(0,1,0), kp(0,0,1);
+                     const hier::Index pp[]={ip,jp,kp};
+                     dRc_dp_weight=dRc_dp_3D(fine_box,c_fine,cell_viscosity,
+                                             *edge_viscosity3D_ptr,v,Dx,pp);
+                   }
 
-                   double dRc_dp_weight=
-                     dRc_dp_2D(fine_box,c_fine,x,y,
-                               cell_viscosity,edge_viscosity,v,dx,dy);
-                            
+                 if(c_fine==fine)
+                   dRc_dp_fine=dRc_dp_weight;
+                 dRc_dp_total+=dRc_dp_weight;
+               }
 
-                   if(c_fine==fine)
-                     dRc_dp_fine=dRc_dp_weight;
-                   dRc_dp_total+=dRc_dp_weight;
-                 }
+           p_fine(fine)=p(center)*dRc_dp_total/(4*dRc_dp_fine);
+         }
+       else
+         {
+           p_fine(fine)=p(center);
+         }
 
-             p_fine(fine)=p(center)*dRc_dp_total/(4*dRc_dp_fine);
-           }
-         else
-           {
-             p_fine(fine)=p(center);
-           }
+       // tbox::plog << "P_MDPI_Refine "
+       //            << fine_patch.getPatchLevelNumber() << " "
+       //            << i << " "
+       //            << j << " "
+       //            << (*p_fine)(fine) << " "
+       //            << (*p)(center) << " "
+       //            << dp_dx << " "
+       //            << dp_dy << " "
+       //            << "\n";
 
-         // tbox::plog << "P_MDPI_Refine "
-         //            << fine_patch.getPatchLevelNumber() << " "
-         //            << i << " "
-         //            << j << " "
-         //            << (*p_fine)(fine) << " "
-         //            << (*p)(center) << " "
-         //            << dp_dx << " "
-         //            << dp_dy << " "
-         //            << "\n";
-
-       }
+     }
 }
 #endif



More information about the CIG-COMMITS mailing list