852 {
854
858
859 auto dm =
simple->getDM();
860 auto solver = pipeline_mng->createTSIM();
862
863 auto set_section_monitor = [&](auto solver) {
865 SNES snes;
866 CHKERR TSGetSNES(solver, &snes);
867 CHKERR SNESMonitorSet(snes,
870 (void *)(snes_ctx_ptr.get()), nullptr);
872 };
873
874 auto create_post_process_element = [&]() {
875 auto post_proc_fe = boost::make_shared<PostProcEle>(
mField);
876
877 auto block_params = boost::make_shared<BlockedParameters>();
878 auto mDPtr = block_params->getDPtr();
879 auto coeff_expansion_ptr = block_params->getCoeffExpansionPtr();
880
882 "MAT_THERMAL", block_params, Sev::verbose);
883
885 post_proc_fe->getOpPtrVector(), {H1, HDIV});
886
887 auto mat_grad_ptr = boost::make_shared<MatrixDouble>();
888 auto mat_strain_ptr = boost::make_shared<MatrixDouble>();
889 auto mat_stress_ptr = boost::make_shared<MatrixDouble>();
890
891 auto vec_temp_ptr = boost::make_shared<VectorDouble>();
892 auto mat_flux_ptr = boost::make_shared<MatrixDouble>();
893
894 post_proc_fe->getOpPtrVector().push_back(
896 post_proc_fe->getOpPtrVector().push_back(
898
899 auto u_ptr = boost::make_shared<MatrixDouble>();
900 post_proc_fe->getOpPtrVector().push_back(
902 post_proc_fe->getOpPtrVector().push_back(
904 mat_grad_ptr));
905 post_proc_fe->getOpPtrVector().push_back(
907 post_proc_fe->getOpPtrVector().push_back(
909 coeff_expansion_ptr, mat_stress_ptr));
910
912
913 post_proc_fe->getOpPtrVector().push_back(
914
916
917 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
918
919 {{"T", vec_temp_ptr}},
920
921 {{"U", u_ptr}, {"FLUX", mat_flux_ptr}},
922
923 {},
924
925 {{"STRAIN", mat_strain_ptr}, {"STRESS", mat_stress_ptr}}
926
927 )
928
929 );
930
931 return post_proc_fe;
932 };
933
934 auto monitor_ptr = boost::make_shared<FEMethod>();
935 auto post_proc_fe = create_post_process_element();
936
937 auto set_time_monitor = [&](auto dm, auto solver) {
939 monitor_ptr->preProcessHook = [&]() {
941
943 post_proc_fe,
944 monitor_ptr->getCacheWeakPtr());
945 CHKERR post_proc_fe->writeFile(
946 "out_" + boost::lexical_cast<std::string>(monitor_ptr->ts_step) +
947 ".h5m");
948
952 ->evalFEAtThePoint3D(
957 } else {
959 ->evalFEAtThePoint2D(
964 }
965
968 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
969 << "Eval point T: " << t_temp;
970 }
974 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
975 <<
"Eval point U magnitude: " << sqrt(t_disp(
i) * t_disp(
i));
976 }
979 auto t_disp_grad =
981 MOFEM_LOG(
"ThermoElasticSync", Sev::inform)
982 <<
"Eval point U_GRAD trace: " << t_disp_grad(
i,
i);
983 }
984
986 }
987
989 };
990 auto null = boost::shared_ptr<FEMethod>();
992 monitor_ptr, null);
994 };
995
996 auto set_fieldsplit_preconditioner = [&](auto solver) {
998
999 SNES snes;
1000 CHKERR TSGetSNES(solver, &snes);
1001 KSP ksp;
1002 CHKERR SNESGetKSP(snes, &ksp);
1003 PC pc;
1004 CHKERR KSPGetPC(ksp, &pc);
1005 PetscBool is_pcfs = PETSC_FALSE;
1006 PetscObjectTypeCompare((PetscObject)pc, PCFIELDSPLIT, &is_pcfs);
1007
1008
1009 if (is_pcfs == PETSC_TRUE) {
1012 auto name_prb =
simple->getProblemName();
1013
1015 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"U", 0,
1018 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"FLUX", 0, 0,
1019 is_flux);
1021 CHKERR is_mng->isCreateProblemFieldAndRank(name_prb,
ROW,
"T", 0, 0,
1022 is_T);
1023 IS is_tmp;
1024 CHKERR ISExpand(is_T, is_flux, &is_tmp);
1026
1027 auto is_all_bc = bc_mng->getBlockIS(name_prb, "HEATFLUX", "FLUX", 0, 0);
1028 int is_all_bc_size;
1029 CHKERR ISGetSize(is_all_bc, &is_all_bc_size);
1031 << "Field split block size " << is_all_bc_size;
1032 if (is_all_bc_size) {
1033 IS is_tmp2;
1034 CHKERR ISDifference(is_TFlux, is_all_bc, &is_tmp2);
1036 CHKERR PCFieldSplitSetIS(pc, PETSC_NULL,
1037 is_all_bc);
1038 }
1039
1042 CHKERR PCFieldSplitSetIS(pc, PETSC_NULL, is_TFlux);
1043 CHKERR PCFieldSplitSetIS(pc, PETSC_NULL, is_u);
1044 }
1045
1047 };
1048
1050 CHKERR TSSetSolution(solver,
D);
1051 CHKERR TSSetFromOptions(solver);
1052
1053 CHKERR set_section_monitor(solver);
1054 CHKERR set_fieldsplit_preconditioner(solver);
1055 CHKERR set_time_monitor(dm, solver);
1056
1058 CHKERR TSSolve(solver, NULL);
1059
1061}
#define MOFEM_LOG_SYNCHRONISE(comm)
Synchronise "SYNC" channel.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
auto createDMVector(DM dm)
Get smart vector from DM.
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.
MoFEMErrorCode MoFEMSNESMonitorFields(SNES snes, PetscInt its, PetscReal fgnorm, SnesCtx *snes_ctx)
Sens monitor printing residual field by field.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
auto getDMSnesCtx(DM dm)
Get SNES context data structure used by DM.
OpPostProcMapInMoab< SPACE_DIM, SPACE_DIM > OpPPMap
Section manager is used to create indexes and sections.
Post post-proc data at points from hash maps.
intrusive_ptr for managing petsc objects