diff --git a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh index 89eb4f7a73de42181acd76f143a05ac0d1b02b55..152d592f65479eb3f4132cb28a018d979e04bd71 100644 --- a/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh +++ b/dune/gfe/coupling/rodcontinuumsteklovpoincarestep.hh @@ -651,6 +651,26 @@ linearizedRodNeumannToDirichletMap(const std::string& rodName, if (couplingName.first != rodName) continue; + // Transform force from canonical coordinates to coordinates given by lambda + Dune::FieldVector<double,3> canonicalForce, canonicalTorque; + for (int i=0; i<3; i++) { + canonicalForce[i] = it->second[i]; + canonicalTorque[i] = it->second[3+i]; + } + + Dune::FieldMatrix<double,3,3> orientationMatrix; + centerOfTorque.find(couplingName)->second.q.matrix(orientationMatrix); + + /** \todo Why don't we have to transform the force as well? */ + Dune::FieldVector<double,3> localForce, localTorque; + orientationMatrix.mv(canonicalTorque,localTorque); + + RigidBodyMotion<3>::TangentVector localForceTorque; + for (int i=0; i<3; i++) { + localForceTorque[i] = localForce[i]; + localForceTorque[3+i] = localTorque[i]; + } + // Use 'forceTorque' as a Neumann value for the rod const LeafBoundaryPatch<RodGridType>& interfaceBoundary = complex_.coupling(couplingName).rodInterfaceBoundary_; @@ -659,7 +679,7 @@ linearizedRodNeumannToDirichletMap(const std::string& rodName, */ for (size_t i=0; i<rhs.size(); i++) if (interfaceBoundary.containsVertex(i)) - rhs[i] += it->second; + rhs[i] += localForceTorque; } ///////////////////////////////////////////////////////////