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: }