1*c4762a1bSJed Brown static char help[] = "Parallel bouncing ball example to test TS event feature.\n"; 2*c4762a1bSJed Brown 3*c4762a1bSJed Brown /* 4*c4762a1bSJed Brown The dynamics of the bouncing ball is described by the ODE 5*c4762a1bSJed Brown u1_t = u2 6*c4762a1bSJed Brown u2_t = -9.8 7*c4762a1bSJed Brown 8*c4762a1bSJed Brown Each processor is assigned one ball. 9*c4762a1bSJed Brown 10*c4762a1bSJed Brown The event function routine checks for the ball hitting the 11*c4762a1bSJed Brown ground (u1 = 0). Every time the ball hits the ground, its velocity u2 is attenuated by 12*c4762a1bSJed Brown a factor of 0.9 and its height set to 1.0*rank. 13*c4762a1bSJed Brown */ 14*c4762a1bSJed Brown 15*c4762a1bSJed Brown #include <petscts.h> 16*c4762a1bSJed Brown 17*c4762a1bSJed Brown PetscErrorCode EventFunction(TS ts,PetscReal t,Vec U,PetscScalar *fvalue,void *ctx) 18*c4762a1bSJed Brown { 19*c4762a1bSJed Brown PetscErrorCode ierr; 20*c4762a1bSJed Brown const PetscScalar *u; 21*c4762a1bSJed Brown 22*c4762a1bSJed Brown PetscFunctionBegin; 23*c4762a1bSJed Brown /* Event for ball height */ 24*c4762a1bSJed Brown ierr = VecGetArrayRead(U,&u);CHKERRQ(ierr); 25*c4762a1bSJed Brown fvalue[0] = u[0]; 26*c4762a1bSJed Brown ierr = VecRestoreArrayRead(U,&u);CHKERRQ(ierr); 27*c4762a1bSJed Brown PetscFunctionReturn(0); 28*c4762a1bSJed Brown } 29*c4762a1bSJed Brown 30*c4762a1bSJed Brown PetscErrorCode PostEventFunction(TS ts,PetscInt nevents,PetscInt event_list[],PetscReal t,Vec U,PetscBool forwardsolve,void* ctx) 31*c4762a1bSJed Brown { 32*c4762a1bSJed Brown PetscErrorCode ierr; 33*c4762a1bSJed Brown PetscScalar *u; 34*c4762a1bSJed Brown PetscMPIInt rank; 35*c4762a1bSJed Brown 36*c4762a1bSJed Brown PetscFunctionBegin; 37*c4762a1bSJed Brown ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 38*c4762a1bSJed Brown if (nevents) { 39*c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_SELF,"Ball hit the ground at t = %5.2f seconds -> Processor[%d]\n",(double)t,rank);CHKERRQ(ierr); 40*c4762a1bSJed Brown /* Set new initial conditions with .9 attenuation */ 41*c4762a1bSJed Brown ierr = VecGetArray(U,&u);CHKERRQ(ierr); 42*c4762a1bSJed Brown u[0] = 1.0*rank; 43*c4762a1bSJed Brown u[1] = -0.9*u[1]; 44*c4762a1bSJed Brown ierr = VecRestoreArray(U,&u);CHKERRQ(ierr); 45*c4762a1bSJed Brown } 46*c4762a1bSJed Brown PetscFunctionReturn(0); 47*c4762a1bSJed Brown } 48*c4762a1bSJed Brown 49*c4762a1bSJed Brown /* 50*c4762a1bSJed Brown Defines the ODE passed to the ODE solver in explicit form: U_t = F(U) 51*c4762a1bSJed Brown */ 52*c4762a1bSJed Brown static PetscErrorCode RHSFunction(TS ts,PetscReal t,Vec U,Vec F,void *ctx) 53*c4762a1bSJed Brown { 54*c4762a1bSJed Brown PetscErrorCode ierr; 55*c4762a1bSJed Brown PetscScalar *f; 56*c4762a1bSJed Brown const PetscScalar *u; 57*c4762a1bSJed Brown 58*c4762a1bSJed Brown PetscFunctionBegin; 59*c4762a1bSJed Brown /* The next three lines allow us to access the entries of the vectors directly */ 60*c4762a1bSJed Brown ierr = VecGetArrayRead(U,&u);CHKERRQ(ierr); 61*c4762a1bSJed Brown ierr = VecGetArray(F,&f);CHKERRQ(ierr); 62*c4762a1bSJed Brown 63*c4762a1bSJed Brown f[0] = u[1]; 64*c4762a1bSJed Brown f[1] = - 9.8; 65*c4762a1bSJed Brown 66*c4762a1bSJed Brown ierr = VecRestoreArrayRead(U,&u);CHKERRQ(ierr); 67*c4762a1bSJed Brown ierr = VecRestoreArray(F,&f);CHKERRQ(ierr); 68*c4762a1bSJed Brown PetscFunctionReturn(0); 69*c4762a1bSJed Brown } 70*c4762a1bSJed Brown 71*c4762a1bSJed Brown /* 72*c4762a1bSJed Brown Defines the Jacobian of the ODE passed to the ODE solver. See TSSetRHSJacobian() for the meaning the Jacobian. 73*c4762a1bSJed Brown */ 74*c4762a1bSJed Brown static PetscErrorCode RHSJacobian(TS ts,PetscReal t,Vec U,Mat A,Mat B,void *ctx) 75*c4762a1bSJed Brown { 76*c4762a1bSJed Brown PetscErrorCode ierr; 77*c4762a1bSJed Brown PetscInt rowcol[2],rstart; 78*c4762a1bSJed Brown PetscScalar J[2][2]; 79*c4762a1bSJed Brown const PetscScalar *u; 80*c4762a1bSJed Brown 81*c4762a1bSJed Brown PetscFunctionBegin; 82*c4762a1bSJed Brown ierr = VecGetArrayRead(U,&u);CHKERRQ(ierr); 83*c4762a1bSJed Brown 84*c4762a1bSJed Brown ierr = MatGetOwnershipRange(B,&rstart,NULL);CHKERRQ(ierr); 85*c4762a1bSJed Brown rowcol[0] = rstart; rowcol[1] = rstart+1; 86*c4762a1bSJed Brown 87*c4762a1bSJed Brown J[0][0] = 0.0; J[0][1] = 1.0; 88*c4762a1bSJed Brown J[1][0] = 0.0; J[1][1] = 0.0; 89*c4762a1bSJed Brown ierr = MatSetValues(B,2,rowcol,2,rowcol,&J[0][0],INSERT_VALUES);CHKERRQ(ierr); 90*c4762a1bSJed Brown 91*c4762a1bSJed Brown ierr = VecRestoreArrayRead(U,&u);CHKERRQ(ierr); 92*c4762a1bSJed Brown ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 93*c4762a1bSJed Brown ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 94*c4762a1bSJed Brown if (A != B) { 95*c4762a1bSJed Brown ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 96*c4762a1bSJed Brown ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 97*c4762a1bSJed Brown } 98*c4762a1bSJed Brown PetscFunctionReturn(0); 99*c4762a1bSJed Brown } 100*c4762a1bSJed Brown 101*c4762a1bSJed Brown /* 102*c4762a1bSJed Brown Defines the ODE passed to the ODE solver in implicit form: F(U_t,U) = 0 103*c4762a1bSJed Brown */ 104*c4762a1bSJed Brown static PetscErrorCode IFunction(TS ts,PetscReal t,Vec U,Vec Udot,Vec F,void *ctx) 105*c4762a1bSJed Brown { 106*c4762a1bSJed Brown PetscErrorCode ierr; 107*c4762a1bSJed Brown PetscScalar *f; 108*c4762a1bSJed Brown const PetscScalar *u,*udot; 109*c4762a1bSJed Brown 110*c4762a1bSJed Brown PetscFunctionBegin; 111*c4762a1bSJed Brown /* The next three lines allow us to access the entries of the vectors directly */ 112*c4762a1bSJed Brown ierr = VecGetArrayRead(U,&u);CHKERRQ(ierr); 113*c4762a1bSJed Brown ierr = VecGetArrayRead(Udot,&udot);CHKERRQ(ierr); 114*c4762a1bSJed Brown ierr = VecGetArray(F,&f);CHKERRQ(ierr); 115*c4762a1bSJed Brown 116*c4762a1bSJed Brown f[0] = udot[0] - u[1]; 117*c4762a1bSJed Brown f[1] = udot[1] + 9.8; 118*c4762a1bSJed Brown 119*c4762a1bSJed Brown ierr = VecRestoreArrayRead(U,&u);CHKERRQ(ierr); 120*c4762a1bSJed Brown ierr = VecRestoreArrayRead(Udot,&udot);CHKERRQ(ierr); 121*c4762a1bSJed Brown ierr = VecRestoreArray(F,&f);CHKERRQ(ierr); 122*c4762a1bSJed Brown PetscFunctionReturn(0); 123*c4762a1bSJed Brown } 124*c4762a1bSJed Brown 125*c4762a1bSJed Brown /* 126*c4762a1bSJed Brown Defines the Jacobian of the ODE passed to the ODE solver. See TSSetIJacobian() for the meaning of a and the Jacobian. 127*c4762a1bSJed Brown */ 128*c4762a1bSJed Brown static PetscErrorCode IJacobian(TS ts,PetscReal t,Vec U,Vec Udot,PetscReal a,Mat A,Mat B,void *ctx) 129*c4762a1bSJed Brown { 130*c4762a1bSJed Brown PetscErrorCode ierr; 131*c4762a1bSJed Brown PetscInt rowcol[2],rstart; 132*c4762a1bSJed Brown PetscScalar J[2][2]; 133*c4762a1bSJed Brown const PetscScalar *u,*udot; 134*c4762a1bSJed Brown 135*c4762a1bSJed Brown PetscFunctionBegin; 136*c4762a1bSJed Brown ierr = VecGetArrayRead(U,&u);CHKERRQ(ierr); 137*c4762a1bSJed Brown ierr = VecGetArrayRead(Udot,&udot);CHKERRQ(ierr); 138*c4762a1bSJed Brown 139*c4762a1bSJed Brown ierr = MatGetOwnershipRange(B,&rstart,NULL);CHKERRQ(ierr); 140*c4762a1bSJed Brown rowcol[0] = rstart; rowcol[1] = rstart+1; 141*c4762a1bSJed Brown 142*c4762a1bSJed Brown J[0][0] = a; J[0][1] = -1.0; 143*c4762a1bSJed Brown J[1][0] = 0.0; J[1][1] = a; 144*c4762a1bSJed Brown ierr = MatSetValues(B,2,rowcol,2,rowcol,&J[0][0],INSERT_VALUES);CHKERRQ(ierr); 145*c4762a1bSJed Brown 146*c4762a1bSJed Brown ierr = VecRestoreArrayRead(U,&u);CHKERRQ(ierr); 147*c4762a1bSJed Brown ierr = VecRestoreArrayRead(Udot,&udot);CHKERRQ(ierr); 148*c4762a1bSJed Brown 149*c4762a1bSJed Brown ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 150*c4762a1bSJed Brown ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 151*c4762a1bSJed Brown if (A != B) { 152*c4762a1bSJed Brown ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 153*c4762a1bSJed Brown ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 154*c4762a1bSJed Brown } 155*c4762a1bSJed Brown PetscFunctionReturn(0); 156*c4762a1bSJed Brown } 157*c4762a1bSJed Brown 158*c4762a1bSJed Brown int main(int argc,char **argv) 159*c4762a1bSJed Brown { 160*c4762a1bSJed Brown TS ts; /* ODE integrator */ 161*c4762a1bSJed Brown Vec U; /* solution will be stored here */ 162*c4762a1bSJed Brown PetscErrorCode ierr; 163*c4762a1bSJed Brown PetscMPIInt rank; 164*c4762a1bSJed Brown PetscInt n = 2; 165*c4762a1bSJed Brown PetscScalar *u; 166*c4762a1bSJed Brown PetscInt direction=-1; 167*c4762a1bSJed Brown PetscBool terminate=PETSC_FALSE; 168*c4762a1bSJed Brown PetscBool rhs_form=PETSC_FALSE,hist=PETSC_TRUE; 169*c4762a1bSJed Brown TSAdapt adapt; 170*c4762a1bSJed Brown 171*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 172*c4762a1bSJed Brown Initialize program 173*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 174*c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 175*c4762a1bSJed Brown ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 176*c4762a1bSJed Brown 177*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 178*c4762a1bSJed Brown Create timestepping solver context 179*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 180*c4762a1bSJed Brown ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); 181*c4762a1bSJed Brown ierr = TSSetType(ts,TSROSW);CHKERRQ(ierr); 182*c4762a1bSJed Brown 183*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 184*c4762a1bSJed Brown Set ODE routines 185*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 186*c4762a1bSJed Brown ierr = TSSetProblemType(ts,TS_NONLINEAR);CHKERRQ(ierr); 187*c4762a1bSJed Brown /* Users are advised against the following branching and code duplication. 188*c4762a1bSJed Brown For problems without a mass matrix like the one at hand, the RHSFunction 189*c4762a1bSJed Brown (and companion RHSJacobian) interface is enough to support both explicit 190*c4762a1bSJed Brown and implicit timesteppers. This tutorial example also deals with the 191*c4762a1bSJed Brown IFunction/IJacobian interface for demonstration and testing purposes. */ 192*c4762a1bSJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-rhs-form",&rhs_form,NULL);CHKERRQ(ierr); 193*c4762a1bSJed Brown if (rhs_form) { 194*c4762a1bSJed Brown ierr = TSSetRHSFunction(ts,NULL,RHSFunction,NULL);CHKERRQ(ierr); 195*c4762a1bSJed Brown ierr = TSSetRHSJacobian(ts,NULL,NULL,RHSJacobian,NULL);CHKERRQ(ierr); 196*c4762a1bSJed Brown } else { 197*c4762a1bSJed Brown ierr = TSSetIFunction(ts,NULL,IFunction,NULL);CHKERRQ(ierr); 198*c4762a1bSJed Brown ierr = TSSetIJacobian(ts,NULL,NULL,IJacobian,NULL);CHKERRQ(ierr); 199*c4762a1bSJed Brown } 200*c4762a1bSJed Brown 201*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 202*c4762a1bSJed Brown Set initial conditions 203*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 204*c4762a1bSJed Brown ierr = VecCreate(PETSC_COMM_WORLD,&U);CHKERRQ(ierr); 205*c4762a1bSJed Brown ierr = VecSetSizes(U,n,PETSC_DETERMINE);CHKERRQ(ierr); 206*c4762a1bSJed Brown ierr = VecSetUp(U);CHKERRQ(ierr); 207*c4762a1bSJed Brown ierr = VecGetArray(U,&u);CHKERRQ(ierr); 208*c4762a1bSJed Brown u[0] = 1.0*rank; 209*c4762a1bSJed Brown u[1] = 20.0; 210*c4762a1bSJed Brown ierr = VecRestoreArray(U,&u);CHKERRQ(ierr); 211*c4762a1bSJed Brown ierr = TSSetSolution(ts,U);CHKERRQ(ierr); 212*c4762a1bSJed Brown 213*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 214*c4762a1bSJed Brown Set solver options 215*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 216*c4762a1bSJed Brown ierr = TSSetSaveTrajectory(ts);CHKERRQ(ierr); 217*c4762a1bSJed Brown ierr = TSSetMaxTime(ts,30.0);CHKERRQ(ierr); 218*c4762a1bSJed Brown ierr = TSSetExactFinalTime(ts,TS_EXACTFINALTIME_STEPOVER);CHKERRQ(ierr); 219*c4762a1bSJed Brown ierr = TSSetTimeStep(ts,0.1);CHKERRQ(ierr); 220*c4762a1bSJed Brown /* The adapative time step controller could take very large timesteps resulting in 221*c4762a1bSJed Brown the same event occuring multiple times in the same interval. A maximum step size 222*c4762a1bSJed Brown limit is enforced here to avoid this issue. */ 223*c4762a1bSJed Brown ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr); 224*c4762a1bSJed Brown ierr = TSAdaptSetType(adapt,TSADAPTBASIC);CHKERRQ(ierr); 225*c4762a1bSJed Brown ierr = TSAdaptSetStepLimits(adapt,0.0,0.5);CHKERRQ(ierr); 226*c4762a1bSJed Brown 227*c4762a1bSJed Brown /* Set direction and terminate flag for the event */ 228*c4762a1bSJed Brown ierr = TSSetEventHandler(ts,1,&direction,&terminate,EventFunction,PostEventFunction,NULL);CHKERRQ(ierr); 229*c4762a1bSJed Brown 230*c4762a1bSJed Brown ierr = TSSetFromOptions(ts);CHKERRQ(ierr); 231*c4762a1bSJed Brown 232*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 233*c4762a1bSJed Brown Run timestepping solver 234*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 235*c4762a1bSJed Brown ierr = TSSolve(ts,U);CHKERRQ(ierr); 236*c4762a1bSJed Brown 237*c4762a1bSJed Brown if (hist) { /* replay following history */ 238*c4762a1bSJed Brown TSTrajectory tj; 239*c4762a1bSJed Brown PetscReal tf,t0,dt; 240*c4762a1bSJed Brown 241*c4762a1bSJed Brown ierr = TSGetTime(ts,&tf);CHKERRQ(ierr); 242*c4762a1bSJed Brown ierr = TSSetMaxTime(ts,tf);CHKERRQ(ierr); 243*c4762a1bSJed Brown ierr = TSSetStepNumber(ts,0);CHKERRQ(ierr); 244*c4762a1bSJed Brown ierr = TSRestartStep(ts);CHKERRQ(ierr); 245*c4762a1bSJed Brown ierr = TSSetExactFinalTime(ts,TS_EXACTFINALTIME_MATCHSTEP);CHKERRQ(ierr); 246*c4762a1bSJed Brown ierr = TSSetFromOptions(ts);CHKERRQ(ierr); 247*c4762a1bSJed Brown ierr = TSSetEventHandler(ts,1,&direction,&terminate,EventFunction,PostEventFunction,NULL);CHKERRQ(ierr); 248*c4762a1bSJed Brown ierr = TSGetAdapt(ts,&adapt);CHKERRQ(ierr); 249*c4762a1bSJed Brown ierr = TSAdaptSetType(adapt,TSADAPTHISTORY);CHKERRQ(ierr); 250*c4762a1bSJed Brown ierr = TSGetTrajectory(ts,&tj);CHKERRQ(ierr); 251*c4762a1bSJed Brown ierr = TSAdaptHistorySetTrajectory(adapt,tj,PETSC_FALSE);CHKERRQ(ierr); 252*c4762a1bSJed Brown ierr = TSAdaptHistoryGetStep(adapt,0,&t0,&dt);CHKERRQ(ierr); 253*c4762a1bSJed Brown /* this example fails with single (or smaller) precision */ 254*c4762a1bSJed Brown #if defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL__FP16) 255*c4762a1bSJed Brown ierr = TSAdaptSetType(adapt,TSADAPTBASIC);CHKERRQ(ierr); 256*c4762a1bSJed Brown ierr = TSAdaptSetStepLimits(adapt,0.0,0.5);CHKERRQ(ierr); 257*c4762a1bSJed Brown ierr = TSSetFromOptions(ts);CHKERRQ(ierr); 258*c4762a1bSJed Brown #endif 259*c4762a1bSJed Brown ierr = TSSetTime(ts,t0);CHKERRQ(ierr); 260*c4762a1bSJed Brown ierr = TSSetTimeStep(ts,dt);CHKERRQ(ierr); 261*c4762a1bSJed Brown ierr = TSResetTrajectory(ts);CHKERRQ(ierr); 262*c4762a1bSJed Brown ierr = VecGetArray(U,&u);CHKERRQ(ierr); 263*c4762a1bSJed Brown u[0] = 1.0*rank; 264*c4762a1bSJed Brown u[1] = 20.0; 265*c4762a1bSJed Brown ierr = VecRestoreArray(U,&u);CHKERRQ(ierr); 266*c4762a1bSJed Brown ierr = TSSolve(ts,U);CHKERRQ(ierr); 267*c4762a1bSJed Brown } 268*c4762a1bSJed Brown /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 269*c4762a1bSJed Brown Free work space. All PETSc objects should be destroyed when they are no longer needed. 270*c4762a1bSJed Brown - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 271*c4762a1bSJed Brown ierr = VecDestroy(&U);CHKERRQ(ierr); 272*c4762a1bSJed Brown ierr = TSDestroy(&ts);CHKERRQ(ierr); 273*c4762a1bSJed Brown 274*c4762a1bSJed Brown ierr = PetscFinalize(); 275*c4762a1bSJed Brown return ierr; 276*c4762a1bSJed Brown } 277*c4762a1bSJed Brown 278*c4762a1bSJed Brown /*TEST 279*c4762a1bSJed Brown 280*c4762a1bSJed Brown test: 281*c4762a1bSJed Brown suffix: a 282*c4762a1bSJed Brown nsize: 2 283*c4762a1bSJed Brown args: -ts_trajectory_type memory -snes_stol 1e-4 284*c4762a1bSJed Brown filter: sort -b 285*c4762a1bSJed Brown 286*c4762a1bSJed Brown test: 287*c4762a1bSJed Brown suffix: b 288*c4762a1bSJed Brown nsize: 2 289*c4762a1bSJed Brown args: -ts_trajectory_type memory -ts_type arkimex -snes_stol 1e-4 290*c4762a1bSJed Brown filter: sort -b 291*c4762a1bSJed Brown 292*c4762a1bSJed Brown test: 293*c4762a1bSJed Brown suffix: c 294*c4762a1bSJed Brown nsize: 2 295*c4762a1bSJed Brown args: -ts_trajectory_type memory -ts_type theta -ts_adapt_type basic -ts_atol 1e-1 -snes_stol 1e-4 296*c4762a1bSJed Brown filter: sort -b 297*c4762a1bSJed Brown 298*c4762a1bSJed Brown test: 299*c4762a1bSJed Brown suffix: d 300*c4762a1bSJed Brown nsize: 2 301*c4762a1bSJed Brown args: -ts_trajectory_type memory -ts_type alpha -ts_adapt_type basic -ts_atol 1e-1 -snes_stol 1e-4 302*c4762a1bSJed Brown filter: sort -b 303*c4762a1bSJed Brown 304*c4762a1bSJed Brown test: 305*c4762a1bSJed Brown suffix: e 306*c4762a1bSJed Brown nsize: 2 307*c4762a1bSJed Brown args: -ts_trajectory_type memory -ts_type bdf -ts_adapt_dt_max 0.015 -ts_max_steps 3000 308*c4762a1bSJed Brown filter: sort -b 309*c4762a1bSJed Brown 310*c4762a1bSJed Brown test: 311*c4762a1bSJed Brown suffix: f 312*c4762a1bSJed Brown nsize: 2 313*c4762a1bSJed Brown args: -ts_trajectory_type memory -rhs-form -ts_type rk -ts_rk_type 3bs 314*c4762a1bSJed Brown filter: sort -b 315*c4762a1bSJed Brown 316*c4762a1bSJed Brown test: 317*c4762a1bSJed Brown suffix: g 318*c4762a1bSJed Brown nsize: 2 319*c4762a1bSJed Brown args: -ts_trajectory_type memory -rhs-form -ts_type rk -ts_rk_type 5bs 320*c4762a1bSJed Brown filter: sort -b 321*c4762a1bSJed Brown 322*c4762a1bSJed Brown test: 323*c4762a1bSJed Brown suffix: h 324*c4762a1bSJed Brown nsize: 2 325*c4762a1bSJed Brown args: -ts_trajectory_type memory -rhs-form -ts_type rk -ts_rk_type 6vr 326*c4762a1bSJed Brown filter: sort -b 327*c4762a1bSJed Brown output_file: output/ex41_g.out 328*c4762a1bSJed Brown 329*c4762a1bSJed Brown test: 330*c4762a1bSJed Brown suffix: i 331*c4762a1bSJed Brown nsize: 2 332*c4762a1bSJed Brown args: -ts_trajectory_type memory -rhs-form -ts_type rk -ts_rk_type 7vr 333*c4762a1bSJed Brown filter: sort -b 334*c4762a1bSJed Brown output_file: output/ex41_g.out 335*c4762a1bSJed Brown 336*c4762a1bSJed Brown test: 337*c4762a1bSJed Brown suffix: j 338*c4762a1bSJed Brown nsize: 2 339*c4762a1bSJed Brown args: -ts_trajectory_type memory -rhs-form -ts_type rk -ts_rk_type 8vr 340*c4762a1bSJed Brown filter: sort -b 341*c4762a1bSJed Brown output_file: output/ex41_g.out 342*c4762a1bSJed Brown 343*c4762a1bSJed Brown TEST*/ 344