148 private :: qfunc, vpfunc, vmfunc, ufunc, tfunc, &
149 findquartetnumber, findquartetconfig, &
150 coocsrind, asymsmattimvec, &
151 prepkgrid, biinterpwt
153 private :: qs_ver, qi_lrb, qr_eps, qr_grav, &
154 qr_pi, qr_tpi, qr_dmax, qc_iu, qs_cfg, &
155 qr_kx, qr_ky, qr_dk, qr_om, qi_nrsm, &
156 qi_nn, qi_pp, qi_qq, qi_rr, &
157 qr_k4x, qr_k4y, qr_om4, qr_dom, &
158 qr_tkern, qr_tkurt, &
159 qi_iccos, qi_ircsr, qr_sumqr, qr_sumnp, &
160 qi_bind, qr_bwgh, qr_wn1
162 private :: qi_bound, qr_fpow, qr_bdry
184 integer,
parameter :: qi_bound= 1
188 real,
parameter :: qr_fpow= -5.
190 character(len=50),
parameter &
192 integer,
parameter :: qi_lrb = 4
193 real,
parameter :: qr_eps = epsilon(100.0)
198 real,
parameter :: qr_grav = 9.806
199 real,
parameter :: qr_pi = 3.141592653589793
200 real,
parameter :: qr_tpi = 2 * qr_pi
201 real,
parameter :: qr_dmax = 3000.0
202 complex,
parameter :: qc_iu = (0.0, 1.0)
204 character(len=100) :: qs_cfg
206 real,
allocatable,
save :: qr_kx(:), qr_ky(:), &
211 integer,
allocatable,
save :: qi_nn(:), qi_pp(:), &
213 real,
allocatable,
save :: qr_k4x(:), qr_k4y(:), &
215 real,
allocatable,
save :: qr_dom(:), &
218 integer,
allocatable,
save :: qi_iccos(:), &
221 real,
allocatable,
save :: qr_sumqr(:), &
224 integer,
allocatable,
save :: qi_bind(:, :)
225 real,
allocatable,
save :: qr_bwgh(:, :)
226 real,
allocatable,
save :: qr_bdry(:)
227 real,
allocatable,
save :: qr_wn1(:)
234 function qfunc(kx, ky)
257 real,
intent(in) :: kx, ky
261 qfunc = sqrt(kx*kx + ky*ky)
266 qfunc = qfunc * tanh(qfunc *
qr_depth)
275 function vpfunc(k0x, k0y, k1x, k1y, k2x, k2y)
293 real,
intent(in) :: k0x, k0y, k1x, k1y, k2x, k2y
308 vpfunc = sqrt(1.0/32.0) * ( &
309 (k0x*k1x + k0y*k1y + q0*q1) * sqrt(sqrt(qr_grav*q2 / (q0*q1)))&
310 + (k0x*k2x + k0y*k2y + q0*q2) * sqrt(sqrt(qr_grav*q1 / (q0*q2)))&
311 + (k1x*k2x + k1y*k2y + q1*q2) * sqrt(sqrt(qr_grav*q0 / (q1*q2))))
319 function vmfunc(k0x, k0y, k1x, k1y, k2x, k2y)
335 real,
intent(in) :: k0x, k0y, k1x, k1y, k2x, k2y
347 vmfunc = sqrt(1.0/32.0) * ( &
348 (k0x*k1x + k0y*k1y - q0*q1) * sqrt(sqrt(qr_grav*q2 / (q0*q1)))&
349 + (k0x*k2x + k0y*k2y - q0*q2) * sqrt(sqrt(qr_grav*q1 / (q0*q2)))&
350 + (k1x*k2x + k1y*k2y + q1*q2) * sqrt(sqrt(qr_grav*q0 / (q1*q2))))
358 function ufunc(k0x, k0y, k1x, k1y, k2x, k2y, k3x, k3y)
375 real,
intent(in) :: k0x, k0y, k1x, k1y, &
379 real :: q0, q1, q2, q3
389 ufunc = (1.0/16.0) * sqrt(sqrt(q2*q3 / (q0*q1))) * &
390 (2.0*((k0x*k0x + k0y*k0y) * q1 + (k1x*k1x + k1y*k1y) * q0)-&
391 q0*q1*( qfunc(k0x+k2x, k0y+k2y) + qfunc(k1x+k2x, k1y+k2y)+&
392 qfunc(k0x+k3x, k0y+k3y) + qfunc(k1x+k3x, k1y+k3y) ))
400 function tfunc(k0x, k0y, k1x, k1y, k2x, k2y, k3x, k3y)
417 real,
intent(in) :: k0x, k0y, k1x, k1y, &
425 real :: om0, om1, om2, om3, &
433 real :: l14, l23, l56, &
452 om0 = sqrt(qr_grav * qfunc(k0x, k0y))
453 om1 = sqrt(qr_grav * qfunc(k1x, k1y))
454 om2 = sqrt(qr_grav * qfunc(k2x, k2y))
455 om3 = sqrt(qr_grav * qfunc(k3x, k3y))
459 om02 = sqrt(qr_grav * qfunc(k0x-k2x, k0y-k2y))
460 om13 = sqrt(qr_grav * qfunc(k1x-k3x, k1y-k3y))
461 om12 = sqrt(qr_grav * qfunc(k1x-k2x, k1y-k2y))
462 om03 = sqrt(qr_grav * qfunc(k0x-k3x, k0y-k3y))
464 if (abs(k0x+k1x) > qr_eps .or. abs(k0y+k1y) > qr_eps)
then
467 om0p1 = sqrt(qr_grav * qfunc(k0x+k1x, k0y+k1y))
468 om2p3 = sqrt(qr_grav * qfunc(k2x+k3x, k2y+k3y))
473 w = ufunc(-k0x, -k0y, -k1x, -k1y, k2x, k2y, k3x, k3y) + &
474 ufunc( k2x, k2y, k3x, k3y, -k0x, -k0y, -k1x, -k1y) - &
475 ufunc( k2x, k2y, -k1x, -k1y, -k0x, -k0y, k3x, k3y) - &
476 ufunc(-k0x, -k0y, k2x, k2y, -k1x, -k1y, k3x, k3y) - &
477 ufunc(-k0x, -k0y, k3x, k3y, k2x, k2y, -k1x, -k1y) - &
478 ufunc( k3x, k3y, -k1x, -k1y, k2x, k2y, -k0x, -k0y)
482 l14 = vmfunc(k0x, k0y, k2x, k2y, k0x-k2x, k0y-k2y) * &
483 vmfunc(k3x, k3y, k1x, k1y, k3x-k1x, k3y-k1y) * &
484 (1.0/(om2 + om02 - om0) + 1.0/(om1 + om13 - om3)) + &
485 vmfunc(k1x, k1y, k3x, k3y, k1x-k3x, k1y-k3y) * &
486 vmfunc(k2x, k2y, k0x, k0y, k2x-k0x, k2y-k0y) * &
487 (1.0/(om3 + om13 - om1) + 1.0/(om0 + om02 - om2))
491 l23 = vmfunc(k1x, k1y, k2x, k2y, k1x-k2x, k1y-k2y) * &
492 vmfunc(k3x, k3y, k0x, k0y, k3x-k0x, k3y-k0y) * &
493 (1.0/(om2 + om12 - om1) + 1.0/(om0 + om03 - om3)) + &
494 vmfunc(k0x, k0y, k3x, k3y, k0x-k3x, k0y-k3y) * &
495 vmfunc(k2x, k2y, k1x, k1y, k2x-k1x, k2y-k1y) * &
496 (1.0/(om3 + om03 - om0) + 1.0/(om1 + om12 - om2))
500 if (abs(k0x+k1x) > qr_eps .or. abs(k0y+k1y) > qr_eps)
then
503 l56 = vmfunc(k0x+k1x, k0y+k1y, k0x, k0y, k1x, k1y) * &
504 vmfunc(k2x+k3x, k2y+k3y, k2x, k2y, k3x, k3y) * &
505 (1.0/(om0p1 - om0 - om1) + 1.0/(om2p3 - om2 - om3)) + &
506 vpfunc(-k0x-k1x, -k0y-k1y, k0x, k0y, k1x, k1y) * &
507 vpfunc(-k2x-k3x, -k2y-k3y, k2x, k2y, k3x, k3y) * &
508 (1.0/(om0p1 + om0 + om1) + 1.0/(om2p3 + om2 + om3))
513 tfunc = w - l14 - l23 - l56
522 subroutine findquartetnumber(ns, kx, ky, om, oml, nnz)
649 integer,
intent(in) :: ns
651 real,
intent(in) :: kx(ns), &
654 real,
intent(in) :: oml
657 integer(kind=8),
intent(out) &
665 integer :: i1, i2, i3, i4, row, col
666 real :: k4x, k4y, k4, om4, kmin, kmax, dom
669 k = sqrt(kx*kx + ky*ky)
674 if (
qi_interp .eq. 1 .and. qi_bound .eq. 1)
then
690 if (i3 .ne. i1 .and. i3 .ne. i2)
then
692 k4x = kx(i1) + kx(i2) - kx(i3)
693 k4y = ky(i1) + ky(i2) - ky(i3)
694 k4 = sqrt(k4x*k4x + k4y*k4y)
697 if (k4 >= kmin .and. k4 <= kmax)
then
699 om4 = sqrt(qr_grav * qfunc(k4x, k4y))
700 dom = abs(om(i1) + om(i2) - om(i3) - om4) / &
701 min(om(i1), om(i2), om(i3), om4)
703 if (oml <= qr_eps .or. dom <= oml)
then
704 i4 = minloc((kx - k4x)*(kx - k4x) + &
705 (ky - k4y)*(ky - k4y), 1)
707 if (i4 .ne. i1 .and. i4 .ne. i2)
then
710 row = i1 + ns * (i2-1)
711 col = i3 + ns * (i4-1)
724 write(*, *)
'→ nnz = ', nnz
728 end subroutine findquartetnumber
732 subroutine findquartetconfig(ns, kx, ky, om, oml, nnz, &
762 integer,
intent(in) :: ns
764 real,
intent(in) :: kx(ns), &
767 real,
intent(in) :: oml
769 integer(kind=8),
intent(in) &
774 integer,
intent(out) :: nn(nnz), &
779 real,
intent(out) :: k4x(nnz), &
785 integer :: i1, i2, i3, i4, row, col, s
786 real :: k4xt, k4yt, k4t, om4t, kmin, kmax, dom
789 k = sqrt(kx*kx + ky*ky)
794 if (
qi_interp .eq. 1 .and. qi_bound .eq. 1)
then
813 if (i3 .ne. i1 .and. i3 .ne. i2)
then
815 k4xt = kx(i1) + kx(i2) - kx(i3)
816 k4yt = ky(i1) + ky(i2) - ky(i3)
817 k4t = sqrt(k4xt*k4xt + k4yt*k4yt)
820 if (k4t >= kmin .and. k4t <= kmax)
then
822 om4t = sqrt(qr_grav * qfunc(k4xt, k4yt))
823 dom = abs(om(i1) + om(i2) - om(i3) - om4t)/&
824 min(om(i1), om(i2), om(i3), om4t)
826 if (oml <= qr_eps .or. dom <= oml)
then
827 i4 = minloc((kx - k4xt)*(kx - k4xt) + &
828 (ky - k4yt)*(ky - k4yt), 1)
830 if (i4 .ne. i1 .and. i4 .ne. i2)
then
833 row = i1 + ns * (i2-1)
834 col = i3 + ns * (i4-1)
861 write(*, 1001)
'FindQuartetConfig'
866 1001
FORMAT(/
' *** GKE ERROR IN gkeModule : '/ &
867 ' Subr. ', a,
': The number of Quartet Configs. does not match NNZ!'/)
869 end subroutine findquartetconfig
874 subroutine coocsrind (nrow, nnz, ir, jc, ind_translate, iao)
927 integer,
intent(in) :: nrow
928 integer(kind=8),
intent(in) &
930 integer,
intent(in) :: ir(nnz)
931 integer,
intent(in) :: jc(nnz)
932 integer,
intent(out) :: ind_translate(nnz)
933 integer,
intent(out) :: iao(nrow+1)
936 integer :: i, j, k, k0, iad
943 iao(ir(k)) = iao(ir(k)) + 1
967 ind_translate(iad) = k
979 end subroutine coocsrind
983 subroutine asymsmattimvec (n, a, ja, ia, x, y, Symb)
1028 integer,
intent(in) :: n
1030 real,
intent(in) :: a(:)
1031 integer,
intent(in) :: ja(:)
1032 integer,
intent(in) :: ia(n+1)
1034 real,
intent(in) :: x(n)
1035 real,
intent(out) :: y(n)
1036 real,
intent(in) :: symb
1047 do k = ia(i), ia(i+1)-1
1050 t = t + a(k) * x(ja(k))
1053 y(ja(k)) = y(ja(k)) + symb * a(k)*x(i)
1061 end subroutine asymsmattimvec
1066 subroutine prepkgrid(nk, nth, dpt, sig, th)
1095 integer,
intent(in) :: nk
1096 integer,
intent(in) :: nth
1097 real,
intent(in) :: dpt
1098 real,
intent(in) :: sig(nk)
1099 real,
intent(in) :: th(nth)
1103 integer,
parameter :: dispopt = 1
1105 integer :: ik, ith, jkth, ns
1106 real :: x, xx, y, omega
1107 real :: k, cg, dsii, angr, dth
1108 real :: esin(nth), ecos(nth)
1120 dth = qr_tpi / real(nth)
1124 esin(ith) = sin(angr)
1125 ecos(ith) = cos(angr)
1127 if (abs(esin(ith)) .lt. 1.e-5)
then
1129 if (ecos(ith) .gt. 0.5)
then
1136 if (abs(ecos(ith)) .lt. 1.e-5)
then
1138 if (esin(ith) .gt. 0.5)
then
1147 if (dispopt .eq. 0)
then
1149 omega = sig(ik)**2.0/qr_grav
1151 xx = y*(y+1.0/(1.0+y*(0.66667+y*(0.35550+y*(0.16084+y*(0.06320+y* &
1152 (0.02174+y*(0.00654+y*(0.00171+y*(0.00039+y*0.00011))))))))))
1156 if(dpt*k > 30.0)
then
1157 cg = qr_grav/(2.0*sig(ik))
1159 cg = sig(ik)/k*(0.5+dpt*k/sinh(2.0*dpt*k))
1162 else if (dispopt .eq. 1)
then
1164 call wavnu1(sig(ik), dpt, k, cg)
1168 write(*, *)
'σ, k, cg: ', sig(ik), k, cg
1172 dsii = 0.5 * (sig(2) - sig(1))
1173 else if (ik .eq. nk)
then
1174 dsii = 0.5 * (sig(nk) - sig(nk-1))
1176 dsii = 0.5 * (sig(ik+1) - sig(ik-1))
1180 jkth = ith + (ik - 1) * nth
1181 qr_kx(jkth) = k * ecos(ith)
1182 qr_ky(jkth) = k * esin(ith)
1184 qr_dk(jkth) = k * dsii / cg * dth
1185 qr_om(jkth) = sig(ik)
1189 write(*, *)
'qr_kx: ', qr_kx
1190 write(*, *)
'qr_ky: ', qr_ky
1191 write(*, *)
'qr_dk: ', qr_dk
1192 write(*, *)
'qr_om: ', qr_om
1197 end subroutine prepkgrid
1229 integer,
intent(in) :: nk
1230 integer,
intent(in) :: nth
1231 real,
intent(in) :: sig(nk)
1232 real,
intent(in) :: th(nth)
1235 character(len=*),
intent(in) :: act
1238 integer :: ns, iq, i1, i3, icol
1239 integer(kind=8) :: rpos
1240 integer,
allocatable :: irow_coo(:), &
1247 if (
allocated(qi_ircsr))
deallocate(qi_ircsr);
allocate(qi_ircsr(qi_nrsm+1))
1248 if (
allocated(qr_sumqr))
deallocate(qr_sumqr);
allocate(qr_sumqr(qi_nrsm))
1249 if (
allocated(qr_sumnp))
deallocate(qr_sumnp);
allocate(qr_sumnp(ns, ns))
1251 if (
allocated(qr_dk))
deallocate(qr_dk);
allocate(qr_dk(ns))
1252 if (
allocated(qr_om))
deallocate(qr_om);
allocate(qr_om(ns))
1265 write(qs_cfg,
"(A, '_d', I4.4, '.cfg')") trim(qs_ver), int(
qr_depth)
1267 if (trim(act) ==
'WRITE')
then
1269 if (
allocated(qr_kx))
deallocate(qr_kx);
allocate(qr_kx(ns))
1270 if (
allocated(qr_ky))
deallocate(qr_ky);
allocate(qr_ky(ns))
1271 if (
allocated(qr_wn1))
deallocate(qr_wn1);
allocate(qr_wn1(nk))
1272 call prepkgrid(nk, nth,
qr_depth, sig, th)
1274 call findquartetnumber(ns, qr_kx, qr_ky, qr_om,
qr_oml,
qi_nnz)
1276 if (
allocated(qi_nn))
deallocate(qi_nn);
allocate(qi_nn(
qi_nnz))
1277 if (
allocated(qi_pp))
deallocate(qi_pp);
allocate(qi_pp(
qi_nnz))
1278 if (
allocated(qi_qq))
deallocate(qi_qq);
allocate(qi_qq(
qi_nnz))
1279 if (
allocated(qi_rr))
deallocate(qi_rr);
allocate(qi_rr(
qi_nnz))
1281 if (
allocated(qr_k4x))
deallocate(qr_k4x);
allocate(qr_k4x(
qi_nnz))
1282 if (
allocated(qr_k4y))
deallocate(qr_k4y);
allocate(qr_k4y(
qi_nnz))
1283 if (
allocated(qr_om4))
deallocate(qr_om4);
allocate(qr_om4(
qi_nnz))
1285 call findquartetconfig(ns, qr_kx, qr_ky, qr_om,
qr_oml,
qi_nnz, &
1286 qi_nn, qi_pp, qi_qq, qi_rr, &
1287 qr_k4x, qr_k4y, qr_om4)
1290 if (
allocated(qr_tkern))
deallocate(qr_tkern);
allocate(qr_tkern(
qi_nnz))
1291 if (
allocated(qr_tkurt))
deallocate(qr_tkurt);
allocate(qr_tkurt(
qi_nnz))
1292 if (
allocated(qr_dom))
deallocate(qr_dom);
allocate(qr_dom(
qi_nnz))
1295 qr_tkern(iq) = tfunc(qr_kx(qi_nn(iq)), qr_ky(qi_nn(iq)),&
1296 qr_kx(qi_pp(iq)), qr_ky(qi_pp(iq)),&
1297 qr_kx(qi_qq(iq)), qr_ky(qi_qq(iq)),&
1298 qr_k4x(iq) , qr_k4y(iq) )
1301 qr_tkurt = qr_tkern * sqrt(qr_om(qi_nn) * qr_om(qi_pp) * qr_om(qi_qq) * qr_om4)
1303 qr_dom = qr_om(qi_nn) + qr_om(qi_pp) - qr_om(qi_qq) - qr_om4
1308 where(abs(qr_dom) < qr_eps) qr_dom = 0.0
1312 if (
allocated(qi_bind))
deallocate(qi_bind);
allocate(qi_bind(4,
qi_nnz))
1313 if (
allocated(qr_bwgh))
deallocate(qr_bwgh);
allocate(qr_bwgh(4,
qi_nnz))
1314 if (qi_bound .eq. 1 )
then
1315 if (
allocated(qr_bdry))
deallocate(qr_bdry);
allocate(qr_bdry(
qi_nnz))
1317 call biinterpwt(nk, nth, qr_wn1, th)
1320 deallocate(qr_kx, qr_ky)
1321 deallocate(qr_k4x, qr_k4y, qr_om4)
1322 if (
qi_interp .eq. 1)
deallocate(qr_wn1)
1325 if (
allocated(qi_iccos))
deallocate(qi_iccos);
allocate(qi_iccos(
qi_nnz))
1326 if (
allocated(irow_coo))
deallocate(irow_coo);
allocate(irow_coo(
qi_nnz))
1327 if (
allocated(icootcsr))
deallocate(icootcsr);
allocate(icootcsr(
qi_nnz))
1329 irow_coo = qi_nn + (qi_pp - 1) * ns
1330 qi_iccos = qi_qq + (qi_rr - 1) * ns
1334 call coocsrind(qi_nrsm,
qi_nnz, irow_coo, qi_iccos, icootcsr, qi_ircsr)
1337 qi_nn = qi_nn(icootcsr)
1338 qi_pp = qi_pp(icootcsr)
1339 qi_qq = qi_qq(icootcsr)
1340 qi_rr = qi_rr(icootcsr)
1341 qr_tkern = qr_tkern(icootcsr)
1342 qr_tkurt = qr_tkurt(icootcsr)
1343 qr_dom = qr_dom(icootcsr)
1346 qi_bind = qi_bind(:, icootcsr)
1347 qr_bwgh = qr_bwgh(:, icootcsr)
1348 if (qi_bound .eq. 1) qr_bdry = qr_bdry(icootcsr)
1351 qi_iccos = qi_iccos(icootcsr)
1352 deallocate(irow_coo, icootcsr)
1359 icol = i3 + (i3 - 1) * ns
1360 qr_sumqr(icol) = 1.0
1366 qr_sumnp(i1, i1) = 0.5
1370 write(*, *)
'[W] Writing |', trim(qs_cfg),
'| ...'
1371 open(51,
file=trim(qs_cfg), form=
'unformatted', convert=
file_endian, &
1372 access=
'stream', status=
'replace')
1375 write(51) nk, nth, sig, th
1378 write(51) qr_om, qr_dk
1380 write(51) qi_nn, qi_pp, qi_qq, qi_rr
1381 write(51) qr_tkern, qr_tkurt, qr_dom
1382 write(51) qi_iccos, qi_ircsr
1383 write(51) qr_sumqr, qr_sumnp
1385 if (
qi_interp .eq. 1)
write(51) qi_bind, qr_bwgh
1386 if ( (
qi_interp .eq. 1) .and. (qi_bound .eq. 1) ) &
1391 write(*, *)
"[W] qr_depth: ",
qr_depth
1392 write(*, *)
"[W] qr_oml : ",
qr_oml
1393 write(*, *)
"[W] qi_disc : ",
qi_disc
1394 write(*, *)
"[W] qi_kev : ",
qi_kev
1395 write(*, *)
"[W] qr_om : ", qr_om
1396 write(*, *)
"[W] qr_dk : ", qr_dk
1397 write(*, *)
"[W] The total number of quartets is ",
qi_nnz
1398 write(*, *)
'[W] qi_NN : ', qi_nn
1399 write(*, *)
'[W] qi_PP : ', qi_pp
1400 write(*, *)
'[W] qi_QQ : ', qi_qq
1401 write(*, *)
'[W] qi_RR : ', qi_rr
1402 write(*, *)
'[W] qr_TKern: ', qr_tkern
1403 write(*, *)
'[W] qr_TKurt: ', qr_tkurt
1404 write(*, *)
'[W] qr_dom : ', qr_dom
1405 write(*, *)
'[W] qi_icCos: ', qi_iccos
1406 write(*, *)
'[W] qi_irCsr: ', qi_ircsr
1407 write(*, *)
'[W] Σ_QR : ', qr_sumqr(1: qi_nrsm: ns+1)
1408 write(*, *)
'[W] Σ_P : ', (qr_sumnp(iq, iq), iq = 1, ns)
1411 else if (trim(act) ==
'READ')
then
1412 write(*, *)
'⊚ → [R] Reading |', trim(qs_cfg),
'| ...'
1413 open(51,
file=trim(qs_cfg), form=
'unformatted', convert=
file_endian, &
1414 access=
'stream', status=
'old')
1416 rpos = 1_8 + qi_lrb * (2_8 + nk + nth)
1421 read(51) qr_om, qr_dk
1424 write(*, *)
"⊚ → [R] The total number of quartets is ",
qi_nnz
1427 if (
allocated(qi_nn))
deallocate(qi_nn);
allocate(qi_nn(
qi_nnz))
1428 if (
allocated(qi_pp))
deallocate(qi_pp);
allocate(qi_pp(
qi_nnz))
1429 if (
allocated(qi_qq))
deallocate(qi_qq);
allocate(qi_qq(
qi_nnz))
1430 if (
allocated(qi_rr))
deallocate(qi_rr);
allocate(qi_rr(
qi_nnz))
1432 if (
allocated(qr_tkern))
deallocate(qr_tkern);
allocate(qr_tkern(
qi_nnz))
1433 if (
allocated(qr_tkurt))
deallocate(qr_tkurt);
allocate(qr_tkurt(
qi_nnz))
1434 if (
allocated(qr_dom))
deallocate(qr_dom);
allocate(qr_dom(
qi_nnz))
1436 if (
allocated(qi_iccos))
deallocate(qi_iccos);
allocate(qi_iccos(
qi_nnz))
1438 read(51) qi_nn, qi_pp, qi_qq, qi_rr
1439 read(51) qr_tkern, qr_tkurt, qr_dom
1440 read(51) qi_iccos, qi_ircsr
1441 read(51) qr_sumqr, qr_sumnp
1444 if (
allocated(qi_bind))
deallocate(qi_bind);
allocate(qi_bind(4,
qi_nnz))
1445 if (
allocated(qr_bwgh))
deallocate(qr_bwgh);
allocate(qr_bwgh(4,
qi_nnz))
1446 read(51) qi_bind, qr_bwgh
1448 if (qi_bound .eq. 1)
then
1449 if (
allocated(qr_bdry))
deallocate(qr_bdry);
allocate(qr_bdry(
qi_nnz))
1458 write(*, *)
"[R] qr_depth: ",
qr_depth
1459 write(*, *)
"[R] qr_oml : ",
qr_oml
1460 write(*, *)
"[R] qi_disc : ",
qi_disc
1461 write(*, *)
"[R] qi_kev : ",
qi_kev
1462 write(*, *)
"[R] qr_om : ", qr_om
1463 write(*, *)
"[R] qr_dk : ", qr_dk
1464 write(*, *)
"[R] The total number of quartets is ",
qi_nnz
1465 write(*, *)
'[R] qi_NN : ', qi_nn
1466 write(*, *)
'[R] qi_PP : ', qi_pp
1467 write(*, *)
'[R] qi_QQ : ', qi_qq
1468 write(*, *)
'[R] qi_RR : ', qi_rr
1469 write(*, *)
'[R] qr_TKern: ', qr_tkern
1470 write(*, *)
'[R] qr_TKurt: ', qr_tkurt
1471 write(*, *)
'[R] qr_dom : ', qr_dom
1472 write(*, *)
'[R] qi_icCos: ', qi_iccos
1473 write(*, *)
'[R] qi_irCsr: ', qi_ircsr
1474 write(*, *)
'[R] Σ_QR : ', qr_sumqr(1: qi_nrsm: ns+1)
1475 write(*, *)
'[R] Σ_P : ', (qr_sumnp(iq, iq), iq = 1, ns)
1483 subroutine biinterpwt(nk, nth, wn, th)
1499 integer,
intent(in) :: nk
1500 integer,
intent(in) :: nth
1501 real,
intent(in) :: wn(nk)
1502 real,
intent(in) :: th(nth)
1504 integer :: iq, jku, jk4, jk4p, jth4t, jth4, jth4p
1505 real :: dth, aref, k4t, angr, &
1506 r_jk, r_jth, delk, w_k4, w_th4
1507 real :: kmin, kmax, k4r
1513 if (qi_bound .eq. 1) qr_bdry = 1.
1519 qr_kpow = qr_fpow / 2. - 2.
1527 dth = qr_tpi / real(nth)
1532 k4r = sqrt(qr_k4x(iq)**2. + qr_k4y(iq)**2.)
1533 angr= atan2(qr_k4y(iq), qr_k4x(iq))
1535 if (qi_bound .eq. 1)
then
1536 k4t = max(kmin, min(k4r, kmax))
1557 r_jth = (angr - aref) / dth + 1.
1558 jth4t = floor(r_jth)
1559 w_th4 = r_jth - real(jth4t)
1561 jth4 = mod(jth4t-1+nth, nth) + 1
1562 jth4p = mod(jth4t+nth, nth) + 1
1573 do while (k4t > wn(jku))
1578 if (jku .eq. 1)
then
1581 delk = wn(jku) - wn(jku-1)
1582 r_jk = real(jku - 1.) + (k4t - wn(jku-1)) / delk
1586 w_k4 = r_jk - real(jk4)
1587 jk4p = min(jk4+1, nk)
1590 qi_bind(1, iq) = jth4 + (jk4 - 1) * nth
1591 qi_bind(2, iq) = jth4 + (jk4p - 1) * nth
1592 qi_bind(3, iq) = jth4p + (jk4p - 1) * nth
1593 qi_bind(4, iq) = jth4p + (jk4 - 1) * nth
1596 qr_bwgh(1, iq) = (1. - w_k4) * (1. - w_th4)
1597 qr_bwgh(2, iq) = w_k4 * (1. - w_th4)
1598 qr_bwgh(3, iq) = w_k4 * w_th4
1599 qr_bwgh(4, iq) = (1. - w_k4) * w_th4
1608 if (qi_bound .eq. 1)
then
1609 if (k4r < kmin)
then
1611 else if (k4r > kmax)
then
1612 qr_bdry(iq) = (k4r/kmax)**qr_kpow
1618 end subroutine biinterpwt
1622 subroutine calcqrsnl(nk, nth, sig, th, &
1623 t0, t1, Cvk0, Cvk1, &
1624 Inpqr0, Snl, Dnl, Kurt)
1662 integer,
intent(in) :: nk
1663 integer,
intent(in) :: nth
1664 real,
intent(in) :: sig(nk)
1665 real,
intent(in) :: th(nth)
1668 real,
intent(inout) :: t0
1669 real,
intent(inout) :: cvk0(nk*nth)
1670 complex,
intent(inout) :: inpqr0(:)
1672 real,
intent(in) :: t1
1673 real,
intent(in) :: cvk1(nk*nth)
1676 real,
intent(out) :: snl(nk*nth)
1677 real,
intent(out) :: dnl(nk*nth)
1678 real,
intent(out) :: kurt
1683 logical,
save :: flread = .true.
1684 integer :: num_i, ns
1685 real :: dvk0(nk*nth),&
1687 real,
allocatable,
save :: cvk0_r(:), &
1689 real,
allocatable,
save :: fnpqr0(:), &
1692 complex,
allocatable,
save :: inpqr1(:), &
1696 real,
allocatable,
save :: mnp1d(:), mnp2d(:, :)
1718 if (
allocated(fnpqr0))
deallocate(fnpqr0);
allocate(fnpqr0(
qi_nnz))
1719 if (
allocated(fnpqr1))
deallocate(fnpqr1);
allocate(fnpqr1(
qi_nnz))
1720 if (
allocated(etau ))
deallocate(etau );
allocate(etau(
qi_nnz))
1721 if (
allocated(edelt ))
deallocate(edelt );
allocate(edelt(
qi_nnz))
1722 if (
allocated(mnpqr ))
deallocate(mnpqr );
allocate(mnpqr(
qi_nnz))
1723 if (
allocated(inpqr1))
deallocate(inpqr1);
allocate(inpqr1(
qi_nnz))
1725 if (
allocated(mnp1d))
deallocate(mnp1d);
allocate(mnp1d(qi_nrsm))
1726 if (
allocated(mnp2d))
deallocate(mnp2d);
allocate(mnp2d(ns, ns))
1729 if (
allocated(cvk0_r))
deallocate(cvk0_r);
allocate(cvk0_r(
qi_nnz))
1730 if (
allocated(cvk1_r))
deallocate(cvk1_r);
allocate(cvk1_r(
qi_nnz))
1737 write(*, *)
"◆ qr_depth :",
qr_depth
1738 write(*, *)
"◆ qr_oml :",
qr_oml
1739 write(*, *)
"◆ qi_disc :",
qi_disc
1740 write(*, *)
"◆ qi_kev :",
qi_kev
1741 write(*, *)
"◆ qi_nnz :",
qi_nnz
1742 write(*, *)
"◆ qi_NN(:10) :", qi_nn(:10)
1743 write(*, *)
"◆ qr_TKern(:10) :", qr_tkern(:10)
1744 write(*, *)
"◆ qr_TKurt(:10) :", qr_tkurt(:10)
1745 write(*, *)
"◆ qr_sumQR(:10) :", qr_sumqr(:10)
1748 num_i =
size(inpqr0)
1749 if (num_i .ne.
qi_nnz)
then
1750 write(*, 1001)
'CalcQRSNL'
1761 cvk0_r = cvk0(qi_rr)
1762 cvk1_r = cvk1(qi_rr)
1765 cvk0_r = qr_bwgh(1, :) * cvk0(qi_bind(1, :)) + &
1766 qr_bwgh(2, :) * cvk0(qi_bind(2, :)) + &
1767 qr_bwgh(3, :) * cvk0(qi_bind(3, :)) + &
1768 qr_bwgh(4, :) * cvk0(qi_bind(4, :))
1770 cvk1_r = qr_bwgh(1, :) * cvk1(qi_bind(1, :)) + &
1771 qr_bwgh(2, :) * cvk1(qi_bind(2, :)) + &
1772 qr_bwgh(3, :) * cvk1(qi_bind(3, :)) + &
1773 qr_bwgh(4, :) * cvk1(qi_bind(4, :))
1775 if (qi_bound .eq. 1)
then
1776 cvk0_r = cvk0_r * qr_bdry
1777 cvk1_r = cvk1_r * qr_bdry
1784 fnpqr0 = (cvk0(qi_qq) * cvk0_r * ( &
1785 cvk0(qi_nn) + cvk0(qi_pp) ) - &
1786 cvk0(qi_nn) * cvk0(qi_pp) * ( &
1787 cvk0(qi_qq) + cvk0_r )) * &
1788 qr_dk(qi_nn) * qr_dk(qi_pp) * qr_dk(qi_qq)
1790 fnpqr1 = (cvk1(qi_qq) * cvk1_r * ( &
1791 cvk1(qi_nn) + cvk1(qi_pp) ) - &
1792 cvk1(qi_nn) * cvk1(qi_pp) * ( &
1793 cvk1(qi_qq) + cvk1_r )) * &
1794 qr_dk(qi_nn) * qr_dk(qi_pp) * qr_dk(qi_qq)
1802 fnpqr0 = dvk0(qi_qq) * dvk0(qi_rr) * ( &
1803 dvk0(qi_nn) + dvk0(qi_pp) ) - &
1804 dvk0(qi_nn) * dvk0(qi_pp) * ( &
1805 dvk0(qi_qq) + dvk0(qi_rr) )
1808 fnpqr1 = dvk1(qi_qq) * dvk1(qi_rr) * ( &
1809 dvk1(qi_nn) + dvk1(qi_pp) ) - &
1810 dvk1(qi_nn) * dvk1(qi_pp) * ( &
1811 dvk1(qi_qq) + dvk1(qi_rr) )
1818 if (abs(t1) < qr_eps)
then
1829 if (delt < 0.0)
then
1830 write(*, 1002)
'CalcQRSNL'
1833 etau = exp(qc_iu * cmplx(qr_dom * t1))
1834 edelt = exp(qc_iu * cmplx(qr_dom * delt))
1839 inpqr1 = inpqr0 + cmplx(0.5 * delt) * &
1841 (cmplx(fnpqr0) * edelt + cmplx(fnpqr1))
1842 else if (
qi_kev .eq. 1)
then
1850 where (abs(qr_dom) < qr_eps)
1852 inpqr1 = cmplx(t1, 0.)
1856 inpqr1 = cmplx(sin(qr_dom * t1) / qr_dom, &
1857 (1 - cos(qr_dom * t1)) / qr_dom)
1863 mnpqr = 4.0 * (qr_tkern ** 2.) * real(etau * inpqr1)
1864 else if (
qi_kev .eq. 1)
then
1867 mnpqr = 4.0 * (qr_tkern ** 2.) * fnpqr1 * real(inpqr1)
1872 call asymsmattimvec(qi_nrsm, mnpqr, qi_iccos, qi_ircsr, qr_sumqr, mnp1d, -1.0)
1876 mnp2d = reshape(mnp1d, (/ns, ns/))
1877 snl = sum((mnp2d + transpose(mnp2d)) * qr_sumnp, 2) / qr_dk
1880 write(*,
'(A, E15.3)')
' ← {WW3 GKE } ΣSnl(k) * dk: ', sum(snl * qr_dk)
1914 1001
FORMAT(/
' *** GKE ERROR IN gkeModule : '/ &
1915 ' Subr. ', a,
': the stored total number of quartets &
1916 & and the size of Inpqr0 do not match !'/)
1917 1002
FORMAT(/
' *** GKE ERROR IN gkeModule : '/ &
1918 ' Subr. ', a,
': t0 ≤ t1 is not satisfied !'/)