Runge Kutta Verner 8(9)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(rkv89_class), | intent(inout) | :: | me | |||
real(kind=wp), | intent(in) | :: | t |
initial time |
||
real(kind=wp), | intent(in), | dimension(me%n) | :: | x |
initial state |
|
real(kind=wp), | intent(in) | :: | h |
time step |
||
real(kind=wp), | intent(out), | dimension(me%n) | :: | xf |
state at time |
|
real(kind=wp), | intent(out), | dimension(me%n) | :: | terr |
truncation error estimate |
subroutine rkv89(me,t,x,h,xf,terr) implicit none class(rkv89_class),intent(inout) :: me real(wp),intent(in) :: t !! initial time real(wp),dimension(me%n),intent(in) :: x !! initial state real(wp),intent(in) :: h !! time step real(wp),dimension(me%n),intent(out) :: xf !! state at time `t+h` real(wp),dimension(me%n),intent(out) :: terr !! truncation error estimate real(wp),parameter :: s6 = sqrt(6.0_wp) real(wp),parameter :: a2 = 1.0_wp/12.0_wp real(wp),parameter :: a3 = 1.0_wp/9.0_wp real(wp),parameter :: a4 = 1.0_wp/6.0_wp real(wp),parameter :: a5 = 2.0_wp*(1.0_wp+s6)/15.0_wp real(wp),parameter :: a6 = (6.0_wp+s6)/15.0_wp real(wp),parameter :: a7 = (6.0_wp-s6)/15.0_wp real(wp),parameter :: a8 = 2.0_wp/3.0_wp real(wp),parameter :: a9 = 1.0_wp/2.0_wp real(wp),parameter :: a10 = 1.0_wp/3.0_wp real(wp),parameter :: a11 = 1.0_wp/4.0_wp real(wp),parameter :: a12 = 4.0_wp/3.0_wp real(wp),parameter :: a13 = 5.0_wp/6.0_wp real(wp),parameter :: a15 = 1.0_wp/6.0_wp real(wp),parameter :: b31 = 1.0_wp/27.0_wp real(wp),parameter :: b32 = 2.0_wp/27.0_wp real(wp),parameter :: b41 = 1.0_wp/24.0_wp real(wp),parameter :: b43 = 3.0_wp/24.0_wp real(wp),parameter :: b51 = (4.0_wp+94.0_wp*s6)/375.0_wp real(wp),parameter :: b53 = -(282.0_wp+252.0_wp*s6)/375.0_wp real(wp),parameter :: b54 = (328.0_wp+208.0_wp*s6)/375.0_wp real(wp),parameter :: b61 = (9.0_wp-s6)/150.0_wp real(wp),parameter :: b64 = (312.0_wp+32.0_wp*s6)/1425.0_wp real(wp),parameter :: b65 = (69.0_wp+29.0_wp*s6)/570.0_wp real(wp),parameter :: b71 = (927.0_wp-347.0_wp*s6)/1250.0_wp real(wp),parameter :: b74 = (-16248.0_wp+7328.0_wp*s6)/9375.0_wp real(wp),parameter :: b75 = (-489.0_wp+179.0_wp*s6)/3750.0_wp real(wp),parameter :: b76 = (14268.0_wp-5798.0_wp*s6)/9375.0_wp real(wp),parameter :: b81 = 4.0_wp/54.0_wp real(wp),parameter :: b86 = (16.0_wp-s6)/54.0_wp real(wp),parameter :: b87 = (16.0_wp+s6)/54.0_wp real(wp),parameter :: b91 = 38.0_wp/512.0_wp real(wp),parameter :: b96 = (118.0_wp-23.0_wp*s6)/512.0_wp real(wp),parameter :: b97 = (118.0_wp+23.0_wp*s6)/512.0_wp real(wp),parameter :: b98 = -18.0_wp/512.0_wp real(wp),parameter :: b101 = 11.0_wp/144.0_wp real(wp),parameter :: b106 = (266.0_wp-s6)/864.0_wp real(wp),parameter :: b107 = (266.0_wp+s6)/864.0_wp real(wp),parameter :: b108 = -1.0_wp/16.0_wp real(wp),parameter :: b109 = -8.0_wp/27.0_wp real(wp),parameter :: b111 = (5034.0_wp-271.0_wp*s6)/61440.0_wp real(wp),parameter :: b117 = (7859.0_wp-1626.0_wp*s6)/10240.0_wp real(wp),parameter :: b118 = (-2232.0_wp+813.0_wp*s6)/20480.0_wp real(wp),parameter :: b119 = (-594.0_wp+271.0_wp*s6)/960.0_wp real(wp),parameter :: b1110 = (657.0_wp-813.0_wp*s6)/5120.0_wp real(wp),parameter :: b121 = (5996.0_wp-3794.0_wp*s6)/405.0_wp real(wp),parameter :: b126 = (-4342.0_wp-338.0_wp*s6)/9.0_wp real(wp),parameter :: b127 = (154922.0_wp-40458.0_wp*s6)/135.0_wp real(wp),parameter :: b128 = (-4176.0_wp+3794.0_wp*s6)/45.0_wp real(wp),parameter :: b129 = (-340864.0_wp+242816.0_wp*s6)/405.0_wp real(wp),parameter :: b1210 = (26304.0_wp-15176.0_wp*s6)/45.0_wp real(wp),parameter :: b1211 = -26624.0_wp/81.0_wp real(wp),parameter :: b131 = (3793.0_wp+2168.0_wp*s6)/103680.0_wp real(wp),parameter :: b136 = (4042.0_wp+2263.0_wp*s6)/13824.0_wp real(wp),parameter :: b137 = (-231278.0_wp+40717.0_wp*s6)/69120.0_wp real(wp),parameter :: b138 = (7947.0_wp-2168.0_wp*s6)/11520.0_wp real(wp),parameter :: b139 = (1048.0_wp-542.0_wp*s6)/405.0_wp real(wp),parameter :: b1310 = (-1383.0_wp+542.0_wp*s6)/720.0_wp real(wp),parameter :: b1311 = 2624.0_wp/1053.0_wp real(wp),parameter :: b1312 = 3.0_wp/1664.0_wp real(wp),parameter :: b141 = -137.0_wp/1296.0_wp real(wp),parameter :: b146 = (5642.0_wp-337.0_wp*s6)/864.0_wp real(wp),parameter :: b147 = (5642.0_wp+337.0_wp*s6)/864.0_wp real(wp),parameter :: b148 = -299.0_wp/48.0_wp real(wp),parameter :: b149 = 184.0_wp/81.0_wp real(wp),parameter :: b1410 = -44.0_wp/9.0_wp real(wp),parameter :: b1411 = -5120.0_wp/1053.0_wp real(wp),parameter :: b1412 = -11.0_wp/468.0_wp real(wp),parameter :: b1413 = 16.0_wp/9.0_wp real(wp),parameter :: b151 = (33617.0_wp-2168.0_wp*s6)/518400.0_wp real(wp),parameter :: b156 = (-3846.0_wp+31.0_wp*s6)/13824.0_wp real(wp),parameter :: b157 = (155338.0_wp-52807.0_wp*s6)/345600.0_wp real(wp),parameter :: b158 = (-12537.0_wp+2168.0_wp*s6)/57600.0_wp real(wp),parameter :: b159 = (92.0_wp+542.0_wp*s6)/2025.0_wp real(wp),parameter :: b1510 = (-1797.0_wp-542.0_wp*s6)/3600.0_wp real(wp),parameter :: b1511 = 320.0_wp/567.0_wp real(wp),parameter :: b1512 = -1.0_wp/1920.0_wp real(wp),parameter :: b1513 = 4.0_wp/105.0_wp real(wp),parameter :: b161 = (-36487.0_wp-30352.0_wp*s6)/279600.0_wp real(wp),parameter :: b166 = (-29666.0_wp-4499.0_wp*s6)/7456.0_wp real(wp),parameter :: b167 = (2779182.0_wp-615973.0_wp*s6)/186400.0_wp real(wp),parameter :: b168 = (-94329.0_wp+91056.0_wp*s6)/93200.0_wp real(wp),parameter :: b169 = (-232192.0_wp+121408.0_wp*s6)/17475.0_wp real(wp),parameter :: b1610 = (101226.0_wp-22764.0_wp*s6)/5825.0_wp real(wp),parameter :: b1611 = -169984.0_wp/9087.0_wp real(wp),parameter :: b1612 = -87.0_wp/30290.0_wp real(wp),parameter :: b1613 = 492.0_wp/1165.0_wp real(wp),parameter :: b1615 = 1260.0_wp/233.0_wp real(wp),parameter :: c1 = 103.0_wp/1680.0_wp real(wp),parameter :: c8 = -27.0_wp/140.0_wp real(wp),parameter :: c9 = 76.0_wp/105.0_wp real(wp),parameter :: c10 = -201.0_wp/280.0_wp real(wp),parameter :: c11 = 1024.0_wp/1365.0_wp real(wp),parameter :: c12 = 3.0_wp/7280.0_wp real(wp),parameter :: c13 = 12.0_wp/35.0_wp real(wp),parameter :: c14 = 9.0_wp/280.0_wp real(wp),parameter :: e1 = -1911.0_wp/109200.0_wp real(wp),parameter :: e8 = 34398.0_wp/109200.0_wp real(wp),parameter :: e9 = -61152.0_wp/109200.0_wp real(wp),parameter :: e10 = 114660.0_wp/109200.0_wp real(wp),parameter :: e11 = -114688.0_wp/109200.0_wp real(wp),parameter :: e12 = -63.0_wp/109200.0_wp real(wp),parameter :: e13 = -13104.0_wp/109200.0_wp real(wp),parameter :: e14 = -3510.0_wp/109200.0_wp real(wp),parameter :: e15 = 39312.0_wp/109200.0_wp real(wp),parameter :: e16 = 6058.0_wp/109200.0_wp real(wp),dimension(me%n) :: f1,f2,f3,f4,f5,f6,f7,f8,f9,& f10,f11,f12,f13,f14,f15,f16 call me%f(t,x,f1) call me%f(t+a2*h,x+h*(a2*f1),f2) call me%f(t+a3*h,x+h*(b31*f1+b32*f2),f3) call me%f(t+a4*h,x+h*(b41*f1+b43*f3),f4) call me%f(t+a5*h,x+h*(b51*f1+b53*f3+b54*f4),f5) call me%f(t+a6*h,x+h*(b61*f1+b64*f4+b65*f5),f6) call me%f(t+a7*h,x+h*(b71*f1+b74*f4+b75*f5+b76*f6),f7) call me%f(t+a8*h,x+h*(b81*f1+b86*f6+b87*f7),f8) call me%f(t+a9*h,x+h*(b91*f1+b96*f6+b97*f7+b98*f8),f9) call me%f(t+a10*h,x+h*(b101*f1+b106*f6+b107*f7+b108*f8+b109*f9),f10) call me%f(t+a11*h,x+h*(b111*f1+b117*f7+b118*f8+b119*f9+b1110*f10),f11) call me%f(t+a12*h,x+h*(b121*f1+b126*f6+b127*f7+b128*f8+b129*f9+& b1210*f10+b1211*f11),f12) call me%f(t+a13*h,x+h*(b131*f1+b136*f6+b137*f7+b138*f8+b139*f9+& b1310*f10+b1311*f11+b1312*f12),f13) call me%f(t+h,x+h*(b141*f1+b146*f6+b147*f7+b148*f8+b149*f9+b1410*f10+& b1411*f11+b1412*f12+b1413*f13),f14) call me%f(t+a15*h,x+h*(b151*f1+b156*f6+b157*f7+b158*f8+b159*f9+b1510*f10+& b1511*f11+b1512*f12+b1513*f13),f15) call me%f(t+h,x+h*(b161*f1+b166*f6+b167*f7+b168*f8+b169*f9+b1610*f10+& b1611*f11+b1612*f12+b1613*f13+b1615*f15),f16) xf = x+h*(c1*f1+c8*f8+c9*f9+c10*f10+c11*f11+c12*f12+c13*f13+c14*f14) terr = e1*f1+e8*f8+e9*f9+e10*f10+e11*f11+e12*f12+e13*f13+e14*f14+e15*f15+e16*f16 end subroutine rkv89