[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