13#ifndef EXECUTABLE_DIMENSION
14#define EXECUTABLE_DIMENSION 3
18#define SCHUR_ASSEMBLE 0
26#include <GenericElementInterface.hpp>
29#include <boost/python.hpp>
30#include <boost/python/def.hpp>
31#include <boost/python/numpy.hpp>
32namespace bp = boost::python;
33namespace np = boost::python::numpy;
40 IntegrationType::GAUSS;
75 IT>::OpBaseTimesVector<1, SPACE_DIM, 1>;
109#ifdef WITH_MODULE_MFRONT_INTERFACE
110#include <MFrontMoFEMInterface.hpp>
149 boost::shared_ptr<SDFPython> sdfPythonPtr;
193 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOPT };
194 const char *list_bases[LASBASETOPT] = {
"ainsworth",
"demkowicz"};
195 PetscInt choice_base_value = AINSWORTH;
197 LASBASETOPT, &choice_base_value, PETSC_NULL);
200 switch (choice_base_value) {
204 <<
"Set AINSWORTH_LEGENDRE_BASE for displacements";
209 <<
"Set DEMKOWICZ_JACOBI_BASE for displacements";
234 CHKERR skin.find_skin(0, body_ents,
false, skin_ents);
238 auto filter_blocks = [&](
auto skin) {
239 bool is_contact_block =
false;
244 (boost::format(
"%s(.*)") %
"CONTACT").str()
253 <<
"Find contact block set: " <<
m->getName();
254 auto meshset =
m->getMeshset();
255 Range contact_meshset_range;
257 meshset,
SPACE_DIM - 1, contact_meshset_range,
true);
260 contact_meshset_range);
261 contact_range.merge(contact_meshset_range);
263 if (is_contact_block) {
265 <<
"Nb entities in contact surface: " << contact_range.size();
267 skin = intersect(skin, contact_range);
274 ParallelComm *pcomm =
276 CHKERR pcomm->filter_pstatus(skin, PSTATUS_SHARED | PSTATUS_MULTISHARED,
277 PSTATUS_NOT, -1, &boundary_ents);
278 return boundary_ents;
289 moab::Interface::UNION);
298 auto project_ho_geometry = [&]() {
303 PetscBool project_geometry = PETSC_TRUE;
305 &project_geometry, PETSC_NULL);
306 if (project_geometry) {
307 CHKERR project_ho_geometry();
317 PetscBool use_mfront = PETSC_FALSE;
343 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Using MFront for material model";
354 PetscBool use_scale = PETSC_FALSE;
369 char sdf_file_name[255];
371 sdf_file_name, 255, PETSC_NULL);
373 sdfPythonPtr = boost::make_shared<SDFPython>();
374 CHKERR sdfPythonPtr->sdfInit(sdf_file_name);
375 sdfPythonWeakPtr = sdfPythonPtr;
381 "Use executable contact_2d with axisymmetric model");
385 "Axisymmetric model is only available with MFront (set "
388 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Using axisymmetric model";
393 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Using plane strain model";
398#ifndef WITH_MODULE_MFRONT_INTERFACE
401 "MFrontInterface module was not found while use_mfront was set to 1");
405 boost::make_shared<MFrontMoFEMInterface<TRIDIMENSIONAL>>(
410 boost::make_shared<MFrontMoFEMInterface<AXISYMMETRICAL>>(
413 mfrontInterface = boost::make_shared<MFrontMoFEMInterface<PLANESTRAIN>>(
422 auto dm =
simple->getDM();
440 for (
auto f : {
"U",
"SIGMA"}) {
441 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
442 "REMOVE_X",
f, 0, 0);
443 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
444 "REMOVE_Y",
f, 1, 1);
445 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
446 "REMOVE_Z",
f, 2, 2);
447 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
448 "REMOVE_ALL",
f, 0, 3);
451 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_X",
452 "SIGMA", 0, 0,
false,
true);
453 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_Y",
454 "SIGMA", 1, 1,
false,
true);
455 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_Z",
456 "SIGMA", 2, 2,
false,
true);
457 CHKERR bc_mng->removeBlockDOFsOnEntities(
simple->getProblemName(),
"FIX_ALL",
458 "SIGMA", 0, 3,
false,
true);
459 CHKERR bc_mng->removeBlockDOFsOnEntities(
460 simple->getProblemName(),
"NO_CONTACT",
"SIGMA", 0, 3,
false,
true);
465 simple->getProblemName(),
"U");
477 auto time_scale = boost::make_shared<ScaledTimeScale>();
478 auto body_force_time_scale =
479 boost::make_shared<ScaledTimeScale>(
"body_force_hist.txt");
481 auto integration_rule_vol = [](int, int,
int approx_order) {
484 auto integration_rule_boundary = [](int, int,
int approx_order) {
488 auto add_domain_base_ops = [&](
auto &pip) {
495 auto hencky_common_data_ptr = boost::make_shared<HenckyOps::CommonData>();
496 hencky_common_data_ptr->matDPtr = boost::make_shared<MatrixDouble>();
497 hencky_common_data_ptr->matGradPtr = boost::make_shared<MatrixDouble>();
499 auto add_domain_ops_lhs = [&](
auto &pip) {
509 auto fe_domain_lhs = pip_mng->getDomainLhsFE();
511 auto get_inertia_and_mass_damping =
513 return (
rho *
scale) * fe_domain_lhs->ts_aa +
516 pip.push_back(
new OpMass(
"U",
"U", get_inertia_and_mass_damping));
520 auto fe_domain_lhs = pip_mng->getDomainLhsFE();
522 auto get_inertia_and_mass_damping =
526 pip.push_back(
new OpMass(
"U",
"U", get_inertia_and_mass_damping));
531 mField, pip,
"U",
"MAT_ELASTIC", Sev::verbose,
scale);
539 auto add_domain_ops_rhs = [&](
auto &pip) {
543 pip,
mField,
"U", {body_force_time_scale}, Sev::inform);
552 auto mat_acceleration = boost::make_shared<MatrixDouble>();
554 "U", mat_acceleration));
556 new OpInertiaForce(
"U", mat_acceleration, [](
double,
double,
double) {
563 auto mat_velocity = boost::make_shared<MatrixDouble>();
567 new OpInertiaForce(
"U", mat_velocity, [](
double,
double,
double) {
574 mField, pip,
"U",
"MAT_ELASTIC", Sev::inform,
scale);
585 auto add_boundary_base_ops = [&](
auto &pip) {
595 auto add_boundary_ops_lhs = [&](
auto &pip) {
605 pip,
mField,
"U", Sev::inform);
610 auto fe_boundary_lhs = pip_mng->getBoundaryLhsFE();
615 [
this, fe_boundary_lhs](
double,
double,
double) {
628 mField, pip,
simple->getDomainFEName(),
"SIGMA",
"U",
"GEOMETRY",
634 auto add_boundary_ops_rhs = [&](
auto &pip) {
644 pip,
mField,
"U", {time_scale}, Sev::inform);
647 auto u_disp = boost::make_shared<MatrixDouble>();
648 auto dot_u_disp = boost::make_shared<MatrixDouble>();
653 new OpSpringRhs(
"U", u_disp, [
this](
double,
double,
double) {
657 new OpSpringRhs(
"U", dot_u_disp, [
this](
double,
double,
double) {
669 CHKERR add_domain_base_ops(pip_mng->getOpDomainLhsPipeline());
670 CHKERR add_domain_base_ops(pip_mng->getOpDomainRhsPipeline());
671 CHKERR add_domain_ops_lhs(pip_mng->getOpDomainLhsPipeline());
672 CHKERR add_domain_ops_rhs(pip_mng->getOpDomainRhsPipeline());
674 CHKERR add_boundary_base_ops(pip_mng->getOpBoundaryLhsPipeline());
675 CHKERR add_boundary_base_ops(pip_mng->getOpBoundaryRhsPipeline());
676 CHKERR add_boundary_ops_lhs(pip_mng->getOpBoundaryLhsPipeline());
677 CHKERR add_boundary_ops_rhs(pip_mng->getOpBoundaryRhsPipeline());
683 CHKERR pip_mng->setDomainRhsIntegrationRule(integration_rule_vol);
684 CHKERR pip_mng->setDomainLhsIntegrationRule(integration_rule_vol);
685 CHKERR pip_mng->setBoundaryRhsIntegrationRule(integration_rule_boundary);
686 CHKERR pip_mng->setBoundaryLhsIntegrationRule(integration_rule_boundary);
694 static boost::shared_ptr<SetUpSchur>
709 auto set_section_monitor = [&](
auto solver) {
712 CHKERR TSGetSNES(solver, &snes);
713 PetscViewerAndFormat *vf;
714 CHKERR PetscViewerAndFormatCreate(PETSC_VIEWER_STDOUT_WORLD,
715 PETSC_VIEWER_DEFAULT, &vf);
718 (
MoFEMErrorCode(*)(SNES, PetscInt, PetscReal,
void *))SNESMonitorFields,
723 auto scatter_create = [&](
auto D,
auto coeff) {
725 CHKERR is_manager->isCreateProblemFieldAndRank(
simple->getProblemName(),
726 ROW,
"U", coeff, coeff, is);
728 CHKERR ISGetLocalSize(is, &loc_size);
732 CHKERR VecScatterCreate(
D, is,
v, PETSC_NULL, &scatter);
737 auto set_time_monitor = [&](
auto dm,
auto solver) {
740 boost::shared_ptr<ForcesAndSourcesCore> null;
746 auto set_essential_bc = [&]() {
750 auto pre_proc_ptr = boost::make_shared<FEMethod>();
751 auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
752 auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
755 auto time_scale = boost::make_shared<TimeScale>();
757 auto get_bc_hook_rhs = [&]() {
759 {time_scale},
false);
762 pre_proc_ptr->preProcessHook = get_bc_hook_rhs();
764 auto get_post_proc_hook_rhs = [&]() {
766 mField, post_proc_rhs_ptr, 1.);
768 auto get_post_proc_hook_lhs = [&]() {
770 mField, post_proc_lhs_ptr, 1.);
772 post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs();
774 ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
775 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
776 ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
777 post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs();
778 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
783 auto set_schur_pc = [&](
auto solver) {
784 boost::shared_ptr<SetUpSchur> schur_ptr;
785 if (
AT == AssemblyType::BLOCK_SCHUR) {
793 auto dm =
simple->getDM();
805 CHKERR set_essential_bc();
808 auto solver = pip_mng->createTSIM();
809 CHKERR TSSetFromOptions(solver);
810 auto schur_pc_ptr = set_schur_pc(solver);
813 CHKERR set_section_monitor(solver);
814 CHKERR set_time_monitor(dm, solver);
815 CHKERR TSSetSolution(solver,
D);
817 CHKERR TSSolve(solver, NULL);
819 auto solver = pip_mng->createTSIM2();
820 CHKERR TSSetFromOptions(solver);
821 auto schur_pc_ptr = set_schur_pc(solver);
823 auto dm =
simple->getDM();
827 CHKERR set_section_monitor(solver);
828 CHKERR set_time_monitor(dm, solver);
829 CHKERR TS2SetSolution(solver,
D, DD);
831 CHKERR TSSolve(solver, NULL);
846 double analytical_active_area = 1.0;
848 double tol_force = 1e-3;
849 double tol_norm = 7.5;
850 double tol_area = 3e-2;
851 double fem_active_area = t_ptr[3];
856 fem_force = t_ptr[1];
861 fem_force = t_ptr[1];
868 fem_force = t_ptr[2];
869 analytical_active_area = M_PI / 4;
879 hertz_force = 15.873;
881 fem_force = t_ptr[1];
883 analytical_active_area = M_PI;
888 fem_force = t_ptr[1];
892 hertz_force = 0.5289;
893 fem_force = t_ptr[2];
898 "atom test %d does not exist",
atom_test);
900 if (fabs(fem_force - hertz_force) / hertz_force > tol_force) {
902 "atom test %d failed: Wrong FORCE output: %3.4e != %3.4e",
905 if (norm > tol_norm) {
907 "atom test %d failed: Wrong NORM output: %3.4e > %3.4e",
910 if (fabs(fem_active_area - analytical_active_area) > tol_area) {
912 "atom test %d failed: AREA computed %3.4e but should be %3.4e",
913 atom_test, fem_active_area, analytical_active_area);
926int main(
int argc,
char *argv[]) {
934 const char param_file[] =
"param_file.petsc";
938 auto core_log = logging::core::get();
947 DMType dm_name =
"DMMOFEM";
949 DMType dm_name_mg =
"DMMOFEM_MG";
954 moab::Core mb_instance;
955 moab::Interface &moab = mb_instance;
979 if (Py_FinalizeEx() < 0) {
1014 CHKERR TSGetSNES(solver, &snes);
1016 CHKERR SNESGetKSP(snes, &ksp);
1017 CHKERR KSPSetFromOptions(ksp);
1020 CHKERR KSPGetPC(ksp, &pc);
1022 PetscBool is_pcfs = PETSC_FALSE;
1023 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
1026 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"Setup Schur pc";
1031 "It is expected that Schur matrix is not allocated. This is "
1032 "possible only if PC is set up twice");
1044 CHKERR TSGetDM(solver, &solver_dm);
1045 CHKERR DMSetMatType(solver_dm, MATSHELL);
1052 auto swap_assemble = [](TS ts, PetscReal
t, Vec u, Vec u_t, PetscReal
a,
1053 Mat
A, Mat
B,
void *ctx) {
1056 CHKERR TSSetIJacobian(solver, A, P, swap_assemble, ts_ctx_ptr.get());
1058 auto swap_assemble = [](TS ts, PetscReal
t, Vec u, Vec u_t, Vec utt,
1059 PetscReal
a, PetscReal aa, Mat
A, Mat
B,
1063 CHKERR TSSetI2Jacobian(solver, A, P, swap_assemble, ts_ctx_ptr.get());
1065 CHKERR KSPSetOperators(ksp, A, P);
1074 MOFEM_LOG(
"CONTACT", Sev::inform) <<
"No Schur PC";
1087 auto create_dm = [&](
const char *name,
const char *
field_name,
auto dm_type) {
1089 auto create_dm_imp = [&]() {
1101 "Error in creating schurDM. It is possible that schurDM is "
1109 schurDM = create_dm(
"SCHUR",
"U",
"DMMOFEM_MG");
1110 blockDM = create_dm(
"BLOCK",
"SIGMA",
"DMMOFEM");
1112 if constexpr (
AT == AssemblyType::BLOCK_SCHUR) {
1114 auto get_nested_mat_data = [&](
auto schur_dm,
auto block_dm) {
1120 simple->getDomainFEName(),
1124 {
"U",
"U"}, {
"SIGMA",
"U"}, {
"U",
"SIGMA"}, {
"SIGMA",
"SIGMA"}
1132 {schur_dm, block_dm}, block_mat_data,
1134 {
"SIGMA"}, {
nullptr}, true
1144 "Only BLOCK_SCHUR is implemented");
1153 double eps_stab = 1e-4;
1159 using OpMassStab = B::OpMass<3, SPACE_DIM * SPACE_DIM>;
1169 pip->getOpBoundaryLhsPipeline().push_back(
1170 new OpMassStab(
"SIGMA",
"SIGMA",
1171 [eps_stab](
double,
double,
double) {
return eps_stab; }));
1172 pip->getOpBoundaryLhsPipeline().push_back(
1180 pip->getOpDomainLhsPipeline().push_back(
1187 auto pre_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
1188 auto post_proc_schur_lhs_ptr = boost::make_shared<FEMethod>();
1190 pre_proc_schur_lhs_ptr->preProcessHook = [
this]() {
1193 MOFEM_LOG(
"CONTACT", Sev::verbose) <<
"Lhs Assemble Begin";
1197 post_proc_schur_lhs_ptr->postProcessHook = [
this, ao_up,
1198 post_proc_schur_lhs_ptr]() {
1200 MOFEM_LOG(
"CONTACT", Sev::verbose) <<
"Lhs Assemble End";
1201 auto print_mat_norm = [
this](
auto a, std::string prefix) {
1204 CHKERR MatNorm(
a, NORM_FROBENIUS, &nrm);
1205 MOFEM_LOG(
"CONTACT", Sev::noisy) << prefix <<
" norm = " << nrm;
1208 CHKERR MatAssemblyBegin(
S, MAT_FINAL_ASSEMBLY);
1209 CHKERR MatAssemblyEnd(
S, MAT_FINAL_ASSEMBLY);
1211 mField, post_proc_schur_lhs_ptr, 1,
S, ao_up)();
1213 CHKERR print_mat_norm(
S,
"S");
1215 MOFEM_LOG(
"CONTACT", Sev::verbose) <<
"Lhs Assemble Finish";
1220 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_schur_lhs_ptr);
1221 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_schur_lhs_ptr);
1230 CHKERR PCFieldSplitSetIS(pc, NULL, block_is);
1231 CHKERR PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER,
S);
1238 CHKERR PCFieldSplitSchurGetSubKSP(pc, PETSC_NULL, &subksp);
1239 auto get_pc = [](
auto ksp) {
1241 CHKERR KSPGetPC(ksp, &pc_raw);
1246 auto set_pc_p_mg = [](
auto dm,
auto pc,
auto S) {
1249 PetscBool same = PETSC_FALSE;
1250 PetscObjectTypeCompare((PetscObject)pc, PCMG, &same);
1254 CHKERR PCSetFromOptions(pc);
1261 CHKERR PetscFree(subksp);
1265boost::shared_ptr<SetUpSchur>
1267 return boost::shared_ptr<SetUpSchur>(
new SetUpSchurImpl(m_field));
static auto filter_true_skin(MoFEM::Interface &m_field, Range &&skin)
static auto get_skin(MoFEM::Interface &m_field, Range body_ents)
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
void simple(double P1[], double P2[], double P3[], double c[], const int N)
ElementsAndOps< SPACE_DIM >::BoundaryEle BoundaryEle
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
[Define dimension]
#define CATCH_ERRORS
Catch errors.
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
FieldSpace
approximation spaces
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
#define MYPCOMM_INDEX
default communicator number PCOMM
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ MOFEM_ATOM_TEST_INVALID
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::LinearForm< GAUSS >::OpBaseTimesVector< 1, SPACE_DIM, 1 > OpInertiaForce
PetscErrorCode DMMoFEMCreateSubDM(DM subdm, DM dm, const char problem_name[])
Must be called by user to set Sub DM MoFEM data structures.
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
PetscErrorCode DMMoFEMSetSquareProblem(DM dm, PetscBool square_problem)
set squared problem
PetscErrorCode DMMoFEMAddSubFieldRow(DM dm, const char field_name[])
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
MoFEMErrorCode DMRegister_MGViaApproxOrders(const char sname[])
Register DM for Multi-Grid via approximation orders.
auto createDMVector(DM dm)
Get smart vector from DM.
PetscErrorCode DMMoFEMAddSubFieldCol(DM dm, const char field_name[])
auto createDMMatrix(DM dm)
Get smart matrix from DM.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
virtual MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)=0
Make a loop over dofs.
MoFEMErrorCode getCubitMeshsetPtr(const int ms_id, const CubitBCType cubit_bc_type, const CubitMeshSets **cubit_meshset_ptr) const
get cubit meshset
const double v
phase velocity of light in medium (cm/ns)
MoFEMErrorCode opFactoryDomainLhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< HenckyOps::CommonData > common_ptr, Sev sev)
MoFEMErrorCode opFactoryDomainRhs(MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string field_name, boost::shared_ptr< HenckyOps::CommonData > common_ptr, Sev sev)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
PetscErrorCode DMMoFEMTSSetMonitor(DM dm, TS ts, const std::string fe_name, boost::shared_ptr< MoFEM::FEMethod > method, boost::shared_ptr< MoFEM::BasicMethod > pre_only, boost::shared_ptr< MoFEM::BasicMethod > post_only)
Set Monitor To TS solver.
PetscErrorCode TsSetIJacobian(TS ts, PetscReal t, Vec u, Vec u_t, PetscReal a, Mat A, Mat B, void *ctx)
Set function evaluating jacobian in TS solver.
auto getDMTsCtx(DM dm)
Get TS context data structure used by DM.
OpSchurAssembleBase * createOpSchurAssembleEnd(std::vector< std::string > fields_name, std::vector< boost::shared_ptr< Range > > field_ents, SmartPetscObj< AO > ao, SmartPetscObj< Mat > schur, bool sym_schur, bool symm_op)
Construct a new Op Schur Assemble End object.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
MoFEMErrorCode setSchurA00MatSolvePC(SmartPetscObj< PC > pc)
Set PC for A00 block.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
boost::shared_ptr< PCMGSetUpViaApproxOrdersCtx > createPCMGSetUpViaApproxOrdersCtx(DM dm, Mat A, bool use_shell_mat)
createPCMGSetUpViaApproxOrdersCtx
auto getDMSubData(DM dm)
Get sub problem data structure.
PetscErrorCode TsSetI2Jacobian(TS ts, PetscReal t, Vec u, Vec u_t, Vec u_tt, PetscReal a, PetscReal aa, Mat A, Mat B, void *ctx)
Calculation Jacobian for second order PDE in time.
MoFEMErrorCode PCMGSetUpViaApproxOrders(PC pc, boost::shared_ptr< PCMGSetUpViaApproxOrdersCtx > ctx, int verb)
Function build MG structure.
boost::shared_ptr< BlockStructure > createBlockMatStructure(DM dm, SchurFEOpsFEandFields schur_fe_op_vec)
Create a Mat Diag Blocks object.
boost::shared_ptr< NestSchurData > createSchurNestedMatrixStruture(std::pair< SmartPetscObj< DM >, SmartPetscObj< DM > > dms, boost::shared_ptr< BlockStructure > block_mat_data_ptr, std::vector< std::string > fields_names, std::vector< boost::shared_ptr< Range > > field_ents, bool add_preconditioner_block)
Get the Schur Nest Mat Array object.
auto createAOMappingIS(IS isapp, IS ispetsc)
Creates an application mapping using two index sets.
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
MoFEMErrorCode DMMoFEMSetNestSchurData(DM dm, boost::shared_ptr< NestSchurData >)
auto createDMNestSchurMat(DM dm)
auto createDM(MPI_Comm comm, const std::string dm_type_name)
Creates smart DM object.
OpSchurAssembleBase * createOpSchurAssembleBegin()
auto createDMBlockMat(DM dm)
PetscBool is_quasi_static
ElementsAndOps< SPACE_DIM >::SideEle SideEle
constexpr FieldSpace CONTACT_SPACE
constexpr double t
plate stiffness
constexpr auto field_name
static constexpr int approx_order
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, SPACE_DIM > OpMass
[Only used with Hooke equation (linear material model)]
FTensor::Index< 'm', 3 > m
Add operators pushing bases from local to physical configuration.
Simple interface for fast problem set-up.
virtual moab::Interface & get_moab()=0
virtual MPI_Comm & get_comm() const =0
virtual int get_comm_rank() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Definition of the displacement bc data structure.
Data on single entity (This is passed as argument to DataOperator::doWork)
Class (Function) to enforce essential constrains on the left hand side diagonal.
Class (Function) to enforce essential constrains on the right hand side diagonal.
Class (Function) to enforce essential constrains.
Section manager is used to create indexes and sections.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
Interface for managing meshsets containing materials and boundary conditions.
Approximate field values for given petsc vector.
Get values at integration pts for tensor filed rank 1, i.e. vector field.
PipelineManager interface.
Projection of edge entities with one mid-node on hierarchical basis.
Simple interface for fast problem set-up.
intrusive_ptr for managing petsc objects
Force scale operator for reading two columns.
double getScale(const double time)
Get scaling at a given time.
TimeScale(std::string file_name="", bool error_if_file_not_given=false, ScalingFun def_scaling_fun=[](double time) { return time;})
TimeScale constructor.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
[Push operators to pipeline]
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
virtual MoFEMErrorCode setUp(SmartPetscObj< TS > solver)=0
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)
MoFEMErrorCode createSubDM()
MoFEMErrorCode setDiagonalPC(PC pc)
SetUpSchurImpl(MoFEM::Interface &m_field)
SmartPetscObj< DM > schurDM
MoFEMErrorCode setUp(SmartPetscObj< KSP >)
SmartPetscObj< DM > blockDM
virtual ~SetUpSchurImpl()
MoFEMErrorCode setPC(PC pc)
MoFEMErrorCode setOperator()
MoFEM::Interface & mField
constexpr AssemblyType AT