diff --git a/dirneucoupling.cc b/dirneucoupling.cc index c6f9d7e4f81f588d9bc3eb0d479699f610215671..c3016173f0a998885eaca5bbe6699f4e683757e0 100644 --- a/dirneucoupling.cc +++ b/dirneucoupling.cc @@ -643,6 +643,17 @@ int main (int argc, char *argv[]) try std::cout << "director 2: " << averageInterface.q.director(2) << std::endl; std::cout << std::endl; + ////////////////////////////////////////////////////////////// + // Compute new damped interface value + ////////////////////////////////////////////////////////////// + for (int j=0; j<dim; j++) + lambda.r[j] = (1-damping) * lambda.r[j] + + damping * (referenceInterface.r[j] + averageInterface.r[j]); + + lambda.q = Rotation<3,double>::interpolate(lambda.q, + referenceInterface.q.mult(averageInterface.q), + damping); + } else if (ddType=="RichardsonIteration") { @@ -724,6 +735,9 @@ int main (int argc, char *argv[]) try /////////////////////////////////////////////////////////////// // Apply the preconditioner /////////////////////////////////////////////////////////////// + + FieldVector<double,6> interfaceCorrection; + if (preconditioner=="DirichletNeumann") { //////////////////////////////////////////////////////////////////// @@ -737,7 +751,8 @@ int main (int argc, char *argv[]) try dirichletValues.back(), &localAssembler, solver); - FieldVector<double,6> interfaceCorrection = linContNtDMap.apply(x3d, residualForce, residualTorque, rodX[0].r); + + interfaceCorrection = linContNtDMap.apply(x3d, residualForce, residualTorque, rodX[0].r); } else if (preconditioner=="NeumannDirichlet") { @@ -751,7 +766,7 @@ int main (int argc, char *argv[]) try LinearizedRodNeumannToDirichletMap<RodGridType::LeafGridView,RodVectorType> linRodNtDMap(couplingBoundary, &rodLocalStiffness); - FieldVector<double,6> interfaceCorrection = linRodNtDMap.apply(rodX, residualForce, residualTorque, rodX[0].r); + interfaceCorrection = linRodNtDMap.apply(rodX, residualForce, residualTorque, rodX[0].r); } else if (preconditioner=="NeumannNeumann") { @@ -778,10 +793,10 @@ int main (int argc, char *argv[]) try FieldVector<double,6> continuumCorrection = linContNtDMap.apply(x3d, residualForce, residualTorque, rodX[0].r); FieldVector<double,6> rodCorrection = linRodNtDMap.apply(rodX, residualForce, residualTorque, rodX[0].r); - FieldVector<double,6> interfaceCorrection = continuumCorrection; - interfaceCorrection *= alpha[0]; - interfaceCorrection.axpy(alpha[1], rodCorrection); - interfaceCorrection /= alpha[0] + alpha[1]; + + for (int j=0; j<6; j++) + interfaceCorrection[j] = (alpha[0] * continuumCorrection[j] + alpha[1] * rodCorrection[j]) + / alpha[0] + alpha[1]; } else if (preconditioner=="RobinRobin") { @@ -790,20 +805,16 @@ int main (int argc, char *argv[]) try } else DUNE_THROW(NotImplemented, preconditioner << " is not a known preconditioner"); + /////////////////////////////////////////////////////////////////////////////// + // Apply the damped correction to the current interface value + /////////////////////////////////////////////////////////////////////////////// + + interfaceCorrection *= damping; + lambda = RigidBodyMotion<3>::exp(lambda, interfaceCorrection); + } else DUNE_THROW(NotImplemented, ddType << " is not a known domain decomposition algorithm"); - ////////////////////////////////////////////////////////////// - // Compute new damped interface value - ////////////////////////////////////////////////////////////// - for (int j=0; j<dim; j++) - lambda.r[j] = (1-damping) * lambda.r[j] - + damping * (referenceInterface.r[j] + averageInterface.r[j]); - - lambda.q = Rotation<3,double>::interpolate(lambda.q, - referenceInterface.q.mult(averageInterface.q), - damping); - std::cout << "Lambda: " << lambda << std::endl; // ////////////////////////////////////////////////////////////////////////