130 std::cout <<
"\t ### Full preconditioner information only available for Monolithic preconditioner type ###" << std::endl;
135 template <
class SC,
class LO,
class GO,
class NO>
136 void Problem<SC, LO, GO, NO>::initializeProblem(
int nmbVectors)
139 this->system_.reset(
new BlockMatrix_Type(1));
140 this->initializeVectors(nmbVectors);
143 template <
class SC,
class LO,
class GO,
class NO>
146 this->rhsFuncVec_.push_back(func);
148 template <
class SC,
class LO,
class GO,
class NO>
151 if (this->rhsFuncVec_.size() <= i + 1)
152 this->rhsFuncVec_[i] = func;
153 else if (this->rhsFuncVec_.size() == i)
154 this->rhsFuncVec_.push_back(func);
156 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"Insertion Index smaller then size of vector");
178 template <
class SC,
class LO,
class GO,
class NO>
181 return rhsFuncVec_[i];
184 template <
class SC,
class LO,
class GO,
class NO>
185 void Problem<SC, LO, GO, NO>::addVariable(
const DomainConstPtr_Type &domain, std::string FEType, std::string name,
int dofsPerNode)
188 domainPtr_vec_.push_back(domain);
189 domain_FEType_vec_.push_back(FEType);
190 variableName_vec_.push_back(name);
191 feFactory_->addFE(domain);
192 dofsPerNode_vec_.push_back(dofsPerNode);
202 template <
class SC,
class LO,
class GO,
class NO>
203 void Problem<SC, LO, GO, NO>::assembleSourceTerm(
double time)
const
206 TEUCHOS_TEST_FOR_EXCEPTION(sourceTerm_.is_null(), std::runtime_error,
"Initialize source term before you assemble it - sourceTerm pointer is null");
207 this->sourceTerm_->putScalar(0.);
208 std::string sourceType = parameterList_->sublist(
"Parameter").get(
"Source Type",
"volume");
210 if (sourceType ==
"volume")
211 assembleVolumeTerm(time);
212 else if (sourceType ==
"surface")
213 assembleSurfaceTerm(time);
216 template <
class SC,
class LO,
class GO,
class NO>
217 void Problem<SC, LO, GO, NO>::assembleVolumeTerm(
double time)
const
219 for (UN i = 0; i < sourceTerm_->size(); i++)
221 if (this->rhsFuncVec_.size() > i)
223 if (!this->rhsFuncVec_[i].empty())
225 MultiVectorPtr_Type FERhs;
227 vec_dbl_Type funcParameter(1, 0.);
228 funcParameter[0] = time;
231 for (
int j = 0; j < parasSourceFunc_.size(); j++)
232 funcParameter.push_back(parasSourceFunc_[j]);
235 if (this->getDofsPerNode(i) > 1)
237 FERhs = Teuchos::rcp(
new MultiVector_Type(this->domainPtr_vec_.at(i)->getMapVecFieldRepeated()));
242 FERhs = Teuchos::rcp(
new MultiVector_Type(this->domainPtr_vec_.at(i)->getMapRepeated()));
246 this->feFactory_->assemblyRHS(this->dim_,
247 this->domain_FEType_vec_.at(i),
250 this->rhsFuncVec_[i],
253 this->sourceTerm_->getBlockNonConst(i)->exportFromVector(FERhs,
false,
"Add");
259 template <
class SC,
class LO,
class GO,
class NO>
260 void Problem<SC, LO, GO, NO>::assembleSurfaceTerm(
double time)
const
262 for (UN i = 0; i < sourceTerm_->size(); i++)
264 if (this->rhsFuncVec_.size() > i)
267 if (!this->rhsFuncVec_[i].empty())
269 MultiVectorPtr_Type FERhs;
271 vec_dbl_Type funcParameter(1, 0.);
272 funcParameter[0] = time;
275 for (
int j = 0; j < parasSourceFunc_.size(); j++)
276 funcParameter.push_back(parasSourceFunc_[j]);
279 funcParameter.push_back(funcParameter[funcParameter.size() - 1]);
281 if (this->getDofsPerNode(i) > 1)
283 FERhs = Teuchos::rcp(
new MultiVector_Type(this->domainPtr_vec_.at(i)->getMapVecFieldRepeated()));
288 FERhs = Teuchos::rcp(
new MultiVector_Type(this->domainPtr_vec_.at(i)->getMapRepeated()));
292 this->feFactory_->assemblySurfaceIntegral(this->getDomain(i)->getDimension(),
293 this->getDomain(i)->getFEType(),
296 this->rhsFuncVec_[i],
299 this->sourceTerm_->getBlockNonConst(i)->exportFromVector(FERhs,
false,
"Add");
306 template <
class SC,
class LO,
class GO,
class NO>
307 int Problem<SC, LO, GO, NO>::solve(BlockMultiVectorPtr_Type rhs)
311 std::cout <<
"-- Solve System ..." << std::endl;
315 TimeMonitor_Type solveTM(*solveProblemTimer_);
317 LinearSolver<SC, LO, GO, NO> linSolver;
318 std::string type = parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic");
319 its = linSolver.solve(
this, rhs, type);
323 std::cout <<
" done -- " << std::endl;
328 template <
class SC,
class LO,
class GO,
class NO>
329 void Problem<SC, LO, GO, NO>::setupPreconditioner(std::string type)
const
332 preconditioner_->buildPreconditioner(type);
335 template <
class SC,
class LO,
class GO,
class NO>
336 void Problem<SC, LO, GO, NO>::initializePreconditioner(std::string type)
const
339 preconditioner_->initializePreconditioner(type);
342 template <
class SC,
class LO,
class GO,
class NO>
343 void Problem<SC, LO, GO, NO>::addBoundaries(
const BCConstPtr_Type &bcFactory)
346 bcFactory_ = bcFactory;
349 template <
class SC,
class LO,
class GO,
class NO>
350 void Problem<SC, LO, GO, NO>::setBoundaries(
double time)
const
353 TimeMonitor_Type bcMatTM(*bcMatrixTimer_);
354 TimeMonitor_Type bcRHSTM(*bcRHSTimer_);
356 bcFactory_->set(system_, rhs_, time);
359 template <
class SC,
class LO,
class GO,
class NO>
360 void Problem<SC, LO, GO, NO>::setBoundariesRHS(
double time)
const
363 TimeMonitor_Type bcRHSTM(*bcRHSTimer_);
365 bcFactory_->setRHS(rhs_, time);
368 template <
class SC,
class LO,
class GO,
class NO>
369 void Problem<SC, LO, GO, NO>::setAllDirichletZero(BlockMultiVectorPtr_Type u)
const
372 TimeMonitor_Type bcRHSTM(*bcRHSTimer_);
374 bcFactory_->setAllDirichletZero(u);
377 template <
class SC,
class LO,
class GO,
class NO>
378 void Problem<SC, LO, GO, NO>::setBoundariesSystem()
const
381 TimeMonitor_Type bcMatTM(*bcMatrixTimer_);
383 bcFactory_->setSystem(system_);
386 template <
class SC,
class LO,
class GO,
class NO>
387 void Problem<SC, LO, GO, NO>::initializeVectors(
int nmbVectors)
390 UN size = domainPtr_vec_.size();
391 solution_.reset(
new BlockMultiVector_Type(size));
392 rhs_.reset(
new BlockMultiVector_Type(size));
393 sourceTerm_.reset(
new BlockMultiVector_Type(size));
394 rhsFuncVec_.resize(size);
396 for (UN i = 0; i < size; i++)
398 if (dofsPerNode_vec_[i] > 1)
400 MapConstPtr_Type map = domainPtr_vec_[i]->getMapVecFieldUnique();
401 MultiVectorPtr_Type solutionPart = Teuchos::rcp(
new MultiVector_Type(map));
402 solution_->addBlock(solutionPart, i);
403 MultiVectorPtr_Type rhsPart = Teuchos::rcp(
new MultiVector_Type(map));
404 rhs_->addBlock(rhsPart, i);
405 MultiVectorPtr_Type sourceTermPart = Teuchos::rcp(
new MultiVector_Type(map));
406 sourceTerm_->addBlock(sourceTermPart, i);
410 MapConstPtr_Type map = domainPtr_vec_[i]->getMapUnique();
411 MultiVectorPtr_Type solutionPart = Teuchos::rcp(
new MultiVector_Type(map));
412 solution_->addBlock(solutionPart, i);
413 MultiVectorPtr_Type rhsPart = Teuchos::rcp(
new MultiVector_Type(map));
414 rhs_->addBlock(rhsPart, i);
415 MultiVectorPtr_Type sourceTermPart = Teuchos::rcp(
new MultiVector_Type(map));
416 sourceTerm_->addBlock(sourceTermPart, i);
421 template <
class SC,
class LO,
class GO,
class NO>
422 typename Problem<SC, LO, GO, NO>::BlockMultiVectorPtr_Type Problem<SC, LO, GO, NO>::getRhs()
428 template <
class SC,
class LO,
class GO,
class NO>
429 typename Problem<SC, LO, GO, NO>::BlockMultiVectorPtr_Type Problem<SC, LO, GO, NO>::getRhs()
const
435 template <
class SC,
class LO,
class GO,
class NO>
436 typename Problem<SC, LO, GO, NO>::BlockMultiVectorPtr_Type Problem<SC, LO, GO, NO>::getSolution()
442 template <
class SC,
class LO,
class GO,
class NO>
443 typename Problem<SC, LO, GO, NO>::BlockMatrixPtr_Type Problem<SC, LO, GO, NO>::getSystem()
const
449 template <
class SC,
class LO,
class GO,
class NO>
450 typename Problem<SC, LO, GO, NO>::PreconditionerPtr_Type Problem<SC, LO, GO, NO>::getPreconditioner()
452 return preconditioner_;
455 template <
class SC,
class LO,
class GO,
class NO>
456 typename Problem<SC, LO, GO, NO>::PreconditionerConstPtr_Type Problem<SC, LO, GO, NO>::getPreconditionerConst()
const
458 return preconditioner_;
461 template <
class SC,
class LO,
class GO,
class NO>
462 void Problem<SC, LO, GO, NO>::setPreconditionerThyraFromLinOp(ThyraLinOpPtr_Type precLinOp)
464 preconditioner_->setPreconditionerThyraFromLinOp(precLinOp);
467 template <
class SC,
class LO,
class GO,
class NO>
468 bool Problem<SC, LO, GO, NO>::getVerbose()
const
474 template <
class SC,
class LO,
class GO,
class NO>
475 typename Problem<SC, LO, GO, NO>::FEFacConstPtr_Type Problem<SC, LO, GO, NO>::getFEFactory()
481 template <
class SC,
class LO,
class GO,
class NO>
482 typename Problem<SC, LO, GO, NO>::BCConstPtr_Type Problem<SC, LO, GO, NO>::getBCFactory()
488 template <
class SC,
class LO,
class GO,
class NO>
489 typename Problem<SC, LO, GO, NO>::DomainConstPtr_Type Problem<SC, LO, GO, NO>::getDomain(
int i)
const
492 return domainPtr_vec_.at(i);
495 template <
class SC,
class LO,
class GO,
class NO>
496 std::string Problem<SC, LO, GO, NO>::getFEType(
int i)
const
499 return domain_FEType_vec_.at(i);
502 template <
class SC,
class LO,
class GO,
class NO>
503 std::string Problem<SC, LO, GO, NO>::getVariableName(
int i)
const
506 return variableName_vec_.at(i);
509 template <
class SC,
class LO,
class GO,
class NO>
510 int Problem<SC, LO, GO, NO>::getDofsPerNode(
int i)
const
513 return dofsPerNode_vec_.at(i);
516 template <
class SC,
class LO,
class GO,
class NO>
517 typename Problem<SC, LO, GO, NO>::ParameterListPtr_Type Problem<SC, LO, GO, NO>::getParameterList()
const
520 return parameterList_;
523 template <
class SC,
class LO,
class GO,
class NO>
524 void Problem<SC, LO, GO, NO>::addToRhs(BlockMultiVectorPtr_Type x)
const
527 rhs_->update(1., *x, 1.);
530 template <
class SC,
class LO,
class GO,
class NO>
531 typename Problem<SC, LO, GO, NO>::BlockMultiVectorPtr_Type Problem<SC, LO, GO, NO>::getSourceTerm()
533 TEUCHOS_TEST_FOR_EXCEPTION(sourceTerm_.is_null(), std::runtime_error,
"Problem has no source term to return - source term pointer is null");
537 template <
class SC,
class LO,
class GO,
class NO>
538 bool Problem<SC, LO, GO, NO>::hasSourceTerm()
const
540 for (
int i = 0; i < rhsFuncVec_.size(); i++)
542 if (!rhsFuncVec_[i].empty())
548 template <
class SC,
class LO,
class GO,
class NO>
549 void Problem<SC, LO, GO, NO>::initSolutionWithVector(MultiVector_Type &mv)
551 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"initSolutionWithVector not implemented. DO we need this?");
556 template <
class SC,
class LO,
class GO,
class NO>
557 void Problem<SC, LO, GO, NO>::initializeSolverBuilder()
const
560 ParameterListPtr_Type pListThyraPrec = sublist(parameterList_,
"ThyraPreconditioner");
562 linearSolverBuilder_->setParameterList(pListThyraPrec);
568 template <
class SC,
class LO,
class GO,
class NO>
569 void Problem<SC, LO, GO, NO>::changeAssFELinearization(std::string linearization)
571 this->feFactory_->changeLinearizationFE(linearization);
580 template <
class SC,
class LO,
class GO,
class NO>
581 double Problem<SC, LO, GO, NO>::calculateL2Norm(MultiVectorConstPtr_Type mv,
int domainInd)
585 M = Teuchos::rcp(
new Matrix_Type(this->domainPtr_vec_.at(domainInd)->getMapUnique(), this->getDomain(domainInd)->getApproxEntriesPerRow()));
586 this->feFactory_->assemblyMass(this->dim_, this->domain_FEType_vec_.at(domainInd),
"Scalar", M);
588 Teuchos::RCP<MultiVector<SC, LO, GO, NO>> mvOutput = Teuchos::rcp(
new MultiVector_Type(this->domainPtr_vec_.at(domainInd)->getMapUnique()));
590 M->apply(*mv, *mvOutput);
592 Teuchos::ArrayRCP<SC> vector = mv->getDataNonConst(0);
593 Teuchos::ArrayRCP<SC> outputVector = mvOutput->getDataNonConst(0);
596 for (
int i = 0; i < vector.size(); i++)
598 result += vector[i] * outputVector[i];
600 Teuchos::reduceAll<int, double>(*comm_, Teuchos::REDUCE_SUM, result, Teuchos::outArg(result));
604 template <
class SC,
class LO,
class GO,
class NO>
605 double Problem<SC, LO, GO, NO>::calculateH1Norm(MultiVectorConstPtr_Type mv,
int blockId1,
int blockId2,
int domainInd)
608 MatrixPtr_Type K = this->getSystem()->getBlock(blockId1, blockId2);
610 Teuchos::RCP<MultiVector<SC, LO, GO, NO>> mvOutput = Teuchos::rcp(
new MultiVector_Type(K->getMap()));
612 K->apply(*mv, *mvOutput);
614 Teuchos::ArrayRCP<SC> vector = mv->getDataNonConst(0);
615 Teuchos::ArrayRCP<SC> outputVector = mvOutput->getDataNonConst(0);
618 for (
int i = 0; i < vector.size(); i++)
620 result += vector[i] * outputVector[i];
622 Teuchos::reduceAll<int, double>(*comm_, Teuchos::REDUCE_SUM, result, Teuchos::outArg(result));
627 template <
class SC,
class LO,
class GO,
class NO>
628 void Problem<SC, LO, GO, NO>::infoParameter(
bool full,std::string name)
630 bool verbose(comm_->getRank() == 0);
633 std::cout <<
"#####################################" << std::endl;
635 std::cout <<
" ### " << name <<
" Problem Information ###" << std::endl;
637 std::cout <<
" ### Problem Information ###" << std::endl;
638 std::cout <<
" ### Dimension: " << dim_ << std::endl;
639 std::cout <<
" ### Number of blocks/equations/variables: " << domainPtr_vec_.size() << std::endl;
640 for (
int i = 0; i < domainPtr_vec_.size(); i++)
642 std::cout <<
" ## Block " << i + 1 <<
" name: " << variableName_vec_.at(i) <<
" d.o.f.s: " << dofsPerNode_vec_.at(i) <<
" FE type: " << domain_FEType_vec_.at(i) << std::endl;
645 std::cout <<
" ####################################" << std::endl;
646 ParameterListPtr_Type parameterlist = sublist(parameterList_,
"Parameter");
647 std::cout <<
" ### Parameter Information ###" << std::endl;
648 if(parameterlist->get(
"Mesh Type",
"???") !=
"???"){
649 std::cout <<
" ### Mesh Type: " << parameterlist->get(
"Mesh Type",
"???") << std::endl;
650 if(parameterlist->get(
"Mesh Type",
"???") ==
"structured" || parameterlist->get(
"Mesh Type",
"???") ==
"structured_bfs" )
651 std::cout <<
" ### H/h= " << parameterlist->get(
"H/h", 0) << std::endl;
653 std::cout <<
" ### Mesh File Name 1: " << parameterList_->sublist(
"Mesh Partitioner").get(
"Mesh 1 Name",
"???") << std::endl;
657 if(parameterlist->get(
"Model Geometry",
"None") !=
"None" )
658 std::cout <<
" ### Model Geometry: " << parameterlist->get(
"Model Geometry",
"None") << std::endl;
659 if(parameterlist->get(
"Model",
"None") !=
"None" )
660 std::cout <<
" ### Model: " << parameterlist->get(
"Model",
"None") << std::endl;
661 if(parameterlist->get(
"Distance Laplace", 0.) > 0 )
662 std::cout <<
" ### Distance Laplace: " << parameterlist->get(
"Distance Laplace", 0.) << std::endl;
663 if(parameterlist->get(
"Coefficient Laplace", 0.) > 0 )
664 std::cout <<
" ### Coefficient Laplace: " << parameterlist->get(
"Coefficient Laplace", 0.) << std::endl;
666 if(parameterlist->get(
"Material model",
"None") !=
"None" )
667 std::cout <<
" ### Material model: " << parameterlist->get(
"Material model",
"None") << std::endl;
669 if(parameterlist->get(
"Density", 0.) > 0 )
670 std::cout <<
" ### Density: " << parameterlist->get(
"Density", 0.) << std::endl;
673 if(parameterlist->get(
"Viscosity", 0.) > 0)
674 std::cout <<
" ### Viscosity: " << parameterlist->get(
"Viscosity", 0.) << std::endl ;
675 if(abs(parameterlist->get(
"MaxVelocity", 0.)) > 0 )
676 std::cout <<
" ### Maximum Velocity: " << parameterlist->get(
"MaxVelocity", 0.) << std::endl;
677 else if(abs(parameterlist->get(
"Max Velocity", 0.)) > 0 )
678 std::cout <<
" ### or Maximum Velocity: " << parameterlist->get(
"Max Velocity", 0.) << std::endl;
680 if(abs(parameterlist->get(
"Flowrate", 0.)) > 0 )
681 std::cout <<
" ### Flowrate: " << parameterlist->get(
"Flowrate", 0.) << std::endl;
683 if((parameterlist->get(
"Pressure Boundary Condition",
"None")) !=
"None" ){
684 std::cout <<
" ### Pressure Boundary Condition: " << parameterlist->get(
"Pressure Boundary Condition",
"None") << std::endl;
685 std::cout <<
" ### Reference fluid pressure: " << parameterlist->get(
"Reference fluid pressure", 0.) << std::endl;
687 if(parameterlist->get(
"E", 0.) > 0 )
688 std::cout <<
" ### E Modul: " << parameterlist->get(
"E", 0.) << std::endl;
689 if(parameterlist->get(
"Mu", 0.) > 0 )
690 std::cout <<
" ### Mu: " << parameterlist->get(
"Mu", 0.) << std::endl;
691 if(parameterlist->get(
"Poisson Ratio", 0.) > 0 )
692 std::cout <<
" ### Poisson Ratio: " << parameterlist->get(
"Poisson Ratio", 0.) << std::endl;
695 std::cout <<
" ### Rel. Tol.: " << parameterlist->get(
"relNonLinTol", 0.)
696 <<
" ### Abs. Tol.: " << parameterlist->get(
"absNonLinTol", 0.) << std::endl;
699 std::cout <<
"####################################" << std::endl;
702 ParameterListPtr_Type pListThyraPrec = sublist(parameterList_,
"ThyraPreconditioner");
703 std::cout <<
" ### Preconditioner Information ###" << std::endl;
704 std::cout <<
" ## Type: " << parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic") << std::endl;
706 if (!pListThyraPrec->get(
"Preconditioner Type",
"FROSch").compare(
"FROSch") && parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic") ==
"Monolithic")
708 std::cout <<
" ## Variant: " << pListThyraPrec->sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"FROSch Preconditioner Type",
"TwoLevelBlockPreconditioner") << std::endl;
709 std::cout <<
" ## Overlap: "
710 << pListThyraPrec->sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"Overlap", 0) << std::endl;
711 std::cout <<
" ## OverlappingOperator Type: "
712 << pListThyraPrec->sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"OverlappingOperator Type",
"AlgebraicOverlappingOperator") << std::endl;
714 std::cout <<
" ## CoarseOperator Type: "
715 << pListThyraPrec->sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"CoarseOperator Type",
"GDSWCoarseOperator") << std::endl;
717 if(pListThyraPrec->sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"CoarseOperator Type",
"GDSWCoarseOperator") ==
"IPOUHarmonicCoarseOperator"){
718 for (
int i = 0; i < this->parameterList_->get(
"Number of blocks", 2); i++)
720 std::cout <<
" # IPOU Block "<< std::to_string(i + 1) <<
": " << pListThyraPrec->sublist(
"Preconditioner Types").sublist(
"FROSch").sublist(
"IPOUHarmonicCoarseOperator").sublist(
"Blocks").sublist(std::to_string(i + 1)).sublist(
"InterfacePartitionOfUnity").get(
"Type",
"NOTFOUND") << std::endl;
725 else if (!parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic").compare(
"Teko")){
726 std::cout <<
" ### Block Preconditioner Type: " << parameterList_->sublist(
"Teko Parameters").sublist(
"Preconditioner Types").sublist(
"Teko").get(
"Inverse Type",
"SIMPLE") << std::endl;
727 std::cout <<
" ### Velocity Preconditioner: " << parameterList_->sublist(
"Teko Parameters").sublist(
"Preconditioner Types").sublist(
"Teko").sublist(
"Inverse Factory Library").sublist(
"FROSch-Velocity").get(
"CoarseOperator Type",
"GDSW#") << std::endl;
728 std::cout <<
" ### Pressure Preconditioner: " << parameterList_->sublist(
"Teko Parameters").sublist(
"Preconditioner Types").sublist(
"Teko").sublist(
"Inverse Factory Library").sublist(
"FROSch-Pressure").get(
"CoarseOperator Type",
"GDSW#") << std::endl;
731 else if (!parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic").compare(
"Diagonal") ||
732 !parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic").compare(
"Triangular") ||
733 !parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic").compare(
"PCD") ||
734 !parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic").compare(
"LSC"))
738 std::cout <<
" ### Block Preconditioner Type: " << parameterList_->sublist(
"General").get(
"Preconditioner Method",
"Monolithic") << std::endl;
739 std::cout <<
" ## Velocity Preconditioner: " << parameterList_->sublist(
"Velocity preconditioner").sublist(
"ThyraPreconditioner").sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"CoarseOperator Type",
"Nada") << std::endl;
740 std::cout <<
" # Variant: " << parameterList_->sublist(
"Velocity preconditioner").sublist(
"ThyraPreconditioner").sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"FROSch Preconditioner Type",
"TwoLevelBlockPreconditioner") << std::endl;
741 std::cout <<
" # Overlap: "
742 << parameterList_->sublist(
"Velocity preconditioner").sublist(
"ThyraPreconditioner").sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"Overlap", 0) << std::endl;
744 std::cout <<
" ## Schur Complement Preconditioner: " << parameterList_->sublist(
"Schur complement preconditioner").sublist(
"ThyraPreconditioner").sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"CoarseOperator Type",
"Nada") << std::endl;
745 std::cout <<
" # Variant: " << parameterList_->sublist(
"Schur complement preconditioner").sublist(
"ThyraPreconditioner").sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"FROSch Preconditioner Type",
"TwoLevelBlockPreconditioner") << std::endl;
746 std::cout <<
" # Overlap: "
747 << parameterList_->sublist(
"Schur complement preconditioner").sublist(
"ThyraPreconditioner").sublist(
"Preconditioner Types").sublist(
"FROSch").get(
"Overlap", 0) << std::endl;
751 std::cout <<
" ### Full preconditioner information only available for Monolithic/Teko preconditioner type ###" << std::endl;
754 std::cout <<
" ####################################" << std::endl;
756 std::cout <<
" ### Git commit hash: " << GIT_COMMIT_HASH << std::endl;
757 std::cout <<
" ### Git branch name: " << GIT_BRANCH_NAME << std::endl;
759 std::cout <<
"#####################################" << std::endl;