[cig-commits] commit: Make P_MDPI_Refine more efficient
Mercurial
hg at geodynamics.org
Mon May 2 12:25:16 PDT 2011
changeset: 226:08ca3b14e5fc
user: Walter Landry <wlandry at caltech.edu>
date: Mon May 02 10:03:56 2011 -0700
files: src/P_MDPI_Refine.C
description:
Make P_MDPI_Refine more efficient
diff -r 7b489a37ae33 -r 08ca3b14e5fc src/P_MDPI_Refine.C
--- a/src/P_MDPI_Refine.C Fri Apr 29 21:02:29 2011 -0700
+++ b/src/P_MDPI_Refine.C Mon May 02 10:03:56 2011 -0700
@@ -56,8 +56,9 @@ void SAMRAI::geom::P_MDPI_Refine::refine
const hier::Box& fine_box,
const hier::IntVector& ratio) const
{
- const tbox::Dimension& dim(getDim());
- TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dim, fine_patch, coarse_patch,
+ const tbox::Dimension& dimension(getDim());
+ const int dim(dimension.getValue());
+ TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dimension, fine_patch, coarse_patch,
fine_box, ratio);
tbox::Pointer<pdat::CellData<double> >
@@ -74,7 +75,7 @@ void SAMRAI::geom::P_MDPI_Refine::refine
pdat::CellData<double> &cell_viscosity(*cell_viscosity_ptr);
tbox::Pointer<pdat::NodeData<double> > edge_viscosity2D_ptr;
tbox::Pointer<pdat::EdgeData<double> > edge_viscosity3D_ptr;
- if(dim.getValue()==2)
+ if(dim==2)
edge_viscosity2D_ptr = fine_patch.getPatchData(edge_viscosity_id);
else
edge_viscosity3D_ptr = fine_patch.getPatchData(edge_viscosity_id);
@@ -85,66 +86,67 @@ void SAMRAI::geom::P_MDPI_Refine::refine
TBOX_ASSERT(p.getDepth() == p_fine.getDepth());
#endif
- hier::Box coarse_box=coarse_patch.getBox();
tbox::Pointer<geom::CartesianPatchGeometry>
- geom = coarse_patch.getPatchGeometry();
+ geom = fine_patch.getPatchGeometry();
- hier::Box gbox=p_fine.getGhostBox();
+ const double *Dx=geom->getDx();
- double Dx[dim.getValue()];
- for(int d=0;d<dim.getValue();++d)
- Dx[d]=geom->getDx()[d];
+ hier::Box interior(p_fine.getBox());
- hier::Box gbox_interior(gbox);
- gbox_interior.grow(hier::Index::getOneIndex(dim)*(-1));
+ const hier::Box coarse_box
+ (hier::Box::coarsen(fine_box,hier::IntVector::getOne(dimension)*2));
- hier::Box cell_box(hier::Index::getZeroIndex(dim),
- hier::Index::getOneIndex(dim));
+ hier::Box cell_box(hier::Index::getZeroIndex(dimension),
+ hier::Index::getOneIndex(dimension));
- for(pdat::CellIterator ci(fine_box); ci; ci++)
+ for(pdat::CellIterator ci(coarse_box); ci; ci++)
{
- pdat::CellIndex fine(*ci);
- pdat::CellIndex
- center(hier::Index::coarsen(fine,hier::Index::getOneIndex(dim)*2));
+ pdat::CellIndex coarse(*ci);
+ pdat::CellIndex fine(coarse*2);
- if(gbox_interior.contains(fine))
+ if(interior.contains(fine))
{
- double dRc_dp_total(0), dRc_dp_fine(0);
- /* This is horribly inefficient */
+ pdat::CellData<double>
+ dRc_dp(cell_box,1,hier::Index::getZeroIndex(dimension));
+ double dRc_dp_total(0);
for(pdat::CellIterator ii(cell_box); ii; ii++)
- {
- pdat::CellIndex c_fine(center*2);
- c_fine+=(*ii);
+ {
+ pdat::CellIndex c_fine(fine+*ii);
- 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);
- }
- if(c_fine==fine)
- dRc_dp_fine=dRc_dp_weight;
+ if(dim==2)
+ {
+ pdat::SideIndex x(c_fine,0,pdat::SideIndex::Lower),
+ y(c_fine,1,pdat::SideIndex::Lower);
+ dRc_dp(*ii)=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(*ii)=dRc_dp_3D(fine_box,c_fine,cell_viscosity,
+ *edge_viscosity3D_ptr,v,Dx,pp);
+ }
+ dRc_dp_total+=dRc_dp(*ii,0);
+ }
- dRc_dp_total+=dRc_dp_weight;
- }
-
- p_fine(fine)=
- p(center)*dRc_dp_total/(4*(dim.getValue()-1)*dRc_dp_fine);
+ for(pdat::CellIterator ii(cell_box); ii; ii++)
+ {
+ pdat::CellIndex c_fine(fine+*ii);
+ p_fine(c_fine)=p(coarse)*dRc_dp_total
+ /(4*(dim-1)*dRc_dp(*ii));
+ }
}
else
{
- p_fine(fine)=p(center);
+ /* This should never be used as a real value, so we put in
+ * a bad value so that we will notice when it happens */
+ for(pdat::CellIterator ii(cell_box); ii; ii++)
+ {
+ pdat::CellIndex c_fine(fine+*ii);
+ p_fine(c_fine)=boundary_value;
+ }
}
}
}
More information about the CIG-COMMITS
mailing list