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 two event functions = piecewise-polynomials, zeros = 1 (rank-0), 9 (last rank)\n" 10ca4445c7SIlya Fursov "Options:\n" 11ca4445c7SIlya Fursov "-dir d : zero-crossing direction for events\n" 12ca4445c7SIlya Fursov "-flg : additional output in Postevent\n" 13*fe4ad979SIlya Fursov "-errtol e : error tolerance, for printing 'pass/fail' for located events (1e-5 by default)\n" 14ca4445c7SIlya Fursov "-restart : flag for TSRestartStep() in PostEvent\n" 15*fe4ad979SIlya Fursov "-dtpost x : if x > 0, then on even PostEvent calls 1st-post-event-step = x is set,\n" 16*fe4ad979SIlya Fursov " on odd PostEvent calls 1st-post-event-step = PETSC_DECIDE is set,\n" 17ca4445c7SIlya Fursov " if x == 0, nothing happens\n"; 18ca4445c7SIlya Fursov 19ca4445c7SIlya Fursov #define MAX_NFUNC 100 // max event functions per rank 20ca4445c7SIlya Fursov #define MAX_NEV 5000 // max zero crossings for each rank 21ca4445c7SIlya Fursov 22ca4445c7SIlya Fursov typedef struct { 23ca4445c7SIlya Fursov PetscMPIInt rank, size; 24ca4445c7SIlya Fursov PetscReal pi; 25ca4445c7SIlya Fursov PetscReal fvals[MAX_NFUNC]; // helper array for reporting the residuals 26ca4445c7SIlya Fursov PetscReal evres[MAX_NEV]; // times of found zero-crossings 27*fe4ad979SIlya Fursov PetscReal ref[MAX_NEV]; // reference times of zero-crossings, for checking 28ca4445c7SIlya Fursov PetscInt cnt; // counter 29*fe4ad979SIlya Fursov PetscInt cntref; // actual length of 'ref' on the given rank 30ca4445c7SIlya Fursov PetscBool flg; // flag for additional print in PostEvent 31*fe4ad979SIlya Fursov PetscReal errtol; // error tolerance, for printing 'pass/fail' for located events (1e-5 by default) 32ca4445c7SIlya Fursov PetscBool restart; // flag for TSRestartStep() in PostEvent 33ca4445c7SIlya Fursov PetscReal dtpost; // post-event step 34ca4445c7SIlya Fursov PetscInt postcnt; // counter for PostEvent calls 35ca4445c7SIlya Fursov } AppCtx; 36ca4445c7SIlya Fursov 37ca4445c7SIlya Fursov PetscErrorCode EventFunction(TS ts, PetscReal t, Vec U, PetscReal gval[], void *ctx); 38ca4445c7SIlya Fursov PetscErrorCode Postevent(TS ts, PetscInt nev_zero, PetscInt evs_zero[], PetscReal t, Vec U, PetscBool fwd, void *ctx); 39ca4445c7SIlya Fursov 40ca4445c7SIlya Fursov int main(int argc, char **argv) 41ca4445c7SIlya Fursov { 42ca4445c7SIlya Fursov TS ts; 43ca4445c7SIlya Fursov Mat A; 44ca4445c7SIlya Fursov Vec sol; 45ca4445c7SIlya Fursov PetscInt n, dir0, m = 0; 46ca4445c7SIlya Fursov PetscInt dir[MAX_NFUNC], inds[2]; 47ca4445c7SIlya Fursov PetscBool term[MAX_NFUNC]; 48ca4445c7SIlya Fursov PetscScalar *x, vals[4]; 49ca4445c7SIlya Fursov AppCtx ctx; 50ca4445c7SIlya Fursov 51ca4445c7SIlya Fursov PetscFunctionBeginUser; 52ca4445c7SIlya Fursov PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 53ca4445c7SIlya Fursov setbuf(stdout, NULL); 54ca4445c7SIlya Fursov PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &ctx.rank)); 55ca4445c7SIlya Fursov PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &ctx.size)); 56ca4445c7SIlya Fursov ctx.pi = PetscAcosReal(-1.0); 57ca4445c7SIlya Fursov ctx.cnt = 0; 58*fe4ad979SIlya Fursov ctx.cntref = 0; 59ca4445c7SIlya Fursov ctx.flg = PETSC_FALSE; 60*fe4ad979SIlya Fursov ctx.errtol = 1e-5; 61ca4445c7SIlya Fursov ctx.restart = PETSC_FALSE; 62ca4445c7SIlya Fursov ctx.dtpost = 0; 63ca4445c7SIlya Fursov ctx.postcnt = 0; 64ca4445c7SIlya Fursov 65ca4445c7SIlya Fursov // The linear problem has a 2*2 matrix. The matrix is constant 66ca4445c7SIlya Fursov if (ctx.rank == 0) m = 2; 67ca4445c7SIlya Fursov inds[0] = 0; 68ca4445c7SIlya Fursov inds[1] = 1; 69ca4445c7SIlya Fursov vals[0] = 0; 70ca4445c7SIlya Fursov vals[1] = 0.2; 71ca4445c7SIlya Fursov vals[2] = -0.2; 72ca4445c7SIlya Fursov vals[3] = 0; 73ca4445c7SIlya Fursov PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, m, m, PETSC_DETERMINE, PETSC_DETERMINE, 2, NULL, 0, NULL, &A)); 74ca4445c7SIlya Fursov PetscCall(MatSetValues(A, m, inds, m, inds, vals, INSERT_VALUES)); 75ca4445c7SIlya Fursov PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 76ca4445c7SIlya Fursov PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 77ca4445c7SIlya Fursov PetscCall(MatSetOption(A, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_TRUE)); 78ca4445c7SIlya Fursov 79ca4445c7SIlya Fursov PetscCall(MatCreateVecs(A, &sol, NULL)); 80ca4445c7SIlya Fursov PetscCall(VecGetArray(sol, &x)); 81ca4445c7SIlya Fursov if (ctx.rank == 0) { // initial conditions 82ca4445c7SIlya Fursov x[0] = 0; // sin(0) 83ca4445c7SIlya Fursov x[1] = 1; // cos(0) 84ca4445c7SIlya Fursov } 85ca4445c7SIlya Fursov PetscCall(VecRestoreArray(sol, &x)); 86ca4445c7SIlya Fursov 87ca4445c7SIlya Fursov PetscCall(TSCreate(PETSC_COMM_WORLD, &ts)); 88ca4445c7SIlya Fursov PetscCall(TSSetProblemType(ts, TS_LINEAR)); 89ca4445c7SIlya Fursov 90ca4445c7SIlya Fursov PetscCall(TSSetRHSFunction(ts, NULL, TSComputeRHSFunctionLinear, NULL)); 91ca4445c7SIlya Fursov PetscCall(TSSetRHSJacobian(ts, A, A, TSComputeRHSJacobianConstant, NULL)); 92ca4445c7SIlya Fursov 93ca4445c7SIlya Fursov PetscCall(TSSetTimeStep(ts, 0.1)); 94ca4445c7SIlya Fursov PetscCall(TSSetType(ts, TSBEULER)); 95ca4445c7SIlya Fursov PetscCall(TSSetMaxSteps(ts, 10000)); 96ca4445c7SIlya Fursov PetscCall(TSSetMaxTime(ts, 10.0)); 97ca4445c7SIlya Fursov PetscCall(TSSetExactFinalTime(ts, TS_EXACTFINALTIME_MATCHSTEP)); 98ca4445c7SIlya Fursov PetscCall(TSSetFromOptions(ts)); 99ca4445c7SIlya Fursov 100ca4445c7SIlya Fursov // Set the event handling 101ca4445c7SIlya Fursov dir0 = 0; 102ca4445c7SIlya Fursov PetscCall(PetscOptionsGetInt(NULL, NULL, "-dir", &dir0, NULL)); // desired zero-crossing direction 103ca4445c7SIlya Fursov PetscCall(PetscOptionsHasName(NULL, NULL, "-flg", &ctx.flg)); // flag for additional output 104*fe4ad979SIlya Fursov PetscCall(PetscOptionsGetReal(NULL, NULL, "-errtol", &ctx.errtol, NULL)); // error tolerance for located events 105ca4445c7SIlya Fursov PetscCall(PetscOptionsGetBool(NULL, NULL, "-restart", &ctx.restart, NULL)); // flag for TSRestartStep() 106ca4445c7SIlya Fursov PetscCall(PetscOptionsGetReal(NULL, NULL, "-dtpost", &ctx.dtpost, NULL)); // post-event step 107ca4445c7SIlya Fursov 108ca4445c7SIlya Fursov n = 0; // event counter 109ca4445c7SIlya Fursov if (ctx.rank == 0) { // first event -- on rank-0 110ca4445c7SIlya Fursov dir[n] = dir0; 111ca4445c7SIlya Fursov term[n++] = PETSC_FALSE; 112*fe4ad979SIlya Fursov if (dir0 >= 0) ctx.ref[ctx.cntref++] = 1.0; 113ca4445c7SIlya Fursov } 114ca4445c7SIlya Fursov if (ctx.rank == ctx.size - 1) { // second event -- on last rank 115ca4445c7SIlya Fursov dir[n] = dir0; 116ca4445c7SIlya Fursov term[n++] = PETSC_FALSE; 117*fe4ad979SIlya Fursov if (dir0 <= 0) ctx.ref[ctx.cntref++] = 9.0; 118ca4445c7SIlya Fursov } 119*fe4ad979SIlya Fursov if (ctx.cntref > 0) PetscCall(PetscSortReal(ctx.cntref, ctx.ref)); 120ca4445c7SIlya Fursov PetscCall(TSSetEventHandler(ts, n, dir, term, EventFunction, Postevent, &ctx)); 121ca4445c7SIlya Fursov 122ca4445c7SIlya Fursov // Solution 123ca4445c7SIlya Fursov PetscCall(TSSolve(ts, sol)); 124ca4445c7SIlya Fursov 125*fe4ad979SIlya Fursov // The 4 columns printed are: [RANK] [time of event] [error w.r.t. reference] ["pass"/"fail"] 126*fe4ad979SIlya Fursov for (PetscInt j = 0; j < ctx.cnt; j++) { 127*fe4ad979SIlya Fursov PetscReal err = 10.0; 128*fe4ad979SIlya Fursov if (j < ctx.cntref) err = PetscAbsReal(ctx.evres[j] - ctx.ref[j]); 129*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")); 130*fe4ad979SIlya Fursov } 131ca4445c7SIlya Fursov PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT)); 132ca4445c7SIlya Fursov 133ca4445c7SIlya Fursov PetscCall(MatDestroy(&A)); 134ca4445c7SIlya Fursov PetscCall(TSDestroy(&ts)); 135ca4445c7SIlya Fursov PetscCall(VecDestroy(&sol)); 136ca4445c7SIlya Fursov 137ca4445c7SIlya Fursov PetscCall(PetscFinalize()); 138ca4445c7SIlya Fursov return 0; 139ca4445c7SIlya Fursov } 140ca4445c7SIlya Fursov 141ca4445c7SIlya Fursov /* 142ca4445c7SIlya Fursov User callback for defining the event-functions 143ca4445c7SIlya Fursov */ 144ca4445c7SIlya Fursov PetscErrorCode EventFunction(TS ts, PetscReal t, Vec U, PetscReal gval[], void *ctx) 145ca4445c7SIlya Fursov { 146ca4445c7SIlya Fursov PetscInt n = 0; 147ca4445c7SIlya Fursov AppCtx *Ctx = (AppCtx *)ctx; 148ca4445c7SIlya Fursov 149ca4445c7SIlya Fursov PetscFunctionBeginUser; 150ca4445c7SIlya Fursov // for the test purposes, event-functions are defined based on t 151ca4445c7SIlya Fursov // first event -- on rank-0 152ca4445c7SIlya Fursov if (Ctx->rank == 0) { 153ca4445c7SIlya Fursov if (t < 2.0) gval[n++] = 0.5 * (1 - PetscPowReal(t - 2.0, 12)); 154ca4445c7SIlya Fursov else gval[n++] = 0.5; 155ca4445c7SIlya Fursov } 156ca4445c7SIlya Fursov 157ca4445c7SIlya Fursov // second event -- on last rank 158ca4445c7SIlya Fursov if (Ctx->rank == Ctx->size - 1) { 159ca4445c7SIlya Fursov if (t > 8.0) gval[n++] = 0.25 * (1 - PetscPowReal(t - 8.0, 12)); 160ca4445c7SIlya Fursov else gval[n++] = 0.25; 161ca4445c7SIlya Fursov } 162ca4445c7SIlya Fursov PetscFunctionReturn(PETSC_SUCCESS); 163ca4445c7SIlya Fursov } 164ca4445c7SIlya Fursov 165ca4445c7SIlya Fursov /* 166ca4445c7SIlya Fursov User callback for the post-event stuff 167ca4445c7SIlya Fursov */ 168ca4445c7SIlya Fursov PetscErrorCode Postevent(TS ts, PetscInt nev_zero, PetscInt evs_zero[], PetscReal t, Vec U, PetscBool fwd, void *ctx) 169ca4445c7SIlya Fursov { 170ca4445c7SIlya Fursov AppCtx *Ctx = (AppCtx *)ctx; 171ca4445c7SIlya Fursov 172ca4445c7SIlya Fursov PetscFunctionBeginUser; 173ca4445c7SIlya Fursov if (Ctx->flg) { 174ca4445c7SIlya Fursov PetscCallBack("EventFunction", EventFunction(ts, t, U, Ctx->fvals, ctx)); 175ca4445c7SIlya Fursov PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "[%d] At t = %20.16g : %" PetscInt_FMT " events triggered, fvalues =", Ctx->rank, (double)t, nev_zero)); 176ca4445c7SIlya Fursov for (PetscInt j = 0; j < nev_zero; j++) PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "\t%g", (double)Ctx->fvals[evs_zero[j]])); 177ca4445c7SIlya Fursov PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "\n")); 178ca4445c7SIlya Fursov PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT)); 179ca4445c7SIlya Fursov } 180ca4445c7SIlya Fursov 181*fe4ad979SIlya Fursov if (Ctx->cnt + nev_zero < MAX_NEV) 182*fe4ad979SIlya Fursov for (PetscInt i = 0; i < nev_zero; i++) Ctx->evres[Ctx->cnt++] = t; // save the repeating zeros separately for easier/unified testing 183ca4445c7SIlya Fursov 184ca4445c7SIlya Fursov #ifdef NEW_VERSION 185ca4445c7SIlya Fursov Ctx->postcnt++; // sync 186ca4445c7SIlya Fursov if (Ctx->dtpost > 0) { 187ca4445c7SIlya Fursov if (Ctx->postcnt % 2 == 0) PetscCall(TSSetPostEventStep(ts, Ctx->dtpost)); 188*fe4ad979SIlya Fursov else PetscCall(TSSetPostEventStep(ts, PETSC_DECIDE)); 189ca4445c7SIlya Fursov } 190ca4445c7SIlya Fursov #endif 191ca4445c7SIlya Fursov 192ca4445c7SIlya Fursov if (Ctx->restart) PetscCall(TSRestartStep(ts)); 193ca4445c7SIlya Fursov PetscFunctionReturn(PETSC_SUCCESS); 194ca4445c7SIlya Fursov } 195ca4445c7SIlya Fursov /*---------------------------------------------------------------------------------------------*/ 196*fe4ad979SIlya Fursov /* 197*fe4ad979SIlya Fursov Note, in the tests below, -ts_event_post_event_step is occasionally set to -1, 198*fe4ad979SIlya Fursov which corresponds to PETSC_DECIDE in the API. It is not a very good practice to 199*fe4ad979SIlya Fursov explicitly specify -1 in this option. Rather, if PETSC_DECIDE behaviour is needed, 200*fe4ad979SIlya Fursov simply remove this option altogether. This will result in using the defaults 201*fe4ad979SIlya Fursov (which is PETSC_DECIDE). 202*fe4ad979SIlya Fursov */ 203ca4445c7SIlya Fursov /*TEST 204ca4445c7SIlya Fursov test: 205ca4445c7SIlya Fursov suffix: 0s1 206*fe4ad979SIlya Fursov requires: !single 207ca4445c7SIlya Fursov output_file: output/ex2_0s1.out 208ca4445c7SIlya Fursov args: -dir 0 209*fe4ad979SIlya Fursov args: -restart 0 210*fe4ad979SIlya Fursov args: -dtpost 0.25 211*fe4ad979SIlya Fursov args: -ts_event_post_event_step {{-1 0.31}} 212ca4445c7SIlya Fursov args: -ts_type {{beuler rk}} 213ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 214ca4445c7SIlya Fursov nsize: 1 215ca4445c7SIlya Fursov 216ca4445c7SIlya Fursov test: 217ca4445c7SIlya Fursov suffix: 0s4 218*fe4ad979SIlya Fursov requires: !single 219ca4445c7SIlya Fursov output_file: output/ex2_0s4.out 220ca4445c7SIlya Fursov args: -dir 0 221*fe4ad979SIlya Fursov args: -restart 1 222ca4445c7SIlya Fursov args: -dtpost {{0 0.25}} 223*fe4ad979SIlya Fursov args: -ts_event_post_event_step -1 224ca4445c7SIlya Fursov args: -ts_type {{beuler rk}} 225ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 226ca4445c7SIlya Fursov nsize: 4 227ca4445c7SIlya Fursov filter: sort 228ca4445c7SIlya Fursov filter_output: sort 229ca4445c7SIlya Fursov 230ca4445c7SIlya Fursov test: 231ca4445c7SIlya Fursov suffix: pos 232*fe4ad979SIlya Fursov requires: !single 233ca4445c7SIlya Fursov output_file: output/ex2_pos.out 234ca4445c7SIlya Fursov args: -dir 1 235ca4445c7SIlya Fursov args: -restart {{0 1}} 236*fe4ad979SIlya Fursov args: -dtpost 0 237*fe4ad979SIlya Fursov args: -ts_event_post_event_step 0.31005 238*fe4ad979SIlya Fursov args: -ts_type rk 239ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 240ca4445c7SIlya Fursov nsize: {{1 4}} 241ca4445c7SIlya Fursov filter: sort 242ca4445c7SIlya Fursov filter_output: sort 243ca4445c7SIlya Fursov 244ca4445c7SIlya Fursov test: 245ca4445c7SIlya Fursov suffix: ns1 246*fe4ad979SIlya Fursov requires: !single 247ca4445c7SIlya Fursov output_file: output/ex2_ns1.out 248ca4445c7SIlya Fursov args: -dir -1 249*fe4ad979SIlya Fursov args: -restart 0 250*fe4ad979SIlya Fursov args: -dtpost 0.25 251*fe4ad979SIlya Fursov args: -ts_event_post_event_step {{-1 0.305}} 252ca4445c7SIlya Fursov args: -ts_type {{beuler rk}} 253ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 254ca4445c7SIlya Fursov nsize: 1 255ca4445c7SIlya Fursov 256ca4445c7SIlya Fursov test: 257ca4445c7SIlya Fursov suffix: ns4 258*fe4ad979SIlya Fursov requires: !single 259ca4445c7SIlya Fursov output_file: output/ex2_ns4.out 260ca4445c7SIlya Fursov args: -dir -1 261*fe4ad979SIlya Fursov args: -restart 1 262ca4445c7SIlya Fursov args: -dtpost {{0 0.25}} 263*fe4ad979SIlya Fursov args: -ts_event_post_event_step -1 264*fe4ad979SIlya Fursov args: -ts_type {{beuler rk}} 265*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 266*fe4ad979SIlya Fursov nsize: 4 267*fe4ad979SIlya Fursov filter: sort 268*fe4ad979SIlya Fursov filter_output: sort 269*fe4ad979SIlya Fursov 270*fe4ad979SIlya Fursov test: 271*fe4ad979SIlya Fursov suffix: 0s1single 272*fe4ad979SIlya Fursov requires: single 273*fe4ad979SIlya Fursov output_file: output/ex2_0s1.out 274*fe4ad979SIlya Fursov args: -dir 0 -ts_event_dt_min 1e-6 -errtol 5e-5 275*fe4ad979SIlya Fursov args: -restart {{0 1}} 276*fe4ad979SIlya Fursov args: -dtpost 0 277*fe4ad979SIlya Fursov args: -ts_event_post_event_step 0.31 278*fe4ad979SIlya Fursov args: -ts_type {{beuler rk}} 279*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 280*fe4ad979SIlya Fursov nsize: 1 281*fe4ad979SIlya Fursov 282*fe4ad979SIlya Fursov test: 283*fe4ad979SIlya Fursov suffix: 0s4single 284*fe4ad979SIlya Fursov requires: single 285*fe4ad979SIlya Fursov output_file: output/ex2_0s4.out 286*fe4ad979SIlya Fursov args: -dir 0 -ts_event_dt_min 1e-6 -errtol 5e-5 287*fe4ad979SIlya Fursov args: -restart 0 288*fe4ad979SIlya Fursov args: -dtpost 0.25 289*fe4ad979SIlya Fursov args: -ts_event_post_event_step {{-1 0.315}} 290*fe4ad979SIlya Fursov args: -ts_type {{beuler rk}} 291*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 292*fe4ad979SIlya Fursov nsize: 4 293*fe4ad979SIlya Fursov filter: sort 294*fe4ad979SIlya Fursov filter_output: sort 295*fe4ad979SIlya Fursov 296*fe4ad979SIlya Fursov test: 297*fe4ad979SIlya Fursov suffix: possingle 298*fe4ad979SIlya Fursov requires: single 299*fe4ad979SIlya Fursov output_file: output/ex2_pos.out 300*fe4ad979SIlya Fursov args: -dir 1 -ts_event_dt_min 1e-6 -errtol 5e-5 301*fe4ad979SIlya Fursov args: -restart 1 302*fe4ad979SIlya Fursov args: -dtpost {{0 0.25}} 303*fe4ad979SIlya Fursov args: -ts_event_post_event_step -1 304*fe4ad979SIlya Fursov args: -ts_type {{beuler rk}} 305*fe4ad979SIlya Fursov args: -ts_adapt_type basic 306*fe4ad979SIlya Fursov nsize: {{1 4}} 307*fe4ad979SIlya Fursov filter: sort 308*fe4ad979SIlya Fursov filter_output: sort 309*fe4ad979SIlya Fursov 310*fe4ad979SIlya Fursov test: 311*fe4ad979SIlya Fursov suffix: ns1single 312*fe4ad979SIlya Fursov requires: single 313*fe4ad979SIlya Fursov output_file: output/ex2_ns1.out 314*fe4ad979SIlya Fursov args: -dir -1 -ts_event_dt_min 1e-6 -errtol 5e-5 315*fe4ad979SIlya Fursov args: -restart {{0 1}} 316*fe4ad979SIlya Fursov args: -dtpost 0 317*fe4ad979SIlya Fursov args: -ts_event_post_event_step 0.30501 318*fe4ad979SIlya Fursov args: -ts_type {{beuler rk}} 319*fe4ad979SIlya Fursov args: -ts_adapt_type {{none basic}} 320*fe4ad979SIlya Fursov nsize: 1 321*fe4ad979SIlya Fursov 322*fe4ad979SIlya Fursov test: 323*fe4ad979SIlya Fursov suffix: ns4single 324*fe4ad979SIlya Fursov requires: single 325*fe4ad979SIlya Fursov output_file: output/ex2_ns4.out 326*fe4ad979SIlya Fursov args: -dir -1 -ts_event_dt_min 1e-6 -errtol 5e-5 327*fe4ad979SIlya Fursov args: -restart 0 328*fe4ad979SIlya Fursov args: -dtpost 0.25 329*fe4ad979SIlya Fursov args: -ts_event_post_event_step {{-1 0.31}} 330ca4445c7SIlya Fursov args: -ts_type {{beuler rk}} 331ca4445c7SIlya Fursov args: -ts_adapt_type {{none basic}} 332ca4445c7SIlya Fursov nsize: 4 333ca4445c7SIlya Fursov filter: sort 334ca4445c7SIlya Fursov filter_output: sort 335ca4445c7SIlya Fursov TEST*/ 336