Choral
ode_def.f90
Go to the documentation of this file.
1 
11 
12 module ode_def
13 
16  use real_type
17  use basic_tools
18 
19  implicit none
20  private
21 
22  public :: s_prefactor
23  public :: name_ode_method
24  public :: order_ode_method
25  public :: overflow
26 
27  !! ABSTRACT INTERFACES
28  public :: ode_reaction
29  public :: linsystem_solver
30 
31  ! %----------------------------------------%
32  ! | |
33  ! | ABSTRACT INTERFACES |
34  ! | |
35  ! %----------------------------------------%
36  abstract interface
37 
40  subroutine ode_reaction(a, b, x, t, y, N, Na)
41  import :: rp
42  real(RP), dimension(Na), intent(out) :: a
43  real(RP), dimension(N) , intent(out) :: b
44  real(RP), dimension(3) , intent(in) :: x
45  real(RP) , intent(in) :: t
46  real(RP), dimension(N) , intent(in) :: y
47  integer , intent(in) :: N, Na
48  end subroutine ode_reaction
49 
52  subroutine linsystem_solver(x, ierr, y)
53  import :: rp
54  real(RP), dimension(:), intent(inout) :: x
55  logical , intent(out) :: ierr
56  real(RP), dimension(:), intent(in) :: y
57  end subroutine linsystem_solver
58 
59  end interface
60 
61 
62 contains
63 
64 
67  function name_ode_method(method) result(name)
68  integer, intent(in) :: method
69  character(len=15) :: name
70 
71  select case(method)
72 
73  case(ode_be)
74  name="Bwd-Euler"
75 
76  case(ode_fe)
77  name="Fwd-Euler"
78 
79  case(ode_cn)
80  name="CN"
81 
82  case(ode_sdirk4)
83  name="SDIRK4"
84 
85  case(ode_rk2)
86  name="RK2"
87 
88  case(ode_erk1)
89  name="Exp. Euler"
90 
91  case(ode_erk2_a)
92  name="ERK2 (A)"
93 
94  case(ode_erk2_b)
95  name="ERK2 (B)"
96 
97  case(ode_modif_erk2_b)
98  name="Modif. ERK2 (B)"
99 
100  case(ode_rk4)
101  name="RK4"
102 
103  case(ode_fbe)
104  name="Fwd-Bwd-Euler"
105 
106  case(ode_bdfsbdf2)
107  name="BDF2-SBDF2"
108 
109  case(ode_rl2)
110  name="RL2"
111 
112  case(ode_eab2)
113  name="Exp-Adams-2"
114 
115  case(ode_cnab2)
116  name="CN-AB2"
117 
118  case(ode_mcnab2)
119  name="Mod-CN-AB2"
120 
121  case(ode_bdfsbdf3)
122  name="BDF3-SBDF3"
123 
124  case(ode_rl3)
125  name="RL3"
126 
127  case(ode_eab3)
128  name="Exp-Adams-3"
129 
130  case(ode_bdfsbdf4)
131  name="BDF4-SBDF4"
132 
133  case(ode_rl4)
134  name="RL4"
135 
136  case(ode_eab4)
137  name="Exp-Adams-4"
138 
139  case(ode_bdfsbdf5)
140  name="BDF5-SBDF5"
141 
142  case(ode_dc_2)
143  name="DC-2"
144 
145  case(ode_dc_3)
146  name="DC-3"
147 
148  case default
149  name="invalid"
150 
151  end select
152 
153  end function name_ode_method
154 
155 
158  function order_ode_method(method) result(o)
159  integer, intent(in) :: method
160  integer :: o
161 
162  !! invalid method
163  if ( (method<=0).OR.(method>ode_tot_nb) ) then
164  o = -1
165  return
166  end if
167 
168  !! default
169  o = 2
170 
171  select case(method)
172 
174  o = 1
175 
177  o = 3
178 
180  o = 4
181 
182  case(ode_bdfsbdf5)
183  o = 5
184 
185  case(ode_dc_2)
186  o = 2
187 
188  case(ode_dc_3)
189  o = 3
190 
191  end select
192 
193  end function order_ode_method
194 
195 
196 
204  function s_prefactor(method, dt) result(cs)
205  integer , intent(in) :: method
206  real(RP), intent(in) :: dt
207  real(RP) :: Cs
208 
209  select case(method)
210  case(ode_fe)
211  cs = 0.0_rp
212 
214  cs = dt
215 
216  case(ode_bdfsbdf2)
217  cs = dt * 2._rp / 3._rp
218 
219  case(ode_cnab2)
220  cs = dt / 2._rp
221 
222  case(ode_mcnab2)
223  cs = dt * 9._rp / 16._rp
224 
225  case(ode_bdfsbdf3)
226  cs = dt * 6._rp / 11._rp
227 
228  case(ode_bdfsbdf4)
229  cs = dt * 12._rp / 25._rp
230 
231  case(ode_bdfsbdf5)
232  cs = dt * 60._rp / 137._rp
233 
234  case(ode_cn)
235  cs = dt / 2._rp
236 
237  case(ode_sdirk4)
238  cs = 1._rp/sqrt(3._rp) * cos(pi/18._rp)
239  cs = cs + 0.5_rp
240  cs = dt * cs
241 
242  case default
243  cs = 0.0_rp
244  call quit( "ode_def: S_prefactor: unknown method" )
245 
246  end select
247 
248  end function s_prefactor
249 
250 
253  function overflow(yy) result(bool)
254  logical :: bool
255  real(RP), dimension(:,:), intent(in) :: yy
256 
257  real(RP):: nrm
258 
259  bool = .false.
260 
261  nrm = maxval( abs(yy) )
262 
263  if ((nrm>1.e4_rp) .OR. (isnan(nrm)) ) then
264  bool = .true.
265 
266  if (choral_verb>0) then
267  write(*,*)"ode_def : OVERFLOW"
268  if (choral_verb>2) call print(yy)
269  end if
270 
271  end if
272 
273  end function overflow
274 
275 end module ode_def
integer, parameter ode_dc_3
Deferred corrections 3.
integer, parameter ode_be
Backward Euler.
BASIC TOOLS
Definition: basic_tools.F90:8
integer, parameter ode_mcnab2
ModifiedCrank Nicholson / Adamns Bashforth 2.
integer, parameter ode_bdfsbdf3
BDF / SBDF 3.
real(rp) function, public s_prefactor(method, dt)
When discretising with two matrices, this function returns the prefactor Cs for the matrix S...
Definition: ode_def.f90:205
integer, parameter ode_rk4
RK4.
integer, parameter ode_erk2_b
Exp. RK2, type b.
integer, parameter, public rp
real(kind=RP) = real precision in the code REAL_TOL = epsilon to test real equality ...
Definition: real_type.F90:90
integer, parameter ode_cn
Crank Nicholson.
subroutine, public quit(message)
Stop program execution, display an error messahe.
Abstract interface: .
Definition: ode_def.f90:40
integer, parameter ode_modif_erk2_b
modified ERK2_B
integer, parameter ode_eab4
Exponential Adamns Bashforth 4.
integer, parameter ode_tot_nb
Total number of ODE methods.
logical function, public overflow(yy)
Detects overflow.
Definition: ode_def.f90:254
character(len=15) function, public name_ode_method(method)
Get ODE method name.
Definition: ode_def.f90:68
integer, parameter ode_dc_2
Deferred corrections 2.
REAL NUMBERS PRECISION IN CHORAL: selects simple/double/quad
Definition: real_type.F90:33
integer, parameter ode_eab3
Exponential Adamns Bashforth 3.
integer, parameter ode_erk2_a
Exp. RK2, type a.
integer, parameter ode_fbe
Forward / backward Euler.
CHORAL CONSTANTS
real(rp), parameter, public pi
REAL CONSTANT Pi.
Definition: real_type.F90:96
integer, parameter ode_erk1
Exponential Euler.
integer, parameter ode_bdfsbdf5
BDF / SBDF 5.
BOTTOM LEVEL MODULE FOR ODEs
Definition: ode_def.f90:12
integer choral_verb
Verbosity level.
integer, parameter ode_rl3
Rush Larsen 3.
integer, parameter ode_bdfsbdf4
BDF / SBDF 4.
DEFINITION OF GLOBAL VARIABLES FOR THE LIBRARY CHORAL
short description for real arrays
Definition: real_type.F90:141
integer, parameter ode_rk2
RK2.
integer, parameter ode_cnab2
Crank Nicholson / Adamns Bashforth 2.
integer, parameter ode_fe
Forward Euler.
integer, parameter ode_bdfsbdf2
BDF / SBDF 2.
integer, parameter ode_eab2
Exponential Adamns Bashforth 2.
integer, parameter ode_rl2
Rush Larsen 2.
integer function, public order_ode_method(method)
order associated with a method
Definition: ode_def.f90:159
integer, parameter ode_sdirk4
SDIRK4.
integer, parameter ode_rl4
Rush Larsen 4.