1 /* 2 Code for Timestepping with explicit Euler. 3 */ 4 #include <petsc-private/tsimpl.h> /*I "petscts.h" I*/ 5 6 typedef struct { 7 Vec update; /* work vector where new solution is formed */ 8 } TS_Euler; 9 10 #undef __FUNCT__ 11 #define __FUNCT__ "TSStep_Euler" 12 static PetscErrorCode TSStep_Euler(TS ts) 13 { 14 TS_Euler *euler = (TS_Euler*)ts->data; 15 Vec sol = ts->vec_sol,update = euler->update; 16 PetscErrorCode ierr; 17 18 PetscFunctionBegin; 19 ierr = TSComputeRHSFunction(ts,ts->ptime,sol,update);CHKERRQ(ierr); 20 ierr = VecAXPY(sol,ts->time_step,update);CHKERRQ(ierr); 21 ts->ptime += ts->time_step; 22 ts->steps++; 23 PetscFunctionReturn(0); 24 } 25 /*------------------------------------------------------------*/ 26 27 #undef __FUNCT__ 28 #define __FUNCT__ "TSSetUp_Euler" 29 static PetscErrorCode TSSetUp_Euler(TS ts) 30 { 31 TS_Euler *euler = (TS_Euler*)ts->data; 32 PetscErrorCode ierr; 33 34 PetscFunctionBegin; 35 ierr = VecDuplicate(ts->vec_sol,&euler->update);CHKERRQ(ierr); 36 PetscFunctionReturn(0); 37 } 38 39 #undef __FUNCT__ 40 #define __FUNCT__ "TSReset_Euler" 41 static PetscErrorCode TSReset_Euler(TS ts) 42 { 43 TS_Euler *euler = (TS_Euler*)ts->data; 44 PetscErrorCode ierr; 45 46 PetscFunctionBegin; 47 ierr = VecDestroy(&euler->update);CHKERRQ(ierr); 48 PetscFunctionReturn(0); 49 } 50 51 #undef __FUNCT__ 52 #define __FUNCT__ "TSDestroy_Euler" 53 static PetscErrorCode TSDestroy_Euler(TS ts) 54 { 55 PetscErrorCode ierr; 56 57 PetscFunctionBegin; 58 ierr = TSReset_Euler(ts);CHKERRQ(ierr); 59 ierr = PetscFree(ts->data);CHKERRQ(ierr); 60 PetscFunctionReturn(0); 61 } 62 /*------------------------------------------------------------*/ 63 64 #undef __FUNCT__ 65 #define __FUNCT__ "TSSetFromOptions_Euler" 66 static PetscErrorCode TSSetFromOptions_Euler(TS ts) 67 { 68 PetscFunctionBegin; 69 PetscFunctionReturn(0); 70 } 71 72 #undef __FUNCT__ 73 #define __FUNCT__ "TSView_Euler" 74 static PetscErrorCode TSView_Euler(TS ts,PetscViewer viewer) 75 { 76 PetscFunctionBegin; 77 PetscFunctionReturn(0); 78 } 79 80 #undef __FUNCT__ 81 #define __FUNCT__ "TSInterpolate_Euler" 82 static PetscErrorCode TSInterpolate_Euler(TS ts,PetscReal t,Vec X) 83 { 84 PetscReal alpha = (ts->ptime - t)/ts->time_step; 85 PetscErrorCode ierr; 86 87 PetscFunctionBegin; 88 ierr = VecAXPBY(ts->vec_sol,1.0-alpha,alpha,X);CHKERRQ(ierr); 89 PetscFunctionReturn(0); 90 } 91 92 /* ------------------------------------------------------------ */ 93 94 /*MC 95 TSEULER - ODE solver using the explicit forward Euler method 96 97 Level: beginner 98 99 .seealso: TSCreate(), TS, TSSetType(), TSBEULER 100 101 M*/ 102 EXTERN_C_BEGIN 103 #undef __FUNCT__ 104 #define __FUNCT__ "TSCreate_Euler" 105 PetscErrorCode TSCreate_Euler(TS ts) 106 { 107 TS_Euler *euler; 108 PetscErrorCode ierr; 109 110 PetscFunctionBegin; 111 ts->ops->setup = TSSetUp_Euler; 112 ts->ops->step = TSStep_Euler; 113 ts->ops->reset = TSReset_Euler; 114 ts->ops->destroy = TSDestroy_Euler; 115 ts->ops->setfromoptions = TSSetFromOptions_Euler; 116 ts->ops->view = TSView_Euler; 117 ts->ops->interpolate = TSInterpolate_Euler; 118 119 ierr = PetscNewLog(ts,TS_Euler,&euler);CHKERRQ(ierr); 120 ts->data = (void*)euler; 121 122 PetscFunctionReturn(0); 123 } 124 EXTERN_C_END 125