84 PRIVATE :: wn_cmplx_v1, wn_cmplx_hf
85 PRIVATE :: cmplx_root_muller_v1, cmplx_root_muller_cheng
86 PRIVATE :: f_zhao_v1, f_zhao_cheng
87 PRIVATE :: func1_zhao, func0_zhao, bsdet
89 REAL,
PRIVATE,
PARAMETER :: ic3_ditk = 0.01, ic3_maxitk = 3.
91 PRIVATE :: ic3precalc_cheng, cginic3_cheng
96 SUBROUTINE w3sic3 (A, DEPTH, CG, WN, IX, IY, S, D)
342 USE w3idatmd,
ONLY: icep1, icep2, icep3, icep4, icep5, icei, &
362 REAL,
INTENT(IN) :: cg(
nk), wn(
nk), a(
nspec), depth
364 INTEGER,
INTENT(IN) :: ix, iy
370 INTEGER,
SAVE :: ient = 0
377 REAL :: icecoef1, icecoef2, icecoef3, &
378 icecoef4, icecoef5, iceconc
379 REAL,
DIMENSION(NK) :: d1d, wn_i, wn_r, cg_ic3, cg_tmp
381 REAL :: viscm=1.83e-6
384 REAL :: pturb, pvisc, dturb, dvisc, &
385 smooth, re, uorb, aorb, eb, &
386 deli1, deli2, fw, xi, fturb, &
387 maxthk, maxcnc, use_cheng, &
388 use_cgice, fixedhice, &
389 fixedvisc,fixeddens,fixedelas
390 INTEGER :: ind, is, numin
396 CALL strace (ient,
'W3SIC3')
431 IF (fixedhice.GE.0.0) numin=numin+1
433 IF ( iaproc .EQ. naperr ) &
434 WRITE (ndse,1001)
'ICE PARAMETER 1 (HICE)',numin
440 IF (fixedvisc.GE.0.0) numin=numin+1
442 IF ( iaproc .EQ. naperr ) &
443 WRITE (ndse,1001)
'ICE PARAMETER 2 (VISC)',numin
449 IF (fixeddens.GE.0.0) numin=numin+1
451 IF ( iaproc .EQ. naperr ) &
452 WRITE (ndse,1001)
'ICE PARAMETER 3 (DENS)',numin
458 IF (fixedelas.GE.0.0) numin=numin+1
460 IF ( iaproc .EQ. naperr ) &
461 WRITE (ndse,1001)
'ICE PARAMETER 4 (ELAS)',numin
468 icecoef1 = icep1(ix,iy)
474 icecoef2 = icep2(ix,iy)
480 icecoef3 = icep3(ix,iy)
486 icecoef4 = icep4(ix,iy)
493 IF (
inflags2(4)) iceconc = icei(ix,iy)
499 IF (icecoef1==0.0) noice=.true.
500 IF (
inflags2(4).AND.(iceconc==0.0)) noice=.true.
507 ELSEIF ( use_cheng==1.0 .AND. &
508 ((icecoef1.LE.maxthk).OR.(iceconc.LE.maxcnc)) )
THEN
512 WRITE (
ndst,9000) depth,icecoef1,icecoef2,icecoef3,icecoef4
521 icecoef3, icecoef4, depth)
525 IF ( use_cgice==1.0 )
THEN
532 d1d(ik)= -2.0 * cg_tmp(ik) * wn_i(ik)
536 ELSEIF ( (icecoef1 .LE. maxthk) .OR. (iceconc .LE. maxcnc) )
THEN
542 WRITE (
ndst,9000) depth,icecoef1,icecoef2,icecoef3,icecoef4
549 CALL w3ic3wncg_v1(wn_r, wn_i, cg_ic3, icecoef1, icecoef2, &
550 icecoef3, icecoef4, depth )
553 IF ( use_cgice==1.0 )
THEN
560 d1d(ik)= -2.0 * cg_tmp(ik) * wn_i(ik)
583 uorb = uorb + eb *
sig(ik)**2 *
dden(ik) / cg(ik)
584 aorb = aorb + eb *
dden(ik) / cg(ik)
591 re = uorb*aorb / viscm
598 deli1= min(1. ,xi-float(ind))
601 dturb=-1.* fturb*fw*uorb/
grav
607 dvisc = -1. *
ic3pars(6) * wn(ik) * sqrt(viscm*
sig(ik) / 2.)
608 d1d(ik) = pturb*dturb*
sig(ik)**2 + pvisc*dvisc
616 d(ikth) = d1d(
mapwn(ikth))
631 dout(ik,ith) = d(ith+(ik-1)*
nth)
635 0.0, 0.001,
'Diag Sice',
' ',
'NONAME')
644 1001
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SIC3 : '/ &
645 ' ',a,
' REQUIRED ONCE, BUT WAS PROVIDED BY USER '/ &
649 9000
FORMAT (
' TEST W3SIC3 : depth and 4 ice coef. : ',5e10.3)
657 SUBROUTINE w3ic3wncg_v1(WN_R,WN_I,CG,ICE1,ICE2,ICE3,ICE4,DPT)
743 REAL,
INTENT(INOUT):: wn_r(:),wn_i(:),cg(:)
744 REAL,
INTENT(IN) :: ice1, ice2, ice3, ice4, dpt
747 REAL,
ALLOCATABLE :: sigma(:),cg_ic3(:)
748 REAL :: k_ocean, cg_ocean
749 DOUBLE PRECISION :: kh, k_noice, hwat, hice, nu, dice, es_mod
750 DOUBLE PRECISION,
PARAMETER :: khmax = 18.0d0
751 DOUBLE COMPLEX :: wncomplex,wncomplex_old
753 REAL :: ic3hilim,ic3kilim
755 ALLOCATE( cg_ic3(
SIZE(cg) ) )
756 ALLOCATE( sigma(
SIZE(cg) ) )
773 hice=min(dble(ic3hilim),hice)
775 IF (
SIZE(wn_r,1).EQ.
nk)
THEN
779 ELSE IF (
SIZE(wn_r,1).EQ.
nk+2)
THEN
788 wncomplex_old=cmplx(0.0d0,0.0d0)
793 CALL wavnu1(sigma(ik),dpt,k_ocean,cg_ocean)
794 k_noice = dble(k_ocean)
798 IF (kh.GT.khmax)
THEN
799 hwat = khmax / k_noice
803 IF((ik.GT.kl).AND.(sigma(ik).GT.stensec))
THEN
805 wncomplex = wn_cmplx_hf(dble(sigma(ik)),k_noice,es_mod,nu, &
806 dice,hice,hwat,dble(sigma(ik-1)),wncomplex_old)
807 wncomplex_old=wncomplex
811 wncomplex = wn_cmplx_v1(dble(sigma(ik)),k_noice,es_mod,nu, &
813 wncomplex_old=wncomplex
819 wn_i(ik) = real(aimag(wncomplex))
822 wn_i(ik) = min(wn_i(ik),ic3kilim)
823 wn_r(ik) = real(wncomplex)
832 900
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SIC3_W3IC3WNCG : '/&
833 ' CANNOT DETERMINE BOUNDS OF WAVENUMBER ARRAY.')
839 FUNCTION wn_cmplx_v1(SIGMA,WN_O,ES,NU,DICE,HICE,DEPTH)
RESULT(WN)
932 DOUBLE PRECISION,
INTENT(IN) :: sigma,wn_o,es,nu,dice,hice,depth
939 DOUBLE PRECISION :: tt, ts, t
940 DOUBLE COMPLEX :: x0, x1, x2, wn0
943 t = dble(
tpi) / sigma
945 nsub = int((ts-t) * 10.)
949 ELSE IF (t.LT.ts)
THEN
953 wn0 = cmplx_root_muller_v1(x0,x1,x2,0,dble(
tpi)/ts, &
954 es,nu,dice,hice,depth )
958 wn = cmplx_root_muller_v1(x0,x1,x2,1,dble(
tpi)/ts, &
959 es,nu,dice,hice,depth )
964 tt = ts - (ts-t) / real(nsub) * real(i)
965 wn = cmplx_root_muller_v1(x0,x1,x2,1,dble(
tpi)/tt, &
966 es,nu,dice,hice,depth )
972 wn0 = cmplx_root_muller_v1(x0,x1,x2,0,sigma, &
973 es,nu,dice,hice,depth )
977 wn = cmplx_root_muller_v1(x0,x1,x2,1,sigma, &
978 es,nu,dice,hice,depth )
981 END FUNCTION wn_cmplx_v1
984 FUNCTION wn_cmplx_hf(SIGMA,WN_O,ES,NU,DICE,HICE,DEPTH,SIGMA_LAST, &
1067 DOUBLE PRECISION,
INTENT(IN) :: sigma,wn_o,es,nu,dice,hice,depth
1068 DOUBLE PRECISION,
INTENT(IN) :: sigma_last
1069 DOUBLE COMPLEX,
INTENT(IN) :: wn_last
1070 DOUBLE COMPLEX :: wn
1076 DOUBLE PRECISION :: tt, ts, t
1077 DOUBLE COMPLEX :: x0, x1, x2, wn0
1080 t = dble(
tpi) / sigma
1081 ts = dble(
tpi) / sigma_last
1082 nsub = int((ts-t) * 10.)
1084 IF (hice<0.001)
THEN
1090 wn = cmplx_root_muller_v1(x0,x1,x2,1,dble(
tpi)/ts, &
1091 es,nu,dice,hice,depth )
1096 tt = ts - (ts-t) / real(nsub) * real(i)
1097 wn = cmplx_root_muller_v1(x0,x1,x2,1,dble(
tpi)/tt, &
1098 es,nu,dice,hice,depth )
1102 END FUNCTION wn_cmplx_hf
1106 FUNCTION cmplx_root_muller_v1(X0, X1, X2, JUDGE, SIGMA, ES, NU, &
1107 DICE, HICE, DEPTH)
RESULT(P3)
1188 DOUBLE COMPLEX :: p3
1189 DOUBLE COMPLEX,
INTENT(IN) :: x0,x1,x2
1190 DOUBLE PRECISION,
INTENT(IN) :: sigma,es,nu,dice,hice,depth
1191 INTEGER,
INTENT(IN) :: judge
1197 INTEGER,
PARAMETER :: imax = 1000
1198 DOUBLE PRECISION :: dlta,epsi
1199 DOUBLE COMPLEX :: p0,p1,p2
1200 DOUBLE COMPLEX :: y0,y1,y2,y3
1201 DOUBLE COMPLEX :: a,b,c,q,disc,den1,den2
1212 y0 = f_zhao_v1(p0,judge,sigma,es,nu,dice,hice,depth)
1213 y1 = f_zhao_v1(p1,judge,sigma,es,nu,dice,hice,depth)
1214 y2 = f_zhao_v1(p2,judge,sigma,es,nu,dice,hice,depth)
1217 q = (p2 - p1) / (p1 - p0)
1218 a = q * y2 - q * (1.+q) * y1 + q**2. * y0
1219 b = (2. * q + 1.) * y2 - (1 + q)**2. * y1 + q**2. * y0
1222 IF ( abs(a).NE.0. )
THEN
1224 disc = b**2. - 4 * a * c;
1226 den1 = ( b + sqrt( disc ) )
1227 den2 = ( b - sqrt( disc ) )
1229 IF ( abs( den1 ) .LT. abs( den2 ) )
THEN
1230 p3 = p2 - (p2 - p1) * (2 * c / den2)
1232 p3 = p2 - (p2 - p1) * (2 * c / den1)
1237 IF ( abs(b) .NE. 0. )
THEN
1238 p3 = p2 - (p2 - p1) * (c / b)
1241 WRITE(
ndse,801)x0,x1,x2
1242 WRITE(
ndse,802)sigma,es,nu,dice,hice,depth
1243 WRITE(
ndse,803)judge
1248 y3 = f_zhao_v1(p3,judge,sigma,es,nu,dice,hice,depth);
1250 IF ( abs(p3-p2).LT.dlta .OR. abs(y3).LT.epsi )
THEN
1265 WRITE(
ndse,801)x0,x1,x2
1266 WRITE(
ndse,802)sigma,es,nu,dice,hice,depth
1267 WRITE(
ndse,803)judge
1270 800
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SIC3_CMPLX_ROOT_MULLER'/&
1271 ' : MULLER METHOD FAILED TO FIND ROOT.' )
1272 801
FORMAT (/
'X0,X1,X2 = ',3(1x,
'(',f10.5,
',',f10.5,
')'))
1273 802
FORMAT (/
'SIGMA,ES,NU,DICE,HICE,DEPTH = ',6(1x,f10.5))
1274 803
FORMAT (/
'JUDGE = ',i5)
1276 END FUNCTION cmplx_root_muller_v1
1279 FUNCTION f_zhao_v1(X,JUDGE,SIGMA,ES,NU,DICE,HICE,DEPTH) &
1357 INTEGER,
INTENT(IN) :: judge
1358 DOUBLE PRECISION,
INTENT(IN) :: sigma,es,nu,dice,hice,depth
1359 DOUBLE COMPLEX,
INTENT(IN) :: x
1360 DOUBLE COMPLEX :: fzhao
1363 IF (judge.EQ.0)
THEN
1364 fzhao = func0_zhao(x,sigma,depth)
1366 fzhao = func1_zhao(x,sigma,es,nu,dice,hice,depth)
1369 END FUNCTION f_zhao_v1
1372 FUNCTION func0_zhao(WN, SIGMA, DEPTH)
RESULT(FUNC0)
1444 DOUBLE COMPLEX,
INTENT(IN) :: wn
1445 DOUBLE PRECISION,
INTENT(IN) :: sigma, depth
1446 DOUBLE COMPLEX :: func0
1451 DOUBLE COMPLEX :: th
1454 IF (real(wn*depth).LE.4.)
THEN
1455 th = (exp(wn*depth)-exp(-wn*depth)) &
1456 / (exp(wn*depth)+exp(-wn*depth))
1457 func0 = sigma**2. - th * wn * dble(
grav)
1459 func0 = sigma**2. - wn * dble(
grav)
1462 END FUNCTION func0_zhao
1465 FUNCTION func1_zhao(WN,SIGMA,ES,NU,DICE,HICE,DEPTH)
RESULT(FUNC1)
1545 DOUBLE COMPLEX,
INTENT(IN) :: wn
1546 DOUBLE PRECISION,
INTENT(IN) :: sigma, es, nu, dice, hice, depth
1547 DOUBLE COMPLEX :: func1
1552 DOUBLE COMPLEX :: ve,alpha,n,m,l,sk,ck,sa,ca,th,thh
1553 DOUBLE COMPLEX :: aa(4,4)
1556 ve = cmplx( nu, es/dice/sigma )
1557 alpha = sqrt( wn**2. - sigma/ve * cmplx(0.,1.) )
1558 n = sigma + 2. * ve * wn**2. * cmplx(0.,1.)
1559 l = 2 * wn * alpha * sigma * ve
1560 sk = (exp(wn*hice)-exp(-wn*hice))/2.
1561 ck = (exp(wn*hice)+exp(-wn*hice))/2.
1562 sa = (exp(alpha*hice)-exp(-alpha*hice))/2.
1563 ca = (exp(alpha*hice)+exp(-alpha*hice))/2.
1565 IF (real(wn*depth).LE.4.)
THEN
1566 th = (exp(wn*depth)-exp(-wn*depth)) &
1567 / (exp(wn*depth)+exp(-wn*depth))
1568 thh = ( exp(wn*(depth-hice)) - exp(-wn*(depth-hice)) ) &
1569 / ( exp(wn*(depth-hice)) + exp(-wn*(depth-hice)) )
1575 m = (dble(
dwat)/dice - 1) * dble(
grav) * wn &
1576 - dble(
dwat) / dice * sigma**2 / th
1578 IF (es.GT.1.e7)
THEN
1580 aa(1,2) = 2 * cmplx(0.,1.) * wn**2.
1581 aa(1,3) = alpha**2. + wn**2.
1585 aa(2,2) = -wn * dble(
grav)
1586 aa(2,3) = cmplx(0.,1.) * wn * dble(
grav)
1589 aa(3,1) = -2. * cmplx(0.,1.) * wn**2. * sk
1590 aa(3,2) = 2. * cmplx(0.,1.) * wn**2. * ck
1591 aa(3,3) = (alpha**2. + wn**2.) * ca
1592 aa(3,4) = -(alpha**2. + wn**2.) * sa
1594 aa(4,1) = n * sigma * ck - m * sk
1595 aa(4,2) = - n * sigma * sk + m * ck
1596 aa(4,3) = -cmplx(0.,1.) * m * ca - l * sa
1597 aa(4,4) = cmplx(0.,1.) * m * sa + l * ca
1601 func1 = sigma**2. - th*wn*dble(
grav) - th*dice/dble(
dwat)* &
1602 (wn**2.*dble(
grav)**2.*sk*sa - (n**4. + 16.* &
1603 ve**4.*wn**6.*alpha**2.)*sk*sa - 8. &
1604 *wn**3.*alpha*ve**2.*n**2.*(ck*ca-1.))/(4.*wn**3. &
1605 *alpha*ve**2.*sk*ca+n**2.*sa*ck-dble(
grav)*wn*sk*sa)
1608 END FUNCTION func1_zhao
1611 FUNCTION bsdet(AA, N)
RESULT(DET)
1671 INTEGER,
INTENT(IN) :: n
1672 DOUBLE COMPLEX,
INTENT(IN) :: aa(n,n)
1673 DOUBLE COMPLEX :: det
1678 INTEGER :: k, i, j, is, js
1679 DOUBLE COMPLEX :: f, d, mat(n,n)
1680 DOUBLE PRECISION :: q
1686 loop100:
DO k = 1,n-1
1690 IF (abs(mat(i,j)).GT.q)
THEN
1697 IF (q+1.0.EQ.1.0)
THEN
1705 mat(k,j) = mat(is,j)
1713 mat(i,js) = mat(i,k)
1717 det = det * mat(k,k)
1718 loop50:
DO i = k+1,n
1719 d = mat(i,k) / mat(k,k)
1720 loop40:
DO j = k+1,n
1721 mat(i,j) = mat(i,j) - d * mat(k,j)
1726 det = f * det * mat(n,n)
1732 FUNCTION delta(X)
RESULT(DX)
1772 REAL,
INTENT(IN) :: x(:)
1773 REAL,
ALLOCATABLE :: dx(:)
1782 dx(ix) = (x(ix+1)-x(ix ))
1783 ELSE IF (ix==nx)
THEN
1784 dx(ix) = (x(ix )-x(ix-1))
1786 dx(ix) = (x(ix+1)-x(ix-1)) / 2.
1881 REAL,
INTENT(IN) :: ice1, ice2, ice3, ice4, dpt
1882 REAL,
INTENT(INOUT):: wn_r(:),wn_i(:),cg(:)
1883 REAL,
ALLOCATABLE :: sigma(:)
1885 INTEGER :: i, i1, i2, ik, kl,ku, itknum
1886 COMPLEX(8) :: wncomplex, x0,x1,x2, wnr, wnl
1887 REAL(8) :: depth, hice, nu, dice, es_mod, rr, k_ocean, &
1889 REAL :: ic3hilim,ic3kilim
1894 ALLOCATE( sigma(
SIZE(cg) ) )
1896 IF (
SIZE(wn_r,1).EQ.
nk)
THEN
1902 ELSE IF (
SIZE(wn_r,1).EQ.
nk+2)
THEN
1916 hice=min(dble(ic3hilim),hice)
1921 itknum = ceiling(ic3_maxitk/ic3_ditk)
1922 i = min(nint(hice/ic3_ditk),itknum)
1928 cg =
ic3cg(i1:i2, i)
1933 IF (wn_r(ik)*depth>4.0)
THEN
1936 x1 = cmplx(wn_r(ik),wn_i(ik))
1939 wncomplex = cmplx_root_muller_cheng(x0,x1,x2,1, &
1940 dble(sigma(ik)),es_mod,nu,dice,hice,depth)
1941 wn_i(ik) = real(aimag(wncomplex))
1942 wn_r(ik) = real(wncomplex)
1946 CALL smooth_k(wn_r,wn_i,sigma,ku-kl+ 1,0)
1949 wn_i(ik) = min(wn_i(ik),ic3kilim)
1953 CALL cginic3_cheng(cg,sigma,wn_r,ku-kl+1)
1957 900
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SIC3_W3IC3WNCG : '/&
1958 ' CANNOT DETERMINE BOUNDS OF WAVENUMBER ARRAY.')
2029 REAL :: ice1, ice2, ice3, ice4, dpt
2030 INTEGER :: i1, i2, jitk, itknum, ik
2034 itknum = ceiling(ic3_maxitk/ic3_ditk)
2038 ice1 = jitk*ic3_ditk
2040 ic3cg(:,jitk), ice1, ice2, ice3, ice4, dpt)
2047 SUBROUTINE ic3precalc_cheng(WN_R,WN_I,CG,ICE1,ICE2,ICE3,ICE4,DPT)
2115 REAL,
INTENT(INOUT):: wn_r(0:
nk+1),wn_i(0:
nk+1), cg(0:
nk+1)
2116 REAL,
INTENT(IN) :: ice1, ice2, ice3, ice4, dpt
2118 INTEGER :: ik, kl,ku,ix,num,switchid
2119 REAL :: k_ocean,cg_ocean
2120 REAL(8) :: kh, k_noice, depth, hice, nu, dice, &
2122 COMPLEX(8) :: wncomplex, x0,x1,x2,wnm1,wnm2,wn_o
2136 CALL wavnu1(
sig(ik),dpt,k_ocean,cg_ocean)
2145 wnm1 = cmplx(wn_r(ik-1),wn_i(ik-1))
2146 wnm2 = cmplx(wn_r(ik-2),wn_i(ik-2))
2150 wn_o = cmplx(k_noice,0.0)
2152 wnm1,wnm2,es_mod,nu,dice,hice,depth,switchid,ik,ku)
2154 wn_r(ik) = real(wncomplex)
2155 wn_i(ik) = imag(wncomplex)
2158 CALL cginic3_cheng(cg,
sig,wn_r,ku-kl+1)
2160 END SUBROUTINE ic3precalc_cheng
2165 NU,DICE,HICE,DEPTH,SWITCHID,IK,KU)
2257 REAL(8) :: SIGMA,SIGMAM1,ES_MOD,NU,DICE,HICE,DEPTH
2258 COMPLEX(8) :: WN_O, WNM1, WNM2, WN0, WN1,WN2
2259 COMPLEX(8),
INTENT(OUT) :: WN
2264 INTEGER :: I,IX,NUM,SWITCHID,IK,KU
2265 REAL(8) :: RR, R2, EPS, SIGMA0, KAPPA, DIS
2266 COMPLEX(8) :: X0, X1, X2, kp, ks, Gv
2270 gv = cmplx(es_mod,-sigma*nu*dice)
2271 kp = sigma/sqrt(4*gv/dice)
2284 wn1 = cmplx_root_muller_cheng(x0,x1,x2,1,sigma, &
2285 es_mod,nu,dice,hice,depth)
2288 IF (real(wn1)<0.or.abs(wn1-ks)/abs(ks)<0.03 .or. &
2289 abs(wn1-kp)/abs(kp)<0.03.and.es_mod>1.e7*nu)
THEN
2290 wn1 = cmplx_root_muller_cheng(x0,x1,x2,2,sigma, &
2291 es_mod,nu,dice,hice,depth)
2294 wn2 = cmplx_root_muller_cheng(x2,x1,x0,1,sigma, &
2295 es_mod,nu,dice,hice,depth)
2296 IF (real(wn2)<0.or.abs(wn2-ks)/abs(ks)<0.03)
THEN
2297 wn2 = cmplx_root_muller_cheng(x2,x1,x0,2,sigma, &
2298 es_mod,nu,dice,hice,depth)
2300 IF(abs(real(wn1)-real(wn_o))<abs(real(wn2)-real(wn_o)))
THEN
2312 r2 = max(abs(wnm1-wnm2)/abs(wnm2), abs((sigma-sigmam1)/sigma))
2314 IF(i<3.AND.sigma>4)
THEN
2318 rr = min(max(r2/real(num,8),0.001d0),0.5d0)
2323 sigma0 = sigmam1 + (1.0*ix)/num*(sigma-sigmam1)
2324 wn = cmplx_root_muller_cheng(x0,x1,x2,1,sigma0, &
2325 es_mod,nu,dice,hice,depth)
2327 wn = cmplx_root_muller_cheng(x2,x1,x0,1,sigma0, &
2328 es_mod,nu,dice,hice,depth)
2331 wn = cmplx_root_muller_cheng(x0,x1,x2,3,sigma0, &
2332 es_mod,nu,dice,hice,depth)
2334 kp = sigma0/sqrt(4*gv/dice)
2337 IF(abs(wn-ks)/abs(ks)<0.03.OR.real(wn)<0)
THEN
2338 wn = cmplx_root_muller_cheng(x0,x1,x2,2,sigma0, &
2339 es_mod,nu,dice,hice,depth)
2342 IF( real(wn)<0.99*real(wnm1).OR. abs(wn-wn0)>eps .AND. &
2343 (abs(x1-wn)/abs(wn)>0.3 .OR. &
2344 imag(wn)/(imag(x1)+eps)>10.OR. real(wn)<0))
THEN
2359 kp = sigma/sqrt(4*gv/dice)
2360 IF(real(wn0)>0.AND.imag(wn0)>=0.AND.abs(wn - wn0)>eps)
THEN
2364 IF(nu>0.AND.ik>=ku-1.OR. &
2365 nu>0.AND.switchid/=0)
THEN
2368 dis = abs(real(wn)-real(wn_o))/abs(real(wn0)-real(wn_o))
2369 kappa = (imag(wn)+ eps)/(imag(wn0) + eps)
2371 IF ((dis >= 1 .AND. kappa>=1 .AND. &
2372 imag(wn0)>=0.1*imag(wnm1).AND. &
2373 abs(wn-kp)<abs(wn0-kp)) .OR. &
2375 ( dis>=1 .AND. kappa<1 .AND. &
2376 ((kappa> 0.2 .AND. imag(wn0)/real(wn0)<0.5).or. &
2377 abs(real(wn)-real(kp))<abs(real(wn0)-real(kp)))).OR.&
2381 ( kappa>1 .AND. dis<1 .AND. &
2382 abs(real(wn)-real(wnm1))> &
2383 abs(real(wn0)-real(wnm1)) ))
THEN
2387 ELSEIF(dis<1 .AND. kappa<1)
THEN
2394 if (abs(wn-kp)/abs(kp)<0.03)
then
2403 IF (real(wn0)>real(wnm1).AND.real(wn0)<real(wn).and. &
2404 abs(imag(wn0)-imag(wnm1))<abs(imag(wn)-imag(wnm1)))
THEN
2413 print*,
"MULLER METHOD FAILED, ES_MOD,NU,HICE:",es_mod,nu,hice
2420 SUBROUTINE cginic3_cheng(CG,SIGMA,WN_R,N)
2475 REAL,
INTENT(IN) :: SIGMA(1:N),WN_R(1:N)
2476 REAL,
INTENT(OUT) :: CG(1:N)
2480 REAL :: CG1,CG2,CG3,CG0(1:N)
2483 cg(ik)=(sigma(ik+1)-sigma(ik))/(wn_r(ik+1)-wn_r(ik))
2485 cg(ik)=(sigma(ik)-sigma(ik-1))/(wn_r(ik)-wn_r(ik-1))
2487 cg1 = (sigma(ik)-sigma(ik-1))/(wn_r(ik)-wn_r(ik-1))
2488 cg2 = (sigma(ik+1)-sigma(ik))/(wn_r(ik+1)-wn_r(ik))
2489 cg(ik) = 2.0/(1./cg1 + 1./cg2)
2493 END SUBROUTINE cginic3_cheng
2497 SUBROUTINE smooth_k(WN_R,WN_I,SIGMA,N,SWITCHID)
2498 REAL,
INTENT(IN) :: SIGMA(N)
2499 REAL :: WN_R(N), WN_I(N),DIFF(N),REMOVEID(N)
2500 INTEGER :: N,I,J,SWITCHID
2508 diff(i) = wn_r(i) - wn_r(i-1)
2511 IF(diff(i)<=0.OR.diff(i)>3*diff(i-1).OR.switchid==i)
THEN
2518 IF (removeid(i) ==1)
THEN
2519 wn_r(i) = wn_r(i-1) + (wn_r(i+1)-wn_r(i-1))/ &
2520 (sigma(i+1)-sigma(i-1))*(sigma(i)-sigma(i-1))
2521 wn_i(i) = wn_i(i-1) + (wn_i(i+1)-wn_i(i-1))/ &
2522 (sigma(i+1)-sigma(i-1))*(sigma(i)-sigma(i-1))
2527 IF (diff(n)>3*diff(n-1))
THEN
2529 wn_r(i) = wn_r(i-1) + (wn_r(i-1)-wn_r(i-2))/ &
2530 (sigma(i-1)-sigma(i-2))*(sigma(i)-sigma(i-1))
2531 wn_i(i) = wn_i(i-1) + (wn_i(i-1)-wn_i(i-2))/ &
2532 (sigma(i-1)-sigma(i-2))*(sigma(i)-sigma(i-1))
2540 FUNCTION cmplx_root_muller_cheng(X0, X1, X2, JUDGE, &
2541 SIGMA,ES,NU,DICE,HICE,DEPTH )
RESULT(P3)
2624 COMPLEX(8),
INTENT(IN):: X0,X1,X2
2625 REAL(8),
INTENT(IN) :: SIGMA,ES,NU,DICE,HICE,DEPTH
2626 INTEGER,
INTENT(IN) :: JUDGE
2633 INTEGER,
PARAMETER :: IMAX = 200
2634 REAL(8) :: DLTA,EPSI
2635 COMPLEX(8) :: P0,P1,P2
2636 COMPLEX(8) :: Y0,Y1,Y2,Y3
2637 COMPLEX(8) :: A,B,C,Q,DISC,DEN1,DEN2
2648 y0 = f_zhao_cheng(judge,p0,sigma,es,nu,dice,hice,depth)
2649 y1 = f_zhao_cheng(judge,p1,sigma,es,nu,dice,hice,depth)
2650 y2 = f_zhao_cheng(judge,p2,sigma,es,nu,dice,hice,depth)
2653 q = (p2 - p1) / (p1 - p0)
2654 a = q * y2 - q * (1.d0+q) * y1 + q**2.d0 * y0
2655 b = (2.d0 * q + 1.d0) * y2 - (1.d0 + q)**2.d0 * y1 &
2659 IF ( abs(a).NE.0.d0 )
THEN
2661 disc = b**2.d0 - 4.d0 * a * c;
2663 den1 = ( b + sqrt( disc ) )
2664 den2 = ( b - sqrt( disc ) )
2666 IF ( abs( den1 ) .LT. abs( den2 ) )
THEN
2667 p3 = p2 - (p2 - p1) * (2.d0 * c / den2)
2669 p3 = p2 - (p2 - p1) * (2.d0 * c / den1)
2674 IF ( abs(b) .NE. 0.d0 )
THEN
2675 p3 = p2 - (p2 - p1) * (c / b)
2682 IF (imag(p3).LT.0)
THEN
2683 p3 = real(p3) - cmplx(0.,1.)*imag(p3)
2685 IF (real(p3).LT.0)
THEN
2686 p3 = -real(p3) + cmplx(0.,1.)*imag(p3)
2690 p3 = cmplx(real(p3),0)
2692 y3 = f_zhao_cheng(judge,p3,sigma,es,nu,dice,hice,depth);
2693 IF ( abs(p3-p2).LT.dlta .AND. abs(y3).LT.epsi )
THEN
2710 END FUNCTION cmplx_root_muller_cheng
2713 FUNCTION f_zhao_cheng(JUDGE,X,SIGMA,ES,NU,DICE,HICE,DEPTH) &
2797 INTEGER,
INTENT(IN) :: JUDGE
2798 DOUBLE PRECISION,
INTENT(IN) :: SIGMA,ES,NU,DICE,HICE,DEPTH
2799 DOUBLE COMPLEX,
INTENT(IN) :: X
2800 DOUBLE COMPLEX :: FZHAO
2805 ELSEIF(judge ==0)
THEN
2809 END FUNCTION f_zhao_cheng
2893 COMPLEX(8),
INTENT(IN) :: wn
2894 REAL(8),
INTENT(IN) :: sigma, es, nu, dice, hice, depth
2895 COMPLEX(8) :: func1,aa(4,4)
2901 COMPLEX(8) :: ve,alpha,n,m,l,sk,ck,sa,ca,th,thh,temp,j1,j2
2904 ve = cmplx( nu, es/dice/sigma )
2905 alpha = sqrt( wn**2. - sigma/ve * cmplx(0.,1.d0) )
2906 n = sigma + 2. * ve * wn**2. * cmplx(0.,1.d0)
2909 sk = (temp - 1.d0/temp)/2.d0
2910 ck = (temp + 1.d0/temp)/2.d0
2912 temp = exp(alpha*hice)
2913 sa = (temp - 1.d0/temp)/2.d0
2914 ca = (temp + 1.d0/temp)/2.d0
2917 IF ( real(temp).LT.18.d0 )
THEN
2919 th = (temp - 1./temp)/(temp + 1./temp)
2924 IF ((es>=1.e5.AND.judge/=2).or.judge==3)
THEN
2925 l = 2 * wn * alpha * sigma * ve
2926 m = (dble(
dwat)/dice - 1) * dble(
grav) * wn &
2927 - dble(
dwat) / dice * sigma**2 / th
2929 aa(1,2) = 2 * cmplx(0.,1.) * wn**2.
2930 aa(1,3) = alpha**2. + wn**2.
2934 aa(2,2) = -wn * dble(
grav)
2935 aa(2,3) = cmplx(0.,1.) * wn * dble(
grav)
2938 aa(3,1) = -2. * cmplx(0.,1.) * wn**2. * sk
2939 aa(3,2) = 2. * cmplx(0.,1.) * wn**2. * ck
2940 aa(3,3) = (alpha**2. + wn**2.) * ca
2941 aa(3,4) = -(alpha**2. + wn**2.) * sa
2943 aa(4,1) = n * sigma * ck - m * sk
2944 aa(4,2) = - n * sigma * sk + m * ck
2945 aa(4,3) = -cmplx(0.,1.) * m * ca - l * sa
2946 aa(4,4) = cmplx(0.,1.) * m * sa + l * ca
2950 j1 = dice/dble(
dwat)*(wn**2.*dble(
grav)**2.*sk*sa - (n**4. &
2951 + 16.* ve**4.*wn**6.*alpha**2.)*sk*sa - 8. &
2952 *wn**3.*alpha*ve**2.*n**2.*(ck*ca-1.))
2953 j2 = (4.*wn**3.*alpha*ve**2.*sk*ca+n**2.*sa*ck &
2954 -dble(
grav)*wn*sk*sa)
2956 func1 = (sigma**2. - th*wn*dble(
grav)) - th*j1/(j2+1.e-20)
2957 ELSEIF (judge==1)
THEN
2958 func1 = (sigma**2. - th*wn*dble(
grav))*j2 - th*j1
3051 COMPLEX(8),
INTENT(IN) :: wn
3052 REAL(8),
INTENT(IN) :: sigma, es, nu, dice, hice, depth
3058 COMPLEX(8) :: ve,alpha,n,m,l,sk,ck,sa,ca,th,thh,temp,j1,j2
3061 ve = cmplx( nu, es/dice/sigma )
3062 alpha = sqrt( wn**2. - sigma/ve * cmplx(0.,1.d0) )
3063 n = sigma + 2. * ve * wn**2. * cmplx(0.,1.d0)
3066 sk = (temp - 1.d0/temp)/2.d0
3067 ck = (temp + 1.d0/temp)/2.d0
3069 temp = exp(alpha*hice)
3070 sa = (temp - 1.d0/temp)/2.d0
3071 ca = (temp + 1.d0/temp)/2.d0
3074 IF ( real(temp).LT.18.d0 )
THEN
3076 th = (temp - 1./temp)/(temp + 1./temp)
3081 j1 = dice/dble(
dwat)*(wn**2.*dble(
grav)**2.*sk*sa - (n**4. &
3082 + 16.* ve**4.*wn**6.*alpha**2.)*sk*sa - 8. &
3083 *wn**3.*alpha*ve**2.*n**2.*(ck*ca-1.))
3084 j2 = (4.*wn**3.*alpha*ve**2.*sk*ca+n**2.*sa*ck &
3085 -dble(
grav)*wn*sk*sa)
3086 func1 = (sigma**2. - th*wn*dble(
grav))*j2 - th*j1