From 6d9353bac4e6155b89e1b9c9e553d2a32e84daa7 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Fri, 21 Jan 2011 12:17:10 +0000
Subject: [PATCH] simplification: build only the leaf Dirichlet boundary,
 instead of all level ones

[[Imported from SVN: r6813]]
---
 dirneucoupling.cc | 30 ++++++++++++------------------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/dirneucoupling.cc b/dirneucoupling.cc
index 9bcd4fa1..24ec53ef 100644
--- a/dirneucoupling.cc
+++ b/dirneucoupling.cc
@@ -143,8 +143,6 @@ int main (int argc, char *argv[]) try
     complex.rodGrids_["rod"]->globalRefine(numLevels-1);
     complex.continuumGrids_["continuum"]->globalRefine(numLevels-1);
 
-    std::vector<BitSetVector<dim> > dirichletNodes(1);
-
     RodSolutionType rodX(complex.rodGrids_["rod"]->size(1));
 
     int toplevel = complex.rodGrids_["rod"]->maxLevel();
@@ -185,23 +183,19 @@ int main (int argc, char *argv[]) try
     dirichletValues[0].resize(complex.continuumGrids_["continuum"]->size(0, dim));
     AmiraMeshReader<int>::readFunction(dirichletValues[0], path + dirichletValuesFile);
 
-    std::vector<LevelBoundaryPatch<GridType> > dirichletBoundary;
-    dirichletBoundary.resize(numLevels);
-    dirichletBoundary[0].setup(*complex.continuumGrids_["continuum"], 0);
-    readBoundaryPatch(dirichletBoundary[0], path + dirichletNodesFile);
-    PatchProlongator<GridType>::prolong(dirichletBoundary);
+    LevelBoundaryPatch<GridType> coarseDirichletBoundary;
+    coarseDirichletBoundary.setup(*complex.continuumGrids_["continuum"], 0);
+    readBoundaryPatch(coarseDirichletBoundary, path + dirichletNodesFile);
+    
+    LeafBoundaryPatch<GridType> dirichletBoundary(*complex.continuumGrids_["continuum"]);
+    PatchProlongator<GridType>::prolong(coarseDirichletBoundary, dirichletBoundary);
 
-    dirichletNodes.resize(toplevel+1);
-    for (int i=0; i<=toplevel; i++) {
-        
-        dirichletNodes[i].resize( complex.continuumGrids_["continuum"]->size(i,dim));
+    BitSetVector<dim> dirichletNodes( complex.continuumGrids_["continuum"]->size(dim) );
 
-        for (int j=0; j<complex.continuumGrids_["continuum"]->size(i,dim); j++)
-            dirichletNodes[i][j] = dirichletBoundary[i].containsVertex(j);
-        
-    }
+    for (int i=0; i<dirichletNodes.size(); i++)
+        dirichletNodes[i] = dirichletBoundary.containsVertex(i);
 
-    sampleOnBitField(*complex.continuumGrids_["continuum"], dirichletValues, dirichletNodes);
+    sampleOnBitField(*complex.continuumGrids_["continuum"], dirichletValues[0], dirichletValues.back(), dirichletNodes);
     
     /////////////////////////////////////////////////////////////////////
     //  Create the two interface boundary patches
@@ -248,7 +242,7 @@ int main (int argc, char *argv[]) try
     x3d = 0;
     for (int i=0; i<x3d.size(); i++) 
         for (int j=0; j<dim; j++)
-            if (dirichletNodes[toplevel][i][j])
+            if (dirichletNodes[i][j])
                 x3d[i][j] = dirichletValues[toplevel][i][j];
 
     // ///////////////////////////////////////////
@@ -312,7 +306,7 @@ int main (int argc, char *argv[]) try
     MultigridStep<MatrixType, VectorType> multigridStep(stiffnessMatrix3d, x3d, rhs3d, toplevel+1);
 
     multigridStep.setMGType(mu, nu1, nu2);
-    multigridStep.ignoreNodes_       = &dirichletNodes.back();
+    multigridStep.ignoreNodes_       = &dirichletNodes;
     multigridStep.basesolver_        = &baseSolver;
     multigridStep.setSmoother(&presmoother, &postsmoother);
     multigridStep.verbosity_         = Solver::QUIET;
-- 
GitLab