[cig-commits] commit: Add Resid_Coarsen. Seems to work well in 2D
Mercurial
hg at geodynamics.org
Tue May 3 16:19:53 PDT 2011
changeset: 239:e26fa91afe2e
user: Walter Landry <wlandry at caltech.edu>
date: Tue May 03 16:06:23 2011 -0700
files: src/Resid_Coarsen.C src/Resid_Coarsen.h src/StokesFACOps/StokesFACOps.C src/StokesFACOps/initializeOperatorState.C src/main.C wscript
description:
Add Resid_Coarsen. Seems to work well in 2D
diff -r dc0721da2891 -r e26fa91afe2e src/Resid_Coarsen.C
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Resid_Coarsen.C Tue May 03 16:06:23 2011 -0700
@@ -0,0 +1,55 @@
+#include "Resid_Coarsen.h"
+
+/**
+ * Coarsens using the viscosities as weights. So in 2D
+ resid_coarse = (resid(i,j)*viscosity(i,j)
+ + resid(i,j+1)*viscosity(i,j+1)
+ + resid(i+1,j)*viscosity(i+1,j)
+ + resid(i+1,j+1)*viscosity(i+1,j+1))/(4*viscosity_coarse)
+ */
+
+void SAMRAI::geom::Resid_Coarsen::coarsen(hier::Patch& coarse,
+ const hier::Patch& fine,
+ const int dst_component,
+ const int src_component,
+ const hier::Box& coarse_box,
+ const hier::IntVector& ratio) const
+{
+ const tbox::Dimension& dimension(getDim());
+ TBOX_DIM_ASSERT_CHECK_DIM_ARGS4(dimension, coarse, fine, coarse_box, ratio);
+ const int dim(dimension.getValue());
+
+ tbox::Pointer<pdat::CellData<double> >
+ r_fine_ptr = fine.getPatchData(src_component);
+ pdat::CellData<double> &r_fine(*r_fine_ptr);
+ tbox::Pointer<pdat::CellData<double> >
+ r_ptr = coarse.getPatchData(dst_component);
+ pdat::CellData<double> &r(*r_ptr);
+ tbox::Pointer<pdat::CellData<double> >
+ cell_viscosity_ptr = coarse.getPatchData(dst_component);
+ pdat::CellData<double> &cell_viscosity(*cell_viscosity_ptr);
+ tbox::Pointer<pdat::CellData<double> >
+ cell_viscosity_fine_ptr = fine.getPatchData(dst_component);
+ pdat::CellData<double> &cell_viscosity_fine(*cell_viscosity_fine_ptr);
+
+ TBOX_ASSERT(!r_ptr.isNull());
+ TBOX_ASSERT(!r_fine_ptr.isNull());
+ TBOX_ASSERT(r_fine.getDepth() == r.getDepth());
+ TBOX_ASSERT(r.getDepth() == 1);
+
+ hier::Box cell_box(hier::Index::getZeroIndex(dimension),
+ hier::Index::getOneIndex(dimension));
+
+ for(pdat::CellIterator ci(coarse.getBox()); ci; ci++)
+ {
+ pdat::CellIndex coarse(*ci);
+ pdat::CellIndex fine(coarse*2);
+ double temp(0);
+ for(pdat::CellIterator ii(cell_box); ii; ii++)
+ {
+ pdat::CellIndex i(*ii);
+ temp+=r_fine(fine+i)*cell_viscosity_fine(fine+i);
+ }
+ r(coarse)=temp/(4*(dim-1)*cell_viscosity(coarse));
+ }
+}
diff -r dc0721da2891 -r e26fa91afe2e src/Resid_Coarsen.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Resid_Coarsen.h Tue May 03 16:06:23 2011 -0700
@@ -0,0 +1,76 @@
+#ifndef included_geom_Resid_Coarsen
+#define included_geom_Resid_Coarsen
+
+#include "SAMRAI/xfer/CoarsenOperator.h"
+#include "SAMRAI/pdat/CellVariable.h"
+#include <string>
+
+namespace SAMRAI {
+namespace geom {
+
+/**
+ * Coarsens using the viscosities as weights. So in 2D
+ resid_coarse = (resid(i,j)*viscosity(i,j)
+ + resid(i,j+1)*viscosity(i,j+1)
+ + resid(i+1,j)*viscosity(i+1,j)
+ + resid(i+1,j+1)*viscosity(i+1,j+1))/(4*viscosity_coarse)
+ * @see xfer::CoarsenOperator
+ */
+
+class Resid_Coarsen:
+ public xfer::CoarsenOperator
+{
+public:
+ explicit Resid_Coarsen(const tbox::Dimension& dim,
+ const int &cell_viscosity):
+ xfer::CoarsenOperator(dim, "RESID_COARSEN"),
+ cell_viscosity_id(cell_viscosity)
+ {
+ d_name_id = "RESID_COARSEN";
+ }
+
+ virtual ~Resid_Coarsen(){}
+
+ bool findCoarsenOperator(const tbox::Pointer<hier::Variable>& var,
+ const std::string& op_name) const
+ {
+ TBOX_DIM_ASSERT_CHECK_ARGS2(*this, *var);
+
+ const tbox::Pointer<pdat::CellVariable<double> > cast_var(var);
+ if (!cast_var.isNull() && (op_name == d_name_id)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ const std::string& getOperatorName() const
+ {
+ return d_name_id;
+ }
+
+ int getOperatorPriority() const
+ {
+ return 0;
+ }
+
+ hier::IntVector getStencilWidth() const
+ {
+ return hier::IntVector::getZero(getDim());
+ }
+
+ void coarsen(hier::Patch& coarse,
+ const hier::Patch& fine,
+ const int dst_component,
+ const int src_component,
+ const hier::Box& coarse_box,
+ const hier::IntVector& ratio) const;
+
+private:
+ std::string d_name_id;
+ const int cell_viscosity_id;
+};
+
+}
+}
+#endif
diff -r dc0721da2891 -r e26fa91afe2e src/StokesFACOps/StokesFACOps.C
--- a/src/StokesFACOps/StokesFACOps.C Tue May 03 16:04:39 2011 -0700
+++ b/src/StokesFACOps/StokesFACOps.C Tue May 03 16:06:23 2011 -0700
@@ -56,6 +56,7 @@ namespace SAMRAI {
d_cf_discretization("Ewing"),
p_prolongation_method("P_REFINE"),
v_prolongation_method("V_REFINE"),
+ p_rrestriction_method("CONSERVATIVE_COARSEN"),
d_coarse_solver_tolerance(1.e-8),
d_coarse_solver_max_iterations(10),
d_residual_tolerance_during_smoothing(-1.0),
@@ -177,6 +178,10 @@ namespace SAMRAI {
database->getStringWithDefault("v_prolongation_method",
v_prolongation_method);
+ p_rrestriction_method =
+ database->getStringWithDefault("p_rrestriction_method",
+ p_rrestriction_method);
+
d_enable_logging =
database->getBoolWithDefault("enable_logging",
d_enable_logging);
diff -r dc0721da2891 -r e26fa91afe2e src/StokesFACOps/initializeOperatorState.C
--- a/src/StokesFACOps/initializeOperatorState.C Tue May 03 16:04:39 2011 -0700
+++ b/src/StokesFACOps/initializeOperatorState.C Tue May 03 16:06:23 2011 -0700
@@ -207,9 +207,11 @@ void SAMRAI::solv::StokesFACOps::initial
vdb->mapIndexToVariable(d_cell_scratch_id, variable);
p_urestriction_coarsen_operator =
- p_rrestriction_coarsen_operator =
geometry->lookupCoarsenOperator(variable,
"CONSERVATIVE_COARSEN");
+ p_rrestriction_coarsen_operator =
+ geometry->lookupCoarsenOperator(variable,
+ p_rrestriction_method);
vdb->mapIndexToVariable(d_side_scratch_id, variable);
v_urestriction_coarsen_operator =
diff -r dc0721da2891 -r e26fa91afe2e src/main.C
--- a/src/main.C Tue May 03 16:04:39 2011 -0700
+++ b/src/main.C Tue May 03 16:06:23 2011 -0700
@@ -34,6 +34,7 @@ using namespace std;
#include "P_Boundary_Refine.h"
#include "V_Boundary_Refine.h"
#include "V_Coarsen.h"
+#include "Resid_Coarsen.h"
#include "Cell_Viscosity_Coarsen.h"
#include "Edge_Viscosity_Coarsen.h"
#include "P_MDPI_Refine.h"
@@ -204,6 +205,9 @@ int main(
(new SAMRAI::geom::P_MDPI_Refine(dim,fac_stokes.v_id,
fac_stokes.cell_viscosity_id,
fac_stokes.edge_viscosity_id)));
+ grid_geometry->addSpatialCoarsenOperator
+ (tbox::Pointer<SAMRAI::xfer::CoarsenOperator>
+ (new SAMRAI::geom::Resid_Coarsen(dim,fac_stokes.cell_viscosity_id)));
/*
* Create the tag-and-initializer, box-generator and load-balancer
diff -r dc0721da2891 -r e26fa91afe2e wscript
--- a/wscript Tue May 03 16:04:39 2011 -0700
+++ b/wscript Tue May 03 16:06:23 2011 -0700
@@ -22,6 +22,7 @@ def build(bld):
'src/P_Refine.C',
'src/P_MDPI_Refine.C',
'src/V_Refine.C',
+ 'src/Resid_Coarsen.C',
'src/V_Coarsen/coarsen_2D.C',
'src/V_Coarsen/coarsen_3D.C',
'src/P_Boundary_Refine/refine.C',
More information about the CIG-COMMITS
mailing list