6 : mField(m_field), moab(m_field.get_moab()), problemName(problem_name),
17 auto core_log = logging::core::get();
61 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
62 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
63 CHKERR VecGhostUpdateBegin(u_t, INSERT_VALUES, SCATTER_FORWARD);
64 CHKERR VecGhostUpdateEnd(u_t, INSERT_VALUES, SCATTER_FORWARD);
68 auto zero_ghost_vec = [](Vec
g) {
76 for (
int i = 0;
i != s; ++
i)
79 CHKERR VecGhostRestoreLocalForm(
g, &
l);
87#if PETSC_VERSION_GE(3, 8, 0)
88 CHKERR TSGetStepNumber(ts, &step);
90 CHKERR TSGetTimeStepNumber(ts, &step);
93 auto cache_ptr = boost::make_shared<CacheTuple>();
96 auto set = [&](
auto &fe) {
109 CHKERR TSGetSNES(ts, &fe.snes);
110 CHKERR SNESGetKSP(fe.snes, &fe.ksp);
112 fe.cacheWeakPtr = cache_ptr;
116 auto unset = [&](
auto &fe) {
138 *(lit.second),
nullptr,
155 CHKERR VecGhostUpdateBegin(
F, ADD_VALUES, SCATTER_REVERSE);
156 CHKERR VecGhostUpdateEnd(
F, ADD_VALUES, SCATTER_REVERSE);
170 Mat A, Mat
B,
void *ctx) {
175 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
176 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
177 CHKERR VecGhostUpdateBegin(u_t, INSERT_VALUES, SCATTER_FORWARD);
178 CHKERR VecGhostUpdateEnd(u_t, INSERT_VALUES, SCATTER_FORWARD);
185#if PETSC_VERSION_GE(3, 8, 0)
186 CHKERR TSGetStepNumber(ts, &step);
188 CHKERR TSGetTimeStepNumber(ts, &step);
193 auto cache_ptr = boost::make_shared<CacheTuple>();
196 auto set = [&](
auto &fe) {
211 CHKERR TSGetSNES(ts, &fe.snes);
212 CHKERR SNESGetKSP(fe.snes, &fe.ksp);
214 fe.cacheWeakPtr = cache_ptr;
218 auto unset = [&](
auto &fe) {
239 *(lit.second),
nullptr,
256 CHKERR MatAssemblyBegin(
B, MAT_FINAL_ASSEMBLY);
257 CHKERR MatAssemblyEnd(
B, MAT_FINAL_ASSEMBLY);
268 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
269 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
273 auto cache_ptr = boost::make_shared<CacheTuple>();
276 auto set = [&](
auto &fe) {
281 fe.ts_F = PETSC_NULLPTR;
287 CHKERR TSGetSNES(ts, &fe.snes);
288 CHKERR SNESGetKSP(fe.snes, &fe.ksp);
290 fe.cacheWeakPtr = cache_ptr;
294 auto unset = [&](
auto &fe) {
310 *(lit.second),
nullptr,
331 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
332 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
336 auto zero_ghost_vec = [](Vec
g) {
344 for (
int i = 0;
i != s; ++
i)
347 CHKERR VecGhostRestoreLocalForm(
g, &
l);
353 auto cache_ptr = boost::make_shared<CacheTuple>();
357#if PETSC_VERSION_GE(3, 8, 0)
358 CHKERR TSGetStepNumber(ts, &step);
360 CHKERR TSGetTimeStepNumber(ts, &step);
363 auto set = [&](
auto &fe) {
374 fe.cacheWeakPtr = cache_ptr;
378 auto unset = [&](
auto &fe) {
399 *(lit.second),
nullptr,
416 CHKERR VecGhostUpdateBegin(
F, ADD_VALUES, SCATTER_REVERSE);
417 CHKERR VecGhostUpdateEnd(
F, ADD_VALUES, SCATTER_REVERSE);
435 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
436 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
446 auto cache_ptr = boost::make_shared<CacheTuple>();
450#if PETSC_VERSION_GE(3, 8, 0)
451 CHKERR TSGetStepNumber(ts, &step);
453 CHKERR TSGetTimeStepNumber(ts, &step);
456 auto set = [&](
auto &fe) {
468 fe.cacheWeakPtr = cache_ptr;
472 auto unset = [&](
auto &fe) {
494 *(lit.second),
nullptr,
511 CHKERR MatAssemblyBegin(
B, MAT_FINAL_ASSEMBLY);
512 CHKERR MatAssemblyEnd(
B, MAT_FINAL_ASSEMBLY);
520 PetscReal
a, PetscReal aa, Mat A, Mat
B,
526 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
527 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
528 CHKERR VecGhostUpdateBegin(u_t, INSERT_VALUES, SCATTER_FORWARD);
529 CHKERR VecGhostUpdateEnd(u_t, INSERT_VALUES, SCATTER_FORWARD);
530 CHKERR VecGhostUpdateBegin(u_tt, INSERT_VALUES, SCATTER_FORWARD);
531 CHKERR VecGhostUpdateEnd(u_tt, INSERT_VALUES, SCATTER_FORWARD);
538#if PETSC_VERSION_GE(3, 8, 0)
539 CHKERR TSGetStepNumber(ts, &step);
541 CHKERR TSGetTimeStepNumber(ts, &step);
546 auto cache_ptr = boost::make_shared<CacheTuple>();
549 auto set = [&](
auto &fe) {
567 CHKERR TSGetSNES(ts, &fe.snes);
568 CHKERR SNESGetKSP(fe.snes, &fe.ksp);
571 fe.cacheWeakPtr = cache_ptr;
575 auto unset = [&](
auto &fe) {
596 *(lit.second),
nullptr,
613 CHKERR MatAssemblyBegin(
B, MAT_FINAL_ASSEMBLY);
614 CHKERR MatAssemblyEnd(
B, MAT_FINAL_ASSEMBLY);
625 CHKERR VecGhostUpdateBegin(u, INSERT_VALUES, SCATTER_FORWARD);
626 CHKERR VecGhostUpdateEnd(u, INSERT_VALUES, SCATTER_FORWARD);
627 CHKERR VecGhostUpdateBegin(u_t, INSERT_VALUES, SCATTER_FORWARD);
628 CHKERR VecGhostUpdateEnd(u_t, INSERT_VALUES, SCATTER_FORWARD);
629 CHKERR VecGhostUpdateBegin(u_tt, INSERT_VALUES, SCATTER_FORWARD);
630 CHKERR VecGhostUpdateEnd(u_tt, INSERT_VALUES, SCATTER_FORWARD);
634 auto zero_ghost_vec = [](Vec
g) {
642 for (
int i = 0;
i != s; ++
i)
645 CHKERR VecGhostRestoreLocalForm(
g, &
l);
651 auto cache_ptr = boost::make_shared<CacheTuple>();
655#if PETSC_VERSION_GE(3, 8, 0)
656 CHKERR TSGetStepNumber(ts, &step);
658 CHKERR TSGetTimeStepNumber(ts, &step);
661 auto set = [&](
auto &fe) {
675 CHKERR TSGetSNES(ts, &fe.snes);
676 CHKERR SNESGetKSP(fe.snes, &fe.ksp);
679 fe.cacheWeakPtr = cache_ptr;
683 auto unset = [&](
auto &fe) {
705 *(lit.second),
nullptr,
722 CHKERR VecGhostUpdateBegin(
F, ADD_VALUES, SCATTER_REVERSE);
723 CHKERR VecGhostUpdateEnd(
F, ADD_VALUES, SCATTER_REVERSE);
757 : alpha(0.75), gamma(0.5), desiredIt(6), offApat(PETSC_FALSE) {
765 <<
"TS adaptivity: alpha = " <<
alpha <<
", gamma = " <<
gamma
770 PetscInt *next_sc, PetscReal *next_h,
771 PetscBool *accept, PetscReal *wlte,
772 PetscReal *wltea, PetscReal *wlter) {
775 auto ts_adapt_mofem = boost::make_shared<TSAdaptMoFEM>();
782 *accept = PETSC_TRUE;
785 if (!ts_adapt_mofem->offApat) {
788 CHKERR TSGetSNES(ts, &snes);
790 SNESConvergedReason reason;
791 CHKERR SNESGetConvergedReason(snes, &reason);
794 CHKERR SNESGetIterationNumber(snes, &it);
797 h *= ts_adapt_mofem->alpha;
800 "TSWORLD", Sev::warning,
801 "\tDiverged set step length: it = %d, h = %3.4g set h = %3.4g \n", it,
803 }
else if (reason > 0) {
804 h *= pow((
static_cast<double>(ts_adapt_mofem->desiredIt) /
805 static_cast<double>(it + 1)),
806 static_cast<double>(ts_adapt_mofem->gamma));
807 *next_h = PetscClipInterval(
h, adapt->dt_min, adapt->dt_max);
809 "TSWORLD", Sev::inform,
810 "\tConverged set step length: it = %d, h = %3.4g set h = %3.4g \n",
820 PetscFunctionReturn(0);
834 PetscFunctionReturn(0);
#define MOFEM_LOG_C(channel, severity, format,...)
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
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 problem_basic_method_postProcess(const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)=0
Set data for BasicMethod.
virtual MoFEMErrorCode loop_finite_elements(const std::string problem_name, const std::string &fe_name, FEMethod &method, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)=0
Make a loop over finite elements.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
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.
PetscErrorCode TsMonitorSet(TS ts, PetscInt step, PetscReal t, Vec u, void *ctx)
Set monitor for TS solver.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode TsSetI2Function(TS ts, PetscReal t, Vec u, Vec u_t, Vec u_tt, Vec F, void *ctx)
Calculation the right hand side for second order PDE in time.
PetscErrorCode TsSetRHSFunction(TS ts, PetscReal t, Vec u, Vec F, void *ctx)
TS solver function.
PetscErrorCode TSAdaptChooseMoFEM(TSAdapt adapt, TS ts, PetscReal h, PetscInt *next_sc, PetscReal *next_h, PetscBool *accept, PetscReal *wlte, PetscReal *wltea, PetscReal *wlter)
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)
PetscErrorCode TsSetIFunction(TS ts, PetscReal t, Vec u, Vec u_t, Vec F, void *ctx)
Set IFunction for TS solver.
PetscErrorCode TSAdaptDestroyMoFEM(TSAdapt adapt)
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.
PetscErrorCode TSAdaptResetMoFEM(TSAdapt adapt)
PetscErrorCode TsSetRHSJacobian(TS ts, PetscReal t, Vec u, Mat A, Mat B, void *ctx)
TS solver function.
PetscErrorCode TSAdaptCreateMoFEM(TSAdapt adapt)
Craete MOFEM adapt.
constexpr double t
plate stiffness
virtual MoFEMErrorCode cache_problem_entities(const std::string prb_name, CacheTupleWeakPtr cache_ptr)=0
Cache variables.
virtual MoFEMErrorCode problem_basic_method_preProcess(const Problem *problem_ptr, BasicMethod &method, int verb=DEFAULT_VERBOSITY)=0
Set data for BasicMethod.
Deprecated interface functions.
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.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
static bool checkIfChannelExist(const std::string channel)
Check if channel exist.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.
static constexpr Switches CtxSetA
static constexpr Switches CtxSetX
static constexpr Switches CtxSetX_TT
static constexpr Switches CtxSetNone
static constexpr Switches CtxSetF
static constexpr Switches CtxSetX_T
static constexpr Switches CtxSetB
static constexpr Switches CtxSetTime
Custom TSAdaptivity in MoFEM.
Interface for Time Stepping (TS) solver.
PetscLogEvent MOFEM_EVENT_TsCtxI2Jacobian
FEMethodsSequence loopsIJacobian
MoFEMTypes bH
If set to MF_EXIST check if element exist.
PetscLogEvent MOFEM_EVENT_TsCtxRHSJacobian
FEMethodsSequence loopsRHSFunction
PetscLogEvent MOFEM_EVENT_TsCtxMonitor
BasicMethodsSequence postProcessRHSFunction
BasicMethodsSequence preProcessMonitor
PetscLogEvent MOFEM_EVENT_TsCtxRHSFunction
BasicMethodsSequence preProcessIJacobian
BasicMethodsSequence postProcessIFunction
FEMethodsSequence loopsIFunction
FEMethodsSequence loopsRHSJacobian
BasicMethodsSequence preProcessIFunction
FEMethodsSequence loopsMonitor
BasicMethodsSequence postProcessMonitor
BasicMethodsSequence preProcessRHSJacobian
boost::movelib::unique_ptr< bool > vecAssembleSwitch
PetscLogEvent MOFEM_EVENT_TsCtxIJacobian
boost::movelib::unique_ptr< bool > matAssembleSwitch
MoFEMErrorCode clearLoops()
Clear loops.
TsCtx(MoFEM::Interface &m_field, const std::string &problem_name)
MoFEM::Interface & mField
boost::function< MoFEMErrorCode(TS ts, PetscReal t, Vec u, Vec u_t, Vec u_tt, Vec F, void *ctx)> tsDebugHook
BasicMethodsSequence preProcessRHSFunction
BasicMethodsSequence postProcessIJacobian
PetscLogEvent MOFEM_EVENT_TsCtxIFunction
BasicMethodsSequence postProcessRHSJacobian
PetscLogEvent MOFEM_EVENT_TsCtxI2Function
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
Vector manager is used to create vectors \mofem_vectors.