1ca4445c7SIlya Fursov #include <petscts.h> 2ca4445c7SIlya Fursov #include <stdio.h> 3ca4445c7SIlya Fursov 4*fe4ad979SIlya Fursov #define NEW_VERSION // Applicable for the new features; avoid this for the older PETSc versions (without TSSetPostEventStep()) 5ca4445c7SIlya Fursov 6ca4445c7SIlya Fursov static char help[] = "Simple linear problem with events\n" 7ca4445c7SIlya Fursov "x_dot = 0.2*y\n" 8ca4445c7SIlya Fursov "y_dot = -0.2*x\n" 9ca4445c7SIlya Fursov "Using one or several event functions (on rank-0)\n" 10*fe4ad979SIlya Fursov "This program is mostly intended to test the Anderson-Bjorck iteration with challenging event-functions\n" 11ca4445c7SIlya Fursov "Options:\n" 12ca4445c7SIlya Fursov "-dir d : zero-crossing direction for events\n" 13ca4445c7SIlya Fursov "-flg : additional output in Postevent\n" 14*fe4ad979SIlya Fursov "-errtol e : error tolerance, for printing 'pass/fail' for located events (1e-5 by default)\n" 15ca4445c7SIlya Fursov "-restart : flag for TSRestartStep() in PostEvent\n" 16*fe4ad979SIlya Fursov "-dtpost x : if x > 0, then on even PostEvent calls 1st-post-event-step = x is set,\n" 17*fe4ad979SIlya Fursov " on odd PostEvent calls 1st-post-event-step = PETSC_DECIDE is set,\n" 18ca4445c7SIlya Fursov " if x == 0, nothing happens\n" 19ca4445c7SIlya Fursov "-func F : selects the event function [0, ..., 11], if F == -1 (default) is set, all event functions are taken\n"; 20ca4445c7SIlya Fursov 21ca4445c7SIlya Fursov #define MAX_NFUNC 100 // max event functions per rank 22ca4445c7SIlya Fursov #define MAX_NEV 5000 // max zero crossings for each rank 23ca4445c7SIlya Fursov 24ca4445c7SIlya Fursov typedef struct { 25ca4445c7SIlya Fursov PetscMPIInt rank, size; 26ca4445c7SIlya Fursov PetscReal pi; 27ca4445c7SIlya Fursov PetscReal fvals[MAX_NFUNC]; // helper array for reporting the residuals 28ca4445c7SIlya Fursov PetscReal evres[MAX_NEV]; // times of found zero-crossings 29*fe4ad979SIlya Fursov PetscReal ref[MAX_NEV]; // reference times of zero-crossings, for checking 30ca4445c7SIlya Fursov PetscInt cnt; // counter 31*fe4ad979SIlya Fursov PetscInt cntref; // actual length of 'ref' on the given rank 32ca4445c7SIlya Fursov PetscBool flg; // flag for additional print in PostEvent 33*fe4ad979SIlya Fursov PetscReal errtol; // error tolerance, for printing 'pass/fail' for located events (1e-5 by default) 34ca4445c7SIlya Fursov PetscBool restart; // flag for TSRestartStep() in PostEvent 35ca4445c7SIlya Fursov PetscReal dtpost; // post-event step 36ca4445c7SIlya Fursov PetscInt postcnt; // counter for PostEvent calls 37ca4445c7SIlya Fursov PetscInt F; // event-function index 38ca4445c7SIlya Fursov PetscInt Fnum; // total available event functions 39ca4445c7SIlya Fursov } AppCtx; 40ca4445c7SIlya Fursov 41ca4445c7SIlya Fursov PetscErrorCode EventFunction(TS ts, PetscReal t, Vec U, PetscReal gval[], void *ctx); 42ca4445c7SIlya Fursov PetscErrorCode Postevent(TS ts, PetscInt nev_zero, PetscInt evs_zero[], PetscReal t, Vec U, PetscBool fwd, void *ctx); 43ca4445c7SIlya Fursov 44ca4445c7SIlya Fursov int main(int argc, char **argv) 45ca4445c7SIlya Fursov { 46ca4445c7SIlya Fursov TS ts; 47ca4445c7SIlya Fursov Mat A; 48ca4445c7SIlya Fursov Vec sol; 49ca4445c7SIlya Fursov PetscInt n, dir0, m = 0; 50ca4445c7SIlya Fursov PetscInt dir[MAX_NFUNC], inds[2]; 51ca4445c7SIlya Fursov PetscBool term[MAX_NFUNC]; 52*fe4ad979SIlya Fursov PetscBool pass = PETSC_TRUE; 53ca4445c7SIlya Fursov PetscScalar *x, vals[4]; 54ca4445c7SIlya Fursov AppCtx ctx; 55ca4445c7SIlya Fursov 56ca4445c7SIlya Fursov PetscFunctionBeginUser; 57ca4445c7SIlya Fursov PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 58ca4445c7SIlya Fursov setbuf(stdout, NULL); 59ca4445c7SIlya Fursov PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &ctx.rank)); 60ca4445c7SIlya Fursov PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &ctx.size)); 61ca4445c7SIlya Fursov ctx.pi = PetscAcosReal(-1.0); 62ca4445c7SIlya Fursov ctx.cnt = 0; 63*fe4ad979SIlya Fursov ctx.cntref = 0; 64ca4445c7SIlya Fursov ctx.flg = PETSC_FALSE; 65*fe4ad979SIlya Fursov ctx.errtol = 1e-5; 66ca4445c7SIlya Fursov ctx.restart = PETSC_FALSE; 67ca4445c7SIlya Fursov ctx.dtpost = 0; 68ca4445c7SIlya Fursov ctx.postcnt = 0; 69ca4445c7SIlya Fursov ctx.F = -1; 70ca4445c7SIlya Fursov ctx.Fnum = 12; 71ca4445c7SIlya Fursov 72ca4445c7SIlya Fursov // The linear problem has a 2*2 matrix. The matrix is constant 73ca4445c7SIlya Fursov if (ctx.rank == 0) m = 2; 74ca4445c7SIlya Fursov inds[0] = 0; 75ca4445c7SIlya Fursov inds[1] = 1; 76ca4445c7SIlya Fursov vals[0] = 0; 77ca4445c7SIlya Fursov vals[1] = 0.2; 78ca4445c7SIlya Fursov vals[2] = -0.2; 79ca4445c7SIlya Fursov vals[3] = 0; 80ca4445c7SIlya Fursov PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, m, m, PETSC_DETERMINE, PETSC_DETERMINE, 2, NULL, 0, NULL, &A)); 81ca4445c7SIlya Fursov PetscCall(MatSetValues(A, m, inds, m, inds, vals, INSERT_VALUES)); 82ca4445c7SIlya Fursov PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 83ca4445c7SIlya Fursov PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 84ca4445c7SIlya Fursov PetscCall(MatSetOption(A, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE)); 85ca4445c7SIlya Fursov 86ca4445c7SIlya Fursov PetscCall(MatCreateVecs(A, &sol, NULL)); 87ca4445c7SIlya Fursov PetscCall(VecGetArray(sol, &x)); 88ca4445c7SIlya Fursov if (ctx.rank == 0) { // initial conditions 89ca4445c7SIlya Fursov x[0] = 0; // sin(0) 90ca4445c7SIlya Fursov x[1] = 1; // cos(0) 91ca4445c7SIlya Fursov } 92ca4445c7SIlya Fursov PetscCall(VecRestoreArray(sol, &x)); 93ca4445c7SIlya Fursov 94ca4445c7SIlya Fursov PetscCall(TSCreate(PETSC_COMM_WORLD, &ts)); 95ca4445c7SIlya Fursov PetscCall(TSSetProblemType(ts, TS_LINEAR)); 96ca4445c7SIlya Fursov 97ca4445c7SIlya Fursov PetscCall(TSSetRHSFunction(ts, NULL, TSComputeRHSFunctionLinear, NULL)); 98ca4445c7SIlya Fursov PetscCall(TSSetRHSJacobian(ts, A, A, TSComputeRHSJacobianConstant, NULL)); 99ca4445c7SIlya Fursov 100ca4445c7SIlya Fursov PetscCall(TSSetTime(ts, 0.03)); 101ca4445c7SIlya Fursov PetscCall(TSSetTimeStep(ts, 0.1)); 102ca4445c7SIlya Fursov PetscCall(TSSetType(ts, TSBEULER)); 103ca4445c7SIlya Fursov PetscCall(TSSetMaxSteps(ts, 10000)); 104ca4445c7SIlya Fursov PetscCall(TSSetMaxTime(ts, 4.0)); 105ca4445c7SIlya Fursov PetscCall(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP)); 106ca4445c7SIlya Fursov PetscCall(TSSetFromOptions(ts)); 107ca4445c7SIlya Fursov 108ca4445c7SIlya Fursov // Set the event handling 109ca4445c7SIlya Fursov dir0 = 0; 110ca4445c7SIlya Fursov PetscCall(PetscOptionsGetInt(NULL, NULL, "-dir", &dir0, NULL)); // desired zero-crossing direction 111ca4445c7SIlya Fursov PetscCall(PetscOptionsHasName(NULL, NULL, "-flg", &ctx.flg)); // flag for additional output 112*fe4ad979SIlya Fursov PetscCall(PetscOptionsGetReal(NULL, NULL, "-errtol", &ctx.errtol, NULL)); // error tolerance for located events 113ca4445c7SIlya Fursov PetscCall(PetscOptionsGetBool(NULL, NULL, "-restart", &ctx.restart, NULL)); // flag for TSRestartStep() 114ca4445c7SIlya Fursov PetscCall(PetscOptionsGetReal(NULL, NULL, "-dtpost", &ctx.dtpost, NULL)); // post-event step 115ca4445c7SIlya Fursov PetscCall(PetscOptionsGetInt(NULL, NULL, "-F", &ctx.F, NULL)); // event-function index 116ca4445c7SIlya Fursov PetscCheck(ctx.F >= -1 && ctx.F < ctx.Fnum, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_OUTOFRANGE, "Value of 'F' is out of range"); 117ca4445c7SIlya Fursov 118ca4445c7SIlya Fursov n = 0; // event counter 119ca4445c7SIlya Fursov if (ctx.rank == 0) { // all events -- on rank-0 120ca4445c7SIlya Fursov if (ctx.F == -1) 121ca4445c7SIlya Fursov for (n = 0; n < ctx.Fnum; n++) { // all event-functions 122ca4445c7SIlya Fursov dir[n] = dir0; 123ca4445c7SIlya Fursov term[n] = PETSC_FALSE; 124ca4445c7SIlya Fursov } 125ca4445c7SIlya Fursov else { // single event-function 126ca4445c7SIlya Fursov dir[n] = dir0; 127ca4445c7SIlya Fursov term[n++] = PETSC_FALSE; 128ca4445c7SIlya Fursov } 129*fe4ad979SIlya Fursov 130*fe4ad979SIlya Fursov // set the reference values 131*fe4ad979SIlya Fursov if (ctx.F == 0 || ctx.F == -1) { 132*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 2.0; 133*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 4.0; 134*fe4ad979SIlya Fursov if (dir0 <= 0) ctx.ref[ctx.cntref++] = 1.0; 135*fe4ad979SIlya Fursov if (dir0 <= 0) ctx.ref[ctx.cntref++] = 3.0; 136ca4445c7SIlya Fursov } 137*fe4ad979SIlya Fursov if (ctx.F == 1 || ctx.F == -1) 138*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 1.0; 139*fe4ad979SIlya Fursov if (ctx.F == 2 || ctx.F == -1) 140*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 1.0; 141*fe4ad979SIlya Fursov if (ctx.F == 3 || ctx.F == -1) 142*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 1.696812386809752; 143*fe4ad979SIlya Fursov if (ctx.F == 4 || ctx.F == -1) 144*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 0.1; 145*fe4ad979SIlya Fursov if (ctx.F == 5 || ctx.F == -1) 146*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 1.02; 147*fe4ad979SIlya Fursov if (ctx.F == 6 || ctx.F == -1) 148*fe4ad979SIlya Fursov if (dir0 <= 0) ctx.ref[ctx.cntref++] = 0.90478821787302; 149*fe4ad979SIlya Fursov if (ctx.F == 7 || ctx.F == -1) 150*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 0.05; 151*fe4ad979SIlya Fursov if (ctx.F == 8 || ctx.F == -1) 152*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 0.552704666678489; 153*fe4ad979SIlya Fursov if (ctx.F == 9 || ctx.F == -1) 154*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 0.399422291710969; 155*fe4ad979SIlya Fursov if (ctx.F == 10 || ctx.F == -1) { 156*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 0.874511220376091; 157*fe4ad979SIlya Fursov if (dir0 <= 0) ctx.ref[ctx.cntref++] = 2.388359335869107; 158*fe4ad979SIlya Fursov } 159*fe4ad979SIlya Fursov if (ctx.F == 11 || ctx.F == -1) 160*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 2.5; 161*fe4ad979SIlya Fursov } 162*fe4ad979SIlya Fursov if (ctx.cntref > 0) PetscCall(PetscSortReal(ctx.cntref, ctx.ref)); 163ca4445c7SIlya Fursov PetscCall(TSSetEventHandler(ts, n, dir, term, EventFunction, Postevent, &ctx)); 164ca4445c7SIlya Fursov 165ca4445c7SIlya Fursov // Solution 166ca4445c7SIlya Fursov PetscCall(TSSolve(ts, sol)); 167ca4445c7SIlya Fursov 168*fe4ad979SIlya Fursov // The 4 columns printed are: [RANK] [time of event] [error w.r.t. reference] ["pass"/"fail"] 169*fe4ad979SIlya Fursov for (PetscInt j = 0; j < ctx.cnt; j++) { 170*fe4ad979SIlya Fursov PetscReal err = 10.0; 171*fe4ad979SIlya Fursov if (j < ctx.cntref) err = PetscAbsReal(ctx.evres[j] - ctx.ref[j]); 172*fe4ad979SIlya Fursov PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "%d\t%g\t%g\t%s\n", ctx.rank, (double)ctx.evres[j], (double)err, err < ctx.errtol ? "pass" : "fail")); 173*fe4ad979SIlya Fursov pass = (pass && err < ctx.errtol ? PETSC_TRUE : PETSC_FALSE); 174*fe4ad979SIlya Fursov } 175ca4445c7SIlya Fursov PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT)); 176*fe4ad979SIlya Fursov PetscCall(PetscPrintf(PETSC_COMM_WORLD, "This test: %s\n", pass ? "PASSED" : "FAILED")); 177ca4445c7SIlya Fursov 178ca4445c7SIlya Fursov PetscCall(MatDestroy(&A)); 179ca4445c7SIlya Fursov PetscCall(TSDestroy(&ts)); 180ca4445c7SIlya Fursov PetscCall(VecDestroy(&sol)); 181ca4445c7SIlya Fursov 182ca4445c7SIlya Fursov PetscCall(PetscFinalize()); 183ca4445c7SIlya Fursov return 0; 184ca4445c7SIlya Fursov } 185ca4445c7SIlya Fursov 186ca4445c7SIlya Fursov /* 187ca4445c7SIlya Fursov User callback for defining the event-functions 188ca4445c7SIlya Fursov */ 189ca4445c7SIlya Fursov PetscErrorCode EventFunction(TS ts, PetscReal t, Vec U, PetscReal gval[], void *ctx) 190ca4445c7SIlya Fursov { 191ca4445c7SIlya Fursov PetscInt n = 0; 192ca4445c7SIlya Fursov AppCtx *Ctx = (AppCtx *)ctx; 193ca4445c7SIlya Fursov 194ca4445c7SIlya Fursov PetscFunctionBeginUser; 195ca4445c7SIlya Fursov // for the test purposes, event-functions are defined based on t 196ca4445c7SIlya Fursov // all events -- on rank-0 197ca4445c7SIlya Fursov if (Ctx->rank == 0) { 198ca4445c7SIlya Fursov if (Ctx->F == 0 || Ctx->F == -1) gval[n++] = PetscSinReal(Ctx->pi * t) / Ctx->pi; // FUNC-0, roots 1, 2, 3, 4 199ca4445c7SIlya Fursov if (Ctx->F == 1 || Ctx->F == -1) gval[n++] = PetscLogReal(t); // FUNC-2, root 1 200ca4445c7SIlya Fursov if (Ctx->F == 2 || Ctx->F == -1) { // FUNC-3, root 1 201ca4445c7SIlya Fursov if (t < 2) gval[n++] = (1 - PetscPowReal(t - 2, 12)) / 12.0; 202ca4445c7SIlya Fursov else gval[n++] = 1 / 12.0; 203ca4445c7SIlya Fursov } 204ca4445c7SIlya Fursov if (Ctx->F == 3 || Ctx->F == -1) gval[n++] = t - PetscExpReal(PetscSinReal(t)) + 1; // FUNC-5, root 1.69681 205ca4445c7SIlya Fursov if (Ctx->F == 4 || Ctx->F == -1) gval[n++] = (1e10 * PetscPowReal(t, 1 / t) - 1) / 100; // FUNC-6, root 0.1 206ca4445c7SIlya Fursov if (Ctx->F == 5 || Ctx->F == -1) gval[n++] = PetscLogReal(t - 0.02) * PetscLogReal(t - 0.02) * PetscSignReal(t - 1.02) * 1e7; // FUNC-7, root 1.02 207ca4445c7SIlya Fursov if (Ctx->F == 6 || Ctx->F == -1) gval[n++] = 4 * PetscCosReal(t) - PetscExpReal(t); // FUNC-14, root 0.904788 208ca4445c7SIlya Fursov if (Ctx->F == 7 || Ctx->F == -1) gval[n++] = (20.0 * t - 1) / (19.0 * t) / 10; // FUNC-15, root 0.05 209*fe4ad979SIlya Fursov if (Ctx->F == 8 || Ctx->F == -1) gval[n++] = ((t - 1) * PetscExpReal(-20 * t) + PetscPowReal(t, 20)) * 1e4; // FUNC-16, root 0.5527 210ca4445c7SIlya Fursov if (Ctx->F == 9 || Ctx->F == -1) gval[n++] = (t * t * (t * t / 3.0 + PetscSqrtReal(2.0) * PetscSinReal(t)) - PetscSqrtReal(3.0) / 18) * 10; // FUNC-17, root 0.399 211ca4445c7SIlya Fursov if (Ctx->F == 10 || Ctx->F == -1) gval[n++] = ((t * t + 1) * PetscSinReal(t) - PetscExpReal(PetscSqrtReal(t)) * (t - 1) * (t * t - 5)) / 10; // FUNC-18, roots 0.87, 2.388 212ca4445c7SIlya Fursov if (Ctx->F == 11 || Ctx->F == -1) gval[n++] = 2 * t - 5; // FUNC-21, root 2.5 213ca4445c7SIlya Fursov } 214ca4445c7SIlya Fursov PetscFunctionReturn(PETSC_SUCCESS); 215ca4445c7SIlya Fursov } 216ca4445c7SIlya Fursov 217ca4445c7SIlya Fursov /* 218ca4445c7SIlya Fursov User callback for the post-event stuff 219ca4445c7SIlya Fursov */ 220ca4445c7SIlya Fursov PetscErrorCode Postevent(TS ts, PetscInt nev_zero, PetscInt evs_zero[], PetscReal t, Vec U, PetscBool fwd, void *ctx) 221ca4445c7SIlya Fursov { 222ca4445c7SIlya Fursov AppCtx *Ctx = (AppCtx *)ctx; 223ca4445c7SIlya Fursov 224ca4445c7SIlya Fursov PetscFunctionBeginUser; 225ca4445c7SIlya Fursov if (Ctx->flg) { 226ca4445c7SIlya Fursov PetscCallBack("EventFunction", EventFunction(ts, t, U, Ctx->fvals, ctx)); 227ca4445c7SIlya Fursov PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "[%d] At t = %20.16g : %" PetscInt_FMT " events triggered, fvalues =", Ctx->rank, (double)t, nev_zero)); 228ca4445c7SIlya Fursov for (PetscInt j = 0; j < nev_zero; j++) PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "\t%g", (double)Ctx->fvals[evs_zero[j]])); 229ca4445c7SIlya Fursov PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "\n")); 230ca4445c7SIlya Fursov PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT)); 231ca4445c7SIlya Fursov } 232ca4445c7SIlya Fursov 233*fe4ad979SIlya Fursov if (Ctx->cnt + nev_zero < MAX_NEV) 234*fe4ad979SIlya Fursov for (PetscInt i = 0; i < nev_zero; i++) Ctx->evres[Ctx->cnt++] = t; // save the repeating zeros separately for easier/unified testing 235ca4445c7SIlya Fursov 236ca4445c7SIlya Fursov #ifdef NEW_VERSION 237ca4445c7SIlya Fursov Ctx->postcnt++; // sync 238ca4445c7SIlya Fursov if (Ctx->dtpost > 0) { 239ca4445c7SIlya Fursov if (Ctx->postcnt % 2 == 0) PetscCall(TSSetPostEventStep(ts, Ctx->dtpost)); 240*fe4ad979SIlya Fursov else PetscCall(TSSetPostEventStep(ts, PETSC_DECIDE)); 241ca4445c7SIlya Fursov } 242ca4445c7SIlya Fursov #endif 243ca4445c7SIlya Fursov 244ca4445c7SIlya Fursov if (Ctx->restart) PetscCall(TSRestartStep(ts)); 245ca4445c7SIlya Fursov PetscFunctionReturn(PETSC_SUCCESS); 246ca4445c7SIlya Fursov } 247ca4445c7SIlya Fursov /*---------------------------------------------------------------------------------------------*/ 248*fe4ad979SIlya Fursov /* 249*fe4ad979SIlya Fursov Note, in the tests below, -ts_event_post_event_step is occasionally set to -1, 250*fe4ad979SIlya Fursov which corresponds to PETSC_DECIDE in the API. It is not a very good practice to 251*fe4ad979SIlya Fursov explicitly specify -1 in this option. Rather, if PETSC_DECIDE behaviour is needed, 252*fe4ad979SIlya Fursov simply remove this option altogether. This will result in using the defaults 253*fe4ad979SIlya Fursov (which is PETSC_DECIDE). 254*fe4ad979SIlya Fursov */ 255ca4445c7SIlya Fursov /*TEST 256ca4445c7SIlya Fursov test: 257ca4445c7SIlya Fursov suffix: 0 258*fe4ad979SIlya Fursov requires: !single 259ca4445c7SIlya Fursov output_file: output/ex4_0.out 260ca4445c7SIlya Fursov args: -dir 0 261*fe4ad979SIlya Fursov args: -ts_adapt_dt_min 1e-10 -ts_event_dt_min 1e-10 262*fe4ad979SIlya Fursov args: -ts_dt 0.25 263*fe4ad979SIlya Fursov args: -restart 0 264ca4445c7SIlya Fursov args: -ts_event_tol {{1e-8 1e-15}} 265*fe4ad979SIlya Fursov args: -errtol 1e-7 266ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 267*fe4ad979SIlya Fursov args: -dtpost 0 268*fe4ad979SIlya Fursov args: -ts_event_post_event_step -1 269*fe4ad979SIlya Fursov args: -ts_type rk 270*fe4ad979SIlya Fursov nsize: 2 271*fe4ad979SIlya Fursov filter: sort 272*fe4ad979SIlya Fursov filter_output: sort 273*fe4ad979SIlya Fursov 274*fe4ad979SIlya Fursov test: 275*fe4ad979SIlya Fursov suffix: 0single 276*fe4ad979SIlya Fursov requires: single 277*fe4ad979SIlya Fursov output_file: output/ex4_0single.out 278*fe4ad979SIlya Fursov args: -dir 0 279*fe4ad979SIlya Fursov args: -ts_adapt_dt_min 1e-6 -ts_event_dt_min 1e-6 280*fe4ad979SIlya Fursov args: -ts_dt 0.3 281*fe4ad979SIlya Fursov args: -ts_event_tol {{1e-7 1e-10}} 282*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 283*fe4ad979SIlya Fursov args: -dtpost 0.23 284*fe4ad979SIlya Fursov args: -ts_event_post_event_step -1 285*fe4ad979SIlya Fursov args: -ts_type beuler 286*fe4ad979SIlya Fursov nsize: 3 287ca4445c7SIlya Fursov filter: sort 288ca4445c7SIlya Fursov filter_output: sort 289ca4445c7SIlya Fursov 290ca4445c7SIlya Fursov test: 291ca4445c7SIlya Fursov suffix: F7 292ca4445c7SIlya Fursov output_file: output/ex4_F7.out 293ca4445c7SIlya Fursov args: -dir 0 294ca4445c7SIlya Fursov args: -ts_adapt_dt_min 1e-10 -ts_event_dt_min 1e-6 295ca4445c7SIlya Fursov args: -ts_dt 0.4 296ca4445c7SIlya Fursov args: -F 7 297ca4445c7SIlya Fursov args: -ts_event_tol {{1e-8 1e-15}} 298ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 299*fe4ad979SIlya Fursov args: -ts_type rk 300ca4445c7SIlya Fursov nsize: 1 301ca4445c7SIlya Fursov 302ca4445c7SIlya Fursov test: 303ca4445c7SIlya Fursov suffix: F7revisit 304ca4445c7SIlya Fursov output_file: output/ex4_F7revisit.out 305*fe4ad979SIlya Fursov args: -ts_event_monitor -F 7 -ts_dt 0.04 -ts_event_dt_min 0.016 -errtol 0.005 306*fe4ad979SIlya Fursov nsize: 1 307*fe4ad979SIlya Fursov 308*fe4ad979SIlya Fursov test: 309*fe4ad979SIlya Fursov suffix: 2all 310*fe4ad979SIlya Fursov output_file: output/ex4_2.out 311*fe4ad979SIlya Fursov args: -dir 0 312*fe4ad979SIlya Fursov args: -F {{-1 0 1 2 3 4 5 6 7 8 9 10 11}} 313*fe4ad979SIlya Fursov args: -ts_event_dt_min 1e-6 -ts_dt 0.4 -ts_event_tol 1e-8 314*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 315*fe4ad979SIlya Fursov args: -dtpost 0.35 316*fe4ad979SIlya Fursov args: -ts_type rk 317*fe4ad979SIlya Fursov filter: grep "This test" 318*fe4ad979SIlya Fursov nsize: 1 319*fe4ad979SIlya Fursov 320*fe4ad979SIlya Fursov test: 321*fe4ad979SIlya Fursov suffix: 2pos 322*fe4ad979SIlya Fursov output_file: output/ex4_2.out 323*fe4ad979SIlya Fursov args: -dir 1 324*fe4ad979SIlya Fursov args: -F {{-1 0 1 2 3 4 5 7 8 9 10 11}} 325*fe4ad979SIlya Fursov args: -ts_event_dt_min 1e-6 -ts_dt 0.4 -ts_event_tol 1e-8 326*fe4ad979SIlya Fursov args: -ts_adapt_type none 327*fe4ad979SIlya Fursov args: -dtpost 0.34 328*fe4ad979SIlya Fursov args: -ts_type beuler 329*fe4ad979SIlya Fursov filter: grep "This test" 330*fe4ad979SIlya Fursov nsize: 1 331*fe4ad979SIlya Fursov 332*fe4ad979SIlya Fursov test: 333*fe4ad979SIlya Fursov suffix: 2neg 334*fe4ad979SIlya Fursov output_file: output/ex4_2.out 335*fe4ad979SIlya Fursov args: -dir -1 336*fe4ad979SIlya Fursov args: -F {{-1 0 6 10}} 337*fe4ad979SIlya Fursov args: -ts_event_dt_min 1e-6 -ts_dt 0.4 -ts_event_tol 1e-8 338*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 339*fe4ad979SIlya Fursov args: -dtpost 0.33 340*fe4ad979SIlya Fursov args: -ts_type rk 341*fe4ad979SIlya Fursov filter: grep "This test" 342ca4445c7SIlya Fursov nsize: 1 343ca4445c7SIlya Fursov 344ca4445c7SIlya Fursov test: 345ca4445c7SIlya Fursov suffix: pos 346ca4445c7SIlya Fursov output_file: output/ex4_pos.out 347ca4445c7SIlya Fursov args: -dir 1 348ca4445c7SIlya Fursov args: -ts_adapt_dt_min 1e-10 -ts_event_dt_min 1e-6 349ca4445c7SIlya Fursov args: -ts_dt 0.4 350ca4445c7SIlya Fursov args: -restart 0 351ca4445c7SIlya Fursov args: -ts_event_tol {{1e-8 1e-15}} 352ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 353*fe4ad979SIlya Fursov args: -dtpost 0.25 354*fe4ad979SIlya Fursov args: -ts_event_post_event_step -1 355ca4445c7SIlya Fursov args: -ts_type {{beuler rk}} 356*fe4ad979SIlya Fursov nsize: 1 357ca4445c7SIlya Fursov 358ca4445c7SIlya Fursov test: 359ca4445c7SIlya Fursov suffix: neg 360ca4445c7SIlya Fursov output_file: output/ex4_neg.out 361ca4445c7SIlya Fursov args: -dir -1 362ca4445c7SIlya Fursov args: -ts_adapt_dt_min 1e-10 -ts_event_dt_min 1e-6 363ca4445c7SIlya Fursov args: -ts_dt 0.4 364ca4445c7SIlya Fursov args: -restart 1 365ca4445c7SIlya Fursov args: -ts_event_tol {{1e-8 1e-15}} 366ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 367*fe4ad979SIlya Fursov args: -dtpost 0.25 368*fe4ad979SIlya Fursov args: -ts_event_post_event_step 0.35 369*fe4ad979SIlya Fursov args: -ts_type rk 370*fe4ad979SIlya Fursov nsize: 2 371ca4445c7SIlya Fursov filter: sort 372ca4445c7SIlya Fursov filter_output: sort 373ca4445c7SIlya Fursov TEST*/ 374