131 problemStructure_->infoParameter(
false,
"Solid");
134 problemStructureNonLin_ = Teuchos::rcp(
new StructureNonLinProblem_Type( domainStructure, FETypeStructure, parameterListStructure) );
135 problemStructureNonLin_->initializeProblem();
136 problemStructureNonLin_->infoParameter(
false,
"Solid");
139 problemGeometry_ = Teuchos::rcp(
new GeometryProblem_Type( domainGeometry, FETypeGeometry, parameterListGeometry ) );
140 problemGeometry_->initializeProblem();
141 problemGeometry_->infoParameter(
false,
"Geometry");
144 meshDisplacementNew_rep_ = Teuchos::rcp(
new MultiVector_Type( this->getDomain(4)->getMapVecFieldRepeated() ) );
145 meshDisplacementOld_rep_ = Teuchos::rcp(
new MultiVector_Type( this->getDomain(4)->getMapVecFieldRepeated() ) );
146 u_rep_ = Teuchos::rcp(
new MultiVector_Type( this->getDomain(0)->getMapVecFieldRepeated() ) );
147 w_rep_ = Teuchos::rcp(
new MultiVector_Type( this->getDomain(0)->getMapVecFieldRepeated() ) );
148 u_minus_w_rep_ = Teuchos::rcp(
new MultiVector_Type( this->getDomain(0)->getMapVecFieldRepeated() ) );
151 if ( parameterListFSI->sublist(
"General").get(
"Export Extra Data",
false) ){
153 findDisplacementTurek2DBenchmark();
154 else if (this->dim_==3)
155 findDisplacementRichter3DBenchmark();
157 if ( parameterListFSI->sublist(
"General").get(
"Export drag and lift",
false) ){
158 exporterTxtDrag_ = Teuchos::rcp(
new ExporterTxt () );
159 exporterTxtDrag_->setup(
"drag_force", this->comm_ );
160 exporterTxtLift_ = Teuchos::rcp(
new ExporterTxt () );
161 exporterTxtLift_->setup(
"lift_force", this->comm_ );
163 p_rep_ = Teuchos::rcp(
new MultiVector_Type( this->getDomain(1)->getMapRepeated() ) );
171template<
class SC,
class LO,
class GO,
class NO>
172void FSI<SC,LO,GO,NO>::findDisplacementTurek2DBenchmark(){
173 valuesForExport_.resize(1);
174 vec_dbl_Type x = {0.6,0.2};
176 valuesForExport_[0] = this->getDomain(2)->findInPointsUnique( x );
179template<
class SC,
class LO,
class GO,
class NO>
180void FSI<SC,LO,GO,NO>::findDisplacementRichter3DBenchmark(){
181 valuesForExport_.resize(1);
182 vec_dbl_Type x = {0.45,0.15,0.15};
184 valuesForExport_[0] = this->getDomain(2)->findInPointsUnique( x );
187template<
class SC,
class LO,
class GO,
class NO>
188FSI<SC,LO,GO,NO>::~FSI()
190 if (!exporterGeo_.is_null()) {
191 exporterGeo_->closeExporter();
195template<
class SC,
class LO,
class GO,
class NO>
196void FSI<SC,LO,GO,NO>::info()
199 this->infoNonlinProblem();
203template<
class SC,
class LO,
class GO,
class NO>
209 std::cout <<
"-- Assembly FSI ... " << std::endl;
214 this->problemFluid_->assemble();
218 if (materialModel_==
"linear")
219 this->problemStructure_->assemble();
221 this->problemStructureNonLin_->assemble();
223 this->problemGeometry_->assemble();
225 if ( geometryExplicit_ && this->parameterList_->sublist(
"Exporter").get(
"Export GE geometry solution",
false)){
226 exporterGeo_ = Teuchos::rcp(
new Exporter_Type());
228 DomainConstPtr_Type dom = this->getDomain(4);
230 int exportEveryXTimesteps = this->parameterList_->sublist(
"Exporter").get(
"Export every X timesteps", 1 );
231 std::string suffix = this->parameterList_->sublist(
"Exporter").get(
"Geometry Suffix",
"" );
232 std::string varName =
"d_f" + suffix;
234 MeshPtr_Type meshNonConst = Teuchos::rcp_const_cast<Mesh_Type>( dom->getMesh() );
235 exporterGeo_->setup(varName, meshNonConst, dom->getFEType(), exportEveryXTimesteps, this->parameterList_);
237 MultiVectorConstPtr_Type exportVector = this->problemGeometry_->getSolution()->getBlock(0);
239 exporterGeo_->addVariable( exportVector, varName,
"Vector", this->dim_, dom->getMapUnique() );
243 if (!geometryExplicit_) {
247 this->problemGeometry_->setBoundariesSystem();
248 this->problemGeometry_->getRhs()->putScalar(0.0);
260 MatrixPtr_Type C1_T(
new Matrix_Type( this->getDomain(0)->getMapVecFieldUnique(), 1 ) );
261 MatrixPtr_Type C1(
new Matrix_Type( this->getDomain(0)->getInterfaceMapVecFieldUnique(), 1 ) );
262 MatrixPtr_Type C2(
new Matrix_Type( this->getDomain(0)->getInterfaceMapVecFieldUnique(), 1 ) );
263 MatrixPtr_Type C3_T(
new Matrix_Type( this->getDomain(2)->getMapVecFieldUnique(), 1 ) );
267 MatrixPtr_Type C4(
new Matrix_Type( this->getDomain(4)->getMapVecFieldUnique(), 1 ) );
270 this->feFactory_->assemblyFSICoupling(this->dim_, this->domain_FEType_vec_.at(0), C1, C1_T, 0, 0,
271 this->getDomain(0)->getInterfaceMapVecFieldUnique(), this->getDomain(0)->getMapVecFieldUnique(),
true);
276 this->feFactory_->assemblyFSICoupling(this->dim_, this->domain_FEType_vec_.at(2), C2, C3_T, 0, 2,
277 this->getDomain(0)->getInterfaceMapVecFieldUnique(), this->getDomain(2)->getMapVecFieldUnique(),
true);
281 if(!geometryExplicit_)
285 this->feFactory_->assemblyGeometryCoupling(this->dim_, this->domain_FEType_vec_.at(4), C4, 4,
286 this->getDomain(0)->getGlobalInterfaceMapUnique(),
287 this->getDomain(2)->getMapVecFieldUnique(),
288 this->getDomain(4)->getMapVecFieldUnique(),
true);
291 MatrixPtr_Type dummyC;
293 if ( !this->getDomain(0)->getGlobalInterfaceMapVecFieldPartial().is_null() ) {
294 dummyC.reset(
new Matrix_Type( this->getDomain(0)->getInterfaceMapVecFieldUnique(), 1 ) );
295 this->feFactory_->assemblyDummyCoupling(this->dim_, this->domain_FEType_vec_.at(0), dummyC, 0,
true);
301 double dt = this->parameterList_->sublist(
"Timestepping Parameter").get(
"dt",0.02);
306 C2->scale( -(1.0/dt) );
311 C2->fillComplete(this->getDomain(2)->getMapVecFieldUnique(), this->getDomain(0)->getInterfaceMapVecFieldUnique());
312 C3_T->fillComplete(this->getDomain(0)->getInterfaceMapVecFieldUnique(), this->getDomain(2)->getMapVecFieldUnique());
318 if(!geometryExplicit_)
323 C4->fillComplete(this->getDomain(2)->getMapVecFieldUnique(), this->getDomain(4)->getMapVecFieldUnique());
331 if(geometryExplicit_)
332 this->system_.reset(
new BlockMatrix_Type(4));
334 this->system_.reset(
new BlockMatrix_Type(5));
337 this->system_->addBlock( this->problemFluid_->system_->getBlock(0,0), 0, 0 );
338 this->system_->addBlock( this->problemFluid_->system_->getBlock(0,1), 0, 1 );
339 this->system_->addBlock( this->problemFluid_->system_->getBlock(1,0), 1, 0 );
340 if (this->getDomain(0)->getFEType()==
"P1")
341 this->system_->addBlock( this->problemFluid_->system_->getBlock(1,1), 1, 1 );
344 if (materialModel_==
"linear")
345 this->system_->addBlock( this->problemStructure_->system_->getBlock(0,0), 2, 2 );
347 this->system_->addBlock( this->problemStructureNonLin_->system_->getBlock(0,0), 2, 2 );
349 this->system_->addBlock( C1_T, 0, 3 );
350 this->system_->addBlock( C3_T, 2, 3 );
351 this->system_->addBlock( C1, 3, 0 );
352 this->system_->addBlock( C2, 3, 2 );
354 if (!dummyC.is_null())
355 this->system_->addBlock( dummyC, 3, 3 );
357 if(!geometryExplicit_)
360 this->system_->addBlock( this->problemGeometry_->system_->getBlock(0,0), 4, 4 );
362 this->system_->addBlock( C4, 4, 2 );
373 this->setFromPartialVectorsInit();
376 timeSteppingTool_ = Teuchos::rcp(
new TimeSteppingTools(sublist(this->parameterList_,
"Timestepping Parameter") , this->comm_));
377 ParameterListPtr_Type plStructure;
378 if (materialModel_==
"linear")
379 plStructure = this->problemStructure_->getParameterList();
381 plStructure = this->problemStructureNonLin_->getParameterList();
383 setupSubTimeProblems(this->problemFluid_->getParameterList(), plStructure);
387 std::cout <<
"done -- " << std::endl;
395template<
class SC,
class LO,
class GO,
class NO>
396void FSI<SC,LO,GO,NO>::reAssemble(std::string type)
const
399 double dt = this->parameterList_->sublist(
"Timestepping Parameter").get(
"dt",0.02);
402 double density = this->problemFluid_->getParameterList()->sublist(
"Parameter").get(
"Density",1.);
403 double viscosity = this->problemFluid_->getParameterList()->sublist(
"Parameter").get(
"Viscosity",1.);
405 if(type ==
"UpdateMeshDisplacement")
408 std::cout <<
"-- Reassembly (UpdateMeshDisplacement)" <<
'\n';
412 updateMeshDisplacement();
416 if(type ==
"SolveGeometryProblem")
419 std::cout <<
"-- Reassembly (SolveGeometryProblem)" <<
'\n';
421 solveGeometryProblem();
425 if(type ==
"UpdateTime")
428 std::cout <<
"-- Reassembly (UpdateTime)" <<
'\n';
434 if(type ==
"UpdateFluidInTime")
437 std::cout <<
"-- Reassembly (UpdateFluidInTime)" <<
'\n';
443 if(type ==
"MoveMesh")
446 std::cout <<
"-- Reassembly (MoveMesh)" <<
'\n';
452 if(type ==
"AddInterfaceBlockRHS")
455 std::cout <<
"-- Reassembly (AddInterfaceBlockRHS)" <<
'\n';
457 addInterfaceBlockRHS();
461 if(type ==
"ComputeFluidRHSInTime")
464 std::cout <<
"-- Reassembly (ComputeFluidRHSInTime)" <<
'\n';
466 computeFluidRHSInTime( );
469 if(type ==
"ComputeSolidRHSInTime")
472 std::cout <<
"-- Reassembly (ComputeSolidRHSInTime)" <<
'\n';
474 computeSolidRHSInTime( );
477 if(type ==
"ComputePressureRHSInTime")
480 std::cout <<
"-- Reassembly (ComputePressureRHSInTime)" <<
'\n';
482 computePressureRHSInTime();
490 MultiVectorConstPtr_Type fluidSolution = this->solution_->getBlock(0);
491 u_rep_->importFromVector(fluidSolution,
true);
492 u_minus_w_rep_->importFromVector(fluidSolution,
true);
494 MultiVectorConstPtr_Type geometrySolution;
495 if(geometryExplicit_)
497 geometrySolution = this->problemGeometry_->getSolution()->getBlock(0);
501 geometrySolution = this->solution_->getBlock(4);
503 meshDisplacementNew_rep_->importFromVector(geometrySolution,
true);
505 *w_rep_ = *meshDisplacementNew_rep_;
506 w_rep_->update(-1.0, *meshDisplacementOld_rep_, 1.0);
507 w_rep_->scale( 1.0/dt );
509 u_minus_w_rep_->update( -1.0, *w_rep_, 1.0 );
512 MultiVectorConstPtr_Type pressureSolution = this->solution_->getBlock(1);
513 p_rep_->importFromVector(pressureSolution,
true);
521 if(type ==
"ForTime")
524 std::cout <<
"-- Reassembly (ForTime)" <<
'\n';
527 if(geometryExplicit_)
534 this->problemFluid_->assembleConstantMatrices();
537 P_.reset(
new Matrix_Type( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getDimension() * this->getDomain(0)->getApproxEntriesPerRow() ) );
545 this->feFactory_->assemblyAdditionalConvection( this->dim_, this->domain_FEType_vec_.at(0), P_, w_rep_,
true );
550 P_->fillComplete( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getMapVecFieldUnique());
555 this->system_->addBlock( this->problemFluid_->system_->getBlock(0,1), 0, 1 );
556 this->system_->addBlock( this->problemFluid_->system_->getBlock(1,0), 1, 0 );
557 if (this->problemFluid_->system_->blockExists(1,1))
558 this->system_->addBlock( this->problemFluid_->system_->getBlock(1,1), 1, 1 );
569 MatrixPtr_Type APNW = Teuchos::rcp(
new Matrix_Type( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getDimension() * this->getDomain(0)->getApproxEntriesPerRow() ) );
571 if(geometryExplicit_)
574 if(type ==
"FixedPoint")
576 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"should always be called by the residual and never here.");
578 else if(type ==
"Newton")
581 std::cout <<
"-- Reassembly GE (Newton)" <<
'\n';
582 std::cout <<
"-- Reassembly GE (Newton) ... full reassembly" <<
'\n';
585 problemFluid_->reAssemble(
"Newton" );
587 if (materialModel_ !=
"linear")
588 this->problemStructureNonLin_->reAssemble(
"Newton");
594 if(type ==
"FixedPoint")
596 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"should always be called by the residual and never here.");
598 else if(type ==
"Newton")
601 std::cout <<
"-- Reassembly GI (Newton)" <<
'\n';
602 std::cout <<
"-- Reassembly GI (Newton) ... only W" <<
'\n';
605 problemFluid_->reAssemble(
"Newton" );
609 MatrixPtr_Type shapeVelocity = Teuchos::rcp(
new Matrix_Type( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getDimension() * this->getDomain(0)->getApproxEntriesPerRow() ) );
610 MatrixPtr_Type shapeDiv = Teuchos::rcp(
new Matrix_Type( this->getDomain(1)->getMapUnique(), this->getDomain(1)->getDimension() * this->getDomain(1)->getApproxEntriesPerRow() ) );
612 this->feFactory_->assemblyShapeDerivativeVelocity(this->dim_, this->domain_FEType_vec_.at(4), this->domain_FEType_vec_.at(1),
613 shapeVelocity, 4, u_rep_, w_rep_, p_rep_, dt, density, viscosity,
true);
614 this->feFactory_->assemblyShapeDerivativeDivergence(this->dim_, this->domain_FEType_vec_.at(4), this->domain_FEType_vec_.at(1),
615 shapeDiv, 1, 4, this->getDomain(1)->getMapUnique(), this->getDomain(4)->getMapVecFieldUnique(), u_rep_,
true);
616 shapeDiv->resumeFill();
617 shapeDiv->scale(-1.0);
618 shapeDiv->fillComplete(this->getDomain(4)->getMapVecFieldUnique(), this->getDomain(1)->getMapUnique());
621 this->system_->addBlock(shapeVelocity, 0, 4);
622 this->system_->addBlock(shapeDiv, 1, 4);
624 if (materialModel_ !=
"linear")
625 this->problemStructureNonLin_->reAssemble(
"Newton");
630 this->system_->addBlock( problemFluid_->getSystem()->getBlock( 0, 0 ), 0, 0 );
632 if (materialModel_ !=
"linear")
633 this->system_->addBlock( this->problemStructureNonLin_->getSystem()->getBlock(0,0), 2, 2 );
636template<
class SC,
class LO,
class GO,
class NO>
637void FSI<SC,LO,GO,NO>::reAssembleExtrapolation(BlockMultiVectorPtrArray_Type previousSolutions)
639 std::cout <<
"FSI<SC,LO,GO,NO>::reAssembleExtrapolation(BlockMultiVectorPtrArray_Type previousSolutions)"<< std::endl;
739template<
class SC,
class LO,
class GO,
class NO>
743 MultiVectorConstPtr_Type geometrySolution;
745 if(geometryExplicit_)
746 geometrySolution = this->problemGeometry_->getSolution()->getBlock(0);
749 geometrySolution = this->solution_->getBlock(4);
752 meshDisplacementNew_rep_->importFromVector(geometrySolution,
true);
754 MultiVectorConstPtr_Type fluidSolution = this->solution_->getBlock(0);
755 u_rep_->importFromVector(fluidSolution,
true);
756 u_minus_w_rep_->importFromVector(fluidSolution,
true);
758 *w_rep_ = *meshDisplacementNew_rep_;
759 w_rep_->update(-1.0, *meshDisplacementOld_rep_, 1.0);
760 double dt = this->parameterList_->sublist(
"Timestepping Parameter").get(
"dt",0.02);
761 w_rep_->scale(1.0/dt);
763 u_minus_w_rep_->update(-1.0, *w_rep_, 1.0);
765 if (!geometryExplicit_) {
767 P_.reset(
new Matrix_Type( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getDimension() * this->getDomain(0)->getApproxEntriesPerRow() ) );
768 double density = this->problemTimeFluid_->getParameterList()->sublist(
"Parameter").get(
"Density",1000.e-0);
770 this->feFactory_->assemblyAdditionalConvection( this->dim_, this->domain_FEType_vec_.at(0), P_, w_rep_,
true );
774 P_->fillComplete( this->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getMapVecFieldUnique());
776 problemFluid_->assembleConstantMatrices();
778 this->system_->addBlock( this->problemFluid_->system_->getBlock(0,1), 0, 1 );
779 this->system_->addBlock( this->problemFluid_->system_->getBlock(1,0), 1, 0 );
780 if (this->problemFluid_->system_->blockExists(1,1))
781 this->system_->addBlock( this->problemFluid_->system_->getBlock(1,1), 1, 1 );
784 if ( this->verbose_ )
785 std::cout <<
"Warning: Wrong consideration of temporal discretization for multi-stage RK methods!" << std::endl;
787 this->problemFluid_->calculateNonLinResidualVecWithMeshVelo(
"reverse", time, u_minus_w_rep_, P_ );
788 this->system_->addBlock( problemFluid_->getSystem()->getBlock( 0, 0 ), 0, 0 );
791 if (materialModel_!=
"linear"){
792 this->problemStructureNonLin_->calculateNonLinResidualVec(
"reverse", time );
793 this->residualVec_->addBlock( this->problemStructureNonLin_->getResidualVector()->getBlockNonConst(0) , 2);
797 MultiVectorPtr_Type residualSolidFSI =
798 Teuchos::rcp_const_cast<MultiVector_Type>( this->residualVec_->getBlock(2) );
799 this->problemStructure_->getSystem()->getBlock(0,0)->apply( *this->problemStructure_->getSolution()->getBlock(0), *residualSolidFSI, Teuchos::NO_TRANS, -1. );
800 MultiVectorPtr_Type resSolidNonConst = Teuchos::rcp_const_cast<MultiVector_Type> ( this->residualVec_->getBlock(2) );
801 resSolidNonConst->update(1., *this->problemStructure_->getRhs()->getBlock(0), 1.);
805 MultiVectorPtr_Type residualFluidVelocityFSI =
806 Teuchos::rcp_const_cast<MultiVector_Type>( this->residualVec_->getBlock(0) );
808 MultiVectorPtr_Type residualSolidFSI =
809 Teuchos::rcp_const_cast<MultiVector_Type>( this->residualVec_->getBlock(2) );
811 MultiVectorPtr_Type residualCouplingFSI =
812 Teuchos::rcp_const_cast<MultiVector_Type>( this->residualVec_->getBlock(3) );
813 residualCouplingFSI->update( 1. , *this->rhs_->getBlock(3), 0. );
817 this->system_->getBlock(0,3)->apply( *this->solution_->getBlock(3) , *residualFluidVelocityFSI, Teuchos::NO_TRANS, -1., 1. );
820 this->system_->getBlock(2,3)->apply( *this->solution_->getBlock(3) , *residualSolidFSI, Teuchos::NO_TRANS, -1., 1. );
823 this->system_->getBlock(3,0)->apply( *this->solution_->getBlock(0) , *residualCouplingFSI, Teuchos::NO_TRANS, -1., 1. );
826 this->system_->getBlock(3,2)->apply( *this->solution_->getBlock(2) , *residualCouplingFSI, Teuchos::NO_TRANS, -1., 1. );
828 if (!geometryExplicit_) {
830 MultiVectorPtr_Type residualGeometryFSI =
831 Teuchos::rcp_const_cast<MultiVector_Type>( this->residualVec_->getBlock(4) );
833 residualGeometryFSI->update( 1. , *this->rhs_->getBlock(4), 0. );
835 this->system_->getBlock(4,4)->apply( *this->solution_->getBlock(4) , *residualGeometryFSI, Teuchos::NO_TRANS, -1., 1. );
837 this->system_->getBlock(4,2)->apply( *this->solution_->getBlock(2) , *residualGeometryFSI, Teuchos::NO_TRANS, -1., 1. );
841 if (type ==
"reverse")
842 this->bcFactory_->setBCMinusVector( this->residualVec_, this->solution_, time );
843 else if (type ==
"standard"){
844 this->residualVec_->scale(-1.);
845 this->bcFactory_->setVectorMinusBC( this->residualVec_, this->solution_, time );
851template <
class SC,
class LO,
class GO,
class NO>
857 bool geometryExplicit = this->parameterList_->sublist(
"Parameter").get(
"Geometry Explicit",
true);
858 if( !geometryExplicit ) {
859 MatrixPtr_Type massmatrix;
860 this->setFluidMassmatrix( massmatrix );
861 systemMass->addBlock( massmatrix, 0, 0 );
873template<
class SC,
class LO,
class GO,
class NO>
874void FSI<SC,LO,GO,NO>::setFromPartialVectorsInit()
const
878 this->solution_->addBlock( this->problemFluid_->getSolution()->getBlockNonConst(0), 0 );
879 this->residualVec_->addBlock( this->problemFluid_->getResidualVector()->getBlockNonConst(0), 0 );
880 this->residualVec_->addBlock( this->problemFluid_->getResidualVector()->getBlockNonConst(0), 0 );
881 this->rhs_->addBlock( this->problemFluid_->getRhs()->getBlockNonConst(0), 0 );
882 this->sourceTerm_->addBlock( this->problemFluid_->getSourceTerm()->getBlockNonConst(0), 0 );
885 this->solution_->addBlock( this->problemFluid_->getSolution()->getBlockNonConst(1), 1 );
886 this->residualVec_->addBlock( this->problemFluid_->getResidualVector()->getBlockNonConst(1), 1 );
887 this->rhs_->addBlock( this->problemFluid_->getRhs()->getBlockNonConst(1), 1 );
888 this->previousSolution_->addBlock( this->problemFluid_->getPreviousSolution()->getBlockNonConst(1), 1 );
889 this->sourceTerm_->addBlock( this->problemFluid_->getSourceTerm()->getBlockNonConst(1), 1 );
891 if (materialModel_==
"linear"){
892 this->solution_->addBlock( this->problemStructure_->getSolution()->getBlockNonConst(0), 2 );
894 this->rhs_->addBlock( this->problemStructure_->getRhs()->getBlockNonConst(0), 2 );
895 this->sourceTerm_->addBlock( this->problemStructure_->getSourceTerm()->getBlockNonConst(0), 2 );
898 this->solution_->addBlock( this->problemStructureNonLin_->getSolution()->getBlockNonConst(0), 2 );
899 this->residualVec_->addBlock( this->problemStructureNonLin_->getResidualVector()->getBlockNonConst(0), 2 );
900 this->rhs_->addBlock( this->problemStructureNonLin_->getRhs()->getBlockNonConst(0), 2 );
901 this->previousSolution_->addBlock( this->problemStructureNonLin_->getPreviousSolution()->getBlockNonConst(0), 2 );
902 this->sourceTerm_->addBlock( this->problemStructureNonLin_->getSourceTerm()->getBlockNonConst(0), 2 );
905 if(!geometryExplicit_){
906 this->solution_->addBlock( this->problemGeometry_->getSolution()->getBlockNonConst(0), 4 );
908 this->rhs_->addBlock( this->problemGeometry_->getRhs()->getBlockNonConst(0), 4 );
909 this->sourceTerm_->addBlock( this->problemGeometry_->getSourceTerm()->getBlockNonConst(0), 4 );
913template<
class SC,
class LO,
class GO,
class NO>
914void FSI<SC,LO,GO,NO>::updateMeshDisplacement()
const
917 *meshDisplacementOld_rep_ = *meshDisplacementNew_rep_;
922template<
class SC,
class LO,
class GO,
class NO>
923void FSI<SC,LO,GO,NO>::solveGeometryProblem()
const
925 DomainPtr_Type domainFluid = Teuchos::rcp_const_cast<Domain_Type>(this->getDomain(0));
926 DomainPtr_Type domainStruct = Teuchos::rcp_const_cast<Domain_Type>(this->getDomain(2));
929 MapConstPtr_Type interfaceMapFluidVecField = domainFluid->getInterfaceMapVecFieldUnique();
930 MapConstPtr_Type interfaceMapStructureVecField = domainStruct->getInterfaceMapVecFieldUnique();
932 MapConstPtr_Type interfaceMapGlobalFluidVecField = domainFluid->getGlobalInterfaceMapVecFieldUnique();
933 MapConstPtr_Type interfaceMapGlobalStructureVecField = domainStruct->getGlobalInterfaceMapVecFieldUnique();
935 MeshUnstrPtr_Type meshUnstructuredFluid = Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainFluid->getMesh() );
936 vec3D_GO_ptr_Type indicesGlobalMatchedOriginFluid = meshUnstructuredFluid->getMeshInterface()->getIndicesGlobalMatchedOrigin();
939 MultiVectorConstPtr_Type struc_sol_unique = this->solution_->getBlock(2);
942 MultiVectorPtr_Type interfaceSolutionStruct = Teuchos::rcp(
new MultiVector_Type( interfaceMapStructureVecField, 1 ) );
946 Teuchos::ArrayRCP< SC > valuesInterface = interfaceSolutionStruct->getDataNonConst(0);
947 Teuchos::ArrayRCP< SC > valuesStructure = struc_sol_unique->getDataNonConst(0);
949 for(UN i = 0; i < valuesInterface.size(); i++)
951 GO interfaceIDGlobal = interfaceMapGlobalStructureVecField->getGlobalElement( i );
971 LO localInterfaceIDinStructure = domainStruct->getMapVecFieldUnique()->getLocalElement(interfaceIDGlobal);
973 valuesInterface[i] = valuesStructure[localInterfaceIDinStructure];
977 MultiVectorPtr_Type interfaceSolutionFluid = Teuchos::rcp(
new MultiVector_Type( interfaceMapFluidVecField, 1 ) );
978 interfaceSolutionFluid->importFromVector( interfaceSolutionStruct );
982 this->problemGeometry_->setBoundariesSystem();
983 this->problemGeometry_->getRhs()->putScalar(0.0);
985 Teuchos::ArrayRCP< SC > valuesInterface = interfaceSolutionFluid->getDataNonConst(0);
986 Teuchos::ArrayRCP< SC > valuesFluidRhs = this->problemGeometry_->getRhs()->getBlock(0)->getDataNonConst(0);
989 for(UN i = 0; i < valuesInterface.size(); i++)
991 GO interfaceIDGlobal = interfaceMapGlobalFluidVecField->getGlobalElement( i );
1012 LO localInterfaceIDinFluid = domainFluid->getMapVecFieldUnique()->getLocalElement(interfaceIDGlobal);
1014 valuesFluidRhs[localInterfaceIDinFluid] = valuesInterface[i];
1019 this->problemGeometry_->solve();
1021 if (!exporterGeo_.is_null())
1022 this->exporterGeo_->save( this->timeSteppingTool_->currentTime() );
1032template<
class SC,
class LO,
class GO,
class NO>
1033void FSI<SC,LO,GO,NO>::setupSubTimeProblems(ParameterListPtr_Type parameterListFluid, ParameterListPtr_Type parameterListStructure)
const
1036 std::cout <<
"-- Setup FSI Sub-TimeProblems \n" << std::flush;
1038 double dt = timeSteppingTool_->get_dt();
1039 double beta = timeSteppingTool_->get_beta();
1041 int sizeFluid = this->problemFluid_->getSystem()->size();
1043 if (materialModel_==
"linear")
1044 sizeStructure = this->problemStructure_->getSystem()->size();
1046 sizeStructure = this->problemStructureNonLin_->getSystem()->size();
1048 problemTimeFluid_.reset(
new TimeProblem<SC,LO,GO,NO>(*this->problemFluid_, this->comm_));
1049 if (materialModel_==
"linear")
1050 problemTimeStructure_.reset(
new TimeProblem<SC,LO,GO,NO>(*this->problemStructure_, this->comm_));
1052 problemTimeStructure_.reset(
new TimeProblem<SC,LO,GO,NO>(*this->problemStructureNonLin_, this->comm_));
1057 SmallMatrix<double> massCoeffFluid(sizeFluid);
1058 SmallMatrix<double> problemCoeffFluid(sizeFluid);
1059 SmallMatrix<int> defFluid(sizeFluid);
1061 double coeffSourceTermFluid = 0.0;
1062 if ( this->getParameterList()->sublist(
"Timestepping Parameter").get(
"Class",
"Multistep") ==
"Multistep" ) {
1063 for (
int i=0; i<sizeFluid; i++) {
1064 for (
int j=0; j<sizeFluid; j++) {
1065 if ((*defTS_)[i][j]==1 && i==j) {
1067 massCoeffFluid[i][j] = timeSteppingTool_->getInformationBDF(0) / dt;
1070 massCoeffFluid[i][j] = 0.0;
1074 for (
int i=0; i<sizeFluid; i++) {
1075 for (
int j=0; j<sizeFluid; j++){
1076 if ((*defTS_)[i][j]==1){
1077 problemCoeffFluid[i][j] = timeSteppingTool_->getInformationBDF(1);
1078 coeffSourceTermFluid = timeSteppingTool_->getInformationBDF(1);
1081 problemCoeffFluid[i][j] = 1.;
1085 this->problemTimeFluid_->setTimeDef(defFluid);
1086 this->problemTimeFluid_->setTimeParameters(massCoeffFluid,problemCoeffFluid);
1089 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Implement other FSI fluid time stepping than BDF.");
1095 SmallMatrix<double> massCoeffStructure(sizeStructure);
1096 SmallMatrix<double> problemCoeffStructure(sizeStructure);
1097 SmallMatrix<int> defStructure(sizeStructure);
1098 double coeffSourceTermStructure = 0.0;
1101 for(
int i = 0; i < sizeStructure; i++)
1103 for(
int j = 0; j < sizeStructure; j++)
1107 if((*defTS_)[i + sizeFluid][j + sizeFluid] == 1 && i == j)
1109 defStructure[i][j] = 1;
1111 massCoeffStructure[i][j] = 1.0/(dt*dt*beta);
1115 massCoeffStructure[i][j] = 0.;
1121 for(
int i = 0; i < sizeStructure; i++)
1123 for(
int j = 0; j < sizeStructure; j++)
1125 if((*defTS_)[i + sizeFluid][j + sizeFluid] == 1)
1127 problemCoeffStructure[i][j] = 1.0;
1129 coeffSourceTermStructure = 1.0;
1133 problemCoeffStructure[i][j] = 1.0;
1137 this->problemTimeStructure_->setTimeDef(defStructure);
1138 this->problemTimeStructure_->setTimeParameters(massCoeffStructure,problemCoeffStructure);
1140 this->problemTimeFluid_->assemble(
"MassSystem" );
1141 this->problemTimeStructure_->assemble(
"MassSystem" );
1145template<
class SC,
class LO,
class GO,
class NO>
1146void FSI<SC,LO,GO,NO>::setFluidMassmatrix( MatrixPtr_Type& massmatrix )
const
1151 double density = this->problemTimeFluid_->getParameterList()->sublist(
"Parameter").get(
"Density",1000.e-0);
1152 int size = this->problemTimeFluid_->getSystem()->size();
1154 this->problemTimeFluid_->systemMass_.reset(
new BlockMatrix_Type(size));
1156 massmatrix = Teuchos::rcp(
new Matrix_Type( this->problemTimeFluid_->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getApproxEntriesPerRow() ) );
1158 this->feFactory_->assemblyMass( this->dim_, this->problemTimeFluid_->getFEType(0),
"Vector", massmatrix, 0,
true );
1159 massmatrix->resumeFill();
1160 massmatrix->scale(density);
1161 massmatrix->fillComplete( this->problemTimeFluid_->getDomain(0)->getMapVecFieldUnique(), this->problemTimeFluid_->getDomain(0)->getMapVecFieldUnique() );
1163 this->problemTimeFluid_->systemMass_->addBlock(massmatrix, 0, 0);
1170template<
class SC,
class LO,
class GO,
class NO>
1171void FSI<SC,LO,GO,NO>::computePressureRHSInTime()
const{
1174 std::string pressureRB = this->parameterList_->sublist(
"Parameter Fluid").get(
"Pressure Boundary Condition",
"None");
1183 if (pressureRB ==
"Resistance")
1186 std::cout <<
" --- Computing resistance boundary condition .. " << std::endl;
1189 MultiVectorPtr_Type FERhs = Teuchos::rcp(
new MultiVector_Type( this->getDomain(0)->getMapVecFieldRepeated() ));
1192 vec_dbl_Type funcParameter(1,0.);
1193 funcParameter[0] = timeSteppingTool_->t_;
1196 int flagInlet =this->parameterList_->sublist(
"General").get(
"Flag Inlet Fluid", 4);
1197 int flagOutlet = this->parameterList_->sublist(
"General").get(
"Flag Outlet Fluid", 5);
1200 if (timeSteppingTool_->currentTime()==0.) {
1201 double flowRateInlet_n_1 = 0.;
1202 this->feFactory_->assemblyFlowRate(this->dim_, flowRateInlet_n_1, this->getDomain(0)->getFEType() , this->dim_, flagOutlet , u_rep_);
1203 flowRateOutlet_n_1_ = flowRateInlet_n_1;
1217 double flowRateInlet_n = 0.;
1218 this->feFactory_->assemblyFlowRate(this->dim_, flowRateInlet_n, this->getDomain(0)->getFEType() , this->dim_, flagOutlet , u_rep_);
1219 flowRateOutlet_n_ = flowRateInlet_n;
1221 vec_dbl_Type flowRateOutlet_timesteps(2);
1222 flowRateOutlet_timesteps[0] = flowRateOutlet_n_1_;
1223 flowRateOutlet_timesteps[1] = flowRateOutlet_n_;
1225 MultiVectorConstPtr_Type u = this->solution_->getBlock(0);
1226 u_rep_->importFromVector(u,
true);
1229 pressureOutlet_ = this->feFactory_->assemblyResistanceBoundary(this->dim_, this->getDomain(0)->getFEType(),FERhs, u_rep_,flowRateOutlet_timesteps, funcParameter, pressureRamp,this->parameterList_,0);
1231 flowRateOutlet_n_1_ = flowRateOutlet_n_;
1233 this->sourceTerm_->getBlockNonConst(0)->exportFromVector( FERhs,
false,
"Add" );
1241 double coeffSourceTermStructure = 1.0;
1246 this->problemTimeFluid_->getRhs()->getBlockNonConst(0)->update(coeffSourceTermStructure, *this->sourceTerm_->getBlockNonConst(0), 1.);
1247 this->rhs_->addBlock( this->problemTimeFluid_->getRhs()->getBlockNonConst(0), 0 );
1250 std::cout <<
" .. done " << std::endl;
1257 if (pressureRB ==
"Absorbing" || pressureRB ==
"Absorbing Paper")
1260 std::cout <<
" Computing absorbing boundary condition .. " << std::endl;
1262 MultiVectorPtr_Type FERhs = Teuchos::rcp(
new MultiVector_Type( this->getDomain(0)->getMapVecFieldRepeated() ));
1265 vec_dbl_Type funcParameter(1,0.);
1266 funcParameter[0] = timeSteppingTool_->t_;
1268 MultiVectorConstPtr_Type u = this->solution_->getBlock(0);
1269 u_rep_->importFromVector(u,
true);
1271 int flagInlet =this->parameterList_->sublist(
"General").get(
"Flag Inlet Fluid", 4);
1272 int flagOutlet = this->parameterList_->sublist(
"General").get(
"Flag Outlet Fluid", 5);
1274 if (timeSteppingTool_->currentTime()==0.) {
1275 double areaInlet_init = 0.;
1276 double areaOutlet_init = 0.;
1278 this->feFactory_->assemblyArea(this->dim_,areaInlet_init, flagInlet);
1279 this->feFactory_->assemblyArea(this->dim_, areaOutlet_init, flagOutlet);
1281 areaInlet_init_ = areaInlet_init;
1282 areaOutlet_init_ = areaOutlet_init;
1284 double flowRateInlet_n_1 = 0.;
1285 this->feFactory_->assemblyFlowRate(this->dim_, flowRateInlet_n_1, this->getDomain(0)->getFEType() , this->dim_, flagOutlet , u_rep_);
1286 flowRateOutlet_n_1_ = flowRateInlet_n_1;
1288 if ( this->parameterList_->sublist(
"Timestepping Parameter").get(
"Checkpointing",
false)){
1289 exporterBoundaryCondition_->exportData(
"Area_Inlet ", areaInlet_init );
1290 exporterBoundaryCondition_->exportData(
"Area_Outlet ", areaInlet_init );
1310 double flowRateInlet_n = 0.;
1311 this->feFactory_->assemblyFlowRate(this->dim_, flowRateInlet_n, this->getDomain(0)->getFEType() , this->dim_, flagOutlet , u_rep_);
1312 flowRateOutlet_n_ = flowRateInlet_n;
1314 vec_dbl_Type flowRateOutlet_timesteps(2);
1315 flowRateOutlet_timesteps[0] = flowRateOutlet_n_1_;
1316 flowRateOutlet_timesteps[1] = flowRateOutlet_n_;
1321 if(pressureRB ==
"Absorbing Paper"){
1323 double unsteadyStart = this->parameterList_->sublist(
"Parameter Fluid").get(
"Unsteady Start",0.1);
1324 if( unsteadyStart +1e-10 > timeSteppingTool_->currentTime() && unsteadyStart -1e-10 < timeSteppingTool_->currentTime() )
1326 double areaOutlet_T = 0.;
1327 this->feFactory_->assemblyArea(this->dim_, areaOutlet_T, flagOutlet);
1328 areaOutlet_T_ = areaOutlet_T;
1330 std::cout <<
" ---- Absorbing boundary condition: Start of unsteady Phase with areaOutlet_T=" << areaOutlet_T_<<
" ---- " << std::endl;
1333 pressureOutlet_ = this->feFactory_->assemblyAbsorbingBoundaryPaper(this->dim_, this->getDomain(0)->getFEType(),FERhs, u_rep_,flowRateOutlet_timesteps, funcParameter, pressureRamp,areaOutlet_init_, areaOutlet_T_,this->parameterList_,0);
1337 double rampTime = this->parameterList_->sublist(
"Parameter").get(
"Max Ramp Time",0.1);
1338 if( rampTime < timeSteppingTool_->currentTime() && rampTime + 0.05 > timeSteppingTool_->currentTime() )
1340 double areaOutlet_T = 0.;
1341 this->feFactory_->assemblyArea(this->dim_, areaOutlet_T, flagOutlet);
1342 areaOutlet_T_ = areaOutlet_T;
1344 std::cout <<
" ---- Absorbing boundary condition: Start of unsteady Phase with areaOutlet_T=" << areaOutlet_T_<<
" ---- " << std::endl;
1346 pressureOutlet_ = this->feFactory_->assemblyAbsorbingBoundary(this->dim_, this->getDomain(0)->getFEType(),FERhs, u_rep_,flowRateOutlet_timesteps, funcParameter, pressureRamp,areaOutlet_init_,areaOutlet_T_,this->parameterList_,0);
1351 this->sourceTerm_->getBlockNonConst(0)->exportFromVector( FERhs,
false,
"Add" );
1353 flowRateOutlet_n_1_ = flowRateOutlet_n_;
1354 if ( this->parameterList_->sublist(
"Timestepping Parameter").get(
"Checkpointing",
false)){
1355 exporterBoundaryCondition_->exportData(
"FlowrateOutlet_Previous_Timestep", flowRateOutlet_n_1_ );
1358 double coeffSourceTermStructure = 1.0;
1361 this->problemTimeFluid_->getRhs()->getBlockNonConst(0)->update(coeffSourceTermStructure, *this->sourceTerm_->getBlockNonConst(0), 1.);
1362 this->rhs_->addBlock( this->problemTimeFluid_->getRhs()->getBlockNonConst(0), 0 );
1365 std::cout <<
" .. done " << std::endl;
1373template<
class SC,
class LO,
class GO,
class NO>
1374void FSI<SC,LO,GO,NO>::computeFluidRHSInTime( )
const
1379 int sizeFluid = this->problemFluid_->getSystem()->size();
1380 double dt = timeSteppingTool_->get_dt();
1381 int nmbBDF = timeSteppingTool_->getBDFNumber();
1383 vec_dbl_Type coeffPrevSteps(nmbBDF);
1384 for(
int i = 0; i < coeffPrevSteps.size(); i++)
1386 coeffPrevSteps.at(i) = timeSteppingTool_->getInformationBDF(i+2) / dt;
1389 if (timeSteppingTool_->currentTime()==0.) {
1390 SmallMatrix<double> tmpmassCoeff(sizeFluid);
1391 SmallMatrix<double> tmpproblemCoeff(sizeFluid);
1392 for (
int i=0; i<sizeFluid; i++) {
1393 for (
int j=0; j<sizeFluid; j++) {
1394 if ((*defTS_)[i][j]==1 && i==j) {
1395 tmpmassCoeff[i][j] = 1. / dt;
1398 tmpmassCoeff[i][j] = 0.;
1402 for (
int i=0; i<sizeFluid; i++) {
1403 for (
int j=0; j<sizeFluid; j++){
1404 if ((*defTS_)[i][j]==1){
1405 tmpproblemCoeff[i][j] = 1.;
1408 tmpproblemCoeff[i][j] = 1.;
1412 this->problemTimeFluid_->setTimeParameters(tmpmassCoeff, tmpproblemCoeff);
1414 if (timeSteppingTool_->currentTime()==0.) {
1415 vec_dbl_Type tmpcoeffPrevSteps(1, 1. / dt);
1416 this->problemTimeFluid_->updateMultistepRhsFSI(tmpcoeffPrevSteps,1);
1419 this->problemTimeFluid_->updateMultistepRhsFSI(coeffPrevSteps,nmbBDF);
1423 if (this->problemTimeFluid_->hasSourceTerm()) {
1424 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Check sourceterm.");
1429 if (timeSteppingTool_->currentTime()==0.) {
1430 SmallMatrix<double> massCoeffFluid(sizeFluid);
1431 SmallMatrix<double> problemCoeffFluid(sizeFluid);
1433 for (
int i=0; i<sizeFluid; i++) {
1434 for (
int j=0; j<sizeFluid; j++) {
1435 if ((*defTS_)[i][j]==1 && i==j) {
1436 massCoeffFluid[i][j] = timeSteppingTool_->getInformationBDF(0) / dt;
1439 massCoeffFluid[i][j] = 0.0;
1443 for (
int i=0; i<sizeFluid; i++) {
1444 for (
int j=0; j<sizeFluid; j++){
1445 if ((*defTS_)[i][j]==1){
1446 problemCoeffFluid[i][j] = timeSteppingTool_->getInformationBDF(1);
1449 problemCoeffFluid[i][j] = 1.;
1454 this->problemTimeFluid_->setTimeParameters(massCoeffFluid, problemCoeffFluid);
1462template<
class SC,
class LO,
class GO,
class NO>
1463void FSI<SC,LO,GO,NO>::updateFluidInTime()
const
1465 int nmbBDF = timeSteppingTool_->getBDFNumber();
1467 if(nmbBDF<2 && !this->parameterList_->sublist(
"General").get(
"Linearization",
"FixedPoint").compare(
"Extrapolation")) {
1468 if (timeSteppingTool_->currentTime()!=0.){
1469 this->problemTimeFluid_->updateSolutionMultiPreviousStep(2);
1470 this->problemTimeFluid_->updateSystemMassMultiPreviousStep(2);
1473 this->problemTimeFluid_->updateSolutionMultiPreviousStep(1);
1474 this->problemTimeFluid_->updateSystemMassMultiPreviousStep(1);
1478 this->problemTimeFluid_->updateSolutionMultiPreviousStep(nmbBDF);
1479 this->problemTimeFluid_->updateSystemMassMultiPreviousStep(nmbBDF);
1483template<
class SC,
class LO,
class GO,
class NO>
1484void FSI<SC,LO,GO,NO>::computeSolidRHSInTime()
const {
1488 double dt = timeSteppingTool_->get_dt();
1489 double beta = timeSteppingTool_->get_beta();
1490 double gamma = timeSteppingTool_->get_gamma();
1493 vec_dbl_Type coeffTemp(1);
1494 coeffTemp.at(0) = 1.0;
1497 this->problemTimeStructure_->updateSolutionNewmarkPreviousStep(dt, beta, gamma);
1503 this->problemTimeStructure_->updateNewmarkRhs(dt, beta, gamma, coeffTemp);
1506 double time = timeSteppingTool_->currentTime() + dt;
1510 if (this->problemTimeStructure_->hasSourceTerm())
1512 this->problemTimeStructure_->assembleSourceTerm( time );
1518 double coeffSourceTermStructure = 1.0;
1519 BlockMultiVectorPtr_Type tmpPtr = this->problemTimeStructure_->getSourceTerm();
1520 this->problemTimeStructure_->getRhs()->update(coeffSourceTermStructure, *tmpPtr, 1.);
1525template<
class SC,
class LO,
class GO,
class NO>
1526void FSI<SC,LO,GO,NO>::setSolidMassmatrix( MatrixPtr_Type& massmatrix )
const
1531 double density = this->problemTimeStructure_->getParameterList()->sublist(
"Parameter").get(
"Density",1000.e-0);
1532 int size = this->problemTimeStructure_->getSystem()->size();
1534 if(timeSteppingTool_->currentTime() == 0.0)
1536 this->problemTimeStructure_->systemMass_.reset(
new BlockMatrix_Type(size));
1539 massmatrix = Teuchos::rcp(
new Matrix_Type( this->problemTimeStructure_->getDomain(0)->getMapVecFieldUnique(), this->getDomain(0)->getApproxEntriesPerRow() ) );
1541 this->feFactory_->assemblyMass(this->dim_, this->problemTimeStructure_->getFEType(0),
"Vector", massmatrix, 2,
true);
1542 massmatrix->resumeFill();
1543 massmatrix->scale(density);
1544 massmatrix->fillComplete( this->problemTimeStructure_->getDomain(0)->getMapVecFieldUnique(), this->problemTimeStructure_->getDomain(0)->getMapVecFieldUnique());
1546 this->problemTimeStructure_->systemMass_->addBlock( massmatrix, 0, 0 );
1553template<
class SC,
class LO,
class GO,
class NO>
1554void FSI<SC,LO,GO,NO>::updateTime()
const
1556 timeSteppingTool_->t_ = timeSteppingTool_->t_ + timeSteppingTool_->dt_prev_;
1559template<
class SC,
class LO,
class GO,
class NO>
1560void FSI<SC,LO,GO,NO>::moveMesh()
const
1563 MultiVectorConstPtr_Type displacementUniqueConst;
1564 if(geometryExplicit_)
1566 displacementUniqueConst = this->problemGeometry_->getSolution()->getBlock(0);
1570 displacementUniqueConst = this->solution_->getBlock(4);
1572 MultiVectorPtr_Type displacementRepeated = Teuchos::rcp(
new MultiVector_Type( this->problemGeometry_->getDomain(0)->getMapVecFieldRepeated() ) );
1574 displacementRepeated->importFromVector( displacementUniqueConst );
1575 MultiVectorPtr_Type displacementUnique = Teuchos::rcp_const_cast<MultiVector_Type>(displacementUniqueConst);
1582 ( Teuchos::rcp_const_cast<Domain_Type>(this->getDomain(0)) )->moveMesh(displacementUnique, displacementRepeated);
1583 ( Teuchos::rcp_const_cast<Domain_Type>(this->getDomain(1)) )->moveMesh(displacementUnique, displacementRepeated);
1584 ( Teuchos::rcp_const_cast<Domain_Type>(this->problemFluid_->getDomain(0)) )->moveMesh(displacementUnique, displacementRepeated);
1585 ( Teuchos::rcp_const_cast<Domain_Type>(this->problemFluid_->getDomain(1)) )->moveMesh(displacementUnique, displacementRepeated);
1586 ( Teuchos::rcp_const_cast<Domain_Type>(this->problemTimeFluid_->getDomain(0)) )->moveMesh(displacementUnique, displacementRepeated);
1587 ( Teuchos::rcp_const_cast<Domain_Type>(this->problemTimeFluid_->getDomain(1)) )->moveMesh(displacementUnique, displacementRepeated);
1591template<
class SC,
class LO,
class GO,
class NO>
1592void FSI<SC,LO,GO,NO>::addInterfaceBlockRHS()
const
1594 MultiVectorPtr_Type vectorToAdd = Teuchos::rcp(
new MultiVector_Type( this->rhs_->getBlock(3) ) );
1596 C2_->apply(*(this->solution_->getBlock(2)), *vectorToAdd);
1597 this->rhs_->addBlock(vectorToAdd, 3);
1617template<
class SC,
class LO,
class GO,
class NO>
1620 getValuesOfInterest2DBenchmark( values );
1621 else if(this->dim_==3)
1622 getValuesOfInterest3DBenchmark( values);