[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