Actual source code: euler.c

  1: #define PETSCTS_DLL

  3: /*
  4:        Code for Timestepping with explicit Euler.
  5: */
 6:  #include private/tsimpl.h

  8: typedef struct {
  9:   Vec update;     /* work vector where F(t[i],u[i]) is stored */
 10: } TS_Euler;

 14: static PetscErrorCode TSSetUp_Euler(TS ts)
 15: {
 16:   TS_Euler       *euler = (TS_Euler*)ts->data;

 20:   VecDuplicate(ts->vec_sol,&euler->update);
 21:   return(0);
 22: }

 26: static PetscErrorCode TSStep_Euler(TS ts,PetscInt *steps,PetscReal *ptime)
 27: {
 28:   TS_Euler       *euler = (TS_Euler*)ts->data;
 29:   Vec            sol = ts->vec_sol,update = euler->update;
 31:   PetscInt       i,max_steps = ts->max_steps;
 32: 
 34:   *steps = -ts->steps;
 35:   TSMonitor(ts,ts->steps,ts->ptime,sol);

 37:   for (i=0; i<max_steps; i++) {
 38:     PetscReal dt = ts->time_step;

 40:     ts->ptime += dt;
 41:     TSComputeRHSFunction(ts,ts->ptime,sol,update);
 42:     VecAXPY(sol,dt,update);
 43:     ts->steps++;
 44:     TSMonitor(ts,ts->steps,ts->ptime,sol);
 45:     if (ts->ptime > ts->max_time) break;
 46:   }

 48:   *steps += ts->steps;
 49:   *ptime  = ts->ptime;
 50:   return(0);
 51: }
 52: /*------------------------------------------------------------*/
 55: static PetscErrorCode TSDestroy_Euler(TS ts)
 56: {
 57:   TS_Euler       *euler = (TS_Euler*)ts->data;

 61:   if (euler->update) {VecDestroy(euler->update);}
 62:   PetscFree(euler);
 63:   return(0);
 64: }
 65: /*------------------------------------------------------------*/

 69: static PetscErrorCode TSSetFromOptions_Euler(TS ts)
 70: {
 72:   return(0);
 73: }

 77: static PetscErrorCode TSView_Euler(TS ts,PetscViewer viewer)
 78: {
 80:   return(0);
 81: }

 83: /* ------------------------------------------------------------ */

 85: /*MC
 86:       TS_EULER - ODE solver using the explicit forward Euler method

 88:   Level: beginner

 90: .seealso:  TSCreate(), TS, TSSetType(), TS_BEULER

 92: M*/
 96: PetscErrorCode  TSCreate_Euler(TS ts)
 97: {
 98:   TS_Euler       *euler;

102:   ts->ops->setup           = TSSetUp_Euler;
103:   ts->ops->step            = TSStep_Euler;
104:   ts->ops->destroy         = TSDestroy_Euler;
105:   ts->ops->setfromoptions  = TSSetFromOptions_Euler;
106:   ts->ops->view            = TSView_Euler;

108:   PetscNewLog(ts,TS_Euler,&euler);
109:   ts->data = (void*)euler;

111:   return(0);
112: }