1900f6b5bSMatthew G. Knepley #include <petscconvest.h> /*I "petscconvest.h" I*/ 2900f6b5bSMatthew G. Knepley #include <petscts.h> 3f2ed2dc7SMatthew G. Knepley #include <petscdmplex.h> 4900f6b5bSMatthew G. Knepley 5900f6b5bSMatthew G. Knepley #include <petsc/private/petscconvestimpl.h> 6900f6b5bSMatthew G. Knepley 7900f6b5bSMatthew G. Knepley static PetscErrorCode PetscConvEstSetTS_Private(PetscConvEst ce, PetscObject solver) 8900f6b5bSMatthew G. Knepley { 9900f6b5bSMatthew G. Knepley PetscClassId id; 10900f6b5bSMatthew G. Knepley PetscErrorCode ierr; 11900f6b5bSMatthew G. Knepley 12900f6b5bSMatthew G. Knepley PetscFunctionBegin; 13900f6b5bSMatthew G. Knepley ierr = PetscObjectGetClassId(ce->solver, &id);CHKERRQ(ierr); 14*3c633725SBarry Smith PetscCheck(id == TS_CLASSID,PetscObjectComm((PetscObject) ce), PETSC_ERR_ARG_WRONG, "Solver was not a TS"); 15900f6b5bSMatthew G. Knepley ierr = TSGetDM((TS) ce->solver, &ce->idm);CHKERRQ(ierr); 16900f6b5bSMatthew G. Knepley PetscFunctionReturn(0); 17900f6b5bSMatthew G. Knepley } 18900f6b5bSMatthew G. Knepley 19900f6b5bSMatthew G. Knepley static PetscErrorCode PetscConvEstInitGuessTS_Private(PetscConvEst ce, PetscInt r, DM dm, Vec u) 20900f6b5bSMatthew G. Knepley { 21900f6b5bSMatthew G. Knepley PetscErrorCode ierr; 22900f6b5bSMatthew G. Knepley 23900f6b5bSMatthew G. Knepley PetscFunctionBegin; 242e61be88SMatthew G. Knepley ierr = TSComputeInitialCondition((TS) ce->solver, u);CHKERRQ(ierr); 25900f6b5bSMatthew G. Knepley PetscFunctionReturn(0); 26900f6b5bSMatthew G. Knepley } 27900f6b5bSMatthew G. Knepley 28900f6b5bSMatthew G. Knepley static PetscErrorCode PetscConvEstComputeErrorTS_Private(PetscConvEst ce, PetscInt r, DM dm, Vec u, PetscReal errors[]) 29900f6b5bSMatthew G. Knepley { 30f2cacb80SMatthew G. Knepley TS ts = (TS) ce->solver; 31f2cacb80SMatthew G. Knepley PetscErrorCode (*exactError)(TS, Vec, Vec); 32900f6b5bSMatthew G. Knepley PetscErrorCode ierr; 33900f6b5bSMatthew G. Knepley 34900f6b5bSMatthew G. Knepley PetscFunctionBegin; 35f2cacb80SMatthew G. Knepley ierr = TSGetComputeExactError(ts, &exactError);CHKERRQ(ierr); 36f2cacb80SMatthew G. Knepley if (exactError) { 37f2cacb80SMatthew G. Knepley Vec e; 38f2cacb80SMatthew G. Knepley PetscInt f; 39f2cacb80SMatthew G. Knepley 40900f6b5bSMatthew G. Knepley ierr = VecDuplicate(u, &e);CHKERRQ(ierr); 41f2cacb80SMatthew G. Knepley ierr = TSComputeExactError(ts, u, e);CHKERRQ(ierr); 42900f6b5bSMatthew G. Knepley ierr = VecNorm(e, NORM_2, errors);CHKERRQ(ierr); 43f2cacb80SMatthew G. Knepley for (f = 1; f < ce->Nf; ++f) errors[f] = errors[0]; 44900f6b5bSMatthew G. Knepley ierr = VecDestroy(&e);CHKERRQ(ierr); 45f2cacb80SMatthew G. Knepley } else { 46f2cacb80SMatthew G. Knepley PetscReal t; 47f2cacb80SMatthew G. Knepley 48f2cacb80SMatthew G. Knepley ierr = TSGetSolveTime(ts, &t);CHKERRQ(ierr); 49f2cacb80SMatthew G. Knepley ierr = DMComputeL2FieldDiff(dm, t, ce->exactSol, ce->ctxs, u, errors);CHKERRQ(ierr); 50f2cacb80SMatthew G. Knepley } 51900f6b5bSMatthew G. Knepley PetscFunctionReturn(0); 52900f6b5bSMatthew G. Knepley } 53900f6b5bSMatthew G. Knepley 54f2ed2dc7SMatthew G. Knepley static PetscErrorCode PetscConvEstGetConvRateTS_Temporal_Private(PetscConvEst ce, PetscReal alpha[]) 55900f6b5bSMatthew G. Knepley { 56900f6b5bSMatthew G. Knepley TS ts = (TS) ce->solver; 57900f6b5bSMatthew G. Knepley Vec u; 58900f6b5bSMatthew G. Knepley PetscReal *dt, *x, *y, slope, intercept; 59900f6b5bSMatthew G. Knepley PetscInt Ns, oNs, Nf = ce->Nf, f, Nr = ce->Nr, r; 60900f6b5bSMatthew G. Knepley PetscErrorCode ierr; 61900f6b5bSMatthew G. Knepley 62900f6b5bSMatthew G. Knepley PetscFunctionBegin; 63900f6b5bSMatthew G. Knepley ierr = TSGetSolution(ts, &u);CHKERRQ(ierr); 64900f6b5bSMatthew G. Knepley ierr = PetscMalloc1(Nr+1, &dt);CHKERRQ(ierr); 65900f6b5bSMatthew G. Knepley ierr = TSGetTimeStep(ts, &dt[0]);CHKERRQ(ierr); 66900f6b5bSMatthew G. Knepley ierr = TSGetMaxSteps(ts, &oNs);CHKERRQ(ierr); 67900f6b5bSMatthew G. Knepley Ns = oNs; 68900f6b5bSMatthew G. Knepley for (r = 0; r <= Nr; ++r) { 69900f6b5bSMatthew G. Knepley if (r > 0) { 702e61be88SMatthew G. Knepley dt[r] = dt[r-1]/ce->r; 712e61be88SMatthew G. Knepley Ns = PetscCeilReal(Ns*ce->r); 72900f6b5bSMatthew G. Knepley } 73900f6b5bSMatthew G. Knepley ierr = TSSetTime(ts, 0.0);CHKERRQ(ierr); 74900f6b5bSMatthew G. Knepley ierr = TSSetStepNumber(ts, 0);CHKERRQ(ierr); 75900f6b5bSMatthew G. Knepley ierr = TSSetTimeStep(ts, dt[r]);CHKERRQ(ierr); 76900f6b5bSMatthew G. Knepley ierr = TSSetMaxSteps(ts, Ns);CHKERRQ(ierr); 77900f6b5bSMatthew G. Knepley ierr = PetscConvEstComputeInitialGuess(ce, r, NULL, u);CHKERRQ(ierr); 78900f6b5bSMatthew G. Knepley ierr = TSSolve(ts, u);CHKERRQ(ierr); 79900f6b5bSMatthew G. Knepley ierr = PetscLogEventBegin(ce->event, ce, 0, 0, 0);CHKERRQ(ierr); 80f2cacb80SMatthew G. Knepley ierr = PetscConvEstComputeError(ce, r, ce->idm, u, &ce->errors[r*Nf]);CHKERRQ(ierr); 81900f6b5bSMatthew G. Knepley ierr = PetscLogEventEnd(ce->event, ce, 0, 0, 0);CHKERRQ(ierr); 82f2ed2dc7SMatthew G. Knepley for (f = 0; f < Nf; ++f) { 839327cc11SMatthew G. Knepley ce->dofs[r*Nf+f] = 1.0/dt[r]; 849327cc11SMatthew G. Knepley ierr = PetscLogEventSetDof(ce->event, f, ce->dofs[r*Nf+f]);CHKERRQ(ierr); 85900f6b5bSMatthew G. Knepley ierr = PetscLogEventSetError(ce->event, f, ce->errors[r*Nf+f]);CHKERRQ(ierr); 86900f6b5bSMatthew G. Knepley } 87f2cacb80SMatthew G. Knepley /* Monitor */ 88f2cacb80SMatthew G. Knepley ierr = PetscConvEstMonitorDefault(ce, r);CHKERRQ(ierr); 89900f6b5bSMatthew G. Knepley } 90900f6b5bSMatthew G. Knepley /* Fit convergence rate */ 91900f6b5bSMatthew G. Knepley if (Nr) { 92900f6b5bSMatthew G. Knepley ierr = PetscMalloc2(Nr+1, &x, Nr+1, &y);CHKERRQ(ierr); 93900f6b5bSMatthew G. Knepley for (f = 0; f < Nf; ++f) { 94900f6b5bSMatthew G. Knepley for (r = 0; r <= Nr; ++r) { 95f2cacb80SMatthew G. Knepley x[r] = PetscLog10Real(dt[r]); 96900f6b5bSMatthew G. Knepley y[r] = PetscLog10Real(ce->errors[r*Nf+f]); 97900f6b5bSMatthew G. Knepley } 98900f6b5bSMatthew G. Knepley ierr = PetscLinearRegression(Nr+1, x, y, &slope, &intercept);CHKERRQ(ierr); 99900f6b5bSMatthew G. Knepley /* Since lg err = s lg dt + b */ 100900f6b5bSMatthew G. Knepley alpha[f] = slope; 101900f6b5bSMatthew G. Knepley } 102900f6b5bSMatthew G. Knepley ierr = PetscFree2(x, y);CHKERRQ(ierr); 103900f6b5bSMatthew G. Knepley } 104900f6b5bSMatthew G. Knepley /* Reset solver */ 105900f6b5bSMatthew G. Knepley ierr = TSSetConvergedReason(ts, TS_CONVERGED_ITERATING);CHKERRQ(ierr); 106900f6b5bSMatthew G. Knepley ierr = TSSetTime(ts, 0.0);CHKERRQ(ierr); 107900f6b5bSMatthew G. Knepley ierr = TSSetStepNumber(ts, 0);CHKERRQ(ierr); 108900f6b5bSMatthew G. Knepley ierr = TSSetTimeStep(ts, dt[0]);CHKERRQ(ierr); 109900f6b5bSMatthew G. Knepley ierr = TSSetMaxSteps(ts, oNs);CHKERRQ(ierr); 110900f6b5bSMatthew G. Knepley ierr = PetscConvEstComputeInitialGuess(ce, 0, NULL, u);CHKERRQ(ierr); 111900f6b5bSMatthew G. Knepley ierr = PetscFree(dt);CHKERRQ(ierr); 112900f6b5bSMatthew G. Knepley PetscFunctionReturn(0); 113900f6b5bSMatthew G. Knepley } 114900f6b5bSMatthew G. Knepley 115f2ed2dc7SMatthew G. Knepley static PetscErrorCode PetscConvEstGetConvRateTS_Spatial_Private(PetscConvEst ce, PetscReal alpha[]) 116f2ed2dc7SMatthew G. Knepley { 117f2ed2dc7SMatthew G. Knepley TS ts = (TS) ce->solver; 118f2ed2dc7SMatthew G. Knepley Vec uInitial; 119f2ed2dc7SMatthew G. Knepley DM *dm; 120f2ed2dc7SMatthew G. Knepley PetscObject disc; 121f2ed2dc7SMatthew G. Knepley PetscReal *x, *y, slope, intercept; 1227809adefSMatthew G. Knepley PetscInt Nr = ce->Nr, r, Nf = ce->Nf, f, dim, oldlevel, oldnlev; 123f2ed2dc7SMatthew G. Knepley void *ctx; 124f2ed2dc7SMatthew G. Knepley PetscErrorCode ierr; 125f2ed2dc7SMatthew G. Knepley 126f2ed2dc7SMatthew G. Knepley PetscFunctionBegin; 127*3c633725SBarry Smith PetscCheck(ce->r == 2.0,PetscObjectComm((PetscObject) ce), PETSC_ERR_SUP, "Only refinement factor 2 is currently supported (not %g)", (double) ce->r); 128f2ed2dc7SMatthew G. Knepley ierr = DMGetDimension(ce->idm, &dim);CHKERRQ(ierr); 129f2ed2dc7SMatthew G. Knepley ierr = DMGetApplicationContext(ce->idm, &ctx);CHKERRQ(ierr); 130f2ed2dc7SMatthew G. Knepley ierr = DMPlexSetRefinementUniform(ce->idm, PETSC_TRUE);CHKERRQ(ierr); 131f2ed2dc7SMatthew G. Knepley ierr = DMGetRefineLevel(ce->idm, &oldlevel);CHKERRQ(ierr); 1327809adefSMatthew G. Knepley ierr = PetscMalloc1((Nr+1), &dm);CHKERRQ(ierr); 133f2ed2dc7SMatthew G. Knepley ierr = TSGetSolution(ts, &uInitial);CHKERRQ(ierr); 134f2ed2dc7SMatthew G. Knepley /* Loop over meshes */ 135f2ed2dc7SMatthew G. Knepley dm[0] = ce->idm; 136f2ed2dc7SMatthew G. Knepley for (r = 0; r <= Nr; ++r) { 137f2ed2dc7SMatthew G. Knepley Vec u; 138f2ed2dc7SMatthew G. Knepley #if defined(PETSC_USE_LOG) 139f2ed2dc7SMatthew G. Knepley PetscLogStage stage; 140f2ed2dc7SMatthew G. Knepley #endif 141f2ed2dc7SMatthew G. Knepley char stageName[PETSC_MAX_PATH_LEN]; 142f2ed2dc7SMatthew G. Knepley const char *dmname, *uname; 143f2ed2dc7SMatthew G. Knepley 144f2ed2dc7SMatthew G. Knepley ierr = PetscSNPrintf(stageName, PETSC_MAX_PATH_LEN-1, "ConvEst Refinement Level %D", r);CHKERRQ(ierr); 145608e5a7aSMatthew G. Knepley #if defined(PETSC_USE_LOG) 146608e5a7aSMatthew G. Knepley ierr = PetscLogStageGetId(stageName, &stage);CHKERRQ(ierr); 147608e5a7aSMatthew G. Knepley if (stage < 0) {ierr = PetscLogStageRegister(stageName, &stage);CHKERRQ(ierr);} 148608e5a7aSMatthew G. Knepley #endif 149f2ed2dc7SMatthew G. Knepley ierr = PetscLogStagePush(stage);CHKERRQ(ierr); 150f2ed2dc7SMatthew G. Knepley if (r > 0) { 151b2df8587SMatthew G. Knepley if (!ce->noRefine) { 152f2ed2dc7SMatthew G. Knepley ierr = DMRefine(dm[r-1], MPI_COMM_NULL, &dm[r]);CHKERRQ(ierr); 153f2ed2dc7SMatthew G. Knepley ierr = DMSetCoarseDM(dm[r], dm[r-1]);CHKERRQ(ierr); 154b2df8587SMatthew G. Knepley } else { 155b2df8587SMatthew G. Knepley DM cdm, rcdm; 156b2df8587SMatthew G. Knepley 157b2df8587SMatthew G. Knepley ierr = DMClone(dm[r-1], &dm[r]);CHKERRQ(ierr); 158b2df8587SMatthew G. Knepley ierr = DMCopyDisc(dm[r-1], dm[r]);CHKERRQ(ierr); 159b2df8587SMatthew G. Knepley ierr = DMGetCoordinateDM(dm[r-1], &cdm);CHKERRQ(ierr); 160b2df8587SMatthew G. Knepley ierr = DMGetCoordinateDM(dm[r], &rcdm);CHKERRQ(ierr); 161b2df8587SMatthew G. Knepley ierr = DMCopyDisc(cdm, rcdm);CHKERRQ(ierr); 162b2df8587SMatthew G. Knepley } 163f2ed2dc7SMatthew G. Knepley ierr = DMCopyTransform(ce->idm, dm[r]);CHKERRQ(ierr); 164f2ed2dc7SMatthew G. Knepley ierr = PetscObjectGetName((PetscObject) dm[r-1], &dmname);CHKERRQ(ierr); 165f2ed2dc7SMatthew G. Knepley ierr = PetscObjectSetName((PetscObject) dm[r], dmname);CHKERRQ(ierr); 166f2ed2dc7SMatthew G. Knepley for (f = 0; f <= Nf; ++f) { 1678cda7954SMatthew G. Knepley PetscErrorCode (*nspconstr)(DM, PetscInt, PetscInt, MatNullSpace *); 168f2ed2dc7SMatthew G. Knepley 169f2ed2dc7SMatthew G. Knepley ierr = DMGetNullSpaceConstructor(dm[r-1], f, &nspconstr);CHKERRQ(ierr); 170f2ed2dc7SMatthew G. Knepley ierr = DMSetNullSpaceConstructor(dm[r], f, nspconstr);CHKERRQ(ierr); 171f2ed2dc7SMatthew G. Knepley } 172f2ed2dc7SMatthew G. Knepley } 173f2ed2dc7SMatthew G. Knepley ierr = DMViewFromOptions(dm[r], NULL, "-conv_dm_view");CHKERRQ(ierr); 174f2ed2dc7SMatthew G. Knepley /* Create solution */ 175f2ed2dc7SMatthew G. Knepley ierr = DMCreateGlobalVector(dm[r], &u);CHKERRQ(ierr); 176f2ed2dc7SMatthew G. Knepley ierr = DMGetField(dm[r], 0, NULL, &disc);CHKERRQ(ierr); 177f2ed2dc7SMatthew G. Knepley ierr = PetscObjectGetName(disc, &uname);CHKERRQ(ierr); 178f2ed2dc7SMatthew G. Knepley ierr = PetscObjectSetName((PetscObject) u, uname);CHKERRQ(ierr); 179f2ed2dc7SMatthew G. Knepley /* Setup solver */ 180f2ed2dc7SMatthew G. Knepley ierr = TSReset(ts);CHKERRQ(ierr); 181f2ed2dc7SMatthew G. Knepley ierr = TSSetDM(ts, dm[r]);CHKERRQ(ierr); 182f2ed2dc7SMatthew G. Knepley ierr = DMTSSetBoundaryLocal(dm[r], DMPlexTSComputeBoundary, ctx);CHKERRQ(ierr); 183f2ed2dc7SMatthew G. Knepley ierr = DMTSSetIFunctionLocal(dm[r], DMPlexTSComputeIFunctionFEM, ctx);CHKERRQ(ierr); 184f2ed2dc7SMatthew G. Knepley ierr = DMTSSetIJacobianLocal(dm[r], DMPlexTSComputeIJacobianFEM, ctx);CHKERRQ(ierr); 185f2ed2dc7SMatthew G. Knepley ierr = TSSetTime(ts, 0.0);CHKERRQ(ierr); 186f2ed2dc7SMatthew G. Knepley ierr = TSSetStepNumber(ts, 0);CHKERRQ(ierr); 187f2ed2dc7SMatthew G. Knepley ierr = TSSetFromOptions(ts);CHKERRQ(ierr); 188f2ed2dc7SMatthew G. Knepley /* Create initial guess */ 189f2ed2dc7SMatthew G. Knepley ierr = PetscConvEstComputeInitialGuess(ce, r, dm[r], u);CHKERRQ(ierr); 190f2ed2dc7SMatthew G. Knepley ierr = TSSolve(ts, u);CHKERRQ(ierr); 191f2ed2dc7SMatthew G. Knepley ierr = PetscLogEventBegin(ce->event, ce, 0, 0, 0);CHKERRQ(ierr); 192f2ed2dc7SMatthew G. Knepley ierr = PetscConvEstComputeError(ce, r, dm[r], u, &ce->errors[r*Nf]);CHKERRQ(ierr); 193f2ed2dc7SMatthew G. Knepley ierr = PetscLogEventEnd(ce->event, ce, 0, 0, 0);CHKERRQ(ierr); 194f2ed2dc7SMatthew G. Knepley for (f = 0; f < Nf; ++f) { 195f2ed2dc7SMatthew G. Knepley PetscSection s, fs; 196f2ed2dc7SMatthew G. Knepley PetscInt lsize; 197f2ed2dc7SMatthew G. Knepley 198f2ed2dc7SMatthew G. Knepley /* Could use DMGetOutputDM() to add in Dirichlet dofs */ 199f2ed2dc7SMatthew G. Knepley ierr = DMGetLocalSection(dm[r], &s);CHKERRQ(ierr); 200f2ed2dc7SMatthew G. Knepley ierr = PetscSectionGetField(s, f, &fs);CHKERRQ(ierr); 201f2ed2dc7SMatthew G. Knepley ierr = PetscSectionGetConstrainedStorageSize(fs, &lsize);CHKERRQ(ierr); 202ffc4695bSBarry Smith ierr = MPI_Allreduce(&lsize, &ce->dofs[r*Nf+f], 1, MPIU_INT, MPI_SUM, PetscObjectComm((PetscObject) ts));CHKERRMPI(ierr); 2037809adefSMatthew G. Knepley ierr = PetscLogEventSetDof(ce->event, f, ce->dofs[r*Nf+f]);CHKERRQ(ierr); 204f2ed2dc7SMatthew G. Knepley ierr = PetscLogEventSetError(ce->event, f, ce->errors[r*Nf+f]);CHKERRQ(ierr); 205f2ed2dc7SMatthew G. Knepley } 206f2ed2dc7SMatthew G. Knepley /* Monitor */ 207f2ed2dc7SMatthew G. Knepley ierr = PetscConvEstMonitorDefault(ce, r);CHKERRQ(ierr); 208f2ed2dc7SMatthew G. Knepley if (!r) { 209f2ed2dc7SMatthew G. Knepley /* PCReset() does not wipe out the level structure */ 210f2ed2dc7SMatthew G. Knepley SNES snes; 211f2ed2dc7SMatthew G. Knepley KSP ksp; 212f2ed2dc7SMatthew G. Knepley PC pc; 213f2ed2dc7SMatthew G. Knepley 214f2ed2dc7SMatthew G. Knepley ierr = TSGetSNES(ts, &snes);CHKERRQ(ierr); 215f2ed2dc7SMatthew G. Knepley ierr = SNESGetKSP(snes, &ksp);CHKERRQ(ierr); 216f2ed2dc7SMatthew G. Knepley ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr); 217f2ed2dc7SMatthew G. Knepley ierr = PCMGGetLevels(pc, &oldnlev);CHKERRQ(ierr); 218f2ed2dc7SMatthew G. Knepley } 219f2ed2dc7SMatthew G. Knepley /* Cleanup */ 220f2ed2dc7SMatthew G. Knepley ierr = VecDestroy(&u);CHKERRQ(ierr); 221f2ed2dc7SMatthew G. Knepley ierr = PetscLogStagePop();CHKERRQ(ierr); 222f2ed2dc7SMatthew G. Knepley } 223f2ed2dc7SMatthew G. Knepley for (r = 1; r <= Nr; ++r) { 224f2ed2dc7SMatthew G. Knepley ierr = DMDestroy(&dm[r]);CHKERRQ(ierr); 225f2ed2dc7SMatthew G. Knepley } 226f2ed2dc7SMatthew G. Knepley /* Fit convergence rate */ 227f2ed2dc7SMatthew G. Knepley ierr = PetscMalloc2(Nr+1, &x, Nr+1, &y);CHKERRQ(ierr); 228f2ed2dc7SMatthew G. Knepley for (f = 0; f < Nf; ++f) { 229f2ed2dc7SMatthew G. Knepley for (r = 0; r <= Nr; ++r) { 2307809adefSMatthew G. Knepley x[r] = PetscLog10Real(ce->dofs[r*Nf+f]); 231f2ed2dc7SMatthew G. Knepley y[r] = PetscLog10Real(ce->errors[r*Nf+f]); 232f2ed2dc7SMatthew G. Knepley } 233f2ed2dc7SMatthew G. Knepley ierr = PetscLinearRegression(Nr+1, x, y, &slope, &intercept);CHKERRQ(ierr); 234f2ed2dc7SMatthew G. Knepley /* Since h^{-dim} = N, lg err = s lg N + b = -s dim lg h + b */ 235f2ed2dc7SMatthew G. Knepley alpha[f] = -slope * dim; 236f2ed2dc7SMatthew G. Knepley } 237f2ed2dc7SMatthew G. Knepley ierr = PetscFree2(x, y);CHKERRQ(ierr); 2387809adefSMatthew G. Knepley ierr = PetscFree(dm);CHKERRQ(ierr); 239f2ed2dc7SMatthew G. Knepley /* Restore solver */ 240f2ed2dc7SMatthew G. Knepley ierr = TSReset(ts);CHKERRQ(ierr); 241f2ed2dc7SMatthew G. Knepley { 242f2ed2dc7SMatthew G. Knepley /* PCReset() does not wipe out the level structure */ 243f2ed2dc7SMatthew G. Knepley SNES snes; 244f2ed2dc7SMatthew G. Knepley KSP ksp; 245f2ed2dc7SMatthew G. Knepley PC pc; 246f2ed2dc7SMatthew G. Knepley 247f2ed2dc7SMatthew G. Knepley ierr = TSGetSNES(ts, &snes);CHKERRQ(ierr); 248f2ed2dc7SMatthew G. Knepley ierr = SNESGetKSP(snes, &ksp);CHKERRQ(ierr); 249f2ed2dc7SMatthew G. Knepley ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr); 250f2ed2dc7SMatthew G. Knepley ierr = PCMGSetLevels(pc, oldnlev, NULL);CHKERRQ(ierr); 251f2ed2dc7SMatthew G. Knepley ierr = DMSetRefineLevel(ce->idm, oldlevel);CHKERRQ(ierr); /* The damn DMCoarsen() calls in PCMG can reset this */ 252f2ed2dc7SMatthew G. Knepley } 253f2ed2dc7SMatthew G. Knepley ierr = TSSetDM(ts, ce->idm);CHKERRQ(ierr); 254f2ed2dc7SMatthew G. Knepley ierr = DMTSSetBoundaryLocal(ce->idm, DMPlexTSComputeBoundary, ctx);CHKERRQ(ierr); 255f2ed2dc7SMatthew G. Knepley ierr = DMTSSetIFunctionLocal(ce->idm, DMPlexTSComputeIFunctionFEM, ctx);CHKERRQ(ierr); 256f2ed2dc7SMatthew G. Knepley ierr = DMTSSetIJacobianLocal(ce->idm, DMPlexTSComputeIJacobianFEM, ctx);CHKERRQ(ierr); 257f2ed2dc7SMatthew G. Knepley ierr = TSSetConvergedReason(ts, TS_CONVERGED_ITERATING);CHKERRQ(ierr); 258f2ed2dc7SMatthew G. Knepley ierr = TSSetTime(ts, 0.0);CHKERRQ(ierr); 259f2ed2dc7SMatthew G. Knepley ierr = TSSetStepNumber(ts, 0);CHKERRQ(ierr); 260f2ed2dc7SMatthew G. Knepley ierr = TSSetFromOptions(ts);CHKERRQ(ierr); 261f2ed2dc7SMatthew G. Knepley ierr = TSSetSolution(ts, uInitial);CHKERRQ(ierr); 262f2ed2dc7SMatthew G. Knepley ierr = PetscConvEstComputeInitialGuess(ce, 0, NULL, uInitial);CHKERRQ(ierr); 263f2ed2dc7SMatthew G. Knepley PetscFunctionReturn(0); 264f2ed2dc7SMatthew G. Knepley } 265f2ed2dc7SMatthew G. Knepley 266f2ed2dc7SMatthew G. Knepley PetscErrorCode PetscConvEstUseTS(PetscConvEst ce, PetscBool checkTemporal) 267900f6b5bSMatthew G. Knepley { 268900f6b5bSMatthew G. Knepley PetscFunctionBegin; 269900f6b5bSMatthew G. Knepley PetscValidHeaderSpecific(ce, PETSC_OBJECT_CLASSID, 1); 270900f6b5bSMatthew G. Knepley ce->ops->setsolver = PetscConvEstSetTS_Private; 271900f6b5bSMatthew G. Knepley ce->ops->initguess = PetscConvEstInitGuessTS_Private; 272900f6b5bSMatthew G. Knepley ce->ops->computeerror = PetscConvEstComputeErrorTS_Private; 273f2ed2dc7SMatthew G. Knepley if (checkTemporal) { 274f2ed2dc7SMatthew G. Knepley ce->ops->getconvrate = PetscConvEstGetConvRateTS_Temporal_Private; 275f2ed2dc7SMatthew G. Knepley } else { 276f2ed2dc7SMatthew G. Knepley ce->ops->getconvrate = PetscConvEstGetConvRateTS_Spatial_Private; 277f2ed2dc7SMatthew G. Knepley } 278900f6b5bSMatthew G. Knepley PetscFunctionReturn(0); 279900f6b5bSMatthew G. Knepley } 280