102 SUBROUTINE wmupdt ( IMOD ,TDATA )
204 INTEGER,
INTENT(IN) :: imod
205 INTEGER,
INTENT(INOUT) :: tdata(2)
210 INTEGER :: MDSEN, J, DTIME(2), IERR, NDTNEW, JJ
212 INTEGER,
SAVE :: IENT = 0
216 CHARACTER(LEN=13) :: IDFLDS(-7:10)
217 CHARACTER(LEN=23) :: DTME21
219 DATA idflds /
'ice param. 1 ' ,
'ice param. 2 ' , &
220 'ice param. 3 ' ,
'ice param. 4 ' , &
222 'mud density ' ,
'mud thkness ' , &
224 'water levels ' ,
'currents ' , &
225 'winds ' ,
'ice fields ' , &
226 'momentum ' ,
'air density ' , &
227 'mean param. ' ,
'1D spectra ' , &
228 '2D spectra ' ,
'grid speed ' /
235 CALL strace (ient,
'WMUPDT')
238 WRITE (
mdst,9000) imod, tdata
263 WRITE (
mdss,900) imod, dtme21
303 IF (
tfn(1,j) .EQ. -1 )
THEN
315 IF ( dttst .GT. 0. ) cycle
317 WRITE (
mdss,901) idflds(j)
321 IF (
inpmap(imod,j) .EQ. 0 )
THEN
331 ELSE IF (
inpmap(imod,j) .GT. 0 )
THEN
343 IF (
tfn(1,j) .EQ. -1 )
THEN
346 IF ( first .OR. ( j.EQ.1 .AND.
iflstl(-jj) ) &
347 .OR. ( j.EQ.4 .AND.
iflsti(-jj) ) &
348 .OR. ( j.EQ.6 .AND.
iflstr(-jj) ) )
THEN
366 IF ( dttst .LE. 0. )
THEN
384 CALL wmupd2 ( imod, j, jj, ierr )
393 IF (
inpmap(imod,j) .EQ. -999 )
THEN
407 IF ( ierr.GT.0 )
GOTO 2000
409 WRITE (
mdss,950) idflds(j)
422 IF ( dttst.GT.0. .AND. .NOT. ( (
fllstl .AND. j.EQ.1) .OR. &
423 (
fllsti .AND. j.EQ.4) .OR. &
424 (
fllstr .AND. j.EQ.6) ) )
THEN
436 IF ( dttst.GT.0. )
tdn =
tfn(:,j)
474 900
FORMAT (
' Updating input for grid',i3,
' at ',a)
475 901
FORMAT (
' Updating ',a)
476 930
FORMAT (
' First updating ',a)
477 950
FORMAT (
' Past last ',a)
480 9000
FORMAT (
' TEST WMUPDT : INPUT : ',i4,i10.8,i7.6, &
481 ' <============================')
482 9001
FORMAT (
' TEST WMUPDT : ',a2,1x,a3,3x, 2(i10.8,i7.6))
483 9002
FORMAT (
' ',i2,1x,a3,l3,17x,1(i10.8,i7.6))
484 9003
FORMAT (
' ',i2,1x,a3,l3, 2(i10.8,i7.6))
485 9004
FORMAT (
' ',2x,1x,a3,3x,2i10 )
486 9010
FORMAT (
' TEST WMUPDT : J, FLAG, INPMAP : ',i2,l2,i4)
487 9011
FORMAT (
' TEST WMUPDT : ',a,
', DTTST = ',e10.3,2x,i9.8,i7.6)
488 9020
FORMAT (
' TEST WMUPDT : FORCING INPUT FROM FILE & DEFINED ON THE NATIVE GRID')
489 9030
FORMAT (
' TEST WMUPDT : FORCING INPUT FROM FILE & DEFINED ON INPUT GRID',i4)
490 9031
FORMAT (
' TEST WMUPDT : J =',i4,3xa,
', DTTST = ', &
492 9040
FORMAT (
' TEST WMUPDT : FORCING INPUT FROM CPL & DEFINED ON THE NATIVE GRID')
493 9050
FORMAT (
' TEST WMUPDT : FORCING INPUT FROM CPL & DEFINED ON INPUT GRID',i4)
494 9070
FORMAT (
' TEST WMUPDT : ',a2,1x,a3,3x, 3(i10.8,i7.6))
495 9071
FORMAT (
' ',i2,1x,a3,l3,17x,1(i10.8,i7.6))
496 9072
FORMAT (
' ',i2,1x,a3,l3, 2(i10.8,i7.6))
497 9073
FORMAT (
' ',i2,1x,a3,l3,17x,2(i10.8,i7.6))
515 SUBROUTINE wmupd1 ( IMOD, IDSTR, J, IERR )
596 uxn, uy0, uyn, rh0, rhn,
t0n,
t1n,
t2n, &
600 icep2, icep3, icep4, icep5
610 INTEGER,
INTENT(IN) :: IMOD, J
611 INTEGER,
INTENT(OUT) :: IERR
612 CHARACTER(LEN=3),
INTENT(IN) :: IDSTR
617 INTEGER :: MDSEN, DTIME(2), NDTNEW
620 INTEGER,
SAVE :: IENT = 0
628 CALL strace (ient,
'WMUPD1')
631 WRITE (
mdst,9000) imod, j
649 xxx, xxx, xxx,
ti1, xxx, xxx, icep1, ierr)
656 xxx, xxx, xxx,
ti2, xxx, xxx, icep2, ierr)
663 xxx, xxx, xxx,
ti3, xxx, xxx, icep3, ierr)
670 xxx, xxx, xxx,
ti4, xxx, xxx, icep4, ierr)
677 xxx, xxx, xxx,
ti5, xxx, xxx, icep5, ierr)
684 xxx, xxx, xxx,
tzn, xxx, xxx, mudd, ierr)
691 xxx, xxx, xxx,
ttn, xxx, xxx, mudt, ierr)
698 xxx, xxx, xxx,
tvn, xxx, xxx, mudv, ierr)
705 xxx, xxx, xxx,
tln, xxx, xxx, wlev, ierr)
706 IF ( ierr .LT. 0 )
fllstl = .true.
716 cx0, cy0, xxx,
tcn, cxn, cyn, xxx, ierr)
721 cx0, cy0, xxx,
tcn, cxn, cyn, xxx, ierr)
749 xxx, xxx, xxx,
tin, xxx , bergi, icei, ierr)
750 IF ( ierr .LT. 0 )
fllsti = .true.
757 ux0, uy0, xxx,
tun, uxn, uyn, xxx, ierr)
764 xxx, xxx, rh0,
trn, xxx, xxx, rhn, ierr)
765 IF ( ierr .LT. 0 )
fllstr = .true.
773 IF ( ierr .LT. 0 )
THEN
783 ndtnew,
data0, ierr )
792 IF ( ierr .LT. 0 )
THEN
802 ndtnew,
data1, ierr )
811 IF ( ierr .LT. 0 )
THEN
821 ndtnew,
data2, ierr )
850 9000
FORMAT (
' TEST WMUPD1 : INPUT : ',2i4)
869 SUBROUTINE wmupd2 ( IMOD, J, JMOD, IERR )
958 INTEGER,
INTENT(IN) :: IMOD, J, JMOD
959 INTEGER,
INTENT(OUT) :: IERR
964 INTEGER :: ICONSC, ICONSW, ICONSU
966 INTEGER,
SAVE :: IENT = 0
974 CALL strace (ient,
'WMUPD2')
978 WRITE (
mdst,9000) imod, j, jmod
1019 IF (
inputs(imod)%TFN(1,j) .GT. 0 )
THEN
1033 IF (
inputs(imod)%TFN(1,j) .GT. 0 )
THEN
1048 IF (
inputs(imod)%TFN(1,j) .GT. 0 )
THEN
1074 jmod,
inputs(jmod)%ICEP1, 0. )
1080 jmod,
inputs(jmod)%ICEP2, 0. )
1086 jmod,
inputs(jmod)%ICEP3, 0. )
1092 jmod,
inputs(jmod)%ICEP4, 0. )
1099 jmod,
inputs(jmod)%ICEP5, 0. )
1105 jmod,
inputs(jmod)%MUDD, 0. )
1111 jmod,
inputs(jmod)%MUDT, 0. )
1117 jmod,
inputs(jmod)%MUDV, 0. )
1123 jmod,
inputs(jmod)%WLEV, 0. )
1140 ( imod,
inputs(imod)%DTN, &
1141 jmod,
inputs(jmod)%DTN, 0. )
1147 jmod,
inputs(jmod)%ICEI, 0. )
1149 ( imod,
inputs(imod)%BERGI, &
1150 jmod,
inputs(jmod)%BERGI, 0. )
1189 IF (
inputs(imod)%TC0(1) .LT. 0 )
THEN
1211 IF (
inputs(imod)%TW0(1) .LT. 0 )
THEN
1229 ( imod,
inputs(imod)%DT0, &
1230 jmod,
inputs(jmod)%DT0, 0. )
1236 IF (
inputs(imod)%TU0(1) .LT. 0 )
THEN
1265 CALL extcde ( 2999 )
1270 1999
FORMAT (/
' *** ERROR WMUPD2: OPTION NOT YET IMPLEMENTED ***'/)
1273 9000
FORMAT (
' TEST WMUPD2 : INPUT : ',3i4)
1274 9001
FORMAT (
' TEST WMUPD2 : TIME OF IMOD : ',i9.8,1x,i6.6/ &
1275 ' TIME OF JMOD : ',i9.8,1x,i6.6/ &
1276 ' ENDING TIME : ',i9.8,1x,i6.6)
1277 9010
FORMAT (
' TEST WMUPD2 : SHIFTING ',i1,
' TIME = ',i8.8,i7.6)
1278 9011
FORMAT (
' TEST WMUPD2 : NO DATA FOR ',i1,
' TO SHIFT')
1279 9020
FORMAT (
' TEST WMUPD2 : PROCESSING ',i1,
' TIME = ',i8.8,i7.6)
1280 9030
FORMAT (
' TEST WMUPD2 : INITIAL FIELD FOR ',i1, &
1281 ' TIME = ',i8.8,i7.6)
1304 SUBROUTINE wmupdv ( IMOD, VX, VY, JMOD, VXI, VYI, UNDEF, CONSTP )
1401 INTEGER,
INTENT(IN) :: IMOD, JMOD, CONSTP
1402 REAL,
INTENT(OUT) :: VX(NX,NY), VY(NX,NY)
1403 REAL,
INTENT(IN) :: VXI(GRIDS(JMOD)%NX,GRIDS(JMOD)%NY), &
1404 VYI(GRIDS(JMOD)%NX,GRIDS(JMOD)%NY), &
1410 INTEGER :: IXO, IYO, IX, IY, IXF0, IXFN, IYF0, &
1411 IYFN, IXS0, IXSN, IYS0, IYSN, IXS, &
1412 MXA, MYA, J, J1, J2, IXC, IYC, JJ, &
1414 INTEGER :: NPOIX, NPOIY, I, IFIELDS,CURVI
1417 INTEGER,
SAVE :: IENT = 0
1419 INTEGER,
ALLOCATABLE :: NXA(:,:), NYA(:,:)
1420 REAL :: XR, YR, R1, R2, RT, XFL, XFR, XSL, &
1421 XSR, YFL, YFR, YSL, YSR
1422 REAL :: VXL, VYL, VA0, VA, VA2, FACTOR, &
1425 REAL :: LONC, LATC, SXYC, &
1426 XDI, DTOLER, VALUEX, VALUEY
1428 REAL,
ALLOCATABLE :: RXA(:,:), RYA(:,:)
1432 LOGICAL :: MAP1(NX,NY), MAP2(NX,NY), &
1435 INTEGER,
POINTER :: NXI, NYI, MAP(:,:), MAPI(:,:)
1436 REAL,
POINTER :: X0I, Y0I, SXI, SYI
1438 REAL,
POINTER :: HPFACI(:,:), HQFACI(:,:)
1439 DOUBLE PRECISION,
POINTER :: XGRDI(:,:), YGRDI(:,:), XGRDC(:,:), YGRDC(:,:)
1441 INTEGER,
POINTER :: ICLOSE
1442 REAL,
ALLOCATABLE :: XGRTMP(:),YGRTMP(:)
1444 CHARACTER(LEN=17) :: FORMAT1
1452 CALL strace (ient,
'WMUPDV')
1455 IF ( grids(imod)%GTYPE .EQ.
ungtype .OR. &
1456 grids(jmod)%GTYPE .EQ.
ungtype )
THEN
1457 WRITE (
mdse,
'(/2A)')
' *** ERROR WMUPDV: ', &
1458 'UNSTRUCTURED GRID SUPPORT NOT YET IMPLEMENTED ***'
1462 nxi => grids(jmod)%NX
1463 nyi => grids(jmod)%NY
1464 x0i => grids(jmod)%X0
1465 y0i => grids(jmod)%Y0
1466 sxi => grids(jmod)%SX
1467 syi => grids(jmod)%SY
1468 hpfaci => grids(jmod)%HPFAC
1469 hqfaci => grids(jmod)%HQFAC
1470 map => grids(imod)%MAPSTA
1471 mapi => grids(jmod)%MAPSTA
1472 iclose => grids(jmod)%ICLOSE
1476 ' NOT YET ADAPTED FOR TRIPOLE GRIDS. STOPPING NOW.'
1483 jmod, nxi, nyi, x0i, y0i, sxi, syi, undef
1492 IF ( grids(imod)%GTYPE .EQ.
clgtype .OR. &
1493 grids(jmod)%GTYPE .EQ.
clgtype )
THEN
1498 IF(curvi .EQ. 0)
THEN
1500 IF ( abs(
sx/sxi-1.) .LT. 1.e-3 .AND. &
1501 abs(
sy/syi-1.) .LT. 1.e-3 .AND. &
1502 abs(mod((abs(
x0-x0i))/
sx+0.5,1.)-0.5) .LT. 1.e-2 .AND. &
1503 abs(mod((abs(
y0-y0i))/
sy+0.5,1.)-0.5) .LT. 1.e-2 )
THEN
1508 ixo = nint((
x0-x0i)/
sx)
1516 ixf0 = max( 1 , 1-ixo )
1517 ixfn = min( nx , nxi-ixo )
1518 ixs0 = max( 1 , 1+ixo )
1519 ixsn = ixs0 + ixfn - ixf0
1522 iyo = nint((
y0-y0i)/
sy)
1524 iyf0 = max( 1 , 1-iyo )
1525 iyfn = min( ny , nyi-iyo )
1526 iys0 = max( 1 , 1+iyo )
1527 iysn = iys0 + iyfn - iyf0
1530 WRITE (
mdst,9010) ixo, iyo, ixf0, ixfn, iyf0, iyfn, &
1531 ixs0, ixsn, iys0, iysn
1539 ixs = 1 + nint( mod( &
1540 1080.+
x0+(real(ix)-0.5)*
sx-x0i , 360. ) /
sx - 0.5 )
1541 IF ( ixs .GT. nxi ) cycle
1545 vx(ix,iyf0:iyfn) = vxi(ixs,iys0:iysn)
1546 vy(ix,iyf0:iyfn) = vyi(ixs,iys0:iysn)
1560 IF ( grids(imod)%GTYPE .EQ.
clgtype .OR. &
1561 grids(jmod)%GTYPE .EQ.
clgtype )
THEN
1563 xgrdi => grids(jmod)%XGRD
1564 ygrdi => grids(jmod)%YGRD
1567 xgrdc => grids(imod)%XGRD
1568 ygrdc => grids(imod)%YGRD
1576 ALLOCATE ( nxa(nx,0:mxa) , rxa(nx,mxa) )
1579 ALLOCATE ( nya(ny,0:mya) , rya(ny,mya) )
1586 ALLOCATE (xgrtmp(nxi),ygrtmp(nyi))
1587 xgrtmp=real(xgrdi(1,:))
1588 ygrtmp=real(ygrdi(:,1))
1594 lonc=real(xgrdc(j,i))
1595 latc=real(ygrdc(j,i))
1598 vxi,vyi,lonc,latc,dtoler,valuex,valuey)
1607 DEALLOCATE (xgrtmp, ygrtmp)
1615 IF (
sx/sxi .LT. 1.0001 )
THEN
1618 mxa = 2 + int(
sx/sxi)
1622 WRITE (
mdst,9020)
'X'
1625 WRITE (format1,
'(A,I2,A,I2,A)')
"'(10X,",mxa+1,
'I5,',mxa+1,
"F6.2)'"
1626 WRITE (
mdst,9021) nx, mxa
1629 ALLOCATE ( nxa(nx,0:mxa) , rxa(nx,mxa) )
1633 IF ( mxa .EQ. 2 )
THEN
1638 ( 1080.+
x0+real(ix-1)*
sx-x0i , 360. ) / sxi
1640 xr = 1. + (
x0+real(ix-1)*
sx - x0i ) / sxi
1642 IF ( xr.GT.0. )
THEN
1645 r2 = max( 0. , xr-real(j1) )
1648 j1 = 1 + mod(j1-1,nxi)
1649 j2 = 1 + mod(j2-1,nxi)
1651 IF ( j1.GE.1 .AND. j1.LE.nxi .AND. r1.GT.0.05 )
THEN
1652 nxa(ix,0) = nxa(ix,0) + 1
1653 nxa(ix,nxa(ix,0)) = j1
1654 rxa(ix,nxa(ix,0)) = r1
1656 IF ( j2.GE.1 .AND. j2.LE.nxi .AND. r2.GT.0.05 )
THEN
1657 nxa(ix,0) = nxa(ix,0) + 1
1658 nxa(ix,nxa(ix,0)) = j2
1659 rxa(ix,nxa(ix,0)) = r2
1661 IF ( nxa(ix,0) .GT. 0 )
THEN
1662 rt = sum( rxa(ix,:) )
1663 IF ( rt .LT. 0.7 )
THEN
1675 xfl =
x0 + real(ix-1)*
sx - 0.5*
sx
1676 xfr =
x0 + real(ix-1)*
sx + 0.5*
sx
1678 ixc = 1 + nint( mod( &
1679 1080.+
x0+real(ix-1)*
sx-x0i , 360. ) / sxi )
1680 ixs0 = ixc - 1 - mxa/2
1681 ixsn = ixc + 1 + mxa/2
1683 ixc = nint( 1. + (
x0+real(ix-1)*
sx - x0i ) / sxi )
1684 ixs0 = max( 1 , ixc - 1 - mxa/2 )
1685 ixsn = min( nxi , ixc + 1 + mxa/2 )
1690 IF ( iclose.NE.
iclose_none ) jj = 1 + mod(j-1+nxi,nxi)
1691 IF ( jj.LT.1 .OR. jj.GT. nxi ) cycle
1692 ixc = nint((0.5*(xfl+xfr)-x0i-real(jj-1)*sxi)/360.)
1693 IF ( ixc .NE. 0 )
THEN
1694 xfl = xfl - real(ixc) * 360.
1695 xfr = xfr - real(ixc) * 360.
1700 xsl = max( xfl , x0i + real(jj-1)*sxi - 0.5*sxi )
1701 xsr = min( xfr , x0i + real(jj-1)*sxi + 0.5*sxi )
1702 r1 = max( 0. , xsr - xsl ) /
sx
1703 IF ( r1 .GT. 0 )
THEN
1704 nxa(ix,0) = nxa(ix,0) + 1
1705 nxa(ix,nxa(ix,0)) = jj
1706 rxa(ix,nxa(ix,0)) = r1
1709 IF ( nxa(ix,0) .GT. 0 )
THEN
1710 rt = sum( rxa(ix,:) )
1711 IF ( rt .LT. 0.7 )
THEN
1722 IF ( nxa(ix,0) .GT. 0 )
WRITE (
mdst,format1) &
1723 ix, nxa(ix,1:mxa), rxa(ix,1:mxa), sum(rxa(ix,1:mxa))
1729 IF (
sy/syi .LT. 1.0001 )
THEN
1732 mya = 2 + int(
sy/syi)
1736 WRITE (
mdst,9020)
'Y'
1739 format1 =
'(10X, I5, F6.2)'
1740 WRITE (format1,
'(A,I2,A,I2,A)')
"'(10X,",mya+1,
'I5,',mya+1,
"F6.2)'"
1741 WRITE (
mdst,9021) ny, mya
1744 ALLOCATE ( nya(ny,0:mya) , rya(ny,mya) )
1748 IF ( mya .EQ. 2 )
THEN
1751 yr = 1. + (
y0+real(iy-1)*
sy - y0i ) / syi
1752 IF ( yr.GT.0. )
THEN
1755 r2 = max( 0. , yr-real(j1) )
1757 IF ( j1.GE.1 .AND. j1.LE.nyi .AND. r1.GT.0.05 )
THEN
1758 nya(iy,0) = nya(iy,0) + 1
1759 nya(iy,nya(iy,0)) = j1
1760 rya(iy,nya(iy,0)) = r1
1762 IF ( j2.GE.1 .AND. j2.LE.nyi .AND. r2.GT.0.05 )
THEN
1763 nya(iy,0) = nya(iy,0) + 1
1764 nya(iy,nya(iy,0)) = j2
1765 rya(iy,nya(iy,0)) = r2
1767 IF ( nya(iy,0) .GT. 0 )
THEN
1768 rt = sum( rya(iy,:) )
1769 IF ( rt .LT. 0.7 )
THEN
1780 yfl =
y0 + real(iy-1)*
sy - 0.5*
sy
1781 yfr =
y0 + real(iy-1)*
sy + 0.5*
sy
1782 iyc = nint( 1. + (
y0+real(iy-1)*
sy - y0i ) / syi )
1783 iys0 = max( 1 , iyc - 1 - mya/2 )
1784 iysn = min( nyi , iyc + 1 + mya/2 )
1786 ysl = max( yfl , y0i + real(j-1)*syi - 0.5*syi )
1787 ysr = min( yfr , y0i + real(j-1)*syi + 0.5*syi )
1788 r1 = max( 0. , ysr - ysl ) /
sy
1789 IF ( r1 .GT. 0 )
THEN
1790 nya(iy,0) = nya(iy,0) + 1
1791 nya(iy,nya(iy,0)) = j
1792 rya(iy,nya(iy,0)) = r1
1795 IF ( nya(iy,0) .GT. 0 )
THEN
1796 rt = sum( rya(iy,:) )
1797 IF ( rt .LT. 0.7 )
THEN
1811 IF ( nya(iy,0) .GT. 0 )
WRITE (
mdst,format1) &
1812 iy, nya(iy,1:mya), rya(iy,1:mya), sum(rya(iy,1:mya))
1824 IF ( nxa(ix,0) .EQ. 0 ) cycle
1826 IF ( nya(iy,0) .EQ. 0 ) cycle
1827 IF ( map(iy,ix).NE.0 )
THEN
1837 IF ( mapi(jy,jx) .NE. 0 )
THEN
1838 wl = rxa(ix,j1) * rya(iy,j2)
1840 vxl = vxl + wl * vxi(jx,jy)
1841 vyl = vyl + wl * vyi(jx,jy)
1842 va = va + wl * sqrt &
1843 ( vxi(jx,jy)**2 + vyi(jx,jy)**2 )
1845 ( vxi(jx,jy)**2 + vyi(jx,jy)**2 )
1849 IF ( wtot .LT. 0.05 )
THEN
1850 map1(ix,iy) = .true.
1852 map2(ix,iy) = .true.
1856 va2 = sqrt( va2 / wtot )
1857 va0 = sqrt( vxl**2 + vyl**2 )
1858 IF ( constp .EQ. 1 )
THEN
1859 factor = min( 1.25 , va/max(1.e-7,va0) )
1860 ELSE IF ( constp .EQ. 2 )
THEN
1861 factor = min( 1.25 , va2/max(1.e-7,va0) )
1863 vx(ix,iy) = factor * vxl
1864 vy(ix,iy) = factor * vyl
1878 iclose => grids(imod)%ICLOSE
1881 IF ( jj .GT.
swpmax )
EXIT
1886 WRITE (
mdst,9023) jj
1890 IF ( map1(ix,iy) )
THEN
1896 IF ( (j2.GT.1 .AND. j2.LE.nx) .OR. iclose.NE.
iclose_none )
THEN
1897 jx = 1 + mod(nx+j2-1,nx)
1899 IF ( jy.GT.1 .AND. jy.LE.ny )
THEN
1900 IF ( map2(jx,jy) )
THEN
1901 vxl = vxl + vx(jx,jy)
1902 vyl = vyl + vy(jx,jy)
1911 IF ( jx.GT.1 .AND. jx.LE.nx )
THEN
1913 IF ( jy.GT.1 .AND. jy.LE.ny )
THEN
1914 IF ( map2(jx,jy) )
THEN
1915 vxl = vxl + vx(jx,jy)
1916 vyl = vyl + vy(jx,jy)
1924 IF ( j1 .GT. 0 )
THEN
1925 vx(ix,iy) = vxl / real(j1)
1926 vy(ix,iy) = vyl / real(j1)
1927 map1(ix,iy) = .false.
1928 map3(ix,iy) = .true.
1935 map2 = map2 .OR. map3
1944 DEALLOCATE ( nxa, nya, rxa, rya )
1951 9000
FORMAT (
' TEST WMUPDV : GRID INFORMATION : '/ &
1954 ' UNDEFINED = ',e10.3)
1955 9010
FORMAT (
' TEST WMUPDV : COINCIDING GRIDS, OFFSETS :',2i6/ &
1956 ' TARGET GRID RANGES :',4i6/ &
1957 ' SOURCE GRID RANGES :',4i6)
1958 9020
FORMAT (
' TEST WMUPDV : WEIGHTS FOR ',a,
' INTERPOATION')
1961 9021
FORMAT (
' TEST WMUPDV : ARAY DIMENSIONED AS : ',2i6)
1964 9022
FORMAT (
' TEST WMUPDV : RECONCILING MASKS')
1965 9023
FORMAT (
' SWEEP NR ',i4)
1985 SUBROUTINE wmupds ( IMOD, FD, JMOD, FDI, UNDEF )
2079 INTEGER,
INTENT(IN) :: IMOD, JMOD
2080 REAL,
INTENT(OUT) :: FD(NX,NY)
2081 REAL,
INTENT(IN) :: FDI(GRIDS(JMOD)%NX,GRIDS(JMOD)%NY), &
2087 INTEGER :: IXO, IYO, IX, IY, IXF0, IXFN, IYF0, &
2088 IYFN, IXS0, IXSN, IYS0, IYSN, IXS, &
2089 MXA, MYA, J, J1, J2, IXC, IYC, JJ, &
2092 INTEGER :: NPOIX, NPOIY, I, CURVI
2095 INTEGER,
SAVE :: IENT = 0
2097 INTEGER,
ALLOCATABLE :: NXA(:,:), NYA(:,:)
2098 REAL :: XR, YR, R1, R2, RT, XFL, XFR, XSL, &
2099 XSR, YFL, YFR, YSL, YSR
2100 REAL :: FDL, WTOT, WL
2102 REAL :: LONC, LATC, SXYC, &
2103 XDI, DTOLER, VALUEINTER
2105 REAL,
ALLOCATABLE :: RXA(:,:), RYA(:,:)
2108 LOGICAL :: MAP1(NX,NY), MAP2(NX,NY), &
2111 INTEGER,
POINTER :: NXI, NYI, MAP(:,:), MAPI(:,:)
2113 DOUBLE PRECISION,
POINTER :: XGRDI(:,:), YGRDI(:,:), XGRDC(:,:), YGRDC(:,:)
2114 REAL,
POINTER :: HPFACI(:,:), HQFACI(:,:)
2116 REAL,
POINTER :: X0I, Y0I, SXI, SYI
2117 INTEGER,
POINTER :: ICLOSE
2119 CHARACTER(LEN=17) :: FORMAT1
2127 CALL strace (ient,
'WMUPDS')
2130 nxi => grids(jmod)%NX
2131 nyi => grids(jmod)%NY
2132 x0i => grids(jmod)%X0
2133 y0i => grids(jmod)%Y0
2134 sxi => grids(jmod)%SX
2135 syi => grids(jmod)%SY
2136 hpfaci => grids(jmod)%HPFAC
2137 hqfaci => grids(jmod)%HQFAC
2138 map => grids(imod)%MAPSTA
2139 mapi => grids(jmod)%MAPSTA
2140 iclose => grids(jmod)%ICLOSE
2144 ' NOT YET ADAPTED FOR TRIPOLE GRIDS. STOPPING NOW.'
2150 jmod, nxi, nyi, x0i, y0i, sxi, syi, undef
2158 IF ( grids(imod)%GTYPE .EQ.
clgtype .OR. &
2159 grids(jmod)%GTYPE .EQ.
clgtype )
THEN
2165 IF(curvi .EQ. 0)
THEN
2166 IF ( abs(
sx/sxi-1.) .LT. 1.e-3 .AND. &
2167 abs(
sy/syi-1.) .LT. 1.e-3 .AND. &
2168 abs(mod((abs(
x0-x0i))/
sx+0.5,1.)-0.5) .LT. 1.e-2 .AND. &
2169 abs(mod((abs(
y0-y0i))/
sy+0.5,1.)-0.5) .LT. 1.e-2 )
THEN
2173 ixo = nint((
x0-x0i)/
sx)
2181 ixf0 = max( 1 , 1-ixo )
2182 ixfn = min( nx , nxi-ixo )
2183 ixs0 = max( 1 , 1+ixo )
2184 ixsn = ixs0 + ixfn - ixf0
2187 iyo = nint((
y0-y0i)/
sy)
2189 iyf0 = max( 1 , 1-iyo )
2190 iyfn = min( ny , nyi-iyo )
2191 iys0 = max( 1 , 1+iyo )
2192 iysn = iys0 + iyfn - iyf0
2195 WRITE (
mdst,9010) ixo, iyo, ixf0, ixfn, iyf0, iyfn, &
2196 ixs0, ixsn, iys0, iysn
2203 ixs = 1 + nint( mod( &
2204 1080.+
x0+(real(ix)-0.5)*
sx-x0i , 360. ) /
sx - 0.5 )
2205 IF ( ixs .GT. nxi ) cycle
2206 fd(ix,iyf0:iyfn) = fdi(ixs,iys0:iysn)
2211 fd(ix,iyf0:iyfn) = fdi(ixs,iys0:iysn)
2227 IF ( grids(imod)%GTYPE .EQ.
clgtype .OR. &
2228 grids(jmod)%GTYPE .EQ.
clgtype )
THEN
2231 xgrdi => grids(jmod)%XGRD
2232 ygrdi => grids(jmod)%YGRD
2235 xgrdc => grids(imod)%XGRD
2236 ygrdc => grids(imod)%YGRD
2243 ALLOCATE ( nxa(nx,0:mxa) , rxa(nx,mxa) )
2246 ALLOCATE ( nya(ny,0:mya) , rya(ny,mya) )
2255 lonc=real(xgrdc(j,i))
2256 latc=real(ygrdc(j,i))
2260 valueinter=
interpolate(nxi,real(xgrdi(1,:)),nyi,real(ygrdi(:,1)), &
2261 fdi,lonc,latc,dtoler)
2272 IF (
sx/sxi .LT. 1.0001 )
THEN
2275 mxa = 2 + int(
sx/sxi)
2279 WRITE (
mdst,9020)
'X'
2282 format1 =
'(10X, I5, F6.2)'
2283 WRITE (format1,
'(A,I2,A,I2,A)')
"'(10X,",mxa+1,
'I5,',mxa+1,
"F6.2)'"
2284 WRITE (
mdst,9021) nx, mxa
2287 ALLOCATE ( nxa(nx,0:mxa) , rxa(nx,mxa) )
2292 IF ( mxa .EQ. 2 )
THEN
2297 ( 1080.+
x0+real(ix-1)*
sx-x0i , 360. ) / sxi
2299 xr = 1. + (
x0+real(ix-1)*
sx - x0i ) / sxi
2301 IF ( xr.GT.0. )
THEN
2304 r2 = max( 0. , xr-real(j1) )
2307 j1 = 1 + mod(j1-1,nxi)
2308 j2 = 1 + mod(j2-1,nxi)
2310 IF ( j1.GE.1 .AND. j1.LE.nxi .AND. r1.GT.0.05 )
THEN
2311 nxa(ix,0) = nxa(ix,0) + 1
2312 nxa(ix,nxa(ix,0)) = j1
2313 rxa(ix,nxa(ix,0)) = r1
2315 IF ( j2.GE.1 .AND. j2.LE.nxi .AND. r2.GT.0.05 )
THEN
2316 nxa(ix,0) = nxa(ix,0) + 1
2317 nxa(ix,nxa(ix,0)) = j2
2318 rxa(ix,nxa(ix,0)) = r2
2320 IF ( nxa(ix,0) .GT. 0 )
THEN
2321 rt = sum( rxa(ix,:) )
2322 IF ( rt .LT. 0.7 )
THEN
2334 xfl =
x0 + real(ix-1)*
sx - 0.5*
sx
2335 xfr =
x0 + real(ix-1)*
sx + 0.5*
sx
2337 ixc = 1 + nint( mod( &
2338 1080.+
x0+real(ix-1)*
sx-x0i , 360. ) / sxi )
2339 ixs0 = ixc - 1 - mxa/2
2340 ixsn = ixc + 1 + mxa/2
2342 ixc = nint( 1. + (
x0+real(ix-1)*
sx - x0i ) / sxi )
2343 ixs0 = max( 1 , ixc - 1 - mxa/2 )
2344 ixsn = min( nxi , ixc + 1 + mxa/2 )
2348 IF ( iclose.NE.
iclose_none ) jj = 1 + mod(j-1+nxi,nxi)
2349 IF ( jj.LT.1 .OR. jj.GT. nxi ) cycle
2350 ixc = nint((0.5*(xfl+xfr)-x0i-real(jj-1)*sxi)/360.)
2351 IF ( ixc .NE. 0 )
THEN
2352 xfl = xfl - real(ixc) * 360.
2353 xfr = xfr - real(ixc) * 360.
2358 xsl = max( xfl , x0i + real(jj-1)*sxi - 0.5*sxi )
2359 xsr = min( xfr , x0i + real(jj-1)*sxi + 0.5*sxi )
2360 r1 = max( 0. , xsr - xsl ) /
sx
2361 IF ( r1 .GT. 0 )
THEN
2362 nxa(ix,0) = nxa(ix,0) + 1
2363 nxa(ix,nxa(ix,0)) = jj
2364 rxa(ix,nxa(ix,0)) = r1
2367 IF ( nxa(ix,0) .GT. 0 )
THEN
2368 rt = sum( rxa(ix,:) )
2369 IF ( rt .LT. 0.7 )
THEN
2380 IF ( nxa(ix,0) .GT. 0 )
WRITE (
mdst,format1) &
2381 ix, nxa(ix,1:mxa), rxa(ix,1:mxa), sum(rxa(ix,1:mxa))
2387 IF (
sy/syi .LT. 1.0001 )
THEN
2390 mya = 2 + int(
sy/syi)
2394 WRITE (
mdst,9020)
'Y'
2397 WRITE (format1,
'(A,I2,A,I2,A)')
"'(10X,",mya+1,
'I5,',mya+1,
"F6.2)'"
2398 WRITE (
mdst,9021) ny, mya
2401 ALLOCATE ( nya(ny,0:mya) , rya(ny,mya) )
2406 IF ( mya .EQ. 2 )
THEN
2409 yr = 1. + (
y0+real(iy-1)*
sy - y0i ) / syi
2410 IF ( yr.GT.0. )
THEN
2413 r2 = max( 0. , yr-real(j1) )
2415 IF ( j1.GE.1 .AND. j1.LE.nyi .AND. r1.GT.0.05 )
THEN
2416 nya(iy,0) = nya(iy,0) + 1
2417 nya(iy,nya(iy,0)) = j1
2418 rya(iy,nya(iy,0)) = r1
2420 IF ( j2.GE.1 .AND. j2.LE.nyi .AND. r2.GT.0.05 )
THEN
2421 nya(iy,0) = nya(iy,0) + 1
2422 nya(iy,nya(iy,0)) = j2
2423 rya(iy,nya(iy,0)) = r2
2425 IF ( nya(iy,0) .GT. 0 )
THEN
2426 rt = sum( rya(iy,:) )
2427 IF ( rt .LT. 0.7 )
THEN
2438 yfl =
y0 + real(iy-1)*
sy - 0.5*
sy
2439 yfr =
y0 + real(iy-1)*
sy + 0.5*
sy
2440 iyc = nint( 1. + (
y0+real(iy-1)*
sy - y0i ) / syi )
2441 iys0 = max( 1 , iyc - 1 - mya/2 )
2442 iysn = min( nyi , iyc + 1 + mya/2 )
2444 ysl = max( yfl , y0i + real(j-1)*syi - 0.5*syi )
2445 ysr = min( yfr , y0i + real(j-1)*syi + 0.5*syi )
2446 r1 = max( 0. , ysr - ysl ) /
sy
2447 IF ( r1 .GT. 0 )
THEN
2448 nya(iy,0) = nya(iy,0) + 1
2449 nya(iy,nya(iy,0)) = j
2450 rya(iy,nya(iy,0)) = r1
2453 IF ( nya(iy,0) .GT. 0 )
THEN
2454 rt = sum( rya(iy,:) )
2455 IF ( rt .LT. 0.7 )
THEN
2468 IF ( nya(iy,0) .GT. 0 )
WRITE (
mdst,format1) &
2469 iy, nya(iy,1:mya), rya(iy,1:mya), sum(rya(iy,1:mya))
2479 IF ( nxa(ix,0) .EQ. 0 ) cycle
2481 IF ( nya(iy,0) .EQ. 0 ) cycle
2482 IF ( map(iy,ix).NE.0 )
THEN
2489 IF ( mapi(jy,jx) .NE. 0 )
THEN
2490 wl = rxa(ix,j1) * rya(iy,j2)
2492 fdl = fdl + wl * fdi(jx,jy)
2496 IF ( wtot .LT. 0.05 )
THEN
2497 map1(ix,iy) = .true.
2499 map2(ix,iy) = .true.
2514 iclose => grids(imod)%ICLOSE
2517 IF ( jj .GT.
swpmax )
EXIT
2522 WRITE (
mdst,9023) jj
2526 IF ( map1(ix,iy) )
THEN
2531 IF ( (j2.GT.1 .AND. j2.LE.nx) .OR. iclose.NE.
iclose_none )
THEN
2532 jx = 1 + mod(nx+j2-1,nx)
2534 IF ( jy.GT.1 .AND. jy.LE.ny )
THEN
2535 IF ( map2(jx,jy) )
THEN
2536 fdl = fdl + fd(jx,jy)
2545 IF ( jx.GT.1 .AND. jx.LE.nx )
THEN
2547 IF ( jy.GT.1 .AND. jy.LE.ny )
THEN
2548 IF ( map2(jx,jy) )
THEN
2549 fdl = fdl + fd(jx,jy)
2557 IF ( j1 .GT. 0 )
THEN
2558 fd(ix,iy) = fdl / real(j1)
2559 map1(ix,iy) = .false.
2560 map3(ix,iy) = .true.
2567 map2 = map2 .OR. map3
2575 DEALLOCATE ( nxa, nya, rxa, rya )
2582 9000
FORMAT (
' TEST WMUPDS : GRID INFORMATION : '/ &
2585 ' UNDEFINED = ',e10.3)
2586 9010
FORMAT (
' TEST WMUPDS : COINCIDING GRIDS, OFFSETS :',2i6/ &
2587 ' TARGET GRID RANGES :',4i6/ &
2588 ' SOURCE GRID RANGES :',4i6)
2589 9020
FORMAT (
' TEST WMUPDS : WEIGHTS FOR ',a,
' INTERPOATION')
2592 9021
FORMAT (
' TEST WMUPDS : ARAY DIMENSIONED AS : ',2i6)
2595 9022
FORMAT (
' TEST WMUPDS : RECONCILING MASKS')
2596 9023
FORMAT (
' SWEEP NR ',i4)
2687 INTEGER,
INTENT(IN) :: length
2688 REAL,
DIMENSION(LENGTH),
INTENT(IN) :: array
2689 REAL,
INTENT(IN) :: value
2690 REAL,
INTENT(IN),
OPTIONAL :: delta
2694 INTEGER :: left, middle, right
2700 IF (left > right)
THEN
2703 middle = nint((left+right) / 2.0)
2704 IF ( abs(array(middle) -
VALUE) <= delta)
THEN
2707 ELSE IF (array(middle) >
VALUE)
THEN
2742 REAL function
interpolate(x_len,xarray,y_len,yarray,func, &
2826 INTEGER,
INTENT(IN) :: x_len, y_len
2827 REAL,
DIMENSION(X_LEN),
INTENT(IN) :: xarray
2828 REAL,
DIMENSION(Y_LEN),
INTENT(IN) :: yarray
2829 REAL,
DIMENSION(X_LEN, Y_LEN),
INTENT(IN) :: func
2830 REAL,
INTENT(IN) :: x,y
2831 REAL,
INTENT(IN),
OPTIONAL :: delta
2832 REAL :: denom, x1, x2, y1, y2
2838 IF (inx .GE. x_len)
THEN
2841 IF (jnx .GE. y_len)
THEN
2850 denom = (x2 - x1)*(y2 - y1)
2853 func(inx+1,jnx)*(x-x1)*(y2-y) + &
2854 func(inx,jnx+1)*(x2-x)*(y-y1)+ &
2855 func(inx+1, jnx+1)*(x-x1)*(y-y1))/denom
2885 FUNC2,X,Y,DELTA,VAL1,VAL2)
2965 INTEGER,
INTENT(IN) :: X_LEN, Y_LEN
2966 REAL,
DIMENSION(X_LEN),
INTENT(IN) :: XARRAY
2967 REAL,
DIMENSION(Y_LEN),
INTENT(IN) :: YARRAY
2968 REAL,
DIMENSION(X_LEN, Y_LEN),
INTENT(IN) :: FUNC1, FUNC2
2969 REAL,
INTENT(IN) :: X,Y
2970 REAL,
INTENT(IN),
OPTIONAL :: DELTA
2971 REAL,
INTENT(OUT) :: VAL1,VAL2
2973 REAL :: DENOM, X1, X2, Y1, Y2,C1,C2,C3,C4
2979 IF (inx .GE. x_len)
THEN
2982 IF (jnx .GE. y_len)
THEN
2991 denom = (x2 - x1)*(y2 - y1)
2996 val1 = (func1(inx,jnx) *c1 + func1(inx+1,jnx) *c2 + &
2997 func1(inx,jnx+1)*c3 + func1(inx+1,jnx+1)*c4)/denom
2999 val2 = (func2(inx,jnx) *c1 + func2(inx+1,jnx) *c2 + &
3000 func2(inx,jnx+1)*c3 + func2(inx+1,jnx+1)*c4)/denom
3026 REAL FUNCTION AVERAGING(X_LEN,XARRAY,Y_LEN,YARRAY,FUNC, &
3050 INTEGER x_len, y_len, inxend, inyend, npx,npy
3051 REAL,
DIMENSION(X_LEN) :: xarray
3052 REAL,
DIMENSION(Y_LEN) :: yarray
3053 REAL,
DIMENSION(X_LEN, Y_LEN) :: func
3056 REAL :: x1, x2, y1, y2, sum
3057 INTEGER :: inx,iny, initialx, initialy
3058 INTEGER :: infinx, infiny,icount,i,j
3072 IF (inx-npx .LT. 1)
THEN
3078 IF (inx+inxend .GT. x_len)
THEN
3084 IF (iny-npy .LT. 1)
THEN
3090 IF (iny+inyend .GT. y_len)
THEN
3099 DO j=initialy,infiny
3100 DO i=initialx,infinx
3105 averaging=sum/real(icount)