From 49c072c2cc47a77ae7b59615b88d43be84484c06 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Sun, 23 Jan 2011 18:18:26 +0000
Subject: [PATCH] call the linearized NtD maps for all rods/continua

[[Imported from SVN: r6854]]
---
 .../rodcontinuumsteklovpoincarestep.hh        | 125 ++++++++++++++----
 1 file changed, 98 insertions(+), 27 deletions(-)

diff --git a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh
index 50fb426b..a8dd0923 100644
--- a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh
+++ b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh
@@ -723,9 +723,6 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd
     //  Apply the preconditioner
     ///////////////////////////////////////////////////////////////
             
-    // temporary
-    std::pair<std::string,std::string> interfaceName = std::make_pair("rod","continuum");
-    
     std::map<std::pair<std::string,std::string>, RigidBodyMotion<3>::TangentVector> interfaceCorrection;
             
     if (preconditioner_=="DirichletNeumann") {
@@ -735,11 +732,28 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd
         //  of the continuum.
         ////////////////////////////////////////////////////////////////////
                 
-        interfaceCorrection = linearizedContinuumNeumannToDirichletMap("continuum",
-                                                                       continuumSubdomainSolutions_["continuum"], 
-                                                                       residualForceTorque,
-                                                                       lambda);
-                
+        for (ContinuumIterator it = continua_.begin(); it != continua_.end(); ++it) {
+        
+            const std::string& continuumName = it->first;
+    
+            std::map<std::pair<std::string,std::string>, RigidBodyMotion<3>::TangentVector> continuumInterfaceCorrection
+                    = linearizedContinuumNeumannToDirichletMap(continuumName,
+                                                               continuumSubdomainSolutions_[continuumName], 
+                                                               residualForceTorque,
+                                                               lambda);
+
+            int oldSize = interfaceCorrection.size();  // for debugging
+            interfaceCorrection.insert(continuumInterfaceCorrection.begin(), continuumInterfaceCorrection.end());
+            assert(interfaceCorrection.size() == oldSize + continuumInterfaceCorrection.size());
+        
+        }
+
+        std::cout << "resultant continuum interface corrections: " << std::endl;
+        for (ForceIterator it = interfaceCorrection.begin(); it != interfaceCorrection.end(); ++it)
+        std::cout << "    [" << it->first.first << ", " << it->first.second << "] -- "
+                  << it->second << std::endl;
+
+
     } else if (preconditioner_=="NeumannDirichlet") {
             
         ////////////////////////////////////////////////////////////////////
@@ -747,11 +761,26 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd
         //  of the rod.
         ////////////////////////////////////////////////////////////////////
         
-        interfaceCorrection = linearizedRodNeumannToDirichletMap("rod",
-                                                                 rodSubdomainSolutions_["rod"], 
-                                                                 residualForceTorque, 
-                                                                 lambda);
+        for (RodIterator it = rods_.begin(); it != rods_.end(); ++it) {
+        
+            const std::string& rodName = it->first;
+    
+            std::map<std::pair<std::string,std::string>, RigidBodyMotion<3>::TangentVector> rodInterfaceCorrection
+                    = linearizedRodNeumannToDirichletMap(rodName,
+                                                         rodSubdomainSolutions_[rodName], 
+                                                         residualForceTorque,
+                                                         lambda);
 
+            int oldSize = interfaceCorrection.size();  // for debugging
+            interfaceCorrection.insert(rodInterfaceCorrection.begin(), rodInterfaceCorrection.end());
+            assert(interfaceCorrection.size() == oldSize + rodInterfaceCorrection.size());
+        
+        }
+
+        std::cout << "resultant rod interface corrections: " << std::endl;
+        for (ForceIterator it = interfaceCorrection.begin(); it != interfaceCorrection.end(); ++it)
+        std::cout << "    [" << it->first.first << ", " << it->first.second << "] -- "
+                  << it->second << std::endl;
 
     } else if (preconditioner_=="NeumannNeumann") {
             
@@ -761,21 +790,61 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd
         //  Neumann-to-Dirichlet map of the rod.
         ////////////////////////////////////////////////////////////////////
 
-        std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> continuumCorrection 
-                    = linearizedContinuumNeumannToDirichletMap("continuum",
-                                                               continuumSubdomainSolutions_["continuum"], 
-                                                               residualForceTorque, 
-                                                               lambda);
-        std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> rodCorrection
-                    = linearizedRodNeumannToDirichletMap("rod",
-                                                         rodSubdomainSolutions_["rod"],
+        // First the rod preconditioners
+        std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> rodCorrection;
+        
+        for (RodIterator it = rods_.begin(); it != rods_.end(); ++it) {
+        
+            const std::string& rodName = it->first;
+    
+            std::map<std::pair<std::string,std::string>, RigidBodyMotion<3>::TangentVector> tmp
+                    = linearizedRodNeumannToDirichletMap(rodName,
+                                                         rodSubdomainSolutions_[rodName], 
                                                          residualForceTorque,
                                                          lambda);
+
+            int oldSize = rodCorrection.size();  // for debugging
+            rodCorrection.insert(tmp.begin(), tmp.end());
+            assert(rodCorrection.size() == oldSize + tmp.size());
+        
+        }
+
+        // Then the continuum preconditioners
+        std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> continuumCorrection;
+        
+        for (ContinuumIterator it = continua_.begin(); it != continua_.end(); ++it) {
+        
+            const std::string& continuumName = it->first;
+    
+            std::map<std::pair<std::string,std::string>, RigidBodyMotion<3>::TangentVector> tmp
+                    = linearizedContinuumNeumannToDirichletMap(continuumName,
+                                                               continuumSubdomainSolutions_[continuumName], 
+                                                               residualForceTorque,
+                                                               lambda);
+
+            int oldSize = continuumCorrection.size();  // for debugging
+            continuumCorrection.insert(tmp.begin(), tmp.end());
+            assert(continuumCorrection.size() == oldSize + tmp.size());
+        
+        }
+
+        std::cout << "resultant interface corrections: " << std::endl;
+        for (ForceIterator it = rodCorrection.begin(); it != rodCorrection.end(); ++it) {
+
+            const std::pair<std::string,std::string> interfaceName = it->first;
+        
+            std::cout << "    [" << interfaceName.first << ", " << interfaceName.second << "]"
+                      << "  -- " << it->second 
+                      << "  -- " << continuumCorrection[interfaceName] << std::endl;
+
+            // Compute weighted combination of both
+            RigidBodyMotion<3>::TangentVector& correction = interfaceCorrection[interfaceName];
+            for (int j=0; j<6; j++)
+                correction[j] = (alpha_[0] * continuumCorrection[interfaceName][j] + alpha_[1] * rodCorrection[interfaceName][j])
+                                            / alpha_[0] + alpha_[1];
                 
-        for (int j=0; j<6; j++)
-            interfaceCorrection[interfaceName][j] = (alpha_[0] * continuumCorrection[interfaceName][j] + alpha_[1] * rodCorrection[interfaceName][j])
-                                        / alpha_[0] + alpha_[1];
-                
+        }
+        
     } else if (preconditioner_=="RobinRobin") {
             
         DUNE_THROW(Dune::NotImplemented, "Robin-Robin preconditioner not implemented yet");
@@ -787,10 +856,12 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd
     //  Apply the damped correction to the current interface value
     ///////////////////////////////////////////////////////////////////////////////
                 
-    interfaceCorrection[interfaceName] *= richardsonDamping_;
     typename std::map<std::pair<std::string,std::string>,RigidBodyMotion<3> >::iterator it = lambda.begin();
-    for (; it!=lambda.end(); ++it) {
-        it->second = RigidBodyMotion<3>::exp(it->second, interfaceCorrection[interfaceName]);
+    ForceIterator fIt = interfaceCorrection.begin();
+    for (; it!=lambda.end(); ++it, ++fIt) {
+        assert(it->first == fIt->first);
+        fIt->second *= richardsonDamping_;
+        it->second = RigidBodyMotion<3>::exp(it->second, fIt->second);
     }
 }
 
-- 
GitLab