14a658b32SHong Zhang static char help[] = "Tests TS time span \n\n"; 24a658b32SHong Zhang 34a658b32SHong Zhang #include <petscts.h> 44a658b32SHong Zhang 5d71ae5a4SJacob Faibussowitsch static PetscErrorCode RHSFunction(TS ts, PetscReal t, Vec X, Vec F, void *ctx) 6d71ae5a4SJacob Faibussowitsch { 74a658b32SHong Zhang PetscInt i, n; 84a658b32SHong Zhang const PetscScalar *xx; 9e1db57b0SHong Zhang PetscScalar *ff; 104a658b32SHong Zhang 117510d9b0SBarry Smith PetscFunctionBeginUser; 124a658b32SHong Zhang PetscCall(VecGetLocalSize(X, &n)); 134a658b32SHong Zhang PetscCall(VecGetArrayRead(X, &xx)); 144a658b32SHong Zhang PetscCall(VecGetArray(F, &ff)); 154a658b32SHong Zhang if (n >= 1) ff[0] = 1; 164a658b32SHong Zhang for (i = 1; i < n; i++) ff[i] = (i + 1) * (xx[i - 1] + PetscPowReal(t, i)) / 2; 174a658b32SHong Zhang PetscCall(VecRestoreArrayRead(X, &xx)); 184a658b32SHong Zhang PetscCall(VecRestoreArray(F, &ff)); 193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 204a658b32SHong Zhang } 214a658b32SHong Zhang 22d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[]) 23d71ae5a4SJacob Faibussowitsch { 244a658b32SHong Zhang TS ts; 254a658b32SHong Zhang Vec X, *Xs; 264a658b32SHong Zhang PetscInt i, n, N = 9; 27e1db57b0SHong Zhang PetscReal tspan[8] = {16.0, 16.1, 16.2, 16.3, 16.4, 16.5, 16.6, 16.7}; 28c80d56d9SJames Wright const PetscReal *tspan2, *sol_times; 294a658b32SHong Zhang 30327415f7SBarry Smith PetscFunctionBeginUser; 314a658b32SHong Zhang PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 324a658b32SHong Zhang PetscCall(TSCreate(PETSC_COMM_SELF, &ts)); 334a658b32SHong Zhang PetscCall(TSSetType(ts, TSRK)); 344a658b32SHong Zhang PetscCall(TSSetRHSFunction(ts, NULL, RHSFunction, NULL)); 354a658b32SHong Zhang PetscCall(VecCreateSeq(PETSC_COMM_SELF, N, &X)); 364a658b32SHong Zhang PetscCall(VecZeroEntries(X)); 37e1db57b0SHong Zhang PetscCall(TSSetTimeStep(ts, 0.001)); 38e1db57b0SHong Zhang PetscCall(TSSetTimeSpan(ts, 8, tspan)); 394a658b32SHong Zhang PetscCall(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP)); 404a658b32SHong Zhang PetscCall(TSSetFromOptions(ts)); 414a658b32SHong Zhang PetscCall(TSSolve(ts, X)); 42c80d56d9SJames Wright PetscCall(TSGetEvaluationSolutions(ts, &n, &sol_times, &Xs)); 43c80d56d9SJames Wright PetscCall(TSGetEvaluationTimes(ts, &n, &tspan2)); 444a658b32SHong Zhang PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Time Span: ")); 454a658b32SHong Zhang for (i = 0; i < n; i++) PetscCall(PetscPrintf(PETSC_COMM_WORLD, " %g", (double)tspan2[i])); 464a658b32SHong Zhang PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n")); 47c80d56d9SJames Wright for (PetscInt i = 0; i < n; i++) { 48*2cdf5ea4SPierre Jolivet PetscCheck(PetscIsCloseAtTol(tspan2[i], sol_times[i], 1e-6, 1e2 * PETSC_MACHINE_EPSILON), PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Requested solution at time %g, but received time at %g", (double)tspan[i], (double)sol_times[i]); 49c80d56d9SJames Wright } 504a658b32SHong Zhang PetscCall(TSDestroy(&ts)); 514a658b32SHong Zhang PetscCall(VecDestroy(&X)); 524a658b32SHong Zhang PetscCall(PetscFinalize()); 534a658b32SHong Zhang return 0; 544a658b32SHong Zhang } 554a658b32SHong Zhang 564a658b32SHong Zhang /*TEST 574a658b32SHong Zhang 584a658b32SHong Zhang testset: 594a658b32SHong Zhang test: 604a658b32SHong Zhang suffix: 1 614a658b32SHong Zhang args: -ts_monitor 624a658b32SHong Zhang test: 634a658b32SHong Zhang suffix: 2 64e1db57b0SHong Zhang requires: !single 65e1db57b0SHong Zhang args: -ts_monitor -ts_adapt_type none 664a658b32SHong Zhang TEST*/ 67