3 #include "sll_assert.h"
4 #include "sll_memory.h"
5 #include "sll_working_precision.h"
20 function scalar_function_1d(eta)
22 sll_real64 :: scalar_function_1d
23 sll_real64,
intent(in) :: eta
24 end function scalar_function_1d
32 sll_real64,
intent(in) :: eta
34 f_one = 1.0_f64 + eta - eta
63 intrinsic :: floor,
present
71 sll_real64,
dimension(:) :: xout
72 sll_real64,
dimension(:) :: a
73 sll_real64,
dimension(:),
pointer,
optional :: a_np1
75 sll_int32 :: i, id, ileft, iright, i0
76 sll_real64 :: xmax, xi, alpha
78 sll_real64,
dimension(ncx + 1),
target :: zeros
79 sll_real64,
dimension(:),
pointer :: b
91 if (
present(a_np1))
then
94 stop
'implicit_ode: need field at time t_n+1 for higher order'
97 print *,
'order = ', order,
' not implemented'
102 sll_assert(
size(a) == ncx + 1)
103 sll_assert(
size(b) == ncx + 1)
104 sll_assert(
size(xout) == ncx + 1)
106 xmax = xmin + ncx*deltax
110 if (a(i) + b(i) > 0)
then
114 do while (i0 + c*deltat/deltax*(a(modulo(i0 - 1, ncx) + 1) + b(i)) >= i)
120 stop
'implicit_ode : boundary_type not implemented'
125 do while (i0 + c*deltat/deltax*(a(i0) + b(i)) < i)
132 xi = xmin + (i - 1)*deltax
134 do while (i0 + c*deltat/deltax*(a(modulo(i0 - 1, ncx) + 1) + b(i)) <= i)
142 ileft = modulo(i0 - 1, ncx) + 1
143 iright = modulo(i0, ncx) + 1
145 ileft = min(max(i0, 1), ncx + 1)
146 iright = max(min(i0 + 1, ncx + 1), 1)
148 stop
'implicit_ode : boundary_type not implemented'
151 sll_assert((ileft >= 1) .and. (ileft <= ncx + 1))
152 sll_assert((iright >= 1) .and. (iright <= ncx + 1))
153 sll_assert(deltax + c*deltat*(a(iright) - a(ileft)) > 0.0)
155 alpha = c*deltat*(b(i) + (1 - id)*a(ileft) + id*a(iright)) &
156 /(deltax + c*deltat*(a(iright) - a(ileft)))
157 xout(i) = xi - alpha*deltax
160 xout(i) = modulo(xout(i) - xmin, xmax - xmin) + xmin
162 if (xout(i) < xmin)
then
165 elseif (xout(i) > xmax)
then
170 stop
'implicit_ode : boundary_type not implemented'
173 sll_assert((xout(i) >= xmin) .and. (xout(i) <= xmax))
186 intrinsic :: floor,
present
187 sll_int32,
intent(in) :: order
188 sll_real64,
intent(in) :: deltat
189 sll_int32,
intent(in) :: ncx
190 sll_int32,
intent(in) :: bt
191 sll_real64,
dimension(:) :: xin(:)
193 sll_real64,
dimension(:) :: xout
194 sll_real64,
dimension(:) :: a
195 sll_real64,
dimension(:),
pointer,
optional :: a_np1
197 sll_int32 :: i, ileft, iright, i0, imax
198 sll_real64 :: xi, xi0, yi0, yi0p1, x1, beta
201 sll_real64,
dimension(ncx + 1),
target :: zeros
202 sll_real64,
dimension(:),
pointer :: b
203 sll_real64,
parameter :: eps = 1.0d-14
214 b => zeros(1:ncx + 1)
217 if (
present(a_np1))
then
218 b => a_np1(1:ncx + 1)
220 stop
'implicit_ode: need field at time t_n+1 for higher order'
223 print *,
'order = ', order,
' not implemented'
228 sll_assert(
size(a) == ncx + 1)
229 sll_assert(
size(b) == ncx + 1)
230 sll_assert(
size(xout) == ncx + 1)
231 sll_assert(
size(xin) == ncx + 1)
239 tmp = tmp + abs(a(i))
241 tmp = tmp/real(ncx, f64)
242 if (tmp < 1.e-14)
then
248 period = xin(ncx + 1) - x1
260 if (a(1) + b(i) > 0)
then
263 yi0p1 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
265 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
266 do while (yi0p1 > yi0)
269 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
274 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
275 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
276 do while (yi0p1 > yi0)
279 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
283 if ((i0 < 1) .or. (i0 > ncx))
then
285 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
286 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
290 do while ((yi0p1 < xi + eps))
291 i0 = modulo(i0, ncx) + 1
294 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
298 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
302 sll_assert((i0 >= 1) .and. (i0 <= ncx))
304 if (yi0p1 > yi0)
then
305 beta = (xi - yi0)/(yi0p1 - yi0)
306 else if (xi >= yi0)
then
307 beta = (xi - yi0)/(yi0p1 - yi0 + period)
309 beta = (xi - yi0 + period)/(yi0p1 - yi0 + period)
312 if (.not. ((beta >= -eps) .and. (beta <= 1)))
then
315 print *, beta, eps, i0, beta - 1._f64, i
319 sll_assert((beta >= -eps) .and. (beta <= 1))
320 xout(i) = xin(i0) + beta*(xin(i0 + 1) - xin(i0))
322 xout(i) = modulo(xout(i) - xin(1), xin(ncx + 1) - xin(1)) + xin(1)
323 sll_assert((xout(i) >= xin(1)) .and. (xout(i) <= xin(ncx + 1)))
327 xout(ncx + 1) = xout(1)
332 if (a(i) + b(i) > 0)
then
337 do while (xin(i0) + c*deltat*(a(i0) + b(i)) < xin(i))
349 yi0 = xin(i0) + c*deltat*(a(i0) + b(i))
350 do while ((yi0 <= xi) .and. (i0 < ncx + 1))
352 yi0 = xin(i0) + c*deltat*(a(i0) + b(i))
357 do while ((yi0 > xi) .and. (i0 > 1))
359 yi0 = xin(i0) + c*deltat*(a(i0) + b(i))
366 sll_assert((ileft >= 1) .and. (ileft <= ncx))
367 sll_assert((iright >= 2) .and. (iright <= ncx + 1))
368 sll_assert(xin(ileft + 1) - xin(ileft) + c*deltat*(a(iright) - a(ileft)) > 0.0)
370 beta = (xin(i) - xin(ileft) - c*deltat*(b(i) + a(ileft))) &
371 /(xin(ileft + 1) - xin(ileft) + c*deltat*(a(iright) - a(ileft)))
372 xout(i) = xin(ileft) + beta*(xin(ileft + 1) - xin(ileft))
375 if (xout(i) < xin(1))
then
378 elseif (xout(i) > xin(ncx + 1))
then
380 xout(i) = xin(ncx + 1)
382 sll_assert((xout(i) >= xin(1)) .and. (xout(i) <= xin(ncx + 1)))
385 stop
'implicit_ode : boundary_type not implemented'
398 intrinsic :: floor,
present
403 sll_real64,
dimension(:) :: xin(:)
405 sll_real64,
dimension(:) :: xout
406 sll_real64,
dimension(:) :: a
407 sll_real64,
dimension(:),
pointer,
optional :: a_np1
409 sll_int32 :: i, ileft, iright, i0, imax
410 sll_real64 :: xi, xi0, yi0, yi0p1, x1, beta
413 sll_real64,
dimension(ncx + 1),
target :: zeros
414 sll_real64,
dimension(:),
pointer :: b
415 sll_real64,
parameter :: eps = 1.0d-14
424 b => zeros(1:ncx + 1)
427 if (
present(a_np1))
then
428 b => a_np1(1:ncx + 1)
430 stop
'implicit_ode: need field at time t_n+1 for higher order'
433 print *,
'order = ', order,
' not implemented'
438 sll_assert(
size(a) == ncx + 1)
439 sll_assert(
size(b) == ncx + 1)
440 sll_assert(
size(xout) == ncx + 1)
441 sll_assert(
size(xin) == ncx + 1)
449 tmp = tmp + abs(a(i))
451 tmp = tmp/real(ncx, f64)
452 if (tmp < 1.e-14)
then
458 period = xin(ncx + 1) - x1
467 if (a(1) + b(i) > 0)
then
470 yi0p1 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
472 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
473 do while (yi0p1 > yi0)
476 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
481 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
482 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
483 do while (yi0p1 > yi0)
486 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
490 if ((i0 < 1) .or. (i0 > ncx))
then
492 yi0 = modulo(xin(i0) + c*deltat*(a(i0) + b(i)) - x1, period) + x1
493 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
497 do while ((yi0p1 < xi + eps))
498 i0 = modulo(i0, ncx) + 1
501 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
505 yi0p1 = modulo(xin(i0 + 1) + c*deltat*(a(i0 + 1) + b(i)) - x1, period) + x1
509 sll_assert((i0 >= 1) .and. (i0 <= ncx))
511 if (yi0p1 > yi0)
then
512 beta = (xi - yi0)/(yi0p1 - yi0)
513 else if (xi >= yi0)
then
514 beta = (xi - yi0)/(yi0p1 - yi0 + period)
516 beta = (xi - yi0 + period)/(yi0p1 - yi0 + period)
519 if (.not. ((beta >= -eps) .and. (beta <= 1)))
then
522 print *, beta, eps, i0, beta - 1._f64, i
526 sll_assert((beta >= -eps) .and. (beta <= 1))
527 xout(i) = xin(i0) + beta*(xin(i0 + 1) - xin(i0))
529 xout(i) = modulo(xout(i) - xin(1), xin(ncx + 1) - xin(1)) + xin(1)
530 sll_assert((xout(i) >= xin(1)) .and. (xout(i) <= xin(ncx + 1)))
533 xout(ncx + 1) = xout(1)
537 if (a(i) + b(i) > 0)
then
542 do while (xin(i0) + c*deltat*(a(i0) + b(i)) < xin(i))
553 yi0 = xin(i0) + c*deltat*(a(i0) + b(i))
554 do while ((yi0 <= xi) .and. (i0 < ncx + 1))
556 yi0 = xin(i0) + c*deltat*(a(i0) + b(i))
561 do while ((yi0 > xi) .and. (i0 > 1))
563 yi0 = xin(i0) + c*deltat*(a(i0) + b(i))
569 sll_assert((ileft >= 1) .and. (ileft <= ncx))
570 sll_assert((iright >= 2) .and. (iright <= ncx + 1))
571 sll_assert(xin(ileft + 1) - xin(ileft) + c*deltat*(a(iright) - a(ileft)) > 0.0)
573 beta = (xin(i) - xin(ileft) - c*deltat*(b(i) + a(ileft))) &
574 /(xin(ileft + 1) - xin(ileft) + c*deltat*(a(iright) - a(ileft)))
575 xout(i) = xin(ileft) + beta*(xin(ileft + 1) - xin(ileft))
578 if (xout(i) < xin(1))
then
581 elseif (xout(i) > xin(ncx + 1))
then
583 xout(i) = xin(ncx + 1)
585 sll_assert((xout(i) >= xin(1)) .and. (xout(i) <= xin(ncx + 1)))
588 stop
'implicit_ode : boundary_type not implemented'
618 intrinsic :: floor,
present
621 sll_real64 :: eta_min
623 sll_real64 :: delta_eta
626 sll_real64,
dimension(:) :: eta_out
627 procedure(scalar_function_1d),
pointer :: xfunc
628 procedure(scalar_function_1d),
pointer :: xprimefunc
629 sll_real64,
dimension(:) :: a
630 sll_real64,
dimension(:),
pointer,
optional :: a_np1
633 sll_real64 :: alpha, aint, eta_max, eta_i, eta_k, eta_kp1, xi
635 sll_real64,
dimension(nc_eta + 1),
target :: zeros
636 sll_real64,
dimension(:),
pointer :: b
648 if (
present(a_np1))
then
651 stop
'implicit_ode_curv: need field at time t_n+1 for higher order'
654 print *,
'order = ', order,
' not implemented'
659 sll_assert(
size(a) == nc_eta + 1)
660 sll_assert(
size(b) == nc_eta + 1)
661 sll_assert(
size(eta_out) == nc_eta + 1)
663 eta_max = eta_min + nc_eta*delta_eta
669 do while (abs(eta_k - eta_kp1) > 1.0d-8)
673 eta_k = eta_min + modulo(eta_k - eta_min, eta_max - eta_min)
675 if (eta_k < eta_min)
then
678 else if (eta_k > eta_max)
then
683 stop
'implicit_ode_curv: boundary_type not implemented'
686 id = floor((eta_k - eta_min)/delta_eta)
687 alpha = (eta_k - eta_min)/delta_eta - id
690 aint = (1.0_f64 - alpha)*a(id) + alpha*a(id + 1)
692 eta_kp1 = eta_k - (c*deltat*(b(i)*aint) + xfunc(eta_k) - xi)/ &
693 (c*deltat*(a(id + 1) - a(id))/delta_eta + xprimefunc(eta_k))
696 sll_assert((eta_kp1 >= eta_min) .and. (eta_kp1 <= eta_max))
698 eta_i = eta_i + delta_eta
705 subroutine rk2(nsubsteps, &
715 sll_int32 :: nsubsteps
717 sll_real64 :: eta_min
719 sll_real64 :: delta_eta
722 sll_real64,
dimension(:) :: eta_out
723 sll_real64,
dimension(:) :: a
724 procedure(scalar_function_1d),
pointer,
optional :: jac
726 procedure(scalar_function_1d),
pointer :: jacobian
727 sll_real64 :: eta_max
728 sll_real64 :: eta_i, eta_k, eta_kp1
729 sll_real64 :: deltatsub
730 sll_real64 :: a_n, a_np1, alpha
731 sll_int32 :: i, id, isub
733 if (
present(jac))
then
739 sll_assert(
size(a) == nc_eta + 1)
740 sll_assert(
size(eta_out) == nc_eta + 1)
742 eta_max = eta_min + nc_eta*delta_eta
744 eta_i = eta_min + (i - 1)*delta_eta
747 a_n = a(i)/jacobian(eta_i)
748 deltatsub = deltat/nsubsteps
749 do isub = 1, nsubsteps
751 eta_kp1 = eta_k + deltatsub*a_n
754 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
756 if (eta_kp1 < eta_min)
then
758 else if (eta_kp1 > eta_max)
then
762 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
766 id = floor((eta_kp1 - eta_min)/delta_eta)
767 alpha = (eta_kp1 - eta_min)/delta_eta - id
769 a_np1 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
771 a_np1 = a_np1/jacobian(eta_kp1)
776 eta_kp1 = eta_k + 0.5_f64*deltatsub*(a_n + a_np1)
780 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
782 if (eta_kp1 < eta_min)
then
784 else if (eta_kp1 > eta_max)
then
788 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
792 id = floor((eta_kp1 - eta_min)/delta_eta)
793 alpha = (eta_kp1 - eta_min)/delta_eta - id
795 a_np1 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
797 a_np1 = a_np1/jacobian(eta_kp1)
804 sll_assert((eta_out(i) >= eta_min) .and. (eta_out(i) <= eta_max))
811 subroutine rk4(nsubsteps, &
821 sll_int32 :: nsubsteps
823 sll_real64 :: eta_min
825 sll_real64 :: delta_eta
828 sll_real64,
dimension(:) :: eta_out
829 sll_real64,
dimension(:) :: a
830 procedure(scalar_function_1d),
pointer,
optional :: jac
832 procedure(scalar_function_1d),
pointer :: jacobian
833 sll_real64 :: eta_max
834 sll_real64 :: eta_i, eta_k, eta_kp1
835 sll_real64 :: deltatsub
836 sll_real64 :: a_n, a_np1, alpha, k2, k3, k4
837 sll_int32 :: i, id, isub
839 if (
present(jac))
then
845 sll_assert(
size(a) == nc_eta + 1)
846 sll_assert(
size(eta_out) == nc_eta + 1)
848 eta_max = eta_min + nc_eta*delta_eta
850 eta_i = eta_min + (i - 1)*delta_eta
853 a_n = a(i)/jacobian(eta_i)
854 deltatsub = deltat/nsubsteps
855 do isub = 1, nsubsteps
857 eta_kp1 = eta_k + 0.5_f64*deltatsub*a_n
860 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
862 if (eta_kp1 < eta_min)
then
864 else if (eta_kp1 > eta_max)
then
868 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
871 id = floor((eta_kp1 - eta_min)/delta_eta)
872 alpha = (eta_kp1 - eta_min)/delta_eta - id
874 k2 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
876 k2 = k2/jacobian(eta_kp1)
879 eta_kp1 = eta_k + 0.5_f64*deltatsub*k2
882 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
884 if (eta_kp1 < eta_min)
then
886 else if (eta_kp1 > eta_max)
then
890 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
893 id = floor((eta_kp1 - eta_min)/delta_eta)
894 alpha = (eta_kp1 - eta_min)/delta_eta - id
896 k3 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
898 k3 = k3/jacobian(eta_kp1)
901 eta_kp1 = eta_k + deltatsub*k3
904 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
906 if (eta_kp1 < eta_min)
then
908 else if (eta_kp1 > eta_max)
then
912 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
915 id = floor((eta_kp1 - eta_min)/delta_eta)
916 alpha = (eta_kp1 - eta_min)/delta_eta - id
918 k4 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
920 k4 = k4/jacobian(eta_kp1)
922 eta_kp1 = eta_k + deltatsub/6.0_f64*(a_n + 2.0_f64*(k2 + k3) + k4)
926 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
928 if (eta_kp1 < eta_min)
then
930 else if (eta_kp1 > eta_max)
then
934 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
938 id = floor((eta_kp1 - eta_min)/delta_eta)
939 alpha = (eta_kp1 - eta_min)/delta_eta - id
941 a_np1 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
943 a_np1 = a_np1/jacobian(eta_kp1)
950 sll_assert((eta_out(i) >= eta_min) .and. (eta_out(i) <= eta_max))
967 sll_int32 :: nsubsteps
969 sll_real64 :: eta_min
971 sll_real64 :: delta_eta
974 sll_real64,
dimension(:) :: eta_out
975 sll_real64,
dimension(:) :: a
976 sll_real64,
dimension(:) :: xin
978 sll_real64 :: eta_max
979 sll_real64 :: eta_i, eta_k, eta_kp1
980 sll_real64 :: deltatsub
981 sll_real64 :: a_n, a_np1, alpha, k2, k3, k4
982 sll_int32 :: i, id, isub
984 sll_assert(
size(a) == nc_eta + 1)
985 sll_assert(
size(eta_out) == nc_eta + 1)
987 eta_max = eta_min + nc_eta*delta_eta
989 eta_i = eta_min + (i - 1)*delta_eta
993 deltatsub = deltat/nsubsteps
994 do isub = 1, nsubsteps
996 eta_kp1 = eta_k + 0.5_f64*deltatsub*a_n
999 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
1001 if (eta_kp1 < eta_min)
then
1003 else if (eta_kp1 > eta_max)
then
1007 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
1010 id = floor((eta_kp1 - eta_min)/delta_eta)
1011 alpha = (eta_kp1 - eta_min)/delta_eta - id
1013 k2 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
1017 eta_kp1 = eta_k + 0.5_f64*deltatsub*k2
1020 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
1022 if (eta_kp1 < eta_min)
then
1024 else if (eta_kp1 > eta_max)
then
1028 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
1031 id = floor((eta_kp1 - eta_min)/delta_eta)
1032 alpha = (eta_kp1 - eta_min)/delta_eta - id
1034 k3 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
1038 eta_kp1 = eta_k + deltatsub*k3
1041 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
1043 if (eta_kp1 < eta_min)
then
1045 else if (eta_kp1 > eta_max)
then
1049 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
1052 id = floor((eta_kp1 - eta_min)/delta_eta)
1053 alpha = (eta_kp1 - eta_min)/delta_eta - id
1055 k4 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
1059 eta_kp1 = eta_k + deltatsub/6.0_f64*(a_n + 2.0_f64*(k2 + k3) + k4)
1063 eta_kp1 = eta_min + modulo(eta_kp1 - eta_min, eta_max - eta_min)
1065 if (eta_kp1 < eta_min)
then
1067 else if (eta_kp1 > eta_max)
then
1071 stop
'sll_ode_solvers, rk2: boundary_type not implemented'
1075 id = floor((eta_kp1 - eta_min)/delta_eta)
1076 alpha = (eta_kp1 - eta_min)/delta_eta - id
1078 a_np1 = (1.0_f64 - alpha)*a(id + 1) + alpha*a(id + 2)
1087 sll_assert((eta_out(i) >= eta_min) .and. (eta_out(i) <= eta_max))
subroutine implicit_ode_curv(order, deltat, eta_min, nc_eta, delta_eta, bt, eta_out, xfunc, xprimefunc, a, a_np1)
integer, parameter, public sll_p_compact_ode
integer, parameter, public sll_p_periodic_ode
subroutine, public sll_s_implicit_ode_nonuniform(order, deltat, xin, ncx, bt, xout, a, a_np1)
real(kind=f64) function f_one(eta)
subroutine implicit_ode_nonuniform_old(order, deltat, xin, ncx, bt, xout, a, a_np1)
subroutine rk4(nsubsteps, deltat, eta_min, nc_eta, delta_eta, bt, eta_out, a, jac)
subroutine rk2(nsubsteps, deltat, eta_min, nc_eta, delta_eta, bt, eta_out, a, jac)
subroutine rk4_non_unif(nsubsteps, deltat, eta_min, nc_eta, delta_eta, bt, eta_out, a, xin)
subroutine implicit_ode(order, deltat, xmin, ncx, deltax, bt, xout, a, a_np1)
Module to select the kind parameter.