Determine relation to higher ranked grids for each grid.
Base map set in WMGLOW, supplemental data computed here. Map averaging information for higher ranked grid to lower ranked grid.
1270 INTEGER :: GDST, IJ, IDST, JDST, GSRC, JJ, IB, ISEA, &
1271 JSEA, IDSTLA, IDSTHA, JDSTLA, JDSTHA, &
1272 ISRC, JSRC, ISRCL, ISRCH, JSRCL, JSRCH, NIT, &
1273 NRTOT, NROK, JF, JR, NLMAX, ISPROC, ISPRO2, &
1274 IREC, ISND, ITMP,ILOC
1276 INTEGER :: NLMAX_SCRIP
1286 INTEGER,
SAVE :: IENT = 0
1289 INTEGER,
ALLOCATABLE :: IDSTL(:), IDSTH(:), JDSTL(:), JDSTH(:), &
1291 I1(:,:), I2(:,:), I3(:), I4(:), &
1293 INTEGER,
ALLOCATABLE :: NX_BEG(:), NX_END(:)
1295 INTEGER,
ALLOCATABLE :: NX_SIZE(:), IRQ(:), MSTAT(:,:)
1298 INTEGER :: IM, NX_REM, TAG, NRQ
1301 INTEGER,
ALLOCATABLE :: TMPINT_OM(:,:),TMPINT(:,:)
1302 REAL,
ALLOCATABLE :: TMPRL_OM(:,:) ,TMPRL(:,:)
1303 REAL,
ALLOCATABLE :: BDIST_OM(:) ,BDIST(:)
1304 INTEGER :: NR0 , NR1 , NR2 , NRL , NLOC
1305 INTEGER :: NR0_OM, NR1_OM, NR2_OM, NRL_OM, NLOC_OM
1308 INTEGER,
ALLOCATABLE :: LTAG(:)
1311 REAL :: FACTOR, STX, STY, STXY, NEWVAL, &
1312 XL, XH, YL, YH, XA, YA, DXC, JD, &
1317 LOGICAL,
ALLOCATABLE :: GRIDOK(:), &
1318 STMASK(:,:), MASKI(:,:), TMPLOG(:)
1320 INTEGER :: JBND,IBND
1326 INTEGER :: NJDST,NIDST,KDST
1327 INTEGER :: NJSRC,NISRC,KSRC
1328 INTEGER :: IPNT,ICOUNT,IPNT2
1329 INTEGER :: DST_GRID_SIZE,ISTOP,JTMP
1331 REAL :: DX_MAX_GDST,DY_MAX_GDST
1332 REAL :: DX_MIN_GSRC,DY_MIN_GSRC
1336 TYPE(WEIGHT_DATA),
POINTER :: WGTDATA(:)
1338 TYPE(ALLWGT),
ALLOCATABLE :: ALLWGTS(:)
1339 LOGICAL :: L_MASTER = .true.
1340 LOGICAL :: L_READ = .false.
1341 LOGICAL :: L_WRITE = .false.
1344 INTEGER :: IMPROC_ASSIGN
1345 CHARACTER(LEN=80) :: interp_file1, interp_file_test
1346 CHARACTER(LEN=3) :: cdst, csrc
1347 LOGICAL,
ALLOCATABLE :: LGRDREAD(:,:)
1348 LOGICAL,
ALLOCATABLE :: LGRDWRITE(:,:)
1349 INTEGER :: NGRDRANK(2)
1352 LOGICAL :: LSCRIP=.false.
1355 LOGICAL :: LSCRIPNC=.false.
1359 LOGICAL :: L_STOP = .false.
1361 LOGICAL :: T38=.false.
1366 LOGICAL :: ALL_REGULAR=.true.
1368 LOGICAL :: DO_CHECKING=.false.
1373 LOGICAL :: OLD_METHOD=.false.
1378 LOGICAL :: LMPIBDI=.false.
1379 LOGICAL :: CALLED_SCRIP=.false.
1383 INTEGER :: ITRI, IM1, IM2, IT, JT, IsFirst
1384 REAL :: DIST_MIN, DIST_MAX, eDist
1387 CHARACTER(LEN=1),
ALLOCATABLE :: MAPST(:,:)
1391 CHARACTER (LEN=10) :: CDATE_TIME(3)
1392 INTEGER :: DATE_TIME(8)
1393 INTEGER :: ELAPSED_TIME, BEG_TIME(10), END_TIME
1394 INTEGER :: NMYOUT=42
1395 CHARACTER (LEN=14) :: CMYOUT=
"myout00000.lis"
1396 CHARACTER (LEN=5) :: CRANK
1400 WRITE(crank,
"(I5.5)")
improc-1
1401 cmyout(6:10) = crank(1:5)
1405 CALL strace (ient,
'WMGHGH')
1412 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1413 beg_time(1) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1414 WRITE(nmyout,*)
"WMGHGH: START: 0 MSEC"
1421 IF ( .NOT.
ALLOCATED(
grdhgh) )
THEN
1439 INQUIRE(
file=
"SCRIP_STOP", exist=l_stop)
1444 ALLOCATE ( nx_beg(
nmproc), nx_end(
nmproc), stat=istat )
1445 check_alloc_status( istat )
1448 mstat(mpi_status_size,2*
nmproc), stat=istat )
1449 check_alloc_status( istat )
1456 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1457 beg_time(2) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1461 IF (
hgstge(gdst,gsrc)%INIT )
THEN
1462 IF (
hgstge(gdst,gsrc)%NREC .NE. 0 )
THEN
1468 check_dealloc_status( istat )
1470 IF (
hgstge(gdst,gsrc)%NSND .NE. 0 )
THEN
1472 hgstge(gdst,gsrc)%ISEND , &
1474 check_dealloc_status( istat )
1476 hgstge(gdst,gsrc)%NTOT = 0
1477 hgstge(gdst,gsrc)%NREC = 0
1478 hgstge(gdst,gsrc)%NRC1 = 0
1479 hgstge(gdst,gsrc)%NSND = 0
1480 hgstge(gdst,gsrc)%NSN1 = 0
1481 hgstge(gdst,gsrc)%NSMX = 0
1482 hgstge(gdst,gsrc)%INIT = .false.
1490 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1491 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1492 elapsed_time = end_time - beg_time(2)
1493 WRITE(nmyout,*)
"WMGHGH, LOOP 1 TOOK ", elapsed_time,
" MSEC"
1522 IF ( (.NOT.
flagll) .AND. all_regular .AND. lscrip )
THEN
1524 WRITE (
mdse,
'(/2A)')
'We will check SCRIP calculations ', &
1525 'against old method of calculating weights.'
1529 IF (do_checking .OR. (.NOT.lscrip)) old_method=.true.
1534 IF ( (.NOT.lscrip) .AND. (.NOT.all_regular) .AND. &
1537 WRITE (
mdse,
'(/3A)')
' *** ERROR WMGHGH: ', &
1538 'IRREGULAR or UNSTRUCTURED grid detected: this requires ', &
1558 IF (.NOT. l_stop)
THEN
1576 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1577 beg_time(3) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1578 elapsed_time = beg_time(3) - beg_time(1)
1579 WRITE(nmyout,*)
"WMGHGH, BEGINNING BOTTLENECK LOOP AT ", elapsed_time,
" MSEC"
1606 IF ( (
grank(gdst).NE.1) .AND. (
nbi.EQ.0) )
THEN
1608 WRITE (
mdse,
'(/2A)')
' WARNING in WMGHGH: ', &
1609 'NBI=0 AND RANK > 1 '
1615 IF ( (
nbi.EQ.0) .OR. (
grank(gdst).EQ.1) )
THEN
1633 ' Generating map with distances to boundary.'
1635 ALLOCATE (
mdatas(gdst)%MAPBDI(
ny,
nx), stat=istat )
1636 check_alloc_status( istat )
1644 IF (
nmproc .EQ. 1 )
THEN
1650 IF (nx_rem .GT. 0) nx_size(1) = nx_size(1) + 1
1651 nx_end(1) = nx_beg(1) + nx_size(1) - 1
1653 nx_beg(im) = nx_end(im-1) + 1
1655 IF (im .LE. nx_rem) nx_size(im) = nx_size(im) + 1
1656 nx_end(im) = nx_beg(im) + nx_size(im) - 1
1657 nx_size(im-1) = nx_size(im-1) *
ny
1669 'Starting MAPBDI 1st loop.'
1672 IF(mod(idst,250).EQ.0)
THEN
1674 WRITE(
mdse,
'(4x,3(A,I5))')&
1675 'processing column ',idst,
' out of ',
nx, &
1678 WRITE(
mdse,
'(4x,2(A,I5))')&
1679 'processing column ',idst,
' out of ',
nx
1683 IF (
mapsta(jdst,idst) .EQ. 0 )
THEN
1685 ELSE IF ( abs(
mapsta(jdst,idst)) .EQ. 2 )
THEN
1689 mapbdi(jdst,idst) = 1.0e+10
1697 'Starting MAPBDI 2nd loop.'
1700 IF ( (mod(ibnd,25).EQ.0) .AND. &
1702 WRITE(
mdse,
'(4x,2(A,I5))') &
1703 'bnd. point ',ibnd,
' out of ',
nx
1706 IF ( abs(
mapsta(jbnd,ibnd)) .EQ. 2 )
THEN
1713 IF (abs(
mapsta(jdst,idst)) .EQ. 1)
THEN
1715 dd=factor*w3dist(
flagll,real(
xgrd(jdst,idst)), &
1716 REAL(YGRD(JDST,IDST)),
REAL(XGRD(JBND,IBND)), &
1717 REAL(YGRD(JBND,IBND)))
1725 dd=dd/ ( 0.58 *
grav )
1739 'Finished MAPBDI 2nd loop.'
1749 IF ( im .NE.
improc )
THEN
1753 irq(nrq), ierr_mpi )
1757 IF ( im .NE.
improc )
THEN
1761 irq(nrq), ierr_mpi )
1764 CALL mpi_waitall( nrq, irq, mpi_status_ignore, ierr_mpi )
1769 ' Finished generating map with distances to boundary.'
1827 check_alloc_status( istat )
1837 ALLOCATE( lgrdread(ngrdrank(1)-1, ngrdrank(2)), stat=istat )
1838 check_alloc_status( istat )
1839 ALLOCATE(lgrdwrite(ngrdrank(1)-1, ngrdrank(2)), stat=istat )
1840 check_alloc_status( istat )
1842 DO jj = 1,
grdhgh(gdst,0)
1843 IF (
grdhgh(gdst,0) .EQ. 0 )
THEN
1845 lgrdread(gdst,jj) = .false.
1846 lgrdwrite(gdst,jj) = .false.
1849 interp_file1 =
"rmp_src_to_dst_conserv_xxx_xxx.nc"
1850 WRITE(cdst,
"(I3.3)") gdst
1851 WRITE(csrc,
"(I3.3)") gsrc
1852 interp_file1(24:26) = csrc
1853 interp_file1(28:30) = cdst
1854 INQUIRE(
file=interp_file1, exist=l_read)
1856 lgrdread(gdst,jj) = l_read
1857 lgrdwrite(gdst,jj) = .NOT. l_read
1866 lowrank_grid :
DO gdst=1,
nrgrd
1869 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1870 beg_time(2) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1871 elapsed_time = beg_time(2) - beg_time(1)
1872 WRITE(nmyout,*)
"WMGHGH, LOOP LOWRANK_GRID, GDST= ", gdst,
" START: ", elapsed_time,
" MSEC"
1884 IF (
grdhgh(gdst,0) .EQ. 0 )
THEN
1909 WRITE(
mdse,*)
'SUBROUTINE WMGHGH IS'// &
1910 ' NOT YET ADAPTED FOR TRIPOLE GRIDS. STOPPING NOW.'
1914 ALLOCATE ( maptst(
ny,
nx), inflnd(
ny,
nx), stat=istat )
1915 check_alloc_status( istat )
1954 ALLOCATE ( allwgts(maxval(
grdhgh)), stat=istat )
1955 check_alloc_status( istat )
1963 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1964 beg_time(3) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1965 elapsed_time = beg_time(3) - beg_time(1)
1966 WRITE(nmyout,*)
"WMGHGH, LOOP JJ= ", jj,
" START: ", elapsed_time,
" MSEC"
1971 nisrc=
grids(gsrc)%NX
1972 njsrc=
grids(gsrc)%NY
1987 interp_file1 =
"rmp_src_to_dst_conserv_xxx_xxx.nc"
1988 WRITE(cdst,
"(I3.3)") gdst
1989 WRITE(csrc,
"(I3.3)") gsrc
1990 interp_file1(24:26) = csrc
1991 interp_file1(28:30) = cdst
1992 l_read = lgrdread(gdst, jj)
1995 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1996 beg_time(4) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1997 elapsed_time = beg_time(3) - beg_time(1)
1998 WRITE(nmyout,*)
"WMGHGH, SCRIP WRAPPER START: ", elapsed_time,
" MSEC"
2001 IF (l_stop) l_write = (
improc .EQ. improc_assign)
2005 IF(l_stop.AND.l_read)
THEN
2007 WRITE(
mdse,
'(A)')
'ERROR: You should either have SCRIP_STOP '// &
2008 'or remapping (.nc) files. Not both. We will exit now.'
2014 called_scrip=.false.
2018 IF ((.NOT. l_stop) .OR. ((.NOT. l_read) .AND. l_write))
THEN
2022 WRITE(
mdse,
'(A,2(I5),A,I5)')
'Calling SCRIP for GSRC,GDST = ', &
2023 gsrc,gdst,
' on processor ',
improc
2025 WRITE(
mdse,
'(A,2(I5))')
'Calling SCRIP interface for GSRC,GDST = ', &
2030 grids(gsrc)%GRIDSHIFT,l_write,l_read,t38)
2041 IF (.NOT. l_read)
THEN
2042 improc_assign = improc_assign + 1
2043 IF (improc_assign .GT.
nmproc) improc_assign = 1
2044 IF(called_scrip)
THEN
2046 dst_grid_size=nidst*njdst
2047 DO kdst=1,dst_grid_size
2048 DEALLOCATE(
wgtdata(kdst)%W, stat=istat )
2049 check_dealloc_status( istat )
2050 DEALLOCATE(
wgtdata(kdst)%K, stat=istat )
2051 check_dealloc_status( istat )
2053 DEALLOCATE(
wgtdata, stat=istat )
2054 check_dealloc_status( istat )
2061 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
2062 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
2063 elapsed_time = end_time - beg_time(4)
2064 WRITE(nmyout,*)
"WMGHGH, SCRIP WRAPPER, GSRC= ", gsrc,
" TOOK ", elapsed_time,
" MSEC"
2068 IF(.NOT.called_scrip)
THEN
2071 'should have cycled out by now. We will exit now.'
2083 dst_grid_size=nidst*njdst
2084 ALLOCATE(allwgts(gsrc)%WGTDATA(dst_grid_size),stat=istat)
2085 check_alloc_status( istat )
2086 DO kdst=1,dst_grid_size
2087 ALLOCATE(allwgts(gsrc)%WGTDATA(kdst) &
2088 %W(
wgtdata(kdst)%N),stat=istat)
2089 check_alloc_status( istat )
2090 ALLOCATE(allwgts(gsrc)%WGTDATA(kdst) &
2091 %K(
wgtdata(kdst)%N),stat=istat)
2092 check_alloc_status( istat )
2107 DO kdst=1,dst_grid_size
2108 allwgts(gsrc)%WGTDATA(kdst)%N=
wgtdata(kdst)%N
2109 allwgts(gsrc)%WGTDATA(kdst)%NR0=
wgtdata(kdst)%NR0
2110 allwgts(gsrc)%WGTDATA(kdst)%NR2=
wgtdata(kdst)%NR2
2111 allwgts(gsrc)%WGTDATA(kdst)%NRL=
wgtdata(kdst)%NRL
2113 allwgts(gsrc)%WGTDATA(kdst)%W(ipnt) &
2115 allwgts(gsrc)%WGTDATA(kdst)%K(ipnt) &
2127 DO kdst=1,dst_grid_size
2128 DEALLOCATE(
wgtdata(kdst)%W, stat=istat )
2129 check_dealloc_status( istat )
2130 DEALLOCATE(
wgtdata(kdst)%K, stat=istat )
2131 check_dealloc_status( istat )
2133 DEALLOCATE(
wgtdata, stat=istat )
2134 check_dealloc_status( istat )
2143 WRITE(
mdst,
'(/2A)')
' XDST YDST ', &
2147 kdst=(jdst-1)*nidst+idst
2148 xdst=real(
grids(gdst)%XGRD(jdst,idst))
2149 ydst=real(
grids(gdst)%YGRD(jdst,idst))
2150 DO ipnt=1,allwgts(gsrc)%WGTDATA(kdst)%N
2151 ksrc=allwgts(gsrc)%WGTDATA(kdst)%K(ipnt)
2152 jsrc=int((ksrc-1)/nisrc)+1
2153 isrc=ksrc-(jsrc-1)*nisrc
2154 xsrc=real(
grids(gsrc)%XGRD(jsrc,isrc))
2155 ysrc=real(
grids(gsrc)%YGRD(jsrc,isrc))
2156 wxwy=allwgts(gsrc)%WGTDATA(kdst)%W(ipnt)
2157 WRITE(
mdst,
'(5(1X,F12.5))')xdst,ydst,xsrc, &
2166 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
2167 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
2168 elapsed_time = end_time - beg_time(3)
2169 WRITE(nmyout,*)
"WMGHGH, LOOP JJ, GSRC= ", gsrc,
" TOOK ", elapsed_time,
" MSEC"
2182 IF (
ALLOCATED(maptst) )
THEN
2183 DEALLOCATE ( maptst, stat=istat )
2184 check_dealloc_status( istat )
2186 IF (
ALLOCATED(inflnd) )
THEN
2187 DEALLOCATE ( inflnd, stat=istat )
2188 check_dealloc_status( istat )
2190 IF (
ALLOCATED(allwgts) )
THEN
2193 IF (
ASSOCIATED(allwgts(gsrc)%WGTDATA) )
THEN
2194 DO kdst=1, dst_grid_size
2198 IF (
ALLOCATED(allwgts(gsrc)%WGTDATA(kdst)%W) )
THEN
2199 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%W, stat=istat )
2200 check_dealloc_status( istat )
2202 IF (
ALLOCATED(allwgts(gsrc)%WGTDATA(kdst)%K) )
THEN
2203 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%K, stat=istat )
2204 check_dealloc_status( istat )
2208 DEALLOCATE ( allwgts(gsrc)%WGTDATA, stat=istat )
2209 check_dealloc_status( istat )
2210 NULLIFY ( allwgts(gsrc)%WGTDATA )
2213 DEALLOCATE ( allwgts, stat=istat )
2214 check_dealloc_status( istat )
2254 DO ib=1,
SIZE(
mdatas(gsrc)%NBI2S(:,1))
2255 IF (
mdatas(gsrc)%NBI2S(ib,1) .EQ. gdst )
THEN
2258 maptst(jdst,idst) = - gsrc
2271 ALLOCATE ( idstl(
grdhgh(gdst,0)), idsth(
grdhgh(gdst,0)), &
2275 check_alloc_status( istat )
2277 IF (old_method)
THEN
2278 ALLOCATE (bdist_om(
grdhgh(gdst,0)), stat=istat )
2279 check_alloc_status( istat )
2328 xl=real(minval(
grids(gsrc)%XGRD))
2329 yl=real(minval(
grids(gsrc)%YGRD))
2330 xh=real(maxval(
grids(gsrc)%XGRD))
2331 yh=real(maxval(
grids(gsrc)%YGRD))
2336 xh =
grids(gsrc)%X0 + ( real(
grids(gsrc)%NX) - 1.5 ) &
2339 yh =
grids(gsrc)%Y0 + ( real(
grids(gsrc)%NY) - 1.5 ) &
2355 idstl(jj) = 2 + int( (xl-
x0)/
sx + 0.49 )
2356 idsth(jj) = 1 + int( (xh-
x0)/
sx - 0.49 )
2359 jdstl(jj) = 2 + int( (yl-
y0)/
sy + 0.49 )
2360 jdsth(jj) = 1 + int( (yh-
y0)/
sy - 0.49 )
2362 idstl(jj) = max( 1 , idstl(jj) )
2363 idsth(jj) = min(
nx , idsth(jj) )
2364 jdstl(jj) = max( 1 , jdstl(jj) )
2365 jdsth(jj) = min(
ny , jdsth(jj) )
2368 WRITE (
mdst,9022) gsrc, idstl(jj),idsth(jj), &
2377 idstla = minval(idstl)
2378 idstha = maxval(idsth)
2379 jdstla = minval(jdstl)
2380 jdstha = maxval(jdsth)
2411 dx_max_gdst=maxval(
grids(gdst)%HPFAC)
2412 dy_max_gdst=maxval(
grids(gdst)%HQFAC)
2414 dx_max_gdst=
grids(gdst)%SX
2415 dy_max_gdst=
grids(gdst)%SY
2420 DO itri=1,
grids(gdst)%NTRI
2427 im1=
grids(gdst)%TRIGP(it,itri)
2428 im2=
grids(gdst)%TRIGP(jt,itri)
2429 edist=w3dist(
flagll, real(
grids(gdst)%XGRD(1,im1)), &
2430 REAL(GRIDS(GDST)%YGRD(1,IM1)), &
2431 REAL(GRIDS(GDST)%XGRD(1,IM2)),
REAL(GRIDS(GDST)%YGRD(1,IM2)))
2432 IF (isfirst.eq.1)
THEN
2437 IF (edist.gt.dist_max)
THEN
2440 IF (edist.lt.dist_min)
THEN
2446 dx_max_gdst=dist_max
2447 dy_max_gdst=dist_max
2451 dx_min_gsrc=minval(
grids(gsrc)%HPFAC)
2452 dy_min_gsrc=minval(
grids(gsrc)%HQFAC)
2454 dx_min_gsrc=
grids(gsrc)%SX
2455 dy_min_gsrc=
grids(gsrc)%SY
2460 DO itri=1,
grids(gsrc)%NTRI
2467 im1=
grids(gsrc)%TRIGP(it,itri)
2468 im2=
grids(gsrc)%TRIGP(jt,itri)
2469 edist=w3dist(
flagll, real(
grids(gsrc)%XGRD(1,im1)), &
2470 REAL(GRIDS(GSRC)%YGRD(1,IM1)), &
2471 REAL(GRIDS(GSRC)%XGRD(1,IM2)),
REAL(GRIDS(GSRC)%YGRD(1,IM2)))
2472 IF (isfirst.eq.1)
THEN
2477 IF (edist.gt.dist_max)
THEN
2480 IF (edist.lt.dist_min)
THEN
2486 dx_min_gsrc=dist_min
2487 dy_min_gsrc=dist_min
2494 nlmax = max( nlmax , &
2495 (2+int(dx_max_gdst/dx_min_gsrc+0.001)) * &
2496 (2+int(dy_max_gdst/dy_min_gsrc+0.001)) )
2499 WRITE(
mdst,*)
'ratio 1 = ',(dx_max_gdst/dx_min_gsrc), &
2500 dx_max_gdst,dx_min_gsrc
2501 WRITE(
mdst,*)
'ratio 2 = ',(dy_max_gdst/dy_min_gsrc), &
2502 dy_max_gdst,dy_min_gsrc
2503 WRITE(
mdse,*)
'GSRC, NLMAX = ',gsrc,nlmax
2509 kdst=(jdst-1)*nidst+idst
2510 nloc=allwgts(gsrc)%WGTDATA(kdst)%N
2511 nlmax_scrip=max(nlmax_scrip,nloc)
2539 WRITE(
mdse,*)
'NLMAX,NLMAX_SCRIP=',nlmax,nlmax_scrip
2541 nlmax = max(nlmax, nlmax_scrip)
2546 WRITE(
mdse,*)
'NEW NLMAX:',nlmax
2549 IF(nlmax.GT.100)
THEN
2550 WRITE(
mdse,
'(/A,I8)') &
2551 'WARNING: unusually large value for NLMAX : ',nlmax
2556 ALLOCATE ( tmpint_om(
nx*
ny,-4:nlmax), stat=istat )
2557 check_alloc_status( istat )
2558 ALLOCATE ( tmprl_om(
nx*
ny,0:nlmax), stat=istat )
2559 check_alloc_status( istat )
2561 ALLOCATE ( tmpint(
nx*
ny,-4:nlmax), stat=istat )
2562 check_alloc_status( istat )
2563 ALLOCATE ( tmprl(
nx*
ny,0:nlmax), stat=istat )
2564 check_alloc_status( istat )
2565 ALLOCATE ( tmplog(
nx*
ny), stat=istat )
2566 check_alloc_status( istat )
2569 ALLOCATE ( ltag(nlmax), stat=istat )
2570 check_alloc_status( istat )
2572 ltag(jj) = jj + ltag0
2588 lowrank_j :
DO jdst=1,
ny
2589 IF ( jdst.LT.jdstla .OR. jdst.GT.jdstha ) cycle
2591 lowrank_i :
DO idst=1,
nx
2592 IF ( idst.LT.idstla .OR. idst.GT.idstha ) cycle
2594 IF ( abs(
mapsta(jdst,idst)) .NE. 1 ) cycle
2596 IF ( maptst(jdst,idst) .LT. 0 ) cycle
2597 xa = real(
xgrd(jdst,idst))
2598 ya = real(
ygrd(jdst,idst))
2635 dxc = mod( 1080.+xa-
grids(gsrc)%X0 , 360. )
2636 xl = 1. + (dxc-0.5*
sx)/
grids(gsrc)%SX
2637 xh = 1. + (dxc+0.5*
sx)/
grids(gsrc)%SX
2645 isrcl = nint(xl+0.01)
2646 isrch = nint(xh-0.01)
2647 jsrcl = nint(yl+0.01)
2648 jsrch = nint(yh-0.01)
2650 IF ( isrcl.LT.1 .OR. isrch.GT.
grids(gsrc)%NX .OR. &
2651 jsrcl.LT.1 .OR. jsrch.GT.
grids(gsrc)%NY )
THEN
2653 gridok(jj) = .false.
2677 bdist_om(jj) = 9.99e33
2679 DO isrc=isrcl, isrch
2680 DO jsrc=jsrcl, jsrch
2681 IF (
grids(gsrc)%MAPSTA(jsrc,isrc).EQ.0)
THEN
2692 IF (
grids(gsrc)%MAPST2(jsrc,isrc).EQ.0) &
2694 ELSE IF (abs(
grids(gsrc)%MAPSTA(jsrc,isrc)) &
2702 bdist_om(jj) = min( bdist_om(jj) , &
2703 mdatas(gsrc)%MAPBDI(jsrc,isrc) )
2704 ELSE IF (abs(
grids(gsrc)%MAPSTA(jsrc,isrc)) &
2731 nisrc=
grids(gsrc)%NX
2732 kdst=(jdst-1)*nidst+idst
2736 DO ipnt=1,allwgts(gsrc)%WGTDATA(kdst)%N
2737 ksrc=allwgts(gsrc)%WGTDATA(kdst)%K(ipnt)
2738 jsrc=int((ksrc-1)/nisrc)+1
2739 isrc=ksrc-(jsrc-1)*nisrc
2740 IF (abs(
grids(gsrc)%MAPSTA(jsrc,isrc)).EQ.1)
THEN
2744 bdist(jj) = min( bdist(jj) , &
2745 mdatas(gsrc)%MAPBDI(jsrc,isrc) )
2749 'we masked non-sea points. (coding error)'
2757 nr0 = allwgts(gsrc)%WGTDATA(kdst)%NR0
2761 nrl = allwgts(gsrc)%WGTDATA(kdst)%NRL
2766 nr1 = allwgts(gsrc)%WGTDATA(kdst)%N
2770 nr2 = allwgts(gsrc)%WGTDATA(kdst)%NR2
2782 WRITE(
mdst,*)
'STARTING TEST 1'
2784 IF(nr0_om.NE.nr0)
THEN
2786 ' *** ERROR WMGHGH: NR0_OM,NR0 = ',nr0_om,nr0
2789 IF(nr1_om.NE.nr1)
THEN
2791 ' *** ERROR WMGHGH: NR1_OM,NR1 = ',nr1_om,nr1
2794 IF(nr2_om.NE.nr2)
THEN
2796 ' *** ERROR WMGHGH: NR2_OM,NR2 = ',nr2_om,nr2
2799 IF(nrl_om.NE.nrl)
THEN
2801 ' *** ERROR WMGHGH: NRL_OM,NRL = ',nrl_om,nrl
2804 IF(bdist_om(jj).NE.bdist(jj))
THEN
2806 WRITE (
mdse,
'(/2A,2(F12.5))') &
2807 ' *** ERROR WMGHGH: ', &
2808 ' BDIST_OM(JJ),BDIST(JJ) = ', &
2809 bdist_om(jj),bdist(jj)
2813 WRITE(
mdst,*)
'PASSED TEST 1'
2838 IF ( nrl .GT. (nr0+nr1+nr2)/2 )
THEN
2843 inflnd(jdst,idst) = 1
2845 gridok(jj) = nr1.GT.0 .AND. nr2.EQ.0
2850 IF ( gridok(jj) ) nrok = nrok + 1
2856 IF ( nrok .EQ. 0 )
THEN
2870 inflnd(jdst,idst) = 0
2914 DO jj=
grdhgh(gdst,0),1,-1
2919 IF ( gridok(jj) )
THEN
2920 IF ( jf .EQ. 0 )
THEN
2927 IF (
grank(gsrc) .NE. jr )
EXIT
2929 IF ( bdist(jj) .GT. jd )
THEN
2939 WRITE(
mdst,
'(A,2(I8),A,I8)')
'For grid point IDST,JDST = ',idst,jdst,
', we selected GSRC = ',gsrc
2945 maptst(jdst,idst) = gsrc
2953 tmpint(nrtot,-4) = idst
2954 tmpint(nrtot,-3) = jdst
2955 tmpint(nrtot,-2) =
mapfs(jdst,idst)
2956 tmpint(nrtot,-1) = gsrc
2957 tmprl(nrtot, 0) = jd *
sig(1) /
dtmax
2971 tmpint_om(nrtot,itmp)=tmpint(nrtot,itmp)
2973 tmprl_om(nrtot,0)=tmprl(nrtot,0)
2976 dxc = mod( 1080.+xa-
grids(gsrc)%X0 , 360. )
2977 xl = 1. + (dxc-0.5*
sx)/
grids(gsrc)%SX
2978 xh = 1. + (dxc+0.5*
sx)/
grids(gsrc)%SX
2990 isrcl = nint(xl+0.01)
2991 isrch = nint(xh-0.01)
2992 jsrcl = nint(yl+0.01)
2993 jsrch = nint(yh-0.01)
2997 DO isrc=isrcl, isrch
2998 wx = min(xh,real(isrc)+0.5) - max(xl,real(isrc)-0.5)
2999 DO jsrc=jsrcl, jsrch
3000 IF (abs(
grids(gsrc)%MAPSTA(jsrc,isrc)).EQ.1)
THEN
3002 wy = min(yh,real(jsrc)+0.5) - &
3003 max(yl,real(jsrc)-0.5)
3005 nloc_om = nloc_om + 1
3007 IF ( nloc_om .GT. nlmax )
THEN
3011 tmpint_om(nrtot,nloc_om) = &
3012 grids(gsrc)%MAPFS(jsrc,isrc)
3013 tmprl_om(nrtot,nloc_om) = wx*wy
3017 tmpint_om(nrtot,0) = nloc_om
3018 tmprl_om(nrtot,1:nloc_om) = tmprl_om(nrtot,1:nloc_om) &
3035 kdst=(jdst-1)*nidst+idst
3036 nloc=allwgts(gsrc)%WGTDATA(kdst)%N
3037 tmpint(nrtot,0) = nloc
3038 nisrc=
grids(gsrc)%NX
3044 WRITE(
mdst,*)
'GSRC,KDST,NLOC = ',gsrc,kdst,nloc
3051 IF ( nloc .GT. nlmax )
THEN
3053 WRITE (
mdse,
'(/2A,4(1x,I8))') &
3054 ' *** ERROR WMGHGH: ', &
3055 ' IDST,JDST,NLOC,NLMAX = ', &
3056 idst,jdst,nloc,nlmax
3062 ksrc=allwgts(gsrc)%WGTDATA(kdst)%K(ipnt)
3063 jsrc=int((ksrc-1)/nisrc)+1
3064 isrc=ksrc-(jsrc-1)*nisrc
3065 tmpint(nrtot,ipnt) =
grids(gsrc)%MAPFS(jsrc,isrc)
3066 tmprl(nrtot,ipnt)= &
3067 allwgts(gsrc)%WGTDATA(kdst)%W(ipnt)
3079 IF (do_checking)
THEN
3082 WRITE(
mdst,*)
'STARTING TEST 2'
3084 if (nloc.NE.nloc_om)
THEN
3086 ' *** ERROR WMGHGH: NLOC,NLOC_OM = ',nloc,nloc_om
3093 IF (tmpint_om(nrtot,ipnt).EQ.tmpint(nrtot,ipnt2))
THEN
3096 IF(abs(tmprl_om(nrtot,ipnt)-tmprl(nrtot,ipnt2)) &
3099 (
mdse,
'(/2A,2(F12.5))') &
3100 ' *** ERROR WMGHGH: ', &
3101 ' *** TMPRL_OM(NRTOT,IPNT),TMPRL(NRTOT,IPNT2) = ', &
3102 tmprl_om(nrtot,ipnt),tmprl(nrtot,ipnt2)
3108 IF(icount.NE.nloc)
THEN
3110 ' *** ERROR WMGHGH: ICOUNT,NLOC = ',icount,nloc
3117 WRITE(
mdst,*)
'PASSED TEST 2'
3132 WRITE(
mdst,*)
'WMGHGH Section 2.b.6 completed.'
3144 WRITE (
mdst,9023) gdst, nrtot
3168 ALLOCATE ( stmask(
ny,0:
nx+1), maski(
ny,
nx), stat=istat )
3169 check_alloc_status( istat )
3170 IF (
mdatas(gdst)%MSKINI )
THEN
3171 DEALLOCATE (
mdatas(gdst)%MAPMSK, stat=istat )
3172 check_dealloc_status( istat )
3174 ALLOCATE (
mdatas(gdst)%MAPMSK(
ny,
nx), stat=istat )
3175 check_alloc_status( istat )
3177 mdatas(gdst)%MSKINI = .true.
3191 stmask(:,1:
nx) = maptst .LT. 0
3192 stmask(:,0) = stmask(:,
nx)
3193 stmask(:,
nx+1) = stmask(:,1)
3227 DO idst=idstla,idstha
3229 IF ( .NOT. stmask(jdst,idst) .AND. ( &
3230 stmask(jdst+1,idst+1) .OR. stmask(jdst+1,idst ) .OR. &
3231 stmask(jdst+1,idst-1) .OR. stmask(jdst ,idst-1) .OR. &
3232 stmask(jdst-1,idst-1) .OR. stmask(jdst-1,idst ) .OR. &
3233 stmask(jdst-1,idst+1) .OR. stmask(jdst ,idst+1) ) ) &
3234 maski(jdst,idst) = .true.
3237 stmask(:,1:
nx) = stmask(:,1:
nx) .OR. maski
3238 stmask(:,0) = stmask(:,
nx)
3239 stmask(:,
nx+1) = stmask(:,1)
3249 idst = tmpint(iloc,-4)
3250 jdst = tmpint(iloc,-3)
3251 tmplog(iloc) = stmask(jdst,idst)
3252 IF ( .NOT. stmask(jdst,idst) )
THEN
3255 maptst(jdst,idst) = 99
3261 DEALLOCATE ( stmask, maski, stat=istat )
3262 check_dealloc_status( istat )
3285 jj = tmpint(iloc,-1)
3287 isea = tmpint(iloc,-2)
3290 isproc = isproc +
croot - 1
3293 i1(jj,isproc) = i1(jj,isproc) + 1
3294 IF ( tmplog(iloc) ) i2(jj,isproc) = i2(jj,isproc) + 1
3295 IF (
improc .EQ. isproc )
THEN
3296 hgstge(gdst,jj)%NSMX = max(
hgstge(gdst,jj)%NSMX,tmpint(iloc,0))
3299 DO jr=1, tmpint(iloc,0)
3300 isea = tmpint(iloc,jr)
3302 IF ( ispro2 .EQ.
improc )
THEN
3304 IF ( tmplog(iloc) )
hgstge(gdst,jj)%NSN1 = &
3317 IF (
hgstge(gdst,gsrc)%NREC .GT. 0 )
THEN
3322 hgstge(gdst,gsrc)%NSMX), &
3324 hgstge(gdst,gsrc)%NSMX), &
3326 hgstge(gdst,gsrc)%NSMX), &
3328 hgstge(gdst,gsrc)%NSMX, &
3329 hgstge(gdst,gsrc)%NREC), stat=istat )
3330 check_alloc_status( istat )
3332 hgstge(gdst,gsrc)%LJSEA = -1
3333 hgstge(gdst,gsrc)%NRAVG = -1
3334 hgstge(gdst,gsrc)%IMPSRC = -1
3335 hgstge(gdst,gsrc)%ITAG = -1
3336 hgstge(gdst,gsrc)%WGTH = -1.
3339 IF (
hgstge(gdst,gsrc)%NSND .GT. 0 )
THEN
3340 ALLOCATE (
hgstge(gdst,gsrc)%ISEND (
hgstge(gdst,gsrc)%NSND,5), &
3342 check_alloc_status( istat )
3344 hgstge(gdst,gsrc)%ISEND = -1
3347 hgstge(gdst,gsrc)%INIT = .true.
3355 i4 =
hgstge(gdst,:)%NSND + 1
3360 isea = tmpint(iloc,-2)
3361 jj = tmpint(iloc,-1)
3362 nr0 = tmpint(iloc, 0)
3365 isproc = isproc +
croot - 1
3366 flgrec = isproc .EQ.
improc
3369 IF ( tmplog(iloc) )
THEN
3370 i1(jj,isproc) = i1(jj,isproc) + 1
3371 irec = i1(jj,isproc)
3373 i2(jj,isproc) = i2(jj,isproc) - 1
3374 irec = i2(jj,isproc)
3378 hgstge(gdst,jj)%LJSEA(irec) = jsea
3379 hgstge(gdst,jj)%NRAVG(irec) = nr0
3380 hgstge(gdst,jj)%WGTH(irec,:nr0) = tmprl(iloc,1:nr0)
3382 hgstge(gdst,jj)%ITAG(irec,:nr0) = ltag(:nr0)
3388 isea = tmpint(iloc,ij)
3390 IF ( flgrec )
hgstge(gdst,jj)%IMPSRC(irec,ij) = ispro2
3392 IF ( ispro2 .EQ.
improc )
THEN
3393 IF ( tmplog(iloc) )
THEN
3400 hgstge(gdst,jj)%ISEND(isnd,1) = jsea
3402 hgstge(gdst,jj)%ISEND(isnd,2) = isproc
3404 hgstge(gdst,jj)%ISEND(isnd,3) = irec
3405 hgstge(gdst,jj)%ISEND(isnd,4) = ij
3407 hgstge(gdst,jj)%ISEND(isnd,5) = ltag(ij)
3423 ALLOCATE ( mapst(
ny,
nx), stat=istat )
3424 check_alloc_status( istat )
3429 idst =
mapsf(isea,1)
3430 jdst =
mapsf(isea,2)
3431 IF ( maptst(jdst,idst) .GT. 0 )
flagst(isea) = .NOT.
flghg1
3434 mapst(jdst,idst) =
'O'
3436 mapst(jdst,idst) =
'X'
3444 WRITE (
mdst,9025)
'MAPTST'
3446 WRITE (
mdst,9026) maptst(jdst,:) + 88*inflnd(jdst,:)
3451 WRITE (
mdst,9025)
'MAPSTA'
3458 WRITE (
mdst,9025)
'MAPST2'
3465 WRITE (
mdst,9025)
'FLAGST'
3467 WRITE (
mdst,9027) mapst(jdst,:)
3471 DEALLOCATE ( maptst, inflnd, stat=istat )
3472 check_dealloc_status( istat )
3474 DEALLOCATE ( mapst, stat=istat )
3475 check_dealloc_status( istat )
3482 nr0 =
hgstge(gdst,gsrc)%NREC
3483 IF ( nr0 .EQ. 0 )
THEN
3484 WRITE (
mdst,9030) gsrc
3486 WRITE (
mdst,9031) gsrc, nr0
3488 jsea =
hgstge(gdst,gsrc)%LJSEA(irec)
3489 nrtot =
hgstge(gdst,gsrc)%NRAVG(irec)
3490 IF ( nrtot .LE. 15 )
THEN
3491 WRITE (
mdst,9032) jsea, nrtot, &
3492 hgstge(gdst,gsrc)%WGTH(irec,:nrtot)
3494 WRITE (
mdst,9032) jsea, nrtot, &
3495 hgstge(gdst,gsrc)%WGTH(irec,1:15)
3497 hgstge(gdst,gsrc)%WGTH(irec,16:nrtot)
3500 hgstge(gdst,gsrc)%IMPSRC(irec,1:nrtot)
3502 hgstge(gdst,gsrc)%ITAG(irec,1:nrtot)
3512 nr0 =
hgstge(gdst,gsrc)%NSND
3513 IF ( nr0 .EQ. 0 )
THEN
3514 WRITE (
mdst,9040) gsrc
3516 WRITE (
mdst,9041) gsrc, nr0
3518 WRITE (
mdst,9042)
hgstge(gdst,gsrc)%ISEND(isnd,:)
3526 DEALLOCATE ( idstl, idsth, jdstl, jdsth, gridok, bdist, &
3527 tmpint, tmprl, tmplog, stat=istat )
3528 check_dealloc_status( istat )
3530 IF (old_method)
THEN
3531 DEALLOCATE ( bdist_om, tmpint_om, tmprl_om, stat=istat )
3532 check_dealloc_status( istat )
3536 DEALLOCATE ( ltag, stat=istat )
3537 check_dealloc_status( istat )
3548 DO kdst=1,dst_grid_size
3549 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%W, stat=istat )
3550 check_dealloc_status( istat )
3551 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%K, stat=istat )
3552 check_dealloc_status( istat )
3554 DEALLOCATE ( allwgts(gsrc)%WGTDATA, stat=istat )
3555 check_dealloc_status( istat )
3557 DEALLOCATE ( allwgts, stat=istat )
3558 check_dealloc_status( istat )
3563 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
3564 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
3565 elapsed_time = end_time - beg_time(2)
3566 WRITE(nmyout,*)
"WMGHGH, LOOP LOWRANK_GRID, GDST= ", gdst,
" TOOK ", elapsed_time,
" MSEC"
3571 IF ( lscripnc .AND. l_stop )
THEN
3577 WRITE(
mdse,
'(A,I4.4,A)' )
'IMPROC=',
improc, &
3578 ': STOP_SCRIP option invoked: '// &
3579 'non-error exit after writing remap netcdf files'
3583 DEALLOCATE ( i1, i2, i3, i4, stat=istat )
3584 check_dealloc_status( istat )
3586 DEALLOCATE ( nx_size, irq, mstat, stat=istat )
3587 check_dealloc_status( istat )
3589 DEALLOCATE ( nx_beg, nx_end, stat=istat )
3590 check_dealloc_status( istat )
3596 WRITE (
mdst,9028)
'NTOT'
3603 WRITE (
mdst,9028)
'NREC'
3610 WRITE (
mdst,9028)
'NRC1'
3617 WRITE (
mdst,9028)
'NSND'
3624 WRITE (
mdst,9028)
'NSN1'
3631 WRITE (
mdst,9028)
'NSMX'
3638 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
3639 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
3640 elapsed_time = end_time - beg_time(1)
3641 WRITE(nmyout,*)
"WMGHGH, ALL TOOK ", elapsed_time,
" MSEC"
3648 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGHGH : *** '/ &
3649 ' GRDHGH NOT YET ALLOCATED, CALL WMGLOW FIRST'/)
3650 1020
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGHGH : *** '/ &
3651 ' TMPINT AND TMPRL TOO SMALL (w/out SCRIP)'/)
3653 1021
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGHGH : *** '/ &
3654 ' TMPINT AND TMPRL TOO SMALL (w/SCRIP) '/)
3658 9010
FORMAT (
' TEST WMGHGH : INITIALIZE BOUNDARY DISTANCE MAPS')
3659 9011
FORMAT (
' GRID = ',i3,
' RANK = ',i3, &
3661 9012
FORMAT (
' *** MAP NOT NEEDED ***')
3662 9013
FORMAT (
' TEST WMGHGH : FINAL MAP ')
3663 9014
FORMAT (2x,65i2)
3667 9020
FORMAT (
' TEST WMGHGH : GRID',i3,
' HAS',i3,
' DATA SOURCES')
3668 9021
FORMAT (
' NO PROCESSING REQUIRED')
3669 9022
FORMAT (
' TEST WMGHGH : GRID',i3,
' COVERS ',4i8)
3670 9023
FORMAT (
' TEST WMGHGH : GRID',i3, &
3671 ', NR OF POINTS TO PROCESS:',i5)
3672 9025
FORMAT (
' TEST WMGHGH : FINAL ',a)
3673 9026
FORMAT (2x,65i2)
3674 9027
FORMAT (2x,65a2)
3678 9028
FORMAT (
' TEST WMGHGH : COUNTERS ',a)
3679 9029
FORMAT (2x,20i6)
3683 9030
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', NO DATA TO RECEIVE')
3684 9031
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', RECEIVING ',i6)
3685 9032
FORMAT ( 2x,i10,i6,15f6.2)
3686 9033
FORMAT ( 18x,15f6.2)
3687 9034
FORMAT ( 18x,15i6)
3691 9040
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', NO DATA TO SEND')
3692 9041
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', SENDING ',i6)
3693 9042
FORMAT ( 12x,i10,4i6)