667 {
669
672 auto dm =
simple->getDM();
673
674 auto get_fe_post_proc = [&]() {
675 auto post_proc_fe = boost::make_shared<PostProcEle>(
mField);
676
677 auto det_ptr = boost::make_shared<VectorDouble>();
678 auto jac_ptr = boost::make_shared<MatrixDouble>();
679 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
680
681 auto u_ptr = boost::make_shared<MatrixDouble>();
682 auto grad_u_ptr = boost::make_shared<MatrixDouble>();
683 auto h_ptr = boost::make_shared<VectorDouble>();
684 auto grad_h_ptr = boost::make_shared<MatrixDouble>();
685 auto p_ptr = boost::make_shared<VectorDouble>();
686 auto g_ptr = boost::make_shared<VectorDouble>();
687 auto grad_g_ptr = boost::make_shared<MatrixDouble>();
688
689 post_proc_fe->getOpPtrVector().push_back(
691 post_proc_fe->getOpPtrVector().push_back(
693 post_proc_fe->getOpPtrVector().push_back(
695
696 post_proc_fe->getOpPtrVector().push_back(
698 post_proc_fe->getOpPtrVector().push_back(
700 grad_u_ptr));
701
702 post_proc_fe->getOpPtrVector().push_back(
704 post_proc_fe->getOpPtrVector().push_back(
706
707 post_proc_fe->getOpPtrVector().push_back(
709 post_proc_fe->getOpPtrVector().push_back(
711 post_proc_fe->getOpPtrVector().push_back(
713
715
716 post_proc_fe->getOpPtrVector().push_back(
717
719 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
720
721 {{"H", h_ptr}, {"P", p_ptr}, {"G", g_ptr}},
722
723 {{"U", u_ptr}, {"H_GRAD", grad_h_ptr}, {"G_GRAD", grad_g_ptr}},
724
725 {{"GRAD_U", grad_u_ptr}},
726
727 {}
728
729 )
730
731 );
732
733 return post_proc_fe;
734 };
735
736 auto get_bdy_post_proc_fe = [&]() {
737 auto post_proc_fe = boost::make_shared<PostProcEdgeEle>(
mField);
738
739 auto u_ptr = boost::make_shared<MatrixDouble>();
740 auto p_ptr = boost::make_shared<VectorDouble>();
741 auto lambda_ptr = boost::make_shared<VectorDouble>();
742
743 post_proc_fe->getOpPtrVector().push_back(
745 post_proc_fe->getOpPtrVector().push_back(
747 post_proc_fe->getOpPtrVector().push_back(
749
751
752 post_proc_fe->getOpPtrVector().push_back(
753
754 new OpPPMap(post_proc_fe->getPostProcMesh(),
755 post_proc_fe->getMapGaussPts(),
756
758
760
762
764
765 )
766
767 );
768
769 return post_proc_fe;
770 };
771
772 auto get_lift_fe = [&]() {
773 auto fe = boost::make_shared<BoundaryEle>(
mField);
774 auto lift_ptr = boost::make_shared<VectorDouble>();
775 auto p_ptr = boost::make_shared<VectorDouble>();
776 auto ents_ptr = boost::make_shared<Range>();
777
778 std::vector<const CubitMeshSets *> vec_ptr;
780 std::regex("LIFT"), vec_ptr);
781 for (auto m_ptr : vec_ptr) {
785 ents, true);
786 ents_ptr->merge(ents);
787 }
788
789 MOFEM_LOG(
"FS", Sev::noisy) <<
"Lift ents " << (*ents_ptr);
790
791 fe->getOpPtrVector().push_back(
793 fe->getOpPtrVector().push_back(
795
796 return std::make_pair(fe, lift_ptr);
797 };
798
799 auto set_ts = [&](auto solver) {
801 SNES snes;
802 CHKERR TSGetSNES(solver, &snes);
803 KSP ksp;
804 CHKERR SNESGetKSP(snes, &ksp);
806 };
807
808 auto ts = pipeline_mng->createTSIM();
809 CHKERR TSSetType(ts, TSALPHA);
810
811 auto set_post_proc_monitor = [&](auto dm) {
813 boost::shared_ptr<FEMethod> null_fe;
814 auto monitor_ptr = boost::make_shared<Monitor>(
815 dm, get_fe_post_proc(), get_bdy_post_proc_fe(), get_lift_fe());
817 null_fe, monitor_ptr);
819 };
820 CHKERR set_post_proc_monitor(dm);
821
822
823 double ftime = 1;
824
825 CHKERR TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP);
826
829 SCATTER_FORWARD);
830 CHKERR TSSetSolution(ts, T);
831 CHKERR TSSetFromOptions(ts);
834
835 auto print_fields_in_section = [&]() {
837
839 simple->getProblemName());
840 PetscInt num_fields;
841 CHKERR PetscSectionGetNumFields(section, &num_fields);
842 for (
int f = 0;
f < num_fields; ++
f) {
846 <<
"Field " <<
f <<
" " << std::string(
field_name);
847 }
849 };
850
851 CHKERR print_fields_in_section();
852
854 CHKERR TSGetTime(ts, &ftime);
855
857}
MoFEMErrorCode getMeshset(const int ms_id, const unsigned int cubit_bc_type, EntityHandle &meshset) const
get meshset from CUBIT Id and CUBIT type
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.
virtual moab::Interface & get_moab()=0
Interface for managing meshsets containing materials and boundary conditions.
std::map< std::string, boost::shared_ptr< VectorDouble > > DataMapVec
std::map< std::string, boost::shared_ptr< MatrixDouble > > DataMapMat