722 {
723 static boost::shared_ptr<SetUpSchur>
726
727protected:
729};
730
733
737
738 auto set_section_monitor = [&](auto solver) {
740 SNES snes;
741 CHKERR TSGetSNES(solver, &snes);
742 PetscViewerAndFormat *vf;
743 CHKERR PetscViewerAndFormatCreate(PETSC_VIEWER_STDOUT_WORLD,
744 PETSC_VIEWER_DEFAULT, &vf);
746 snes,
747 (
MoFEMErrorCode (*)(SNES, PetscInt, PetscReal,
void *))SNESMonitorFields,
750 };
751
752 auto scatter_create = [&](
auto D,
auto coeff) {
754 CHKERR is_manager->isCreateProblemFieldAndRank(
simple->getProblemName(),
755 ROW,
"U", coeff, coeff, is);
756 int loc_size;
757 CHKERR ISGetLocalSize(is, &loc_size);
760 VecScatter scatter;
761 CHKERR VecScatterCreate(
D, is,
v, PETSC_NULL, &scatter);
764 };
765
766 auto set_time_monitor = [&](auto dm, auto solver) {
769 boost::shared_ptr<ForcesAndSourcesCore> null;
773 };
774
775 auto set_essential_bc = [&]() {
777
779 auto pre_proc_ptr = boost::make_shared<FEMethod>();
780 auto post_proc_rhs_ptr = boost::make_shared<FEMethod>();
781 auto post_proc_lhs_ptr = boost::make_shared<FEMethod>();
782
783
784 auto time_scale = boost::make_shared<TimeScale>();
785
786 auto get_bc_hook_rhs = [&]() {
788 {time_scale}, false);
789 return hook;
790 };
791 pre_proc_ptr->preProcessHook = get_bc_hook_rhs();
792
793 auto get_post_proc_hook_rhs = [&]() {
795 mField, post_proc_rhs_ptr, 1.);
796 };
797 auto get_post_proc_hook_lhs = [&]() {
799 mField, post_proc_lhs_ptr, 1.);
800 };
801 post_proc_rhs_ptr->postProcessHook = get_post_proc_hook_rhs();
802
803 ts_ctx_ptr->getPreProcessIFunction().push_front(pre_proc_ptr);
804 ts_ctx_ptr->getPreProcessIJacobian().push_front(pre_proc_ptr);
805 ts_ctx_ptr->getPostProcessIFunction().push_back(post_proc_rhs_ptr);
806 post_proc_lhs_ptr->postProcessHook = get_post_proc_hook_lhs();
807 ts_ctx_ptr->getPostProcessIJacobian().push_back(post_proc_lhs_ptr);
809 };
810
811
812 auto set_schur_pc = [&](auto solver) {
813 boost::shared_ptr<SetUpSchur> schur_ptr;
814 if (
AT == AssemblyType::BLOCK_SCHUR) {
815
818 }
819 return schur_ptr;
820 };
821
822 auto dm =
simple->getDM();
824
826
831
832
833
834 CHKERR set_essential_bc();
835
837 auto solver = pip_mng->createTSIM();
838 CHKERR TSSetFromOptions(solver);
839 auto schur_pc_ptr = set_schur_pc(solver);
840
842 CHKERR set_section_monitor(solver);
843 CHKERR set_time_monitor(dm, solver);
844 CHKERR TSSetSolution(solver,
D);
846 CHKERR TSSolve(solver, NULL);
847 } else {
848 auto solver = pip_mng->createTSIM2();
849 CHKERR TSSetFromOptions(solver);
850 auto schur_pc_ptr = set_schur_pc(solver);
851
852 auto dm =
simple->getDM();
855
856 CHKERR set_section_monitor(solver);
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
auto createDMVector(DM dm)
Get smart vector from DM.
const double v
phase velocity of light in medium (cm/ns)
const FTensor::Tensor2< T, Dim, Dim > Vec
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.
auto getDMTsCtx(DM dm)
Get TS context data structure used by DM.
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
Deprecated interface functions.
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.
intrusive_ptr for managing petsc objects
[Push operators to pipeline]
static boost::shared_ptr< SetUpSchur > createSetUpSchur(MoFEM::Interface &m_field)