Choral
ode_NL_1s_mod.f90
Go to the documentation of this file.
1 
9 
11 
14  use basic_tools
15  use real_type
16  use ode_def
17  use ode_problem_mod
19  !$ use OMP_LIB
20 
21  implicit none
22  private
23 
24  public :: solve_ode_nl_1s
25  public :: create_ode_nl_1s_sol
26  public :: set_solver_ode_nl_1s
27  public :: memsize_ode_nl_1s
28  public :: check_ode_method_nl_1s
29 
30 
31 contains
32 
33 
35  function check_ode_method_nl_1s(method) result(b)
36  logical :: b
37  integer, intent(in) :: method
38 
39  b = .false.
40 
41  select case(method)
42  case(ode_fe, ode_fbe, ode_rk2, ode_rk4, &
45  b = .true.
46 
47  end select
48 
49  end function check_ode_method_nl_1s
50 
51 
59  subroutine memsize_ode_nl_1s(n_Y, n_FY, method)
60  integer, intent(out) :: n_FY, n_Y
61  integer, intent(in) :: method
62 
63  select case(method)
64 
65  case(ode_fe, ode_fbe, ode_rk2, ode_rk4, &
68  n_y = 1; n_fy = 0
69 
70  case default
71  call quit("ode_NL_1s_mod: memSize_ode_NL_1s: uncorrect method")
72 
73  end select
74 
75  end subroutine memsize_ode_nl_1s
76 
77 
81  subroutine set_solver_ode_nl_1s(slv, method)
82  integer , intent(in) :: method
83  procedure(ode_nl_1s_solver), pointer :: slv
84 
85  select case(method)
86  case(ode_fbe)
87  slv => nl_1s_fbe
88  case(ode_fe)
89  slv => nl_1s_fe
90  case(ode_rk2)
91  slv => nl_1s_rk2
92  case(ode_rk4)
93  slv => nl_1s_rk4
94  case(ode_erk1)
95  slv => nl_1s_erk1
96  case(ode_erk2_a)
97  slv => nl_1s_erk2_a
98  case(ode_erk2_b)
99  slv => nl_1s_erk2_b
100  case(ode_modif_erk2_b)
101  slv => nl_1s_modif_erk2_a
102 
103  case default
104  call quit("ode_NL_1s_mod: set_solver_ode_NL_1s;&
105  & uncorrect method")
106  end select
107 
108  end subroutine set_solver_ode_nl_1s
109 
110 
113  subroutine create_ode_nl_1s_sol(sol, pb, method)
114  type(ode_solution), intent(inout) :: sol
115  type(ode_problem) , intent(in) :: pb
116  integer , intent(in) :: method
117 
118  integer :: n_Y, n_FY
119  logical :: bool
120 
121  bool = check_ode_method_nl_1s(method)
122  if (.NOT.bool) call quit(&
123  & "ode_NL_1s_mod: create_ode_NL_1s_sol: uncorrect method")
124 
125  call memsize_ode_nl_1s(n_y, n_fy, method)
126  sol = ode_solution(pb, ny=n_y, nfy=n_fy)
127 
128  end subroutine create_ode_nl_1s_sol
129 
130 
131 
134  subroutine solve_ode_nl_1s(sol, pb, t0, T, dt, method, &
135  & out, check_overflow)
136  type(ode_solution), intent(inout) :: sol
137  type(ode_problem) , intent(in) :: pb
138  real(RP) , intent(in) :: t0, T, dt
139  integer , intent(in) :: method
140  procedure(ode_output_proc) :: out
141  logical , intent(in) :: check_overflow
142 
143  procedure(ode_nl_1s_solver), pointer :: slv=>null()
144  real(RP) :: tn
145  logical :: ierr
146  integer :: ns, jj
147  logical :: exit_comp
148 
149  if (choral_verb>1) write(*,*) &
150  &"ode_NL_1s_mod : solve_ode_NL_1s"
151  if (choral_verb>2) write(*,*) &
152  & " NonLin onestep solver = ",&
153  & name_ode_method(method)
154 
155  call set_solver_ode_nl_1s(slv, method)
156 
157  ns = int( (t-t0) / dt)
158  exit_comp = .false.
159  sol%ierr = 0
160 
161  do jj=1, ns
162  tn = t0 + re(jj-1)*dt
163 
164  ! output
165  call out(tn, sol, exit_comp)
166  if (exit_comp) then
167  if (choral_verb>2) write(*,*) &
168  &"ode_NL_1s_mod : solve&
169  & time = ", tn, ': EXIT_COMPp'
170  return
171  end if
172 
173  call slv(sol, dt, tn, pb)
174 
175  if (check_overflow) then
176  ierr = overflow(sol%Y(:,1,:))
177  if (ierr) then
178  sol%ierr = 10
179  if (choral_verb > 1) write(*,*) &
180  & "ode_NL_1s_mod : solve,&
181  & time = ", tn, ': OVERFLOW'
182  return
183  end if
184  end if
185 
186  end do
187 
188  end subroutine solve_ode_nl_1s
189 
190 
191 
200  subroutine nl_1s_fbe(sol, dt, t, pb)
201  type(ode_solution), intent(inout) :: sol
202  real(RP) , intent(in) :: dt, t
203  type(ode_problem) , intent(in) :: pb
204 
205  real(RP), dimension(pb%N) :: BY
206  real(RP), dimension(pb%Na) :: AY
207  integer :: ii, Na, N
208 
209  na = pb%Na
210  n = pb%N
211 
212  !$OMP PARALLEL PRIVATE(AY, BY)
213  !$OMP DO
214  do ii=1, sol%dof
215 
216  call pb%AB(ay, by,&
217  & pb%X(:,ii), t, sol%Y(:,1,ii), n, na)
218 
219  sol%Y(:,1,ii) = sol%Y(:,1,ii) + dt*by
220 
221  sol%Y(1:na,1,ii) = sol%Y(1:na,1,ii) / &
222  & (1._rp - dt * ay )
223  end do
224  !$OMP END DO
225  !$OMP END PARALLEL
226 
227  end subroutine nl_1s_fbe
228 
229 
232  subroutine nl_1s_rk2(sol, dt, t, pb)
233  type(ode_solution), intent(inout) :: sol
234  real(RP) , intent(in) :: dt, t
235  type(ode_problem) , intent(in) :: pb
236 
237  real(RP), dimension(pb%N) :: K, Y
238  real(RP), dimension(pb%Na) :: AY
239  real(RP) :: tph2, h2
240  integer :: ii, Na, N
241 
242  h2 = dt / 2.0_rp
243 
244  tph2 = t + h2
245 
246  na = pb%Na
247  n = pb%N
248 
249  !$OMP PARALLEL PRIVATE(K, Y, AY)
250  !$OMP DO
251  do ii=1, sol%dof
252 
253  y = sol%Y(:,1,ii)
254  call pb%AB(ay, k, pb%X(:,ii), t, y, n, na)
255  k(1:na) = k(1:na) + ay*y(1:na)
256 
257  y = sol%Y(:,1,ii) + h2*k
258  call pb%AB(ay, k, pb%X(:,ii), tph2, y, n, na)
259  k(1:na) = k(1:na) + ay*y(1:na)
260 
261  sol%Y(:,1,ii) = sol%Y(:,1,ii) + dt * k
262 
263  end do
264  !$OMP END DO
265  !$OMP END PARALLEL
266 
267  end subroutine nl_1s_rk2
268 
269 
270 
271 
274  elemental subroutine phi_1(z)
275  real(RP), intent(inout) :: z
276 
277  if (abs(z)> real_tol) then
278  z = (exp(z) - 1._rp)/z
279  else
280  z = 1._rp
281  end if
282 
283  end subroutine phi_1
284 
285 
288  elemental subroutine phi_2(z)
289  real(RP), intent(inout) :: z
290 
291  real(RP) :: z2
292 
293  z2 = z**2
294 
295  if (abs(z2)>real_tol) then
296  z = (exp(z) - z - 1._rp)/z2
297 
298  else
299  z = 0.5_rp
300 
301  end if
302 
303  end subroutine phi_2
304 
305 
308  subroutine nl_1s_fe(sol, dt, t, pb)
309  type(ode_solution), intent(inout) :: sol
310  real(RP) , intent(in) :: dt, t
311  type(ode_problem) , intent(in) :: pb
312 
313  real(RP), dimension(pb%N) :: y, b
314  real(RP), dimension(pb%Na) :: a
315  integer :: ii, Na, N
316 
317  na = pb%Na
318  n = pb%N
319 
320  !$OMP PARALLEL PRIVATE(y, b, a)
321  !$OMP DO
322  do ii=1, sol%dof
323 
324  y = sol%Y(:,1,ii)
325  call pb%AB(a, b, pb%X(:,ii), t, y, n, na)
326  b(1:na) = b(1:na) + a*y(1:na)
327  sol%Y(:,1,ii) = y + dt*b
328 
329  end do
330  !$OMP END DO
331  !$OMP END PARALLEL
332 
333  end subroutine nl_1s_fe
334 
337  subroutine nl_1s_erk1(sol, dt, t, pb)
338  type(ode_solution), intent(inout) :: sol
339  real(RP) , intent(in) :: dt, t
340  type(ode_problem) , intent(in) :: pb
341 
342  real(RP), dimension(pb%N) :: y, b
343  real(RP), dimension(pb%Na) :: a
344  integer :: ii, Na, N
345 
346  na = pb%Na
347  n = pb%N
348 
349  !$OMP PARALLEL PRIVATE(y, b, a)
350  !$OMP DO
351  do ii=1, sol%dof
352 
353  y = sol%Y(:,1,ii)
354  call pb%AB(a, b,&
355  & pb%X(:,ii), t, y, n, na)
356 
357  b(1:na) = b(1:na) + a*y(1:na)
358 
359  a = a*dt
360  call phi_1(a)
361  b(1:na) = a * b(1:na)
362  y = y + dt*b
363 
364  sol%Y(:,1,ii) = y
365 
366  end do
367  !$OMP END DO
368  !$OMP END PARALLEL
369 
370  end subroutine nl_1s_erk1
371 
372 
379  subroutine nl_1s_erk2_a(sol, dt, t, pb)
380  type(ode_solution), intent(inout) :: sol
381  real(RP) , intent(in) :: dt, t
382  type(ode_problem) , intent(in) :: pb
383 
384  real(RP), dimension(pb%N) :: y, y2, G1, G2
385  real(RP), dimension(pb%Na) :: A, phi
386  real(RP) :: t2, h2
387  integer :: ii, Na, N
388 
389  real(RP), parameter :: C2 = 0.5_rp !! ERK_2 parameter c_2
390 
391  real(RP), parameter :: S2 = 1._rp / c2
392 
393  h2 = dt * c2
394  t2 = t + h2
395  na = pb%Na
396  n = pb%N
397 
398  !$OMP PARALLEL PRIVATE(y, y2, G1, G2, A, phi)
399  !$OMP DO
400  do ii=1, sol%dof
401 
402  !! y <-- yn
403  !! A <-- A1 := a(tn, yn)
404  !! G1 <-- B1 := b(tn, yn)
405  !!
406  y = sol%Y(:,1,ii)
407  call pb%AB(a, g1, pb%X(:,ii), t, y, n, na)
408 
409  !! G1 <-- Ayn + B1
410  !!
411  g1(1:na) = g1(1:na) + a*y(1:na)
412 
413  !! y2 <-- yn + h/2 phi_1(h/2 A) G1
414  !!
415  phi = a * h2
416  call phi_1(phi)
417  y2 = g1
418  y2(1:na) = phi * y2(1:na)
419  y2 = y + h2*y2
420 
421  !! phi <-- A2 := a(t2, y2)
422  !! G2 <-- B2 := b(t2, y2)
423  !!
424  call pb%AB(phi, g2, pb%X(:,ii), t2, y2, n, na)
425 
426  !! G2 <-- G^n_2(t2, y2) = B2 + (A2 - A) y2
427  !!
428  phi = phi - a
429  g2(1:na) = g2(1:na) + phi * y2(1:na)
430 
431  !! G2 <-- G^n_2(t2, y2) + A yn
432  !!
433  g2(1:na) = g2(1:na) + a * y(1:na)
434 
435  !! phi <-- phi_1(hA)
436  !! A <-- phi_2(hA)
437  !!
438  a = a * dt
439  phi = a
440  call phi_1(phi)
441  call phi_2(a)
442 
443  !! A <-- 1/c_2 phi_2(hA)
444  !! phi <-- phi_1(hA) - 1/c_2 phi_2(hA)
445  !!
446  a = s2 * a
447  phi = phi - a
448 
449  !! compute y_{n+1}
450  !!
451  g1(1:na) = phi * g1(1:na)
452  g1(na+1:) = 0._rp
453 
454  g2(1:na) = a * g2(1:na)
455 
456  sol%Y(:,1,ii) = y + dt * (g1 + g2)
457 
458  end do
459  !$OMP END DO
460  !$OMP END PARALLEL
461 
462  end subroutine nl_1s_erk2_a
463 
464 
471  subroutine nl_1s_erk2_b(sol, dt, t, pb)
472  type(ode_solution), intent(inout) :: sol
473  real(RP) , intent(in) :: dt, t
474  type(ode_problem) , intent(in) :: pb
475 
476  real(RP), dimension(pb%N) :: y, y2, G1, G2
477  real(RP), dimension(pb%Na) :: A, phi
478  real(RP) :: t2, h2
479  integer :: ii, Na, N
480 
481  real(RP), parameter :: C2 = 0.5_rp !! ERK_2 parameter c_2
482 
483  real(RP), parameter :: S2 = 1._rp / (2._rp * c2)
484  real(RP), parameter :: S1 = 1._rp - s2
485 
486  h2 = dt * c2
487  t2 = t + h2
488  na = pb%Na
489  n = pb%N
490 
491  !$OMP PARALLEL PRIVATE(y, y2, G1, G2, A, phi)
492  !$OMP DO
493  do ii=1, sol%dof
494 
495 
496  !! y <-- yn
497  !! A <-- A1 := a(tn, yn)
498  !! G1 <-- B1 := b(tn, yn)
499  !!
500  y = sol%Y(:,1,ii)
501  call pb%AB(a, g1, pb%X(:,ii), t, y, n, na)
502 
503  !! G1 <-- Ayn + B1
504  !!
505  g1(1:na) = g1(1:na) + a*y(1:na)
506 
507  !! y2 <-- yn + c_2 h phi_1(c_2 h A) G1
508  !!
509  phi = a * h2
510  call phi_1(phi)
511  y2 = g1
512  y2(1:na) = phi * y2(1:na)
513  y2 = y + h2*y2
514 
515  !! phi <-- A2 := a(t2, y2)
516  !! G2 <-- B2 := b(t2, y2)
517  !!
518  call pb%AB(phi, g2, pb%X(:,ii), t2, y2, n, na)
519 
520  !! G2 <-- G^n_2(t2, y2) = B2 + (A2 - A) y2
521  !!
522  phi = phi - a
523  g2(1:na) = g2(1:na) + phi * y2(1:na)
524 
525  !! G2 <-- G^n_2(t2, y2) + A yn
526  !!
527  g2(1:na) = g2(1:na) + a * y(1:na)
528 
529  !! compute y_{n+1}
530  !!
531  phi = a * dt
532  call phi_1(phi)
533 
534  g1(1:na) = phi * g1(1:na)
535  g2(1:na) = phi * g2(1:na)
536  g1 = s1*g1 + s2*g2
537 
538  sol%Y(:,1,ii) = sol%Y(:,1,ii) + dt*g1
539 
540  end do
541  !$OMP END DO
542  !$OMP END PARALLEL
543 
544  end subroutine nl_1s_erk2_b
545 
546 
547 
548 
551  subroutine nl_1s_modif_erk2_b(sol, dt, t, pb)
552  type(ode_solution), intent(inout) :: sol
553  real(RP) , intent(in) :: dt, t
554  type(ode_problem) , intent(in) :: pb
555 
556  real(RP), dimension(pb%N) :: y, b, y2
557  real(RP), dimension(pb%Na) :: a
558  real(RP) :: t2, h2
559  integer :: ii, Na, N
560 
561  h2 = dt * 0.5_rp
562  t2 = t + h2
563  na = pb%Na
564  n = pb%N
565 
566  !$OMP PARALLEL PRIVATE(y, b, y2, a)
567  !$OMP DO
568  do ii=1, sol%dof
569 
570  !! compute a_n, b_n
571  !!
572  y = sol%Y(:,1,ii)
573  call pb%AB(a, b, pb%X(:,ii), t, y, n, na)
574 
575  !! compute y2 = y_{n+1/2} with ERK1, half a time step
576  !!
577  b(1:na) = b(1:na) + a*y(1:na)
578  a = a*h2
579  call phi_1(a)
580  b(1:na) = a * b(1:na)
581  y2 = y + h2*b
582 
583  !! compute a_{n+1/2}, b_{n+1/2}
584  !!
585  call pb%AB(a, b, pb%X(:,ii), t2, y2, n, na)
586 
587  !! compute y_{n+1}
588  !!
589  b(1:na) = b(1:na) + a*y(1:na)
590  a = a*dt
591  call phi_1(a)
592  b(1:na) = a * b(1:na)
593 
594  sol%Y(:,1,ii) = sol%Y(:,1,ii) + dt*b
595 
596  end do
597  !$OMP END DO
598  !$OMP END PARALLEL
599 
600  end subroutine nl_1s_modif_erk2_b
601 
602 
603 
606  subroutine nl_1s_modif_erk2_a(sol, dt, t, pb)
607  type(ode_solution), intent(inout) :: sol
608  real(RP) , intent(in) :: dt, t
609  type(ode_problem) , intent(in) :: pb
610 
611  real(RP), dimension(pb%N) :: y1, G1, y2, G2
612  real(RP), dimension(pb%Na) :: a1, a2, phi1, phi2
613  real(RP) :: t2, h2
614  integer :: ii, Na, N
615 
616  h2 = dt * 0.5_rp
617  t2 = t + h2
618  na = pb%Na
619  n = pb%N
620 
621  !$OMP PARALLEL PRIVATE(y1, G1, y2, G2, a1, a2, phi1, phi2)
622  !$OMP DO
623  do ii=1, sol%dof
624 
625  !! compute a1, G1
626  !!
627  y1 = sol%Y(:,1,ii)
628  call pb%AB(a1, g1, pb%X(:,ii), t, y1, n, na)
629 
630  !! compute y2
631  !!
632  y2 = g1
633  y2(1:na) = y2(1:na) + a1*y1(1:na)
634  phi1 = a1*h2
635  call phi_1(phi1)
636  y2(1:na) = phi1 * y2(1:na)
637  y2 = y1 + h2*y2
638 
639  !! compute a2, G2
640  !!
641  call pb%AB(a2, g2, pb%X(:,ii), t2, y2, n, na)
642 
643  !! compute y_{n+1}
644  !!
645  g1(1:na) = g1(1:na) + a1*y1(1:na)
646  g1(na+1:) = 0._rp
647  phi1 = a1*dt
648  phi2 = phi1
649  call phi_1(phi1)
650  call phi_2(phi2)
651  phi1 = phi1 - 2._rp*phi2
652  g1(1:na) = g1(1:na) * phi1
653 
654  g2(1:na) = g2(1:na) + a2*y1(1:na)
655  phi2 = a2*dt
656  call phi_2(phi2)
657  phi2 = phi2 * 2._rp
658  g2(1:na) = g2(1:na) * phi2
659 
660  g1 = g1 + g2
661  sol%Y(:,1,ii) = y1 + dt*g1
662 
663  end do
664  !$OMP END DO
665  !$OMP END PARALLEL
666 
667  end subroutine nl_1s_modif_erk2_a
668 
669 
670 
671 
674  subroutine nl_1s_rk4(sol, dt, t, pb)
675  type(ode_solution), intent(inout) :: sol
676  real(RP) , intent(in) :: dt, t
677  type(ode_problem) , intent(in) :: pb
678 
679  real(RP), dimension(pb%N) :: K1, K2, K3, K4, Y
680  real(RP), dimension(pb%Na) :: AY
681  real(RP) :: h6, h3, h2, tph, tph2
682  integer :: ii, Na, N
683 
684  h2 = dt / 2.0_rp
685  h6 = dt / 6.0_rp
686  h3 = dt / 3.0_rp
687 
688  tph = t + dt
689  tph2 = t + h2
690 
691  na = pb%Na
692  n = pb%N
693 
694  !$OMP PARALLEL PRIVATE(K1, K2, K3, K4, Y, AY)
695  !$OMP DO
696  do ii=1, sol%dof
697 
698  y = sol%Y(:,1,ii)
699  call pb%AB(ay, k1, pb%X(:,ii), t, y, n, na)
700  k1(1:na) = k1(1:na) + ay*y(1:na)
701 
702  y = sol%Y(:,1,ii) + h2*k1
703  call pb%AB(ay, k2, pb%X(:,ii), tph2, y, n, na)
704  k2(1:na) = k2(1:na) + ay*y(1:na)
705 
706  y = sol%Y(:,1,ii) + h2*k2
707  call pb%AB(ay, k3, pb%X(:,ii), tph2, y, n, na)
708  k3(1:na) = k3(1:na) + ay*y(1:na)
709 
710  y = sol%Y(:,1,ii) + dt*k3
711  call pb%AB(ay, k4, pb%X(:,ii), tph, y, n, na)
712  k4(1:na) = k4(1:na) + ay*y(1:na)
713 
714  y = k1*h6 + k2*h3 + k3*h3 + k4*h6
715  sol%Y(:,1,ii) = sol%Y(:,1,ii) + y
716 
717  end do
718  !$OMP END DO
719  !$OMP END PARALLEL
720 
721  end subroutine nl_1s_rk4
722 
723 
724 end module ode_nl_1s_mod
Type ode_solution: data structure to solve ODE/PDE problems.
BASIC TOOLS
Definition: basic_tools.F90:8
DERIVED TYPE ode_problem: definition of ODE/PDE problems
integer, parameter ode_rk4
RK4.
integer, parameter ode_erk2_b
Exp. RK2, type b.
subroutine, public quit(message)
Stop program execution, display an error messahe.
subroutine, public set_solver_ode_nl_1s(slv, method)
set the solver &#39;slv&#39; to a predefined solver being given a method
integer, parameter ode_modif_erk2_b
modified ERK2_B
subroutine nl_1s_erk1(sol, dt, t, pb)
Exponential Euler.
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
subroutine nl_1s_modif_erk2_a(sol, dt, t, pb)
Modified ERK2_A.
conversion integers or rational to real
Definition: real_type.F90:153
REAL NUMBERS PRECISION IN CHORAL: selects simple/double/quad
Definition: real_type.F90:33
subroutine nl_1s_erk2_b(sol, dt, t, pb)
Exponential RK2, type B ref = "Explicit Exponential Runge-Kutta Methods for Semilinear Parabo...
logical function, public check_ode_method_nl_1s(method)
is &#39;method&#39; a one-step non-linear ODE solver ?
subroutine nl_1s_fe(sol, dt, t, pb)
Forward Euler.
integer, parameter ode_erk2_a
Exp. RK2, type a.
integer, parameter ode_fbe
Forward / backward Euler.
DERIVED TYPE ode_solution: data straucture to solve ODEs
CHORAL CONSTANTS
subroutine, public solve_ode_nl_1s(sol, pb, t0, T, dt, method, out, check_overflow)
solve with constant time-step
elemental subroutine phi_1(z)
phi_1 = ( exp(z) - 1 ) / z
elemental subroutine phi_2(z)
phi_2 = (exp(z) - z - 1._RP)/z^2
integer, parameter ode_erk1
Exponential Euler.
subroutine nl_1s_modif_erk2_b(sol, dt, t, pb)
Modified ERK2_B.
BOTTOM LEVEL MODULE FOR ODEs
Definition: ode_def.f90:12
subroutine, public memsize_ode_nl_1s(n_Y, n_FY, method)
required sizes to allocate memory
integer choral_verb
Verbosity level.
subroutine, public create_ode_nl_1s_sol(sol, pb, method)
create memory for the ode_solution structure &#39;sol&#39;
subroutine nl_1s_rk2(sol, dt, t, pb)
RK2.
ONE-STEP SOLVERS FOR NON LINEAR ODEs
real(rp), parameter, public real_tol
Definition: real_type.F90:91
subroutine nl_1s_fbe(sol, dt, t, pb)
FORWARD/BacWard Euler.
subroutine nl_1s_erk2_a(sol, dt, t, pb)
Exponential RK2, type A ref = "Explicit Exponential Runge-Kutta Methods for Semilinear Parabo...
DEFINITION OF GLOBAL VARIABLES FOR THE LIBRARY CHORAL
subroutine nl_1s_rk4(sol, dt, t, pb)
RK4.
integer, parameter ode_rk2
RK2.
integer, parameter ode_fe
Forward Euler.
Type ode_problem: definition of ODE/PDE problems.