129 integer,
parameter ::
npts = 30
131 integer,
parameter ::
ndep = 37
167 real,
allocatable,
dimension(:,:,:) ::
grad
180 real,
allocatable,
dimension(:,:) ::
ef2
181 real,
allocatable,
dimension(:) ::
ef1
195 real,
allocatable,
dimension(:,:) ::
tsa,
diag
353 INTEGER,
SAVE :: IENT = 0
359 logical :: unavail = .true.
360 logical :: file_exists
361 character :: grdfname*80
380 CALL strace (ient,
'W3SNL4')
395 write(grdfname,
'(A,F6.4,A,I2.2,A,I2.2,A,I2.2,A,I2.2,A)') &
396 'grd_',
dfrq,
'_', nrng,
'_',
nang,
'_',
npts,
'_',
ndep,
'.dat'
403 INQUIRE (
file=grdfname, exist=file_exists )
408 io_unit = io_unit + 1
409 INQUIRE ( io_unit, opened=unavail )
417 IF ( file_exists )
THEN
424 write (
ndso, 900 ) grdfname
429 open (unit=io_unit,
file=grdfname, status=
'old', &
430 access=
'sequential', action=
'read', form=
'unformatted', convert=
file_endian)
446 write (
ndso, 901 ) grdfname
456 (/ 2., 4., 6., 8., 10., 12., 14., 16., 18., 20., &
457 25., 30., 35., 40., 45., 50., 55., 60., 65., 70., &
458 80., 90.,100.,110.,120.,130.,140.,150.,160.,170., &
459 220.,270.,320.,370.,420.,470.,520. /)
475 cvel =
oma(nrng)/wka2(nrng)
484 call gridsetr ( dep2, wka2, cgnrng )
518 pha2(1) = wka2(1)*dwka*
ainc
523 dwka = ( wka2(irng+1) - wka2(irng-1) ) / 2.
524 pha2(irng) = wka2(irng)*dwka*
ainc
532 pha2(nrng) = wka2(nrng)*dwka*
ainc
538 pha_tbl(1:nrng, nd) = pha2(1:nrng)
554 open (unit=io_unit,
file=grdfname, status=
'new', &
555 access=
'sequential', action=
'write', form=
'unformatted', convert=
file_endian)
561 write(
ndso,903 ) grdfname
575 900
format (
' grdfname does exist = ',a/ &
576 ' open, read & close file ' )
578 901
format (
' grdfname does not exist = ',a/ &
579 ' Generate look-up table arrays ' )
581 902
format (
' Done generating look-up table arrays ----------- ' )
583 903
format (
' Done writing & closing grdfname ', a )
610 SUBROUTINE w3snl4 ( A, CG, WN, DEPTH, S, D )
794 REAL,
INTENT(IN) :: A(NTH,NK), CG(NK), WN(NK), DEPTH
795 REAL,
INTENT(OUT) :: S(NTH,NK), D(NTH,NK)
797 LOGICAL,
SAVE :: FIRST_TSA = .true.
804 INTEGER,
SAVE :: IENT = 0
806 integer :: irng, iang
844 CALL strace (ient,
'W3SNL4')
861 IF ( first_tsa )
THEN
867 nzz = (nk * (nk+1)) / 2
878 if (
allocated (
frqa) )
deallocate (
frqa)
879 if (
allocated (
oma) )
deallocate (
oma)
880 if (
allocated (
angl) )
deallocate (
angl)
986 if (
allocated (
wtk2) )
deallocate (
wtk2)
987 if (
allocated (
wtk4) )
deallocate (
wtk4)
991 if (
allocated (
wta2) )
deallocate (
wta2)
992 if (
allocated (
wta4) )
deallocate (
wta4)
1001 if (
allocated (
grad) )
deallocate (
grad)
1008 if (
allocated (
wk2x) )
deallocate (
wk2x)
1009 if (
allocated (
wk2y) )
deallocate (
wk2y)
1013 if (
allocated (
wk4x) )
deallocate (
wk4x)
1014 if (
allocated (
wk4y) )
deallocate (
wk4y)
1018 if (
allocated (
ds) )
deallocate (
ds)
1025 if (
allocated (
ef2) )
deallocate (
ef2)
1026 if (
allocated (
ef1) )
deallocate (
ef1)
1043 if (
itsa .eq. 1)
then
1045 if (
allocated (
tsa) )
deallocate (
tsa)
1046 if (
allocated (
diag) )
deallocate (
diag)
1049 elseif (
itsa .eq. 0)
then
1051 if (
allocated (
fbi) )
deallocate (
fbi)
1095 nd3 = minloc( abs(dep -
dep_tbl(:)), dim=1 )
1133 ef2(irng,iang) = a(iang,irng) * fac
1144 sum1 = sum1 +
ef2(irng,iang)
1203 if (
ef1(irng).gt.
ef1(irng-1) .and.
ef1(irng).gt.
ef1(irng+1) &
1204 .and.
ef1(irng).gt.e1max )
then
1220 if ( e1max.lt.0.000001 )
return
1245 if (
ef1(irng).gt.
ef1(irng-1) .and.
ef1(irng).gt.
ef1(irng+1) &
1246 .and.
ef1(irng).ge.e1max2 .and. iabs(irng-npk).gt.nsep )
then
1260 if ( e1max2.lt.0.000001 )
then
1271 if ( npeaks.eq.2 )
then
1275 if ( npk2.lt.npk )
then
1287 nfs = int( (npk+npk2) / 2.0 )
1302 if ( npeaks.eq.1 )
then
1309 call optsa2 ( 1,
nrng, npk, fpk, nbins, wka, cga )
1318 if ( npeaks.eq.2 )
then
1326 call optsa2 ( 1,nfs, npk, fpk, nbins, wka, cga )
1336 call optsa2 ( nfs+1,
nrng, npk2,fpk2, nbins, wka, cga )
1346 sumd2 =
dens1(nfs+1,iang) +
dens2(nfs+1,iang)
1349 densat1 = (
dens1(nfs-1,iang) +
dens1(nfs,iang) + &
1350 dens1(nfs+1,iang) ) / 3.
1352 densat2 = (
dens1(nfs,iang) +
dens1(nfs+1,iang) + &
1353 dens1(nfs+2,iang) ) / 3.
1356 dens1(nfs,iang) = densat1
1357 dens1(nfs+1,iang) = densat2
1360 dens2(nfs,iang) = sumd1 - densat1
1361 dens2(nfs+1,iang) = sumd2 - densat2
1378 if (
itsa .eq. 1)
then
1394 s(iang,irng) =
tsa(irng,iang) * wka(irng)
1395 d(iang,irng) =
diag(irng,iang)
1402 elseif (
itsa .eq. 0)
then
1419 s(iang,irng) =
fbi(irng,iang) * wka(irng)
1420 d(iang,irng) =
diag2(irng,iang)
1438 1000
format (
' W3SNL4 Error : Bad itsa value ',i4)
1480 SUBROUTINE gridsetr ( dep, wka1, cgnrng1 )
1623 real,
intent(in) :: dep
1624 real,
intent(in) :: wka1(nrng), cgnrng1
1631 integer :: irng,krng, iang,kang, ipt
1632 integer :: iizz, izz, ir, i
1636 real :: alf0,aldfrq, wk1x,wk1y, wk3x,wk3y
1638 real :: wn2,th2, wn2d,tnh2, om2,f2,cg2, tt2,w2
1639 real :: wn4,th4, wn4d,tnh4, om4,f4,cg4, tt4,w4
1640 real :: dWdnsq,dWdn, dif13,dif14, er
1659 alf0 = alog(
frqa(1))
1686 kmax = min(irng+
kzone, nrng)
1693 iizz = (nrng-1)*(irng-1)-((irng-2)*(irng-1))/2
1696 do 30 krng=irng,kmax
1710 wk3x = wka1(krng)*
cosan(kang)
1711 wk3y = wka1(krng)*
sinan(kang)
1713 if ( krng.eq.irng )
then
1717 if ( kang .eq. 1 )
go to 40
1721 call shloxr ( dep, wk1x,wk1y,wk3x,wk3y )
1732 call shlocr ( dep, wk1x,wk1y,wk3x,wk3y )
1744 dif13 = (wk1x-wk3x)*(wk1x-wk3x) + wk3y*wk3y
1749 if ( kang.eq.1 )
then
1750 if (ipt.eq.1 .or. ipt.eq.
np2p1)
go to 50
1765 dif14 = (wk1x-
wk4x(ipt))*(wk1x-
wk4x(ipt)) + &
1768 if ( dif13 .gt. dif14 )
go to 50
1784 irng,krng,kang,ipt )
1795 if ( th2 .lt. 0. ) th2 = th2 +
twopi
1798 om2 = sqrt(g*wn2*tnh2)
1800 cg2 = 0.5*(om2/wn2)*(1.+wn2d*((1./tnh2)-tnh2))
1809 if ( th4 .lt. 0. ) th4 = th4 +
twopi
1812 om4 = sqrt(g*wn4*tnh4)
1814 cg4 = 0.5*(om4/wn4)*(1.+wn4d*((1./tnh4)-tnh4))
1847 dwdnsq = cg2*cg2 - 2.*cg2*cg4 * cos(th2-th4) + cg4*cg4
1854 grad(ipt,kang,izz) =
ds(ipt)*csq*gsq/dwdn
1867 if ( f2 .lt.
f0 )
then
1868 wtk2(ipt,kang,izz) = 1.
1869 tfac2(ipt,kang,izz) = 0.
1870 kref2(ipt,kang,izz) = 1
1872 ir = 1+int((alog(f2)-alf0)/aldfrq)
1873 if ( ir+1 .gt. nrng )
then
1874 wtk2(ipt,kang,izz) = 0.
1875 er = (wka1(nrng)/wn2)**(2.5)
1876 tt2= er*(cg2/cgnrng1)*(
frqa(nrng)/f2)*(wka1(nrng)/wn2)
1877 tfac2(ipt,kang,izz) = tt2
1878 kref2(ipt,kang,izz) = nrng - 1
1881 wtk2(ipt,kang,izz) = 1. - w2
1882 tfac2(ipt,kang,izz) = 1.
1883 kref2(ipt,kang,izz) = ir
1889 if ( f4 .lt.
f0 )
then
1890 wtk4(ipt,kang,izz) = 1.
1891 tfac4(ipt,kang,izz) = 0.
1892 kref4(ipt,kang,izz) = 1
1894 ir = 1+int((alog(f4)-alf0)/aldfrq)
1895 if ( ir+1 .gt. nrng )
then
1896 wtk4(ipt,kang,izz) = 0.
1897 er = (wka1(nrng)/wn4)**2.5
1898 tt4= er*(cg4/cgnrng1)*(
frqa(nrng)/f4)*(wka1(nrng)/wn4)
1899 tfac4(ipt,kang,izz) = tt4
1900 kref4(ipt,kang,izz) = nrng - 1
1903 wtk4(ipt,kang,izz) = 1. - w2
1904 tfac4(ipt,kang,izz) = 1.
1905 kref4(ipt,kang,izz) = ir
1923 jref2(ipt,kang,izz) = i
1929 jref4(ipt,kang,izz) = i
2010 SUBROUTINE shloxr ( dep, wk1x,wk1y, wk3x,wk3y )
2147 real,
intent(in) :: dep
2148 real,
intent(in) :: wk1x,wk1y, wk3x,wk3y
2158 real :: wkx, db, px, py, p, thp, halfp
2159 real :: a, b, dth, a_halfp
2186 f1 = sqrt(g*wk1*tanh(wk1*dep))/
twopi
2195 db = wkx/float(
np2p1-1)
2201 p = sqrt(px*px + py*py)
2210 b = db * (0.5 + float(n-
np2p1))
2212 a = sqrt(1. + (2.*b/p)*(2.*b/p))
2218 wk2x(n) = a_halfp * cos(thp+dth)
2219 wk2y(n) = a_halfp * sin(thp+dth)
2227 wk2x(m) = a_halfp * cos(thp-dth)
2228 wk2y(m) = a_halfp * sin(thp-dth)
2305 SUBROUTINE shlocr ( dep, wk1x,wk1y, wk3x,wk3y )
2442 real,
intent(in) :: dep
2443 real,
intent(in) :: wk1x,wk1y, wk3x,wk3y
2450 integer :: n, np, nnp, nplace
2453 real :: p, px, py, q, qrtp, qsqp, &
2454 dr, dth, thp, dphi, cphi, &
2455 w1, w1x, w1y, wk1, w3, w3x, w3y, wk3, &
2456 rold, rold1, rold2, rnew, rnew1, rnew2, &
2458 t, t1, t2, t3, tm, tp, ds1, ds2, &
2459 rmin, rmax, rcenter, rradius
2461 double precision :: dbt3,dbt4,dbt5,dbt6, dbz, dbp, dbqrtp, &
2462 cdthold, cdthnew, wate1, wate2
2485 wk3 = sqrt(wk3x*wk3x + wk3y*wk3y)
2499 p = sqrt(px*px + py*py)
2502 q = sqrt(w3*tanh(w3)) - sqrt(w1*tanh(w1))
2559 tp = tanh(rold1 * p)
2560 tm = tanh((1.-rold1) * p)
2564 t3 = 2. * qrtp * sqrt(tp*tm) * sqrt(t-qsqp)
2565 rnew1 = (t1 + t2 + t3) / (t*t)
2570 tp = tanh(rold2 * p)
2571 tm = tanh((1.-rold2) * p)
2575 t3 = 2. * qrtp * sqrt(tp*tm) * sqrt(t-qsqp)
2576 rnew2 = (t1 + t2 + t3) / (t*t)
2577 if ( rnew2 .lt. rold2 )
then
2578 rold = (rold2*rnew1-rold1*rnew2)/(rold2-rold1-rnew2+rnew1)
2592 tm = tanh((1.-rold) * p)
2596 t3 = 2. * qrtp*sqrt(tp*tm)*sqrt(t-qsqp)
2597 rnew = (t1 + t2 + t3) / (t*t)
2598 if ( abs(rnew-rold) .lt. 0.00001 )
then
2602 rold = 0.5 * (rold + rnew)
2604 ierr_gr = ierr_gr + 1
2610 wk2x(1) = rmin * px / dep
2611 wk2y(1) = rmin * py / dep
2612 wk4x(1) = (rmin-1.) * px / dep
2613 wk4y(1) = (rmin-1.) * py / dep
2662 tm = tanh((rold-1.) * p)
2666 rnew = ((t1+rold*t)**2) / t2
2667 if ( rnew .lt. rold )
then
2672 ierr_gr = ierr_gr + 10
2684 tm = tanh((rold-1.) * p)
2688 rnew = ((t1+rold*t)**2) / t2
2689 if ( rnew .lt. rold )
then
2745 rcenter = 0.5 * (rmax + rmin)
2746 rradius = 0.5 * (rmax - rmin)
2747 t1 = rradius**2 + rcenter**2
2748 t2 = 2. * rradius * rcenter
2749 dphi = 6.283185308 / float(
npts)
2759 cphi = cos(float(np-1)*dphi)
2760 dbz = dsqrt(dble(t1-t2*cphi))
2761 cdthold = dble(rcenter-rradius*cphi) / dbz
2762 dbt3 = (dbz*dbz) + 1.d0
2763 dbt4 = dbt3 / (2.d0*dbz)
2764 dbt5 = ((dsqrt(dbz*dtanh(dbz*dbp))-dbqrtp)**4)/(2.d0*dbz)
2765 dbt6 = dbp * dsqrt(dbt3-2.d0*dbz*cdthold)
2767 if ( dbt6 .gt. 0.55d0 )
then
2769 wate2 = 1.d0 - wate1
2776 cdthnew = dbt4 - dbt5 / ((dtanh(dbt6))**2)
2777 if ( dabs(cdthnew-cdthold) .lt. 0.0000001d0 )
go to 71
2778 cdthold = wate1 * cdthnew + wate2 * cdthold
2779 dbt6 = dbp * dsqrt(dbt3-2.d0*dbz*cdthold)
2781 ierr_gr = ierr_gr + 100
2784 dth = sngl(dacos(cdthnew))
2785 zpod = sngl(dbz) * p / dep
2787 wk2x(np) = zpod * cos(thp+dth)
2788 wk2y(np) = zpod * sin(thp+dth)
2795 wk2x(nnp) = zpod * cos(thp-dth)
2796 wk2y(nnp) = zpod * sin(thp-dth)
2804 if ( ierr_gr .ne. 0 )
then
2805 write (
ndse,1000 ) ierr_gr
2818 ds(np-1) = 0.5*(ds1+ds2)
2828 1000
format (
' W3SNL4 Error : In shlocr. Error from gridset ',i10)
2874 SUBROUTINE cplshr ( w1x0,w1y0, w2x0,w2y0, w3x0,w3y0, &
2875 h, csq, irng,krng, kang,ipt )
2968 integer,
intent(in) :: irng,krng, kang,ipt
2969 real,
intent(in) :: w1x0,w1y0, w2x0,w2y0, w3x0,w3y0
2970 real,
intent(in) :: h
2971 real,
intent(out) :: csq
2979 double precision :: hh
2980 double precision :: s1, s2, s3
2981 double precision :: k1x, k2x, k3x
2982 double precision :: k1y, k2y, k3y
2983 double precision :: k1, k2, k3
2984 double precision :: om1, om2, om3
2985 double precision :: som1, som2, som3
2986 double precision :: om1sq, om2sq, om3sq
2987 double precision :: k23, k23x, k23y
2988 double precision :: dot23, dot123
2989 double precision :: omsq23
2991 double precision :: k1sq, k2sq, k3sq, k23sq
2992 double precision :: tanh_k1, tanh_k2, tanh_k3, tanh_k23
2994 double precision :: k1x0, k2x0, k3x0, k1zx
2995 double precision :: k1y0, k2y0, k3y0, k1zy
2996 double precision :: di, e
2997 double precision :: p1, p2, p3, p4
2998 double precision :: t1, t2, t3, t4, t5
3000 double precision :: csqhatd, csqd
3001 double precision :: scple
3002 double precision :: pi4
3009 double precision :: domsq23, sumom
3032 if (ipass .eq. 1)
then
3036 k1x0 = dble(w1x0) * hh
3037 k1y0 = dble(w1y0) * hh
3038 k2x0 = dble(w2x0) * hh
3039 k2y0 = dble(w2y0) * hh
3040 k3x0 = dble(w3x0) * hh
3041 k3y0 = dble(w3y0) * hh
3044 else if (ipass .eq. 2)
then
3089 k1sq = (k1x*k1x + k1y*k1y)
3090 k2sq = (k2x*k2x + k2y*k2y)
3091 k3sq = (k3x*k3x + k3y*k3y)
3123 dot23 = k2x*k3x + k2y*k3y
3131 k23sq = (k23x*k23x + k23y*k23y)
3138 tanh_k23 = dtanh(k23)
3139 omsq23 = k23 * tanh_k23
3142 dot123 = k1x*k23x + k1y*k23y
3151 di = -(som2+som3)*(om2sq*om3sq-dot23)+0.5d0 * &
3152 (som2*(k3sq-om3sq*om3sq)+som3*(k2sq-om2sq*om2sq))
3155 e = 0.5d0*(dot23-som2*som3*(om2sq+om3sq+som2*som3))
3157 p1 = 2.d0 * (som1+som2+som3) * (om1sq*omsq23 - dot123)
3166 p2 = -som1 * (k23sq*(1 - tanh_k23*tanh_k23))
3167 p4 = (k1sq*(1-tanh_k1*tanh_k1))
3168 p3 = -(som2+som3) * p4
3173 domsq23 = omsq23 - ((som2+som3)**2)
3188 t1 = di * (p1+p2+p3) / (domsq23)
3192 t2 = -di * som1 * (om1sq+omsq23)
3193 t3 = e * ((som1**3) * (som2+som3) - dot123 - p4)
3194 t4 = 0.5d0 * som1 * dot23 * &
3195 ((som1+som2+som3) * (om2sq+om3sq) + som2*som3*(som2+som3))
3202 t5 = -0.5d0 * som1 * &
3203 (om2sq * (k3sq) * (som1+som2 + 2.d0 * som3) + &
3204 om3sq * (k2sq) * (som1+som3 + 2.d0 * som2))
3207 scple = scple + t1 + t2 + t3 + t4 + t5
3218 sumom = om1*om2*om3*(om2+om3-om1)
3220 csqhatd = scple*scple*pi4/(sumom)
3223 csqd = csqhatd / (hh**6)
3258 SUBROUTINE optsa2 ( nrmn,nrmx, npk,fpk, nbins, wka, cga )
3382 integer,
intent(in) :: nrmn, nrmx, nbins
3385 integer,
intent(in) :: npk
3386 real,
intent(in) :: fpk
3387 real,
intent(in) :: wka(nrng), cga(nrng)
3393 integer :: irng, iang
3413 integer :: maxang, newmaxang
3414 integer :: maxangshift
3415 integer :: halfangl, halfangu
3416 real :: ef2maxrow(nang)
3417 real :: ef2shift(nang)
3437 real :: fdenp, fr, ratio, z, ddd
3439 real :: fk(nrng), fknrm(nrng)
3440 real :: bscl1(nrng), fkscl1(nrng)
3442 real :: act2d(nrng,nang)
3470 fac = cga(irng)/(
twopi*
oma(irng)*wka(irng))
3472 act2d(irng,iang) =
ef2(irng,iang) * fac
3476 fk(irng) = cga(irng)*
ef1(irng)/
twopi
3479 fknrm(irng) = fk(irng)*wka(irng)**2.5
3509 beta = fknrm(npk+nbins)
3510 gam = fknrm(npk) / beta
3515 fknrm(irng) = fknrm(irng) / beta
3600 ef2maxrow(:) =
ef2(npk,:)
3601 maxang = maxloc(ef2maxrow,1)
3608 ef2shift(:) = cshift( ef2maxrow(:), (maxang-1-nang/4) )
3613 halfmax = 0.5 *
ef2(npk,maxang)
3614 do while((ef2shift(halfangu).gt.halfmax).and.(halfangu.lt.nang/2))
3615 halfangu = halfangu + 1
3617 do while((ef2shift(halfangl).gt.halfmax).and.(halfangl.gt.1))
3618 halfangl = halfangl - 1
3625 halfangl = halfangl - (nang/4+1)
3626 halfangu = halfangu - (nang/4+1)
3630 maxangshift = nint( 0.5 * (halfangl + halfangu) )
3631 newmaxang = maxang + maxangshift
3632 if (newmaxang .lt. 1) newmaxang = newmaxang + nang
3633 if (newmaxang .gt. nang) newmaxang = newmaxang - nang
3685 psi2(n1:n2) = (
sinan(n1:n2))**4
3686 q4 = 1.0/(sum(psi2(n1:n2))*
ainc)
3687 psi2(n1:n2) = q4 * psi2(n1:n2)
3690 psi2(:) = cshift( psi2(:), newmaxang-1+nang/4 )
3699 igam = (gam-0.4)*10 + 0.5
3701 gam = igam/10. + 0.4
3702 fdenp = gam * beta / wka(npk)**2.5
3706 fr =
frqa(irng) / fpk
3707 if ( fr.le.1.0001 )
then
3708 if ( fr.ge.0.85 )
then
3709 ratio = 1.-(1.-fr)*0.7/0.15
3711 ratio = 0.3*exp(-17.3*(0.85-fr))
3713 fkscl1(irng) = fdenp*ratio
3714 bscl1(irng) = fkscl1(irng)/
oma(irng)
3716 z = 0.5*((fr-1.)/sigz)**1.2
3717 if ( z.gt.6. ) z = 6.
3718 ratio = 1.+exp(-z)*(gam-1.)
3719 fkscl1(irng) = beta*ratio/wka(irng)**2.5
3720 bscl1(irng) = fkscl1(irng)/
oma(irng)
3724 ddd = bscl1(irng) * psi2(iang) / wka(irng)
3725 dens1(irng,iang) = ddd
3726 dens2(irng,iang) = act2d(irng,iang) - ddd
3909 real,
intent(in) :: pha(nrng)
3910 integer,
intent(in) :: ialt
3918 integer :: irng,krng, iang,kang
3919 integer :: ipt, iizz, izz
3921 integer :: ia2, ia2p, k2, k2p
3922 integer :: ia4, ia4p, k4, k4p
3931 real :: d1, d3, d2, d4
3942 real :: dx13, ds13, dxp13, dsp13
3943 real :: dgm, t31, tr31
3944 real :: w2, w2p, wa2, wa2p, d2a, d2b, tt2
3945 real :: w4, w4p, wa4, wa4p, d4a, d4b, tt4
3946 real :: sumint(nrng,nang)
3959 real :: dz1, dz2, dz3, dz6, dz7, dz8
3960 real :: dgmp, tp31, trp31, dzsum, txp31, trx31
3963 real :: ddp1, ddp2, ddp3, ddp4
3964 real :: dd2n1, dd2n3, diag2k1, diag2k3
3965 real :: sumintp(nrng,nang)
3966 real :: sumintx(nrng,nang)
4016 do 50 irng=1,nrng,ialt
4018 kmax = min(irng+
kzone, nrng)
4022 iizz = (nrng-1)*(irng-1) - ((irng-2)*(irng-1))/2
4027 do 60 iang=1,nang,ialt
4030 d1 =
dens1(irng,iang)
4031 dp1 =
dens2(irng,iang)
4039 do 70 krng=irng,kmax,ialt
4054 do 80 kang=1,nang,ialt
4059 if ( krng.eq.irng )
then
4060 if ( kang.eq.iang )
go to 80
4066 d3 =
dens1(krng,kang)
4067 dp3 =
dens2(krng,kang)
4074 nref = kang - iang + 1
4075 if ( nref .lt. 1 ) nref = nref + nang
4114 if (
grad(ipt,nref,izz) .lt. 1.e-15 )
go to 90
4129 k2 =
kref2(ipt,nref,izz)
4131 w2 =
wtk2(ipt,nref,izz)
4135 ia2 = iang +
jref2(ipt,nref,izz)
4136 if ( ia2 .gt. nang ) ia2 = ia2 - nang
4140 if ( ia2p .gt. nang ) ia2p = ia2p - nang
4143 wa2 =
wta2(ipt,nref,izz)
4145 d2a = w2 *
dens1(k2,ia2) + w2p *
dens1(k2p,ia2)
4146 d2b = w2 *
dens1(k2,ia2p) + w2p *
dens1(k2p,ia2p)
4147 tt2 =
tfac2(ipt,nref,izz)
4148 d2 = (wa2*d2a + wa2p*d2b) * tt2
4151 d2pa = w2 *
dens2(k2,ia2) + w2p *
dens2(k2p,ia2)
4152 d2pb = w2 *
dens2(k2,ia2p) + w2p *
dens2(k2p,ia2p)
4155 dp2 = (wa2*d2pa + wa2p*d2pb) * tt2
4163 k4 =
kref4(ipt,nref,izz)
4165 w4 =
wtk4(ipt,nref,izz)
4169 ia4 = iang +
jref4(ipt,nref,izz)
4170 if ( ia4 .gt. nang ) ia4 = ia4 - nang
4174 if ( ia4p .gt. nang ) ia4p = ia4p - nang
4177 wa4 =
wta4(ipt,nref,izz)
4180 d4b = w4*
dens1(k4,ia4p) + w4p*
dens1(k4p,ia4p)
4181 tt4 =
tfac4(ipt,nref,izz)
4182 d4 = (wa4*d4a + wa4p*d4b) * tt4
4186 d4pb = w4*
dens2(k4,ia4p) + w4p*
dens2(k4p,ia4p)
4189 dp4 = (wa4*d4pa + wa4p*d4pb) * tt4
4195 dgm = dx13*(d4-d2) + ds13*d4*d2
4197 t31 = t31 + dgm *
grad(ipt,nref,izz)
4201 dgmp = dxp13*(dp4-dp2) + dsp13*dp4*dp2
4203 tp31 = tp31 + dgmp *
grad(ipt,nref,izz)
4220 dd2n1 = ddp3*(ddp4-ddp2) - ddp4*ddp2
4221 dd2n3 = ddp1*(ddp4-ddp2) + ddp4*ddp2
4222 diag2k1 = diag2k1 + dd2n1 *
grad(ipt,nref,izz)
4223 diag2k3 = diag2k3 + dd2n3 *
grad(ipt,nref,izz)
4229 dz1 = dx13 * (dp4-dp2)
4230 dz2 = d1*dp3 * ((d4-d2)+(dp4-dp2))
4231 dz3 = d3*dp1 * ((d4-d2)+(dp4-dp2))
4234 dz4 = dxp13 * (d4-d2)
4260 dz6 = d2*dp4 * (ds13+dsp13)
4261 dz7 = d4*dp2 * (ds13+dsp13)
4262 dz8 = dp2*dp4 * ds13
4263 dzsum = dz1 + dz2 + dz3 + dz4 + dz5 + dz6 + dz7 + dz8
4264 txp31 = txp31 + dzsum *
grad(ipt,nref,izz)
4290 diag2k1 = 2. * diag2k1
4291 diag2k3 = 2. * diag2k3
4295 sumint(irng,iang) = sumint(irng,iang) + tr31*pha(krng)
4296 sumint(krng,kang) = sumint(krng,kang) - tr31*pha(irng)
4305 sumintp(irng,iang) = sumintp(irng,iang) + trp31*pha(krng)
4306 sumintp(krng,kang) = sumintp(krng,kang) - trp31*pha(irng)
4309 sumintx(irng,iang) = sumintx(irng,iang) + trx31*pha(krng)
4310 sumintx(krng,kang) = sumintx(krng,kang) - trx31*pha(irng)
4319 diag2(irng,iang) =
diag2(irng,iang) + diag2k1*pha(krng)
4320 diag2(krng,kang) =
diag2(krng,kang) - diag2k3*pha(irng)
4341 fbi(:,:) = sumint(:,:) + sumintp(:,:) + sumintx(:,:)
4351 if ( ialt.eq.2 )
then
4542 real,
intent(in) :: pha(nrng)
4543 integer,
intent(in) :: ialt
4551 integer :: irng,krng, iang,kang
4552 integer :: ipt, iizz, izz
4554 integer :: ia2, ia2p, k2, k2p
4555 integer :: ia4, ia4p, k4, k4p
4560 integer :: nklimit, nalimit
4564 real :: d1, d3, d2, d4
4575 real :: dx13, ds13, dxp13, dsp13
4576 real :: dgm, t31, tr31
4577 real :: w2, w2p, wa2, wa2p, d2a, d2b, tt2
4578 real :: w4, w4p, wa4, wa4p, d4a, d4b, tt4
4579 real :: sumint(nrng,nang)
4583 real :: dz2a, dz3a, ttsa, trtsa
4584 real :: ddn1, ddn3, diagk1, diagk3
4585 real :: sumintsa(nrng,nang)
4649 do 50 irng=1,nrng,ialt
4651 kmax = min(irng+
kzone, nrng)
4655 iizz = (nrng-1)*(irng-1) - ((irng-2)*(irng-1))/2
4660 do 60 iang=1,nang,ialt
4663 d1 =
dens1(irng,iang)
4664 dp1 =
dens2(irng,iang)
4672 do 70 krng=irng,kmax,ialt
4687 do 80 kang=1,nang,ialt
4692 if ( krng.eq.irng )
then
4693 if ( kang.eq.iang )
go to 80
4699 d3 =
dens1(krng,kang)
4700 dp3 =
dens2(krng,kang)
4707 nref = kang - iang + 1
4708 if ( nref .lt. 1 ) nref = nref + nang
4747 if (
grad(ipt,nref,izz) .lt. 1.e-15 )
go to 90
4762 k2 =
kref2(ipt,nref,izz)
4764 w2 =
wtk2(ipt,nref,izz)
4768 ia2 = iang +
jref2(ipt,nref,izz)
4769 if ( ia2 .gt. nang ) ia2 = ia2 - nang
4773 if ( ia2p .gt. nang ) ia2p = ia2p - nang
4776 wa2 =
wta2(ipt,nref,izz)
4778 d2a = w2 *
dens1(k2,ia2) + w2p *
dens1(k2p,ia2)
4779 d2b = w2 *
dens1(k2,ia2p) + w2p *
dens1(k2p,ia2p)
4780 tt2 =
tfac2(ipt,nref,izz)
4781 d2 = (wa2*d2a + wa2p*d2b) * tt2
4796 k4 =
kref4(ipt,nref,izz)
4798 w4 =
wtk4(ipt,nref,izz)
4802 ia4 = iang +
jref4(ipt,nref,izz)
4803 if ( ia4 .gt. nang ) ia4 = ia4 - nang
4807 if ( ia4p .gt. nang ) ia4p = ia4p - nang
4810 wa4 =
wta4(ipt,nref,izz)
4813 d4b = w4*
dens1(k4,ia4p) + w4p*
dens1(k4p,ia4p)
4814 tt4 =
tfac4(ipt,nref,izz)
4815 d4 = (wa4*d4a + wa4p*d4b) * tt4
4828 dgm = dx13*(d4-d2) + ds13*d4*d2
4830 t31 = t31 + dgm *
grad(ipt,nref,izz)
4844 ddn1 = (d3+dp3)*(d4-d2) - d4*d2
4845 ddn3 = (d1+dp1)*(d4-d2) + d4*d2
4846 diagk1 = diagk1 + ddn1 *
grad(ipt,nref,izz)
4847 diagk3 = diagk3 + ddn3 *
grad(ipt,nref,izz)
4877 if ( (krng-irng).lt.nklimit .and. &
4878 ( iabs(kang-iang).lt.nalimit .or. &
4879 iabs(kang-iang).gt.(nang-nalimit) ) )
then
4882 dz4 = dxp13 * (d4-d2)
4884 dz2a = d1*dp3 * (d4-d2)
4885 dz3a = d3*dp1 * (d4-d2)
4887 ttsa = ttsa + (dz4+dz5+dz2a+dz3a)*
grad(ipt,nref,izz)
4919 diagk1 = 2. * diagk1
4920 diagk3 = 2. * diagk3
4928 sumint(irng,iang) = sumint(irng,iang) + tr31*pha(krng)
4929 sumint(krng,kang) = sumint(krng,kang) - tr31*pha(irng)
4933 sumintsa(irng,iang)= sumintsa(irng,iang)+ trtsa*pha(krng)
4934 sumintsa(krng,kang)= sumintsa(krng,kang)- trtsa*pha(irng)
4947 diag(irng,iang) =
diag(irng,iang) + diagk1*pha(krng)
4948 diag(krng,kang) =
diag(krng,kang) - diagk3*pha(irng)
4970 tsa(:,:) = sumint(:,:) + sumintsa(:,:)
4984 if ( ialt.eq.2 )
then
5099 REAL,
INTENT(INOUT) :: X(nrng,nang)
5106 integer :: irng, iang
5107 real :: Y(nrng,nang)
5133 x(irng,iang) = 0.5 * ( x(irng-1,iang) + x(irng+1,iang) )
5142 x(irng,iang) = 0.5 * ( x(irng,iang-1) + x(irng,iang+1) )
5149 x(irng,nang) = 0.5 * ( x(irng,nang-1) + x(irng,1) )
5159 if (
ismo.eq.0 )
goto 99
5170 y(irng,iang)=(x(irng-1,iang-1)+x(irng-1,iang)+x(irng-1,iang+1) + &
5171 x(irng, iang-1)+x(irng, iang)+x(irng, iang+1) + &
5172 x(irng+1,iang-1)+x(irng+1,iang)+x(irng+1,iang+1))/9.
5184 y(irng, 1) = (x(irng-1,nang) + x(irng-1, 1) + x(irng-1, 2) + &
5185 x(irng, nang) + x(irng, 1) + x(irng, 2) + &
5186 x(irng+1,nang) + x(irng+1, 1) + x(irng+1, 2) )/9.
5193 y(irng,nang)=(x(irng-1,nang-1) +x(irng-1,nang) +x(irng-1,1) + &
5194 x(irng, nang-1) +x(irng, nang) +x(irng, 1) + &
5195 x(irng+1,nang-1) +x(irng+1,nang) +x(irng+1,1))/9.
5206 y(1,iang) = (x(1,iang-1) + x(1,iang) + x(1,iang+1) + &
5207 x(2,iang-1) + x(2,iang) + x(2,iang+1) )/6.
5214 y(nrng,iang)=(x(nrng-1,iang-1)+x(nrng-1,iang)+x(nrng-1,iang+1)+ &
5215 x(nrng, iang-1)+x(nrng, iang)+x(nrng, iang+1) )/6.
5225 y(1, 1) =( x(1,nang) + x(1, 1) + x(1, 2) + &
5226 x(2,nang) + x(2, 1) + x(2, 2) )/6.0
5230 y(nrng,1) =( x(nrng-1,nang) + x(nrng-1,1) + x(nrng-1,2) + &
5231 x(nrng, nang) + x(nrng, 1) + x(nrng, 2) )/6.0
5235 y(1,nang) =( x(1,nang-1) + x(1,nang) + x(1, 1) + &
5236 x(2,nang-1) + x(2,nang) + x(2, 1) ) / 6.
5240 y(nrng,nang) =( x(nrng-1,nang-1) +x(nrng-1,nang) +x(nrng-1,1) + &
5241 x(nrng, nang-1) +x(nrng, nang) +x(nrng, 1) )/6.
5256 x(irng,iang) = y(irng,iang)
5298 REAL FUNCTION wkfnc ( f, dep )
5350 real,
intent(in) :: f, dep
5354 real(kind=8) :: g, y, x
5364 y = ( (
twopi*f)**2 ) * dep / g
5368 1./(1.00000+y*(0.66667+y*(0.35550+y*(0.16084+y*(0.06320 &
5369 +y*(0.02174+y*(0.00654+y*(0.00171+y*(0.00039+y*0.00011) &
5408 REAL function
cgfnc ( f, dep, cvel )
5461 real,
intent(in) :: f, dep, cvel
5473 wkd =
twopi * f*dep/cvel
5475 cgfnc = 0.5*cvel*(1.+wkd*(1.-tkd**2)/tkd)