[cig-commits] commit: Add in missing fix_viscosity.C

Mercurial hg at geodynamics.org
Sat Mar 12 05:37:03 PST 2011


changeset:   112:1d049d0f2567
user:        Walter Landry <wlandry at caltech.edu>
date:        Thu Mar 10 16:20:02 2011 -0800
files:       FACStokes/fix_viscosity.C
description:
Add in missing fix_viscosity.C


diff -r 5816f25e3c94 -r 1d049d0f2567 FACStokes/fix_viscosity.C
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FACStokes/fix_viscosity.C	Thu Mar 10 16:20:02 2011 -0800
@@ -0,0 +1,103 @@
+#include "FACStokes.h"
+#include "SAMRAI/geom/CartesianGridGeometry.h"
+
+/* Fix the viscosity on the coarse grids by coarsening from the finer
+   grids. */
+
+void SAMRAI::FACStokes::fix_viscosity()
+{
+  const int ln_max(d_hierarchy->getFinestLevelNumber());
+
+  tbox::Pointer<xfer::CoarsenOperator> cell_viscosity_coarsen_operator;
+  tbox::Pointer<xfer::CoarsenAlgorithm> cell_viscosity_coarsen_algorithm;
+  tbox::Array<tbox::Pointer<xfer::CoarsenSchedule> >
+    cell_viscosity_coarsen_schedules;
+
+  tbox::Pointer<xfer::CoarsenOperator> edge_viscosity_coarsen_operator;
+  tbox::Pointer<xfer::CoarsenAlgorithm> edge_viscosity_coarsen_algorithm;
+  tbox::Array<tbox::Pointer<xfer::CoarsenSchedule> >
+    edge_viscosity_coarsen_schedules;
+
+  hier::VariableDatabase* vdb = hier::VariableDatabase::getDatabase();
+  tbox::Pointer<geom::CartesianGridGeometry> geometry =
+    d_hierarchy->getGridGeometry();
+  tbox::Pointer<hier::Variable> variable;
+  vdb->mapIndexToVariable(cell_viscosity_id, variable);
+  cell_viscosity_coarsen_operator =
+    geometry->lookupCoarsenOperator(variable,
+                                    "CELL_VISCOSITY_COARSEN");
+
+  vdb->mapIndexToVariable(edge_viscosity_id, variable);
+  edge_viscosity_coarsen_operator =
+    geometry->lookupCoarsenOperator(variable,
+                                    "EDGE_VISCOSITY_COARSEN");
+
+  if (!cell_viscosity_coarsen_operator) {
+    TBOX_ERROR(d_object_name
+               << ": Cannot find cell viscosity coarsening operator");
+  }
+
+  if (!edge_viscosity_coarsen_operator) {
+    TBOX_ERROR(d_object_name
+               << ": Cannot find edge viscosity coarsening operator");
+  }
+
+  cell_viscosity_coarsen_schedules.resizeArray(ln_max + 1);
+  cell_viscosity_coarsen_algorithm = new xfer::CoarsenAlgorithm(d_dim);
+  cell_viscosity_coarsen_algorithm->
+    registerCoarsen(cell_viscosity_id,cell_viscosity_id,
+                    cell_viscosity_coarsen_operator);
+
+  edge_viscosity_coarsen_schedules.resizeArray(ln_max + 1);
+  edge_viscosity_coarsen_algorithm = new xfer::CoarsenAlgorithm(d_dim);
+  edge_viscosity_coarsen_algorithm->
+    registerCoarsen(edge_viscosity_id,edge_viscosity_id,
+                    edge_viscosity_coarsen_operator);
+
+  for (int dest_ln = 0; dest_ln < ln_max; ++dest_ln) {
+    cell_viscosity_coarsen_schedules[dest_ln] =
+      cell_viscosity_coarsen_algorithm->
+      createSchedule(d_hierarchy->getPatchLevel(dest_ln),
+                     d_hierarchy->getPatchLevel(dest_ln + 1));
+    if (!cell_viscosity_coarsen_schedules[dest_ln]) {
+      TBOX_ERROR(d_object_name
+                 << ": Cannot create a coarsen schedule for cell viscosity restriction!\n");
+    }
+    edge_viscosity_coarsen_schedules[dest_ln] =
+      edge_viscosity_coarsen_algorithm->
+      createSchedule(d_hierarchy->getPatchLevel(dest_ln),
+                     d_hierarchy->getPatchLevel(dest_ln + 1));
+    if (!edge_viscosity_coarsen_schedules[dest_ln]) {
+      TBOX_ERROR(d_object_name
+                 << ": Cannot create a coarsen schedule for edge viscosity restriction!\n");
+    }
+  }
+
+  for(int dest_ln=ln_max-1; dest_ln>=0; --dest_ln)
+    {
+      {
+        xfer::CoarsenAlgorithm coarsener(d_dim);
+        coarsener.registerCoarsen(cell_viscosity_id, cell_viscosity_id,
+                                  cell_viscosity_coarsen_operator);
+        coarsener.resetSchedule(cell_viscosity_coarsen_schedules[dest_ln]);
+        cell_viscosity_coarsen_schedules[dest_ln]->coarsenData();
+        cell_viscosity_coarsen_algorithm->
+          resetSchedule(cell_viscosity_coarsen_schedules[dest_ln]);
+      }
+      {
+        xfer::CoarsenAlgorithm coarsener(d_dim);
+        coarsener.registerCoarsen(edge_viscosity_id, edge_viscosity_id,
+                                  edge_viscosity_coarsen_operator);
+        coarsener.resetSchedule(edge_viscosity_coarsen_schedules[dest_ln]);
+        edge_viscosity_coarsen_schedules[dest_ln]->coarsenData();
+        edge_viscosity_coarsen_algorithm->
+          resetSchedule(edge_viscosity_coarsen_schedules[dest_ln]);
+      }
+    }
+
+  cell_viscosity_coarsen_algorithm.setNull();
+  cell_viscosity_coarsen_schedules.setNull();
+
+  edge_viscosity_coarsen_algorithm.setNull();
+  edge_viscosity_coarsen_schedules.setNull();
+}



More information about the CIG-COMMITS mailing list