Lines Matching refs:ts

485 static PetscErrorCode TSRKGetTableau_RK(TS ts, PetscInt *s, const PetscReal **A, const PetscReal **…  in TSRKGetTableau_RK()  argument
487 TS_RK *rk = (TS_RK *)ts->data; in TSRKGetTableau_RK()
524 PetscErrorCode TSRKGetTableau(TS ts, PetscInt *s, const PetscReal **A, const PetscReal **b, const P… in TSRKGetTableau() argument
527 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSRKGetTableau()
528ts, "TSRKGetTableau_C", (TS, PetscInt *, const PetscReal **, const PetscReal **, const PetscReal *… in TSRKGetTableau()
548 static PetscErrorCode TSEvaluateStep_RK(TS ts, PetscInt order, Vec X, PetscBool *done) in TSEvaluateStep_RK() argument
550 TS_RK *rk = (TS_RK *)ts->data; in TSEvaluateStep_RK()
560 h = ts->time_step; in TSEvaluateStep_RK()
563 h = ts->ptime - ts->ptime_prev; in TSEvaluateStep_RK()
566 SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); in TSEvaluateStep_RK()
570 PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_RK()
573 } else PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_RK()
578 PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_RK()
582 PetscCall(VecCopy(ts->vec_sol, X)); in TSEvaluateStep_RK()
590 …PetscCheck(done, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "RK '%s' of order %" PetscInt_FM… in TSEvaluateStep_RK()
596 static PetscErrorCode TSForwardCostIntegral_RK(TS ts) in TSForwardCostIntegral_RK() argument
598 TS_RK *rk = (TS_RK *)ts->data; in TSForwardCostIntegral_RK()
599 TS quadts = ts->quadraturets; in TSForwardCostIntegral_RK()
610 …PetscCall(TSComputeRHSFunction(quadts, rk->ptime + rk->time_step * c[i], Y[i], ts->vec_costintegra… in TSForwardCostIntegral_RK()
611 PetscCall(VecAXPY(quadts->vec_sol, rk->time_step * b[i], ts->vec_costintegrand)); in TSForwardCostIntegral_RK()
616 static PetscErrorCode TSAdjointCostIntegral_RK(TS ts) in TSAdjointCostIntegral_RK() argument
618 TS_RK *rk = (TS_RK *)ts->data; in TSAdjointCostIntegral_RK()
620 TS quadts = ts->quadraturets; in TSAdjointCostIntegral_RK()
629 …PetscCall(TSComputeRHSFunction(quadts, ts->ptime + ts->time_step * (1.0 - c[i]), Y[i], ts->vec_cos… in TSAdjointCostIntegral_RK()
630 PetscCall(VecAXPY(quadts->vec_sol, -ts->time_step * b[i], ts->vec_costintegrand)); in TSAdjointCostIntegral_RK()
635 static PetscErrorCode TSRollBack_RK(TS ts) in TSRollBack_RK() argument
637 TS_RK *rk = (TS_RK *)ts->data; in TSRollBack_RK()
638 TS quadts = ts->quadraturets; in TSRollBack_RK()
651 h = ts->time_step; in TSRollBack_RK()
654 h = ts->ptime - ts->ptime_prev; in TSRollBack_RK()
657 SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); in TSRollBack_RK()
660 PetscCall(VecMAXPY(ts->vec_sol, s, w, YdotRHS)); in TSRollBack_RK()
661 if (quadts && ts->costintegralfwd) { in TSRollBack_RK()
664 PetscCall(TSComputeRHSFunction(quadts, rk->ptime + h * c[j], Y[j], ts->vec_costintegrand)); in TSRollBack_RK()
665 PetscCall(VecAXPY(quadts->vec_sol, -h * b[j], ts->vec_costintegrand)); in TSRollBack_RK()
671 static PetscErrorCode TSForwardStep_RK(TS ts) in TSForwardStep_RK() argument
673 TS_RK *rk = (TS_RK *)ts->data; in TSForwardStep_RK()
680 PetscReal stage_time, h = ts->time_step; in TSForwardStep_RK()
684 PetscCall(MatCopy(ts->mat_sensip, rk->MatFwdSensip0, SAME_NONZERO_PATTERN)); in TSForwardStep_RK()
685 PetscCall(TSGetRHSJacobian(ts, &J, NULL, NULL, NULL)); in TSForwardStep_RK()
688 stage_time = ts->ptime + h * c[i]; in TSForwardStep_RK()
693 PetscCall(MatCopy(ts->mat_sensip, rk->MatsFwdStageSensip[i], SAME_NONZERO_PATTERN)); in TSForwardStep_RK()
697 PetscCall(MatAXPY(rk->MatsFwdStageSensip[i], 1., ts->mat_sensip, SAME_NONZERO_PATTERN)); in TSForwardStep_RK()
702 PetscCall(TSComputeRHSJacobian(ts, stage_time, Y[i], J, J)); in TSForwardStep_RK()
704 if (ts->Jacprhs) { in TSForwardStep_RK()
705 PetscCall(TSComputeRHSJacobianP(ts, stage_time, Y[i], ts->Jacprhs)); /* get f_p */ in TSForwardStep_RK()
706 …if (ts->vecs_sensi2p) { /* TLM used for 2nd-order adj… in TSForwardStep_RK()
710 …PetscCall(MatMultAdd(ts->Jacprhs, ts->vec_dir, rk->VecDeltaFwdSensipCol, rk->VecDeltaFwdSensipCol)… in TSForwardStep_RK()
714 PetscCall(MatAXPY(MatsFwdSensipTemp[i], 1., ts->Jacprhs, SUBSET_NONZERO_PATTERN)); in TSForwardStep_RK()
719 …for (i = 0; i < s; i++) PetscCall(MatAXPY(ts->mat_sensip, h * b[i], rk->MatsFwdSensipTemp[i], SAME… in TSForwardStep_RK()
724 static PetscErrorCode TSForwardGetStages_RK(TS ts, PetscInt *ns, Mat **stagesensip) in TSForwardGetStages_RK() argument
726 TS_RK *rk = (TS_RK *)ts->data; in TSForwardGetStages_RK()
735 static PetscErrorCode TSForwardSetUp_RK(TS ts) in TSForwardSetUp_RK() argument
737 TS_RK *rk = (TS_RK *)ts->data; in TSForwardSetUp_RK()
743 PetscCall(MatDuplicate(ts->mat_sensip, MAT_DO_NOT_COPY_VALUES, &rk->MatFwdSensip0)); in TSForwardSetUp_RK()
748 PetscCall(MatDuplicate(ts->mat_sensip, MAT_DO_NOT_COPY_VALUES, &rk->MatsFwdStageSensip[i])); in TSForwardSetUp_RK()
749 PetscCall(MatDuplicate(ts->mat_sensip, MAT_DO_NOT_COPY_VALUES, &rk->MatsFwdSensipTemp[i])); in TSForwardSetUp_RK()
751 PetscCall(VecDuplicate(ts->vec_sol, &rk->VecDeltaFwdSensipCol)); in TSForwardSetUp_RK()
755 static PetscErrorCode TSForwardReset_RK(TS ts) in TSForwardReset_RK() argument
757 TS_RK *rk = (TS_RK *)ts->data; in TSForwardReset_RK()
775 static PetscErrorCode TSStep_RK(TS ts) in TSStep_RK() argument
777 TS_RK *rk = (TS_RK *)ts->data; in TSStep_RK()
788 PetscReal next_time_step = ts->time_step; in TSStep_RK()
791 if (ts->steprollback || ts->steprestart) FSAL = PETSC_FALSE; in TSStep_RK()
796 while (!ts->reason && rk->status != TS_STEP_COMPLETE) { in TSStep_RK()
797 PetscReal t = ts->ptime; in TSStep_RK()
798 PetscReal h = ts->time_step; in TSStep_RK()
801 PetscCall(TSPreStage(ts, rk->stage_time)); in TSStep_RK()
802 PetscCall(VecCopy(ts->vec_sol, Y[i])); in TSStep_RK()
805 PetscCall(TSPostStage(ts, rk->stage_time, i, Y)); in TSStep_RK()
806 PetscCall(TSGetAdapt(ts, &adapt)); in TSStep_RK()
807 PetscCall(TSAdaptCheckStage(adapt, ts, rk->stage_time, Y[i], &stageok)); in TSStep_RK()
810 PetscCall(TSComputeRHSFunction(ts, t + h * c[i], Y[i], YdotRHS[i])); in TSStep_RK()
814 PetscCall(TSEvaluateStep(ts, tab->order, ts->vec_sol, NULL)); in TSStep_RK()
816 PetscCall(TSGetAdapt(ts, &adapt)); in TSStep_RK()
819 PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept)); in TSStep_RK()
822 PetscCall(TSRollBack_RK(ts)); in TSStep_RK()
823 ts->time_step = next_time_step; in TSStep_RK()
827 if (ts->costintegralfwd) { /* Save the info for the later use in cost integral evaluation */ in TSStep_RK()
828 rk->ptime = ts->ptime; in TSStep_RK()
829 rk->time_step = ts->time_step; in TSStep_RK()
832 ts->ptime += ts->time_step; in TSStep_RK()
833 ts->time_step = next_time_step; in TSStep_RK()
837 ts->reject++; in TSStep_RK()
839 if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) { in TSStep_RK()
840 ts->reason = TS_DIVERGED_STEP_REJECTED; in TSStep_RK()
841 …tscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than curr… in TSStep_RK()
847 static PetscErrorCode TSAdjointSetUp_RK(TS ts) in TSAdjointSetUp_RK() argument
849 TS_RK *rk = (TS_RK *)ts->data; in TSAdjointSetUp_RK()
854 if (ts->adjointsetupcalled) PetscFunctionReturn(PETSC_SUCCESS); in TSAdjointSetUp_RK()
855 ts->adjointsetupcalled = PETSC_TRUE; in TSAdjointSetUp_RK()
856 PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], s * ts->numcost, &rk->VecsDeltaLam)); in TSAdjointSetUp_RK()
857 PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &rk->VecsSensiTemp)); in TSAdjointSetUp_RK()
858 if (ts->vecs_sensip) PetscCall(VecDuplicate(ts->vecs_sensip[0], &rk->VecDeltaMu)); in TSAdjointSetUp_RK()
859 if (ts->vecs_sensi2) { in TSAdjointSetUp_RK()
860 PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], s * ts->numcost, &rk->VecsDeltaLam2)); in TSAdjointSetUp_RK()
861 PetscCall(VecDuplicateVecs(ts->vecs_sensi2[0], ts->numcost, &rk->VecsSensi2Temp)); in TSAdjointSetUp_RK()
863 if (ts->vecs_sensi2p) PetscCall(VecDuplicate(ts->vecs_sensi2p[0], &rk->VecDeltaMu2)); in TSAdjointSetUp_RK()
871 static PetscErrorCode TSAdjointStep_RK(TS ts) in TSAdjointStep_RK() argument
873 TS_RK *rk = (TS_RK *)ts->data; in TSAdjointStep_RK()
874 TS quadts = ts->quadraturets; in TSAdjointStep_RK()
882 Vec VecDRDUTransCol = ts->vec_drdu_col, VecDRDPTransCol = ts->vec_drdp_col; in TSAdjointStep_RK()
884 PetscReal t = ts->ptime; in TSAdjointStep_RK()
885 PetscReal h = ts->time_step; in TSAdjointStep_RK()
890 PetscCall(TSGetRHSJacobian(ts, &J, &Jpre, NULL, NULL)); in TSAdjointStep_RK()
898 PetscCall(TSComputeSNESJacobian(ts, Y[i], J, Jpre)); in TSAdjointStep_RK()
900 if (ts->vecs_sensip) { in TSAdjointStep_RK()
901 …PetscCall(TSComputeRHSJacobianP(ts, rk->stage_time, Y[i], ts->Jacprhs)); /* ge… in TSAdjointStep_RK()
911 for (nadj = 0; nadj < ts->numcost; nadj++) { in TSAdjointStep_RK()
915 …PetscCall(VecCopy(ts->vecs_sensi[nadj], VecsSensiTemp[nadj])); /* VecDeltaLam is an vec array of s… in TSAdjointStep_RK()
935 if (ts->vecs_sensip) { in TSAdjointStep_RK()
936 PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecDeltaMu)); in TSAdjointStep_RK()
949 … PetscCall(VecAXPY(ts->vecs_sensip[nadj], 1., VecDeltaMu)); /* update sensip for each stage */ in TSAdjointStep_RK()
953 … if (ts->vecs_sensi2 && ts->forward_solve) { /* 2nd-order adjoint, TLM mode has to be turned on */ in TSAdjointStep_RK()
956 PetscCall(VecPlaceArray(ts->vec_sensip_col, xarr)); in TSAdjointStep_RK()
958 …tscCall(TSComputeRHSHessianProductFunctionUU(ts, rk->stage_time, Y[i], VecsSensiTemp, ts->vec_sens… in TSAdjointStep_RK()
961 …eRHSHessianProductFunctionUU(quadts, rk->stage_time, Y[i], NULL, ts->vec_sensip_col, ts->vecs_guu)… in TSAdjointStep_RK()
963 if (ts->vecs_sensip) { in TSAdjointStep_RK()
965 …PetscCall(TSComputeRHSHessianProductFunctionUP(ts, rk->stage_time, Y[i], VecsSensiTemp, ts->vec_di… in TSAdjointStep_RK()
968 …eRHSHessianProductFunctionUP(quadts, rk->stage_time, Y[i], NULL, ts->vec_sensip_col, ts->vecs_gup)… in TSAdjointStep_RK()
971 if (ts->vecs_sensi2p) { in TSAdjointStep_RK()
973 …tscCall(TSComputeRHSHessianProductFunctionPU(ts, rk->stage_time, Y[i], VecsSensiTemp, ts->vec_sens… in TSAdjointStep_RK()
975 …PetscCall(TSComputeRHSHessianProductFunctionPP(ts, rk->stage_time, Y[i], VecsSensiTemp, ts->vec_di… in TSAdjointStep_RK()
978 …eRHSHessianProductFunctionPU(quadts, rk->stage_time, Y[i], NULL, ts->vec_sensip_col, ts->vecs_gpu)… in TSAdjointStep_RK()
980 …ComputeRHSHessianProductFunctionPP(quadts, rk->stage_time, Y[i], NULL, ts->vec_dir, ts->vecs_gpp)); in TSAdjointStep_RK()
983 PetscCall(VecResetArray(ts->vec_sensip_col)); in TSAdjointStep_RK()
986 for (nadj = 0; nadj < ts->numcost; nadj++) { in TSAdjointStep_RK()
990 PetscCall(VecCopy(ts->vecs_sensi2[nadj], VecsSensi2Temp[nadj])); in TSAdjointStep_RK()
994 PetscCall(VecAXPY(VecsDeltaLam2[nadj * s + i], -h * b[i], ts->vecs_guu[nadj])); in TSAdjointStep_RK()
995 …if (ts->vecs_sensip) PetscCall(VecAXPY(VecsDeltaLam2[nadj * s + i], -h * b[i], ts->vecs_gup[nadj])… in TSAdjointStep_RK()
1002 PetscCall(VecAXPY(VecsDeltaLam2[nadj * s + i], -h, ts->vecs_guu[nadj])); in TSAdjointStep_RK()
1003 … if (ts->vecs_sensip) PetscCall(VecAXPY(VecsDeltaLam2[nadj * s + i], -h, ts->vecs_gup[nadj])); in TSAdjointStep_RK()
1005 if (ts->vecs_sensi2p) { /* 2nd-order adjoint for parameters */ in TSAdjointStep_RK()
1006 PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensi2Temp[nadj], VecDeltaMu2)); in TSAdjointStep_RK()
1009 PetscCall(VecAXPY(VecDeltaMu2, -h * b[i], ts->vecs_gpu[nadj])); in TSAdjointStep_RK()
1010 PetscCall(VecAXPY(VecDeltaMu2, -h * b[i], ts->vecs_gpp[nadj])); in TSAdjointStep_RK()
1013 PetscCall(VecAXPY(VecDeltaMu2, -h, ts->vecs_gpu[nadj])); in TSAdjointStep_RK()
1014 PetscCall(VecAXPY(VecDeltaMu2, -h, ts->vecs_gpp[nadj])); in TSAdjointStep_RK()
1016 … PetscCall(VecAXPY(ts->vecs_sensi2p[nadj], 1, VecDeltaMu2)); /* update sensi2p for each stage */ in TSAdjointStep_RK()
1023 for (nadj = 0; nadj < ts->numcost; nadj++) { /* no need to do this for mu's */ in TSAdjointStep_RK()
1024 PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s])); in TSAdjointStep_RK()
1025 if (ts->vecs_sensi2) PetscCall(VecMAXPY(ts->vecs_sensi2[nadj], s, w, &VecsDeltaLam2[nadj * s])); in TSAdjointStep_RK()
1031 static PetscErrorCode TSAdjointReset_RK(TS ts) in TSAdjointReset_RK() argument
1033 TS_RK *rk = (TS_RK *)ts->data; in TSAdjointReset_RK()
1037 PetscCall(VecDestroyVecs(tab->s * ts->numcost, &rk->VecsDeltaLam)); in TSAdjointReset_RK()
1038 PetscCall(VecDestroyVecs(ts->numcost, &rk->VecsSensiTemp)); in TSAdjointReset_RK()
1040 PetscCall(VecDestroyVecs(tab->s * ts->numcost, &rk->VecsDeltaLam2)); in TSAdjointReset_RK()
1042 PetscCall(VecDestroyVecs(ts->numcost, &rk->VecsSensi2Temp)); in TSAdjointReset_RK()
1046 static PetscErrorCode TSInterpolate_RK(TS ts, PetscReal itime, Vec X) in TSInterpolate_RK() argument
1048 TS_RK *rk = (TS_RK *)ts->data; in TSInterpolate_RK()
1056 …PetscCheck(B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSRK %s does not have an interpola… in TSInterpolate_RK()
1061 h = ts->time_step; in TSInterpolate_RK()
1062 t = (itime - ts->ptime) / h; in TSInterpolate_RK()
1065 h = ts->ptime - ts->ptime_prev; in TSInterpolate_RK()
1066 t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */ in TSInterpolate_RK()
1069 SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); in TSInterpolate_RK()
1082 static PetscErrorCode TSRKTableauReset(TS ts) in TSRKTableauReset() argument
1084 TS_RK *rk = (TS_RK *)ts->data; in TSRKTableauReset()
1095 static PetscErrorCode TSReset_RK(TS ts) in TSReset_RK() argument
1098 PetscCall(TSRKTableauReset(ts)); in TSReset_RK()
1099 if (ts->use_splitrhsfunction) { in TSReset_RK()
1100 PetscTryMethod(ts, "TSReset_RK_MultirateSplit_C", (TS), (ts)); in TSReset_RK()
1102 PetscTryMethod(ts, "TSReset_RK_MultirateNonsplit_C", (TS), (ts)); in TSReset_RK()
1131 static PetscErrorCode TSRKTableauSetUp(TS ts) in TSRKTableauSetUp() argument
1133 TS_RK *rk = (TS_RK *)ts->data; in TSRKTableauSetUp()
1138 PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &rk->Y)); in TSRKTableauSetUp()
1139 PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &rk->YdotRHS)); in TSRKTableauSetUp()
1144 static PetscErrorCode TSSetUp_RK(TS ts) in TSSetUp_RK() argument
1146 TS quadts = ts->quadraturets; in TSSetUp_RK()
1150 PetscCall(TSCheckImplicitTerm(ts)); in TSSetUp_RK()
1151 PetscCall(TSRKTableauSetUp(ts)); in TSSetUp_RK()
1152 if (quadts && ts->costintegralfwd) { in TSSetUp_RK()
1156 PetscCall(TSGetDM(ts, &dm)); in TSSetUp_RK()
1157 PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSRK, DMRestrictHook_TSRK, ts)); in TSSetUp_RK()
1158 PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSRK, DMSubDomainRestrictHook_TSRK, ts)); in TSSetUp_RK()
1159 if (ts->use_splitrhsfunction) { in TSSetUp_RK()
1160 PetscTryMethod(ts, "TSSetUp_RK_MultirateSplit_C", (TS), (ts)); in TSSetUp_RK()
1162 PetscTryMethod(ts, "TSSetUp_RK_MultirateNonsplit_C", (TS), (ts)); in TSSetUp_RK()
1167 static PetscErrorCode TSSetFromOptions_RK(TS ts, PetscOptionItems PetscOptionsObject) in TSSetFromOptions_RK() argument
1169 TS_RK *rk = (TS_RK *)ts->data; in TSSetFromOptions_RK()
1183 if (flg) PetscCall(TSRKSetMultirate(ts, use_multirate)); in TSSetFromOptions_RK()
1185 if (flg) PetscCall(TSRKSetType(ts, namelist[choice])); in TSSetFromOptions_RK()
1189 PetscOptionsBegin(PetscObjectComm((PetscObject)ts), NULL, "Multirate methods options", ""); in TSSetFromOptions_RK()
1195 static PetscErrorCode TSView_RK(TS ts, PetscViewer viewer) in TSView_RK() argument
1197 TS_RK *rk = (TS_RK *)ts->data; in TSView_RK()
1210 PetscCall(TSRKGetType(ts, &rktype)); in TSView_RK()
1211 PetscCall(TSRKGetTableau(ts, &s, NULL, NULL, &c, NULL, NULL, NULL, &FSAL)); in TSView_RK()
1221 static PetscErrorCode TSLoad_RK(TS ts, PetscViewer viewer) in TSLoad_RK() argument
1226 PetscCall(TSGetAdapt(ts, &adapt)); in TSLoad_RK()
1246 PetscErrorCode TSRKGetOrder(TS ts, PetscInt *order) in TSRKGetOrder() argument
1249 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSRKGetOrder()
1251 PetscUseMethod(ts, "TSRKGetOrder_C", (TS, PetscInt *), (ts, order)); in TSRKGetOrder()
1271 PetscErrorCode TSRKSetType(TS ts, TSRKType rktype) in TSRKSetType() argument
1274 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSRKSetType()
1276 PetscTryMethod(ts, "TSRKSetType_C", (TS, TSRKType), (ts, rktype)); in TSRKSetType()
1295 PetscErrorCode TSRKGetType(TS ts, TSRKType *rktype) in TSRKGetType() argument
1298 PetscValidHeaderSpecific(ts, TS_CLASSID, 1); in TSRKGetType()
1299 PetscUseMethod(ts, "TSRKGetType_C", (TS, TSRKType *), (ts, rktype)); in TSRKGetType()
1303 static PetscErrorCode TSRKGetOrder_RK(TS ts, PetscInt *order) in TSRKGetOrder_RK() argument
1305 TS_RK *rk = (TS_RK *)ts->data; in TSRKGetOrder_RK()
1312 static PetscErrorCode TSRKGetType_RK(TS ts, TSRKType *rktype) in TSRKGetType_RK() argument
1314 TS_RK *rk = (TS_RK *)ts->data; in TSRKGetType_RK()
1321 static PetscErrorCode TSRKSetType_RK(TS ts, TSRKType rktype) in TSRKSetType_RK() argument
1323 TS_RK *rk = (TS_RK *)ts->data; in TSRKSetType_RK()
1335 if (ts->setupcalled) PetscCall(TSRKTableauReset(ts)); in TSRKSetType_RK()
1337 if (ts->setupcalled) PetscCall(TSRKTableauSetUp(ts)); in TSRKSetType_RK()
1338 ts->default_adapt_type = rk->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE; in TSRKSetType_RK()
1342 …SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", rktyp… in TSRKSetType_RK()
1345 static PetscErrorCode TSGetStages_RK(TS ts, PetscInt *ns, Vec **Y) in TSGetStages_RK() argument
1347 TS_RK *rk = (TS_RK *)ts->data; in TSGetStages_RK()
1355 static PetscErrorCode TSDestroy_RK(TS ts) in TSDestroy_RK() argument
1358 PetscCall(TSReset_RK(ts)); in TSDestroy_RK()
1359 if (ts->dm) { in TSDestroy_RK()
1360 PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSRK, DMRestrictHook_TSRK, ts)); in TSDestroy_RK()
1361 … PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSRK, DMSubDomainRestrictHook_TSRK, ts)); in TSDestroy_RK()
1363 PetscCall(PetscFree(ts->data)); in TSDestroy_RK()
1364 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetOrder_C", NULL)); in TSDestroy_RK()
1365 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetType_C", NULL)); in TSDestroy_RK()
1366 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKSetType_C", NULL)); in TSDestroy_RK()
1367 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetTableau_C", NULL)); in TSDestroy_RK()
1368 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKSetMultirate_C", NULL)); in TSDestroy_RK()
1369 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetMultirate_C", NULL)); in TSDestroy_RK()
1370 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSSetUp_RK_MultirateSplit_C", NULL)); in TSDestroy_RK()
1371 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSReset_RK_MultirateSplit_C", NULL)); in TSDestroy_RK()
1372 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSSetUp_RK_MultirateNonsplit_C", NULL)); in TSDestroy_RK()
1373 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSReset_RK_MultirateNonsplit_C", NULL)); in TSDestroy_RK()
1381 static PetscErrorCode SNESTSFormFunction_RK(SNES snes, Vec x, Vec y, TS ts) in SNESTSFormFunction_RK() argument
1383 TS_RK *rk = (TS_RK *)ts->data; in SNESTSFormFunction_RK()
1389 dmsave = ts->dm; in SNESTSFormFunction_RK()
1390 ts->dm = dm; in SNESTSFormFunction_RK()
1391 PetscCall(TSComputeRHSFunction(ts, rk->stage_time, x, y)); in SNESTSFormFunction_RK()
1392 ts->dm = dmsave; in SNESTSFormFunction_RK()
1396 static PetscErrorCode SNESTSFormJacobian_RK(SNES snes, Vec x, Mat A, Mat B, TS ts) in SNESTSFormJacobian_RK() argument
1398 TS_RK *rk = (TS_RK *)ts->data; in SNESTSFormJacobian_RK()
1403 dmsave = ts->dm; in SNESTSFormJacobian_RK()
1404 ts->dm = dm; in SNESTSFormJacobian_RK()
1405 PetscCall(TSComputeRHSJacobian(ts, rk->stage_time, x, A, B)); in SNESTSFormJacobian_RK()
1406 ts->dm = dmsave; in SNESTSFormJacobian_RK()
1429 PetscErrorCode TSRKSetMultirate(TS ts, PetscBool use_multirate) in TSRKSetMultirate() argument
1432 PetscTryMethod(ts, "TSRKSetMultirate_C", (TS, PetscBool), (ts, use_multirate)); in TSRKSetMultirate()
1451 PetscErrorCode TSRKGetMultirate(TS ts, PetscBool *use_multirate) in TSRKGetMultirate() argument
1454 PetscUseMethod(ts, "TSRKGetMultirate_C", (TS, PetscBool *), (ts, use_multirate)); in TSRKGetMultirate()
1472 PETSC_EXTERN PetscErrorCode TSCreate_RK(TS ts) in TSCreate_RK() argument
1479 ts->ops->reset = TSReset_RK; in TSCreate_RK()
1480 ts->ops->destroy = TSDestroy_RK; in TSCreate_RK()
1481 ts->ops->view = TSView_RK; in TSCreate_RK()
1482 ts->ops->load = TSLoad_RK; in TSCreate_RK()
1483 ts->ops->setup = TSSetUp_RK; in TSCreate_RK()
1484 ts->ops->interpolate = TSInterpolate_RK; in TSCreate_RK()
1485 ts->ops->step = TSStep_RK; in TSCreate_RK()
1486 ts->ops->evaluatestep = TSEvaluateStep_RK; in TSCreate_RK()
1487 ts->ops->rollback = TSRollBack_RK; in TSCreate_RK()
1488 ts->ops->setfromoptions = TSSetFromOptions_RK; in TSCreate_RK()
1489 ts->ops->getstages = TSGetStages_RK; in TSCreate_RK()
1491 ts->ops->snesfunction = SNESTSFormFunction_RK; in TSCreate_RK()
1492 ts->ops->snesjacobian = SNESTSFormJacobian_RK; in TSCreate_RK()
1493 ts->ops->adjointintegral = TSAdjointCostIntegral_RK; in TSCreate_RK()
1494 ts->ops->adjointsetup = TSAdjointSetUp_RK; in TSCreate_RK()
1495 ts->ops->adjointstep = TSAdjointStep_RK; in TSCreate_RK()
1496 ts->ops->adjointreset = TSAdjointReset_RK; in TSCreate_RK()
1498 ts->ops->forwardintegral = TSForwardCostIntegral_RK; in TSCreate_RK()
1499 ts->ops->forwardsetup = TSForwardSetUp_RK; in TSCreate_RK()
1500 ts->ops->forwardreset = TSForwardReset_RK; in TSCreate_RK()
1501 ts->ops->forwardstep = TSForwardStep_RK; in TSCreate_RK()
1502 ts->ops->forwardgetstages = TSForwardGetStages_RK; in TSCreate_RK()
1505 ts->data = (void *)rk; in TSCreate_RK()
1507 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetOrder_C", TSRKGetOrder_RK)); in TSCreate_RK()
1508 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetType_C", TSRKGetType_RK)); in TSCreate_RK()
1509 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKSetType_C", TSRKSetType_RK)); in TSCreate_RK()
1510 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetTableau_C", TSRKGetTableau_RK)); in TSCreate_RK()
1511 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKSetMultirate_C", TSRKSetMultirate_RK)); in TSCreate_RK()
1512 PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSRKGetMultirate_C", TSRKGetMultirate_RK)); in TSCreate_RK()
1514 PetscCall(TSRKSetType(ts, TSRKDefault)); in TSCreate_RK()