From 3d4f637b12eae725bc3dc5e9b0588cdaf8ab0cfc Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Sun, 23 Jan 2011 17:31:45 +0000 Subject: [PATCH] hand over the subdomain names to the linearized NtD maps [[Imported from SVN: r6852]] --- .../rodcontinuumsteklovpoincarestep.hh | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh index 76e4ac74..423c560c 100644 --- a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh +++ b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh @@ -95,7 +95,8 @@ private: * \return The Dirichlet value */ std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> - linearizedRodNeumannToDirichletMap(const RodConfigurationType& currentIterate, + linearizedRodNeumannToDirichletMap(const std::string& rodName, + const RodConfigurationType& currentIterate, const RigidBodyMotion<3>::TangentVector& forceTorque, const Dune::FieldVector<double,3>& centerOfTorque) const; @@ -106,7 +107,8 @@ private: * \return The infinitesimal movement of the interface */ std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> - linearizedContinuumNeumannToDirichletMap(const VectorType& currentIterate, + linearizedContinuumNeumannToDirichletMap(const std::string& continuumName, + const VectorType& currentIterate, const RigidBodyMotion<3>::TangentVector& forceTorque, const Dune::FieldVector<double,3>& centerOfTorque) const; @@ -490,11 +492,12 @@ continuumDirichletToNeumannMap(const std::string& continuumName, */ template <class RodGridType, class ContinuumGridType> std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> RodContinuumSteklovPoincareStep<RodGridType,ContinuumGridType>:: -linearizedRodNeumannToDirichletMap(const RodConfigurationType& currentIterate, +linearizedRodNeumannToDirichletMap(const std::string& rodName, + const RodConfigurationType& currentIterate, const RigidBodyMotion<3>::TangentVector& forceTorque, const Dune::FieldVector<double,3>& centerOfTorque) const { - std::pair<std::string,std::string> interfaceName = std::make_pair("rod","continuum"); + std::pair<std::string,std::string> interfaceName = std::make_pair(rodName,"continuum"); //////////////////////////////////////////////////// // Assemble the linearized rod problem @@ -504,7 +507,7 @@ linearizedRodNeumannToDirichletMap(const RodConfigurationType& currentIterate, typedef Dune::BCRSMatrix<Dune::FieldMatrix<double,6,6> > MatrixType; GeodesicFEAssembler<typename RodGridType::LeafGridView, RigidBodyMotion<3> > assembler(interface.gridView(), - rod("rod").localStiffness_); + rod(rodName).localStiffness_); MatrixType stiffnessMatrix; assembler.assembleMatrix(currentIterate, stiffnessMatrix, @@ -567,11 +570,12 @@ linearizedRodNeumannToDirichletMap(const RodConfigurationType& currentIterate, template <class RodGridType, class ContinuumGridType> std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> RodContinuumSteklovPoincareStep<RodGridType,ContinuumGridType>:: -linearizedContinuumNeumannToDirichletMap(const VectorType& currentIterate, +linearizedContinuumNeumannToDirichletMap(const std::string& continuumName, + const VectorType& currentIterate, const RigidBodyMotion<3>::TangentVector& forceTorque, const Dune::FieldVector<double,3>& centerOfTorque) const { - std::pair<std::string,std::string> interfaceName = std::make_pair("rod","continuum"); + std::pair<std::string,std::string> interfaceName = std::make_pair("rod", continuumName); //////////////////////////////////////////////////// // Assemble the linearized problem @@ -586,7 +590,7 @@ linearizedContinuumNeumannToDirichletMap(const VectorType& currentIterate, OperatorAssembler<P1Basis,P1Basis> assembler(basis, basis); MatrixType stiffnessMatrix; - assembler.assemble(*continuum("continuum").localAssembler_, stiffnessMatrix); + assembler.assemble(*continuum(continuumName).localAssembler_, stiffnessMatrix); ///////////////////////////////////////////////////////////////////// @@ -603,7 +607,7 @@ linearizedContinuumNeumannToDirichletMap(const VectorType& currentIterate, // The weak form of the volume and Neumann data /** \brief Not implemented yet! */ - VectorType rhs(complex_.continuumGrid("continuum")->size(dim)); + VectorType rhs(complex_.continuumGrid(continuumName)->size(dim)); rhs = 0; BoundaryFunctionalAssembler<P1Basis> boundaryFunctionalAssembler(basis, interface); @@ -612,16 +616,16 @@ linearizedContinuumNeumannToDirichletMap(const VectorType& currentIterate, boundaryFunctionalAssembler.assemble(localNeumannAssembler, rhs, false); // Solve the Neumann problem for the continuum - VectorType x = complex_.continuum("continuum").dirichletValues_; - assert( (dynamic_cast<LinearIterationStep<MatrixType,VectorType>* >(continuum("continuum").solver_->iterationStep_)) ); - dynamic_cast<LinearIterationStep<MatrixType,VectorType>* >(continuum("continuum").solver_->iterationStep_)->setProblem(stiffnessMatrix, x, rhs); + VectorType x = complex_.continuum(continuumName).dirichletValues_; + assert( (dynamic_cast<LinearIterationStep<MatrixType,VectorType>* >(continuum(continuumName).solver_->iterationStep_)) ); + dynamic_cast<LinearIterationStep<MatrixType,VectorType>* >(continuum(continuumName).solver_->iterationStep_)->setProblem(stiffnessMatrix, x, rhs); //solver.preprocess(); - continuum("continuum").solver_->iterationStep_->preprocess(); + continuum(continuumName).solver_->iterationStep_->preprocess(); - continuum("continuum").solver_->solve(); + continuum(continuumName).solver_->solve(); - x = continuum("continuum").solver_->iterationStep_->getSol(); + x = continuum(continuumName).solver_->iterationStep_->getSol(); // Average the continuum displacement on the coupling boundary RigidBodyMotion<3> averageInterface; @@ -731,7 +735,8 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd // of the continuum. //////////////////////////////////////////////////////////////////// - interfaceCorrection = linearizedContinuumNeumannToDirichletMap(continuumSubdomainSolutions_["continuum"], + interfaceCorrection = linearizedContinuumNeumannToDirichletMap("continuum", + continuumSubdomainSolutions_["continuum"], residualForceTorque[interfaceName], lambda[interfaceName].r); @@ -742,7 +747,8 @@ iterate(std::map<std::pair<std::string,std::string>, RigidBodyMotion<3> >& lambd // of the rod. //////////////////////////////////////////////////////////////////// - interfaceCorrection = linearizedRodNeumannToDirichletMap(rodSubdomainSolutions_["rod"], + interfaceCorrection = linearizedRodNeumannToDirichletMap("rod", + rodSubdomainSolutions_["rod"], residualForceTorque[interfaceName], lambda[interfaceName].r); @@ -755,10 +761,14 @@ 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(continuumSubdomainSolutions_["continuum"], + std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> continuumCorrection + = linearizedContinuumNeumannToDirichletMap("continuum", + continuumSubdomainSolutions_["continuum"], residualForceTorque[interfaceName], lambda[interfaceName].r); - std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> rodCorrection = linearizedRodNeumannToDirichletMap(rodSubdomainSolutions_["rod"], + std::map<std::pair<std::string,std::string>,RigidBodyMotion<3>::TangentVector> rodCorrection + = linearizedRodNeumannToDirichletMap("rod", + rodSubdomainSolutions_["rod"], residualForceTorque[interfaceName], lambda[interfaceName].r); -- GitLab