Actual source code: euler.c

  1: /*$Id: euler.c,v 1.30 2001/08/07 03:04:22 balay Exp $*/
  2: /*
  3:        Code for Timestepping with explicit Euler.
  4: */
 5:  #include src/ts/tsimpl.h

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

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

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

 25: static int TSStep_Euler(TS ts,int *steps,PetscReal *ptime)
 26: {
 27:   TS_Euler *euler = (TS_Euler*)ts->data;
 28:   Vec      sol = ts->vec_sol,update = euler->update;
 29:   int      ierr,i,max_steps = ts->max_steps;
 30:   PetscScalar   dt = ts->time_step;
 31: 
 33:   *steps = -ts->steps;
 34:   TSMonitor(ts,ts->steps,ts->ptime,sol);

 36:   for (i=0; i<max_steps; i++) {
 37:     ts->ptime += ts->time_step;
 38:     TSComputeRHSFunction(ts,ts->ptime,sol,update);
 39:     VecAXPY(&dt,update,sol);
 40:     ts->steps++;
 41:     TSMonitor(ts,ts->steps,ts->ptime,sol);
 42:     if (ts->ptime > ts->max_time) break;
 43:   }

 45:   *steps += ts->steps;
 46:   *ptime  = ts->ptime;
 47:   return(0);
 48: }
 49: /*------------------------------------------------------------*/
 52: static int TSDestroy_Euler(TS ts)
 53: {
 54:   TS_Euler *euler = (TS_Euler*)ts->data;
 55:   int      ierr;

 58:   if (euler->update) {VecDestroy(euler->update);}
 59:   PetscFree(euler);
 60:   return(0);
 61: }
 62: /*------------------------------------------------------------*/

 66: static int TSSetFromOptions_Euler(TS ts)
 67: {
 69:   return(0);
 70: }

 74: static int TSView_Euler(TS ts,PetscViewer viewer)
 75: {
 77:   return(0);
 78: }

 80: /* ------------------------------------------------------------ */

 82: /*MC
 83:       TS_EULER - ODE solver using the explicit forward Euler method

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

 87: M*/
 88: EXTERN_C_BEGIN
 91: int TSCreate_Euler(TS ts)
 92: {
 93:   TS_Euler *euler;
 94:   int      ierr;

 97:   ts->ops->setup           = TSSetUp_Euler;
 98:   ts->ops->step            = TSStep_Euler;
 99:   ts->ops->destroy         = TSDestroy_Euler;
100:   ts->ops->setfromoptions  = TSSetFromOptions_Euler;
101:   ts->ops->view            = TSView_Euler;

103:   PetscNew(TS_Euler,&euler);
104:   PetscLogObjectMemory(ts,sizeof(TS_Euler));
105:   ts->data = (void*)euler;

107:   return(0);
108: }
109: EXTERN_C_END