109 SUBROUTINE wmiopp ( NPT, XPT, YPT, PNAMES )
245 INTEGER,
INTENT(IN) :: NPT
246 REAL,
INTENT(IN),
OPTIONAL :: XPT(NPT), YPT(NPT)
247 CHARACTER(LEN=40),
INTENT(IN),
OPTIONAL :: PNAMES(NPT)
252 INTEGER :: IPT, J, II
253 INTEGER :: IX(4), IY(4)
255 INTEGER :: itout, I1, I2, I3
257 INTEGER,
SAVE :: IENT = 0
260 REAL :: RX, RY, RDX, RDY
261 REAL,
PARAMETER :: ACC = 0.05
262 REAL,
ALLOCATABLE :: XP(:), YP(:)
264 LOGICAL,
ALLOCATABLE :: INGRID(:,:)
265 LOGICAL,
SAVE :: SETUP = .false., flgo7a = .false.
266 CHARACTER(LEN=40),
ALLOCATABLE :: PN(:)
269 CALL strace (ient,
'WMIOPP')
275 CALL w3seto ( 0, mdse, mdst )
278 WRITE (mdst,9000) o2init, npt,
PRESENT(xpt), &
279 PRESENT(ypt),
PRESENT(pnames)
288 IF ( .NOT. o2init )
THEN
294 IF ( .NOT.
PRESENT(xpt) .OR. .NOT.
PRESENT(ypt) .OR. &
295 .NOT.
PRESENT(pnames) )
THEN
300 CALL w3dmo2 ( 0, mdse, mdst, npt )
324 ALLOCATE ( ingrid(nrgrd,nopts), xp(nopts), yp(nopts) )
332 CALL w3setg ( j, mdse, mdst )
342 IF (gtype .NE. ungtype)
THEN
343 ingrid(j,ipt) = w3grmp( gsu, xpt(ipt), ypt(ipt), ix, iy, rd )
344 IF ( .NOT.ingrid(j,ipt) )
THEN
348 CALL is_in_ungrid(j, dble(xpt(ipt)), dble(ypt(ipt)), itout, ix, iy, rd )
350 ingrid(j,ipt)=.false.
356 IF ( mapsta(iy(1),ix(1)) .EQ. 0 .AND. &
357 mapsta(iy(2),ix(2)) .EQ. 0 .AND. &
358 mapsta(iy(3),ix(3)) .EQ. 0 .AND. &
359 mapsta(iy(4),ix(4)) .EQ. 0 )
THEN
360 ingrid(j,ipt) = .false.
371 DEALLOCATE ( xp, yp )
379 grdid(ipt) =
'...none...'
381 IF ( ingrid(j,ipt) )
THEN
382 grdid(ipt) = grids(j)%FILEXT
383 mdatas(j)%NRUPTS = mdatas(j)%NRUPTS + 1
392 IF ( improc .EQ. nmpscr )
THEN
396 IF ( grids(j)%FILEXT .EQ. grdid(ipt) )
EXIT
398 IF ( j .GT. nrgrd )
THEN
399 WRITE (mdss,921) ptnme(ipt), ptloc(:,ipt)*factor
401 WRITE (mdss,922) ptnme(ipt), ptloc(:,ipt)*factor, &
413 WRITE (mdst,9021) ipt, ptnme(ipt), grdid(ipt)
421 WRITE (mdst,9023) j, mdatas(j)%NRUPTS, grids(j)%FILEXT
422 ipt = ipt - mdatas(j)%NRUPTS
424 WRITE (mdst,9024) ipt
427 DEALLOCATE ( ingrid )
441 ipt = max( 1 , mdatas(j)%NRUPTS )
442 IF ( setup )
DEALLOCATE ( mdatas(j)%UPTMAP )
443 ALLOCATE ( mdatas(j)%UPTMAP(ipt) )
445 IF ( mdatas(j)%NRUPTS .EQ. 0 ) cycle
447 ALLOCATE ( xp(ipt), yp(ipt), pn(ipt) )
453 IF ( grdid(ii) .NE. grids(j)%FILEXT ) cycle
455 mdatas(j)%UPTMAP(ipt) = ii
456 xp(ipt) = ptloc(1,ii)
457 yp(ipt) = ptloc(2,ii)
462 DO ipt=1, mdatas(j)%NRUPTS
463 WRITE (mdst,9031) ipt, mdatas(j)%UPTMAP(ipt),xp(ipt),yp(ipt),pn(ipt)
471 IF ( improc.EQ.nmpscr )
WRITE (mdss,930) &
472 j, grids(j)%FILEXT, ipt
484 CALL w3seto ( j, mdse, mdst )
485 CALL w3setg ( j, mdse, mdst )
490 DEALLOCATE ( outpts(j)%OUT2%IPTINT, &
491 outpts(j)%OUT2%IL , outpts(j)%OUT2%IW , &
492 outpts(j)%OUT2%II , outpts(j)%OUT2%PTIFAC, &
493 outpts(j)%OUT2%PTNME, outpts(j)%OUT2%GRDID , &
494 outpts(j)%OUT2%DPO , outpts(j)%OUT2%WAO , &
495 outpts(j)%OUT2%WDO , outpts(j)%OUT2%ASO , &
496 outpts(j)%OUT2%CAO , outpts(j)%OUT2%CDO , &
497 outpts(j)%OUT2%SPCO , outpts(j)%OUT2%PTLOC )
503 CALL w3iopp ( mdatas(j)%NRUPTS, xp, yp, pn, j )
509 CALL wmsetm ( j, mdse, mdst )
517 CALL w3seto ( j, mdse, mdst )
518 CALL w3setg ( j, mdse, mdst )
519 CALL w3seta ( j, mdse, mdst )
520 CALL w3setw ( j, mdse, mdst )
525 DEALLOCATE ( outpts(j)%OUT2%IPTINT, &
526 outpts(j)%OUT2%IL , outpts(j)%OUT2%IW , &
527 outpts(j)%OUT2%II , outpts(j)%OUT2%PTIFAC, &
528 outpts(j)%OUT2%PTNME, outpts(j)%OUT2%GRDID , &
529 outpts(j)%OUT2%DPO , outpts(j)%OUT2%WAO , &
530 outpts(j)%OUT2%WDO , outpts(j)%OUT2%ASO , &
531 outpts(j)%OUT2%CAO , outpts(j)%OUT2%CDO , &
532 outpts(j)%OUT2%SPCO , outpts(j)%OUT2%PTLOC )
538 CALL w3iopp ( mdatas(j)%NRUPTS, xp, yp, pn, j )
543 DEALLOCATE (outpts(j)%OUT2%IRQPO1, &
544 outpts(j)%OUT2%IRQPO2 )
560 IF ( improc.EQ.nmpscr )
WRITE (mdss,939)
565 CALL w3seto ( 0, mdse, mdst )
566 DEALLOCATE ( xp, yp, pn )
584 920
FORMAT (/
' Diagnostic test output for output points :'/ &
585 ' -------------------------------------------------')
586 921
FORMAT (
' ',a,
' (',2f8.2,
') NO GRID FOUND')
587 922
FORMAT (
' ',a,
' (',2f8.2,
') grid ',a)
592 930
FORMAT (/
' Grid ',i3,
' [',a,
']',i4,
' points :'/ &
593 ' -------------------------------------------------')
597 1000
FORMAT (/
' *** ERROR WMIOPP : INITALIZATION DATA NOT', &
601 9000
FORMAT (
' TEST WMIOPP : O2INIT :',l2/ &
602 ' PAR LIST :',i4,3l2)
606 9010
FORMAT (
' TEST WMIOPP : INITIALIZING DATA GRID 0')
610 9020
FORMAT (
' TEST WMIOPP : FINDING POINTS IN GRID')
611 9021
FORMAT (
' ',i4,2x,a,2x,a)
612 9022
FORMAT (
' TEST WMIOPP : OUTPUT POINTS PER GRID')
613 9023
FORMAT (
' GRID',i3,
' HAS',i4,
' OUTPUT ', &
615 9024
FORMAT (
' UNALLOCATED POINTS :',i4)
619 9030
FORMAT (
' TEST WMIOPP : PREPPING GRID',i3)
620 9031
FORMAT (
' ',2i5,2e12.3,2x,a)
621 9032
FORMAT (
' TEST WMIOPP : RUNNING W3IOPP / W3MPIP')
639 SUBROUTINE wmiopo ( TOUT )
745 INTEGER,
INTENT(IN) :: TOUT(2)
750 INTEGER :: J, I, II, IT0, IT, ITARG, IFROM
752 INTEGER :: MPI_COMM_GRD = 1, croot = 1
753 INTEGER,
PARAMETER :: MPI_COMM_NULL = -1
756 INTEGER :: IERR_MPI, NMPPNT
757 INTEGER,
ALLOCATABLE :: STATUS(:,:)
760 INTEGER,
SAVE :: IENT = 0
762 REAL,
POINTER :: SPEC(:,:)
764 REAL,
POINTER :: SPCR(:,:), DPR(:), WAR(:), &
765 WDR(:), ASR(:), CAR(:), CDR(:)
766 REAL,
POINTER :: ICRO(:), ICRFO(:), ICRHO(:)
770 CALL strace (ient,
'WMIOPO')
777 WRITE (mdst,9000) nmpupt, improc
780 IF ( improc .EQ. nmpupt )
THEN
800 CALL w3seto ( j, mdse, mdst )
801 CALL w3setg ( j, mdse, mdst )
802 CALL wmsetm ( j, mdse, mdst )
810 IF ( mpi_comm_grd .EQ. mpi_comm_null )
THEN
817 IF (
nopts .EQ. 0 )
THEN
833 IF ( improc .EQ. nmpupt )
THEN
840 IF ( respec(0,j) )
THEN
842 WRITE (mdst,9016)
'YES'
854 WRITE (mdst,9016)
'NO'
867 outpts(0)%OUT2%SPCO(:,ii) = spec(:,i)
872 outpts(0)%OUT2%CAO(ii) = cao(i)
873 outpts(0)%OUT2%CDO(ii) = cdo(i)
874 outpts(0)%OUT2%ICEO(ii) = iceo(i)
875 outpts(0)%OUT2%ICEFO(ii) = icefo(i)
876 outpts(0)%OUT2%ICEHO(ii) = iceho(i)
879 IF ( respec(0,j) )
DEALLOCATE ( spec )
888 WRITE (mdst,9018) j, improc, nmpupt
892 it0 =
mtag0 - 7*nrgrd - 1
899 CALL mpi_send ( spco(1,1),
nspec*
nopts, mpi_real, &
903 WRITE (mdst,9019) it-it0,
'SPECTRA'
907 CALL mpi_send (
dpo(1),
nopts, mpi_real, itarg, it, &
911 WRITE (mdst,9019) it-it0,
'WATER DEPTHS'
915 CALL mpi_send (
wao(1),
nopts, mpi_real, itarg, it, &
919 WRITE (mdst,9019) it-it0,
'WIND SPEED'
923 CALL mpi_send (
wdo(1),
nopts, mpi_real, itarg, it, &
927 WRITE (mdst,9019) it-it0,
'WIND DIRECTION'
931 CALL mpi_send (
aso(1),
nopts, mpi_real, itarg, it, &
935 WRITE (mdst,9019) it-it0,
'AIR_SEA TEMP DIFF'
939 CALL mpi_send ( cao(1),
nopts, mpi_real, itarg, it, &
943 WRITE (mdst,9019) it-it0,
'CURRENT VELOCITY'
947 CALL mpi_send ( cdo(1),
nopts, mpi_real, itarg, it, &
951 WRITE (mdst,9019) it-it0,
'CURRENT DIRECTION'
977 IF ( improc .NE. nmpupt )
THEN
998 CALL w3seto ( j, mdse, mdst )
999 CALL w3setg ( j, mdse, mdst )
1000 CALL wmsetm ( j, mdse, mdst )
1004 DO nmppnt= nmproc, 1, -1
1010 WRITE (mdst,9031) j,
nopts, nmppnt
1013 IF ( nmppnt.EQ.nmpupt .OR.
nopts.EQ.0 )
THEN
1026 it0 =
mtag0 - 7*nrgrd - 1
1029 ALLOCATE ( spcr(
nspec,
nopts), status(mpi_status_size,1), &
1037 CALL mpi_recv ( spcr(1,1),
nspec*
nopts, mpi_real, ifrom, &
1041 WRITE (mdst,9019) it-it0,
'SPECTRA'
1045 CALL mpi_recv ( dpr(1),
nspec*
nopts, mpi_real, ifrom, &
1049 WRITE (mdst,9019) it-it0,
'WATER DEPTHS'
1053 CALL mpi_recv ( war(1),
nspec*
nopts, mpi_real, ifrom, &
1057 WRITE (mdst,9019) it-it0,
'WIND SPEED'
1061 CALL mpi_recv ( wdr(1),
nspec*
nopts, mpi_real, ifrom, &
1065 WRITE (mdst,9019) it-it0,
'WIND DIRECTION'
1069 CALL mpi_recv ( asr(1),
nspec*
nopts, mpi_real, ifrom, &
1073 WRITE (mdst,9019) it-it0,
'AIR_SEA TEMP DIFF'
1077 CALL mpi_recv ( car(1),
nspec*
nopts, mpi_real, ifrom, &
1081 WRITE (mdst,9019) it-it0,
'CURRENT VELOCITY'
1085 CALL mpi_recv ( cdr(1),
nspec*
nopts, mpi_real, ifrom, &
1089 WRITE (mdst,9019) it-it0,
'CURRENT DIRECTION'
1111 IF ( respec(0,j) )
THEN
1114 WRITE (mdst,9016)
'YES'
1125 WRITE (mdst,9016)
'NO'
1141 outpts(0)%OUT2%SPCO(:,ii) = spec(:,i)
1142 outpts(0)%OUT2%DPO(ii) = dpr(i)
1143 outpts(0)%OUT2%WAO(ii) = war(i)
1144 outpts(0)%OUT2%WDO(ii) = wdr(i)
1145 outpts(0)%OUT2%ASO(ii) = asr(i)
1146 outpts(0)%OUT2%CAO(ii) = car(i)
1147 outpts(0)%OUT2%CDO(ii) = cdr(i)
1148 outpts(0)%OUT2%ICEO(ii) = iceo(i)
1149 outpts(0)%OUT2%ICEFO(ii) = icefo(i)
1150 outpts(0)%OUT2%ICEHO(ii) = iceho(i)
1155 IF ( respec(0,j) )
DEALLOCATE ( spec )
1156 DEALLOCATE ( spcr, dpr, war, wdr, asr, car, cdr, status )
1161 DEALLOCATE (icro, icrfo, icrho)
1172 CALL w3seto ( 0, mdse, mdst )
1173 CALL w3setg ( 0, mdse, mdst )
1174 CALL w3setw ( 0, mdse, mdst )
1179 CALL w3iopon (
'WRITE', mdsup, ii, 0)
1181 CALL w3iopo (
'WRITE', mdsup, ii, 0 &
1193 9000
FORMAT (
' TEST WMIOPO : OUTPUT/ACTUAL PROCESS : ',2i6)
1194 9010
FORMAT (
' TEST WMIOPO : PROCESSING GRID : ',i6/ &
1195 ' OUTPUT POINTS : ',i6/ &
1196 ' ACTUAL/OUTPUT PROCESS : ',2i6)
1197 9011
FORMAT (
' CYCLE : GRID NOT ON PROCESS')
1198 9012
FORMAT (
' CYCLE : GRID WITHOUT OUTPUT POINTS')
1199 9014
FORMAT (
' CYCLE : DATA NOT ON PRESENT PROCESS')
1200 9015
FORMAT (
' TEST WMIOPO : PROCESSING DATA LOCALLY')
1201 9016
FORMAT (
' TEST WMIOPO : NEED FOR SPECTRAL CONVERSION : ',a)
1202 9017
FORMAT (
' TEST WMIOPO : STORING DATA FROM GRID',i4, &
1206 9117
FORMAT (
' TEST WMIOPO : STORING DATA FROM GRID',i4, &
1208 9018
FORMAT (
' TEST WMIOPO : GRID',i4,
' SEND FROM',i4,
' TO',i4)
1209 9019
FORMAT (
' IT = ',i4,
' PAR = ',a)
1213 9020
FORMAT (
' TEST WMIOPO : DONE AT THIS PROCESSOR')
1217 9030
FORMAT (
' TEST WMIOPO : LOOP OVER GRIDS FOR REMOTE DATA')
1218 9031
FORMAT (
' TEST WMIOPO : GRID',i4,
',',i4,
' POINTS FROM',i4)
1219 9032
FORMAT (
' NOTHING TO RECEIVE')
1222 9040
FORMAT (
' TEST WMIOPO : PERFORM OUTPUT')