From a84ef2e75d9adfe7538fd779264e5ce7c386be43 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Sat, 22 Jan 2011 19:35:57 +0000
Subject: [PATCH] Generalize setup of the dirichletAndCouplingNodes field...

... to n continua and 1 rod.

[[Imported from SVN: r6825]]
---
 .../rodcontinuumsteklovpoincarestep.hh        | 40 ++++++++++++++-----
 1 file changed, 29 insertions(+), 11 deletions(-)

diff --git a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh
index 4f42826f..c2539c37 100644
--- a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh
+++ b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh
@@ -304,24 +304,38 @@ public:
         continua_["continuum"].dirichletValues_ = dirichletValues;
         continua_["continuum"].solver_          = solver;
         continua_["continuum"].localAssembler_  = localAssembler;
-        
+
         ////////////////////////////////////////////////////////////////////////////////////
         //  For each continuum, merge the Dirichlet boundary with all interface boundaries
         ////////////////////////////////////////////////////////////////////////////////////
-        continua_["continuum"].dirichletAndCouplingNodes_.resize(complex.continuumGrid("continuum")->size(dim));
-
-        const LeafBoundaryPatch<ContinuumGridType>& dirichletBoundary = complex.continua_.find("continuum")->second.dirichletBoundary_;
         
-        for (int i=0; i<continua_["continuum"].dirichletAndCouplingNodes_.size(); i++)
-            continua_["continuum"].dirichletAndCouplingNodes_[i] = dirichletBoundary.containsVertex(i);
+        for (ContinuumIterator cIt = continua_.begin(); cIt != continua_.end(); ++cIt) {
+            
+            // name of the current continuum
+            const std::string& name = cIt->first;
+            
+            // short-cut to avoid frequent map look-up
+            Dune::BitSetVector<dim>& dirichletAndCouplingNodes = continua_[name].dirichletAndCouplingNodes_;
+        
+            dirichletAndCouplingNodes.resize(complex.continuumGrid(name)->size(dim));
+        
+            // first copy the true Dirichlet boundary
+            const LeafBoundaryPatch<ContinuumGridType>& dirichletBoundary = complex.continua_.find(name)->second.dirichletBoundary_;
+
+            for (int i=0; i<dirichletAndCouplingNodes.size(); i++)
+                dirichletAndCouplingNodes[i] = dirichletBoundary.containsVertex(i);
 
-        const LeafBoundaryPatch<ContinuumGridType>& continuumInterfaceBoundary = complex.coupling(std::make_pair("rod","continuum")).continuumInterfaceBoundary_;
+            const LeafBoundaryPatch<ContinuumGridType>& continuumInterfaceBoundary 
+                    = complex.coupling(std::make_pair("rod",name)).continuumInterfaceBoundary_;
 
-        for (int i=0; i<continua_["continuum"].dirichletAndCouplingNodes_.size(); i++) {
-            bool v = continuumInterfaceBoundary.containsVertex(i);
-            for (int j=0; j<dim; j++)
-                continua_["continuum"].dirichletAndCouplingNodes_[i][j] = continua_["continuum"].dirichletAndCouplingNodes_[i][j] or v;
+            for (int i=0; i<dirichletAndCouplingNodes.size(); i++) {
+                bool v = continuumInterfaceBoundary.containsVertex(i);
+                for (int j=0; j<dim; j++)
+                    dirichletAndCouplingNodes[i][j] = dirichletAndCouplingNodes[i][j] or v;
+            }
+        
         }
+        
     }
     
     
@@ -380,6 +394,8 @@ private:
 
     std::map<std::string, RodData> rods_;
     
+    typedef typename std::map<std::string, RodData>::iterator RodIterator;
+    
 public:    
     /** \todo Should be part of RodData, too */
     mutable std::map<std::string, RodConfigurationType> rodSubdomainSolutions_;
@@ -412,6 +428,8 @@ private:
     }
 
     std::map<std::string, ContinuumData> continua_;
+
+    typedef typename std::map<std::string, ContinuumData>::iterator ContinuumIterator;
     
 public:
     /** \todo Should be part of ContinuumData, too */
-- 
GitLab