115 integer,
intent(out) :: rc
117 TYPE (esmf_gridcomp) :: model
121 character (len=*),
parameter :: myfile = &
122 & __FILE__//
", WAV_SetServices"
129 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAV_SetServices', &
139 CALL nuopc_compderive (model, &
140 & nuopc_setservices, &
142 IF (esmf_logfounderror(rctocheck=rc, &
143 & msg=esmf_logerr_passthru, &
155 CALL nuopc_compsetentrypoint (model, &
156 & methodflag=esmf_method_initialize, &
157 & phaselabellist=(/
"IPDv00p1"/), &
160 IF (esmf_logfounderror(rctocheck=rc, &
161 & msg=esmf_logerr_passthru, &
169 CALL nuopc_compsetentrypoint (model, &
170 & methodflag=esmf_method_initialize, &
171 & phaselabellist=(/
"IPDv00p2"/), &
174 IF (esmf_logfounderror(rctocheck=rc, &
175 & msg=esmf_logerr_passthru, &
187 CALL nuopc_compspecialize (model, &
188 & speclabel=nuopc_label_datainitialize, &
191 IF (esmf_logfounderror(rctocheck=rc, &
192 & msg=esmf_logerr_passthru, &
200 CALL nuopc_compspecialize (model, &
201 & speclabel=nuopc_label_setclock, &
204 IF (esmf_logfounderror(rctocheck=rc, &
205 & msg=esmf_logerr_passthru, &
213 CALL nuopc_compspecialize (model, &
214 & speclabel=nuopc_label_checkimport, &
215 & specphaselabel=
"RunPhase1", &
218 IF (esmf_logfounderror(rctocheck=rc, &
219 & msg=esmf_logerr_passthru, &
227 CALL nuopc_compspecialize (model, &
228 & speclabel=nuopc_label_advance, &
231 IF (esmf_logfounderror(rctocheck=rc, &
232 & msg=esmf_logerr_passthru, &
242 CALL esmf_gridcompsetentrypoint (model, &
243 & methodflag=esmf_method_finalize, &
246 IF (esmf_logfounderror(rctocheck=rc, &
247 & msg=esmf_logerr_passthru, &
254 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAV_SetServices', &
263 & ImportState, ExportState, &
275 integer,
intent(out) :: rc
277 TYPE (esmf_gridcomp) :: model
278 TYPE (esmf_state) :: importstate
279 TYPE (esmf_state) :: exportstate
280 TYPE (esmf_clock) :: clock
286 character (len=100) :: coupledset, statelabel
287 character (len=240) :: standardname, shortname
289 character (len=*),
parameter :: myfile = &
290 & __FILE__//
", WAM_SetInitializeP1"
297 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_SetInitializeP1', &
315 CALL nuopc_addnestedstate (importstate, &
316 & cplset=trim(coupledset), &
317 & nestedstatename=trim(statelabel),&
321 IF (esmf_logfounderror(rctocheck=rc, &
322 & msg=esmf_logerr_passthru, &
331 standardname=
models(
iwave)%ImportField(i)%standard_name
333 CALL nuopc_advertise (
models(
iwave)%ImportState(ng), &
334 & standardname=trim(standardname), &
335 & name=trim(shortname), &
337 IF (esmf_logfounderror(rctocheck=rc, &
338 & msg=esmf_logerr_passthru, &
360 CALL nuopc_addnestedstate (exportstate, &
361 & cplset=trim(coupledset), &
362 & nestedstatename=trim(statelabel),&
366 IF (esmf_logfounderror(rctocheck=rc, &
367 & msg=esmf_logerr_passthru, &
376 standardname=
models(
iwave)%ExportField(i)%standard_name
378 CALL nuopc_advertise (
models(
iwave)%ExportState(ng), &
379 & standardname=trim(standardname), &
380 & name=trim(shortname), &
382 IF (esmf_logfounderror(rctocheck=rc, &
383 & msg=esmf_logerr_passthru, &
394 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_SetInitializeP1', &
403 & ImportState, ExportState, &
416 integer,
intent(out) :: rc
418 TYPE (esmf_gridcomp) :: model
419 TYPE (esmf_state) :: importstate
420 TYPE (esmf_state) :: exportstate
421 TYPE (esmf_clock) :: clock
425 integer :: mycomm, localpet, ng, petcount
427 character (len=*),
parameter :: myfile = &
428 & __FILE__//
", WAM_SetInitializeP2"
437 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_SetInitializeP2', &
448 CALL esmf_gridcompget (model, &
451 IF (esmf_logfounderror(rctocheck=rc, &
452 & msg=esmf_logerr_passthru, &
458 CALL esmf_vmget (vm, &
459 & localpet=localpet, &
460 & petcount=petcount, &
461 & mpicommunicator=mycomm, &
463 IF (esmf_logfounderror(rctocheck=rc, &
464 & msg=esmf_logerr_passthru, &
474 CALL wam_initialize (mycomm)
483 IF (esqmf_logfounderror(rctocheck=rc, &
484 & msg=esmf_logerr_passthru, &
499 IF (esqmf_logfounderror(rctocheck=rc, &
500 & msg=esmf_logerr_passthru, &
509 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_SetInitializeP2', &
601 USE wam_timopt_module,
ONLY : cdatea, cdatee, coldstart
605 integer,
intent(out) :: rc
607 TYPE (esmf_gridcomp) :: model
611 integer :: ref_year, start_year, stop_year
612 integer :: ref_month, start_month, stop_month
613 integer :: ref_day, start_day, stop_day
614 integer :: ref_hour, start_hour, stop_hour
615 integer :: ref_minute, start_minute, stop_minute
616 integer :: ref_second, start_second, stop_second
617 integer :: localpet, petcount
618 integer :: timefrac, ig
620 real(r8) :: hour, minute, yday
622 character (len= 80) :: calendar
623 character (len=160) :: message
625 character (len=*),
parameter :: myfile = &
626 & __FILE__//
", WAM_SetClock"
628 TYPE (esmf_calkind_flag) :: caltype
629 TYPE (esmf_time) :: currenttime, starttime
630 TYPE (esmf_timeinterval) ::
timestep
638 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_SetClock',
649 CALL esmf_gridcompget (model, &
650 & localpet=localpet, &
651 & petcount=petcount, &
654 IF (esmf_logfounderror(rctocheck=rc, &
655 & msg=esmf_logerr_passthru, &
668 IF (trim(calendar).eq.
'gregorian')
THEN
669 caltype=esmf_calkind_gregorian
671 caltype=esmf_calkind_gregorian
674 & name=trim(calendar),&
676 IF (esmf_logfounderror(rctocheck=rc, &
677 & msg=esmf_logerr_passthru, &
686 READ (cdatea,
'(i4,5i2)') ref_year, ref_month, ref_day, &
687 & ref_hour, ref_minute, ref_second
698 IF (esmf_logfounderror(rctocheck=rc, &
699 & msg=esmf_logerr_passthru, &
708 READ (cdatea,
'(i4,5i2)') start_year, start_month, start_day, &
709 & start_hour, start_minute, start_second
720 IF (esmf_logfounderror(rctocheck=rc, &
721 & msg=esmf_logerr_passthru, &
729 READ (cdatee,
'(i4,5i2)') stop_year, stop_month, stop_day, &
730 & stop_hour, stop_minute, stop_second
741 IF (esmf_logfounderror(rctocheck=rc, &
742 & msg=esmf_logerr_passthru, &
752 CALL esmf_gridcompget (model, &
755 IF (esmf_logfounderror(rctocheck=rc, &
756 & msg=esmf_logerr_passthru, &
766 IF (esmf_logfounderror(rctocheck=rc, &
767 & msg=esmf_logerr_passthru, &
785 & options=
"string", &
787 IF (esmf_logfounderror(rctocheck=rc, &
788 & msg=esmf_logerr_passthru, &
794 CALL esmf_timeprint (starttime, &
795 & options=
"string", &
797 IF (esmf_logfounderror(rctocheck=rc, &
798 & msg=esmf_logerr_passthru, &
804 message=
'Driver and WAM start times do not match: '// &
805 &
'please check the config files.'
806 CALL esmf_logseterror (esmf_failure, rctoreturn=rc, &
814 & options=
"string", &
816 IF (esmf_logfounderror(rctocheck=rc,
817 & msg=esmf_logerr_passthru, &
824 & options=
"string", &
826 IF (esmf_logfounderror(rctocheck=rc, &
827 & msg=esmf_logerr_passthru, &
833 message=
'Driver and WAM stop times do not match: '// &
834 &
'please check the config files.'
835 CALL esmf_logseterror (esmf_failure, rctoreturn=rc, &
843 & options=
"calkindflag", &
845 IF (esmf_logfounderror(rctocheck=rc, &
846 & msg=esmf_logerr_passthru, &
853 & options=
"calkindflag", &
855 IF (esmf_logfounderror(rctocheck=rc, &
856 & msg=esmf_logerr_passthru, &
862 message=
'Driver and WAM calendars do not match: '// &
863 &
'please check the config files.'
864 CALL esmf_logseterror (esmf_failure, rctoreturn=rc, &
875 timefrac=max(timefrac, &
877 & mask=
models(:)%IsActive))
879 IF (timefrac.lt.1)
THEN
881 IF (esmf_logfounderror(rctocheck=rc, &
882 & msg=esmf_logerr_passthru, &
898 IF (esmf_logfounderror(rctocheck=rc, &
899 & msg=esmf_logerr_passthru, &
911 IF (esmf_logfounderror(rctocheck=rc, &
912 & msg=esmf_logerr_passthru, &
920 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_SetClock', &
938 integer,
intent(out) :: rc
940 TYPE (esmf_gridcomp) :: model
944 logical :: atcorrecttime
946 integer :: importcount, localpet
948 character(ESMF_MAXSTR),
allocatable :: importnamelist(:)
950 character (len=*),
parameter :: myfile = &
951 & __FILE__//
", WAM_CheckImport"
953 TYPE (esmf_clock) :: driverclock
954 TYPE (esmf_field) :: field
955 TYPE (esmf_state) :: importstate
956 TYPE (esmf_time) :: starttime, currenttime
957 TYPE (esmf_timeinterval) ::
timestep
965 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_CheckImport', &
975 CALL nuopc_modelget (model, &
976 & driverclock=driverclock, &
978 IF (esmf_logfounderror(rctocheck=rc, &
979 & msg=esmf_logerr_passthru, &
985 CALL esmf_gridcompget (model, &
988 IF (esmf_logfounderror(rctocheck=rc, &
989 & msg=esmf_logerr_passthru, &
995 CALL esmf_vmget (vm, &
996 & localpet=localpet, &
998 IF (esmf_logfounderror(rctocheck=rc, &
999 & msg=esmf_logerr_passthru, &
1001 & file=myfile))
THEN
1009 CALL esmf_clockget (driverclock, &
1010 & starttime=starttime, &
1011 & currtime=currenttime, &
1014 IF (esmf_logfounderror(rctocheck=rc, &
1015 & msg=esmf_logerr_passthru, &
1017 & file=myfile))
THEN
1025 CALL esmf_gridcompget (model, &
1026 & importstate=importstate, &
1028 IF (esmf_logfounderror(rctocheck=rc, &
1029 & msg=esmf_logerr_passthru, &
1031 & file=myfile))
THEN
1039 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
1040 & itemcount=importcount, &
1042 IF (esmf_logfounderror(rctocheck=rc, &
1043 & msg=esmf_logerr_passthru, &
1045 & file=myfile))
THEN
1049 IF (.not.
allocated(importnamelist))
THEN
1050 allocate ( importnamelist(importcount) )
1053 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
1054 & itemnamelist=importnamelist, &
1056 IF (esmf_logfounderror(rctocheck=rc, &
1057 & msg=esmf_logerr_passthru, &
1059 & file=myfile))
THEN
1067 IF (importcount.gt.0)
THEN
1068 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
1069 & itemname=trim(importnamelist(1)), &
1072 IF (esmf_logfounderror(rctocheck=rc, &
1073 & msg=esmf_logerr_passthru, &
1075 & file=myfile))
THEN
1081 atcorrecttime=nuopc_isattime(field, &
1084 IF (esmf_logfounderror(rctocheck=rc, &
1085 & msg=esmf_logerr_passthru, &
1087 & file=myfile))
THEN
1092 & localpet,
"WAM", rc)
1093 IF (esmf_logfounderror(rctocheck=rc, &
1094 & msg=esmf_logerr_passthru, &
1096 & file=myfile))
THEN
1100 IF (.not.atcorrecttime)
THEN
1101 CALL esmf_logseterror(esmf_rc_arg_bad, &
1102 & msg=
"NUOPC INCOMPATIBILITY DETECTED:"// &
1103 &
" Import Fields not at correct time", &
1112 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_CheckImport', &
1129 USE wam_grid_module,
ONLY : nx, amowep, amoeap, xdello
1130 USE wam_grid_module,
ONLY : ny, amosop, amonop, xdella, l_s_mask
1131 USE wam_mpi_module ,
ONLY : petotal, irank, nstart, nend
1135 integer,
intent(in) :: ng, localpet
1136 integer,
intent(out) :: rc
1138 TYPE (esmf_gridcomp),
intent(inout) :: model
1142 integer :: i, ivar, j, localdecount, tile
1143 integer :: imin, imax, jmin, jmax
1145 integer,
allocatable :: deblocklist(:,:,:)
1147 integer (i4b),
pointer :: ptrm(:,:) => null()
1149 real (r8),
pointer :: ptrx(:,:) => null()
1150 real (r8),
pointer :: ptry(:,:) => null()
1152 character (ESMF_MAXSTR) :: name
1154 character (len=*),
parameter :: myfile = &
1155 & __FILE__//
", WAM_SetGridArrays"
1157 TYPE (esmf_distgrid) :: distgrid1, distgrid2
1158 TYPE (esmf_staggerloc) :: staggerloc
1159 TYPE (esmf_vm) :: vm
1166 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_SetGridArrays', &
1176 IF (.not.
allocated(deblocklist))
THEN
1177 allocate ( deblocklist(1,2,petotal) )
1181 deblocklist(1,1,tile)=nstart(tile)
1182 deblocklist(1,2,tile)=nend(tile)
1189 distgrid1=esmf_distgridcreate(minindex=(/ 1 /), &
1190 & maxindex=(/ nend(petotal) /), &
1191 & deblocklist=deblocklist, &
1193 IF (esmf_logfounderror(rctocheck=rc, &
1194 & msg=esmf_logerr_passthru, &
1196 & file=myfile))
THEN
1200 distgrid2=esmf_distgridcreate(minindex=(/ 1, 1 /), &
1201 & maxindex=(/ nx, ny /), &
1203 IF (esmf_logfounderror(rctocheck=rc, &
1204 & msg=esmf_logerr_passthru, &
1206 & file=myfile))
THEN
1223 models(
iwave)%grid(ng)=esmf_gridcreate(distgrid=distgrid2, &
1224 & indexflag=esmf_index_global, &
1225 & name=
"wam_grid", &
1227 IF (esmf_logfounderror(rctocheck=rc, &
1228 & msg=esmf_logerr_passthru, &
1230 & file=myfile))
THEN
1239 & localdecount=localdecount, &
1241 IF (esmf_logfounderror(rctocheck=rc, &
1242 & msg=esmf_logerr_passthru, &
1244 & file=myfile))
THEN
1250 mesh_loop :
DO ivar=1,ubound(
models(
iwave)%mesh, dim=1)
1254 staggerloc=esmf_staggerloc_center
1261 & staggerloc=staggerloc &
1263 IF (esmf_logfounderror(rctocheck=rc, &
1264 & msg=esmf_logerr_passthru, &
1266 & file=myfile))
THEN
1273 & staggerloc=staggerloc, &
1274 & itemflag=esmf_griditem_mask, &
1276 IF (esmf_logfounderror(rctocheck=rc, &
1277 & msg=esmf_logerr_passthru, &
1279 & file=myfile))
THEN
1288 de_loop :
DO localde=0,localdecount-1
1290 & localde=localde, &
1291 & staggerloc=staggerloc, &
1295 IF (esmf_logfounderror(rctocheck=rc, &
1296 & msg=esmf_logerr_passthru, &
1298 & file=myfile))
THEN
1303 & localde=localde, &
1304 & staggerloc=staggerloc, &
1308 IF (esmf_logfounderror(rctocheck=rc, &
1309 & msg=esmf_logerr_passthru, &
1311 & file=myfile))
THEN
1316 & localde=localde, &
1317 & staggerloc=staggerloc, &
1318 & itemflag=esmf_griditem_mask, &
1321 IF (esmf_logfounderror(rctocheck=rc, &
1322 & msg=esmf_logerr_passthru, &
1324 & file=myfile))
THEN
1330 imin=lbound(ptrx, dim=1)
1331 imax=ubound(ptrx, dim=1)
1332 jmin=lbound(ptrx, dim=2)
1333 jmax=ubound(ptrx, dim=2)
1338 ptrx(i,jmin:jmax)=real(i-1,r8)*xdello+amowep
1341 ptry(imin:imax,j)=real(j-1,r8)*xdella+amosop
1345 IF (l_s_mask(i,j))
THEN
1356 IF (
associated(ptrx))
nullify (ptrx)
1357 IF (
associated(ptry))
nullify (ptry)
1358 IF (
associated(ptrm))
nullify (ptrm)
1366 & filename=
"wam_"// &
1369 & staggerloc=staggerloc, &
1371 IF (esmf_logfounderror(rctocheck=rc, &
1372 & msg=esmf_logerr_passthru, &
1374 & file=myfile))
THEN
1382 CALL esmf_gridcompset (model, &
1385 IF (esmf_logfounderror(rctocheck=rc, &
1386 & msg=esmf_logerr_passthru, &
1388 & file=myfile))
THEN
1393 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_SetGridArrays', &
1412 integer,
intent(in) :: ng
1413 integer,
intent(out) :: rc
1415 TYPE (esmf_gridcomp) :: model
1420 integer :: localde, localdecount
1421 integer :: exportcount, importcount
1423 real (dp),
pointer :: ptr2d(:,:) => null()
1425 character (ESMF_MAXSTR),
allocatable :: exportnamelist(:)
1426 character (ESMF_MAXSTR),
allocatable :: importnamelist(:)
1428 character (len=*),
parameter :: myfile = &
1429 & __FILE__//
", WAM_SetStates"
1431 TYPE (esmf_arrayspec) :: arrayspec
1432 TYPE (esmf_field) :: field
1433 TYPE (esmf_staggerloc) :: staggerloc
1434 TYPE (esmf_vm) :: vm
1441 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_SetStates', &
1453 CALL esmf_gridcompget (model, &
1454 & localpet=localpet, &
1457 IF (esmf_logfounderror(rctocheck=rc, &
1458 & msg=esmf_logerr_passthru, &
1460 & file=myfile))
THEN
1469 & localdecount=localdecount, &
1471 IF (esmf_logfounderror(rctocheck=rc, &
1472 & msg=esmf_logerr_passthru, &
1474 & file=myfile))
THEN
1482 CALL esmf_arrayspecset (arrayspec, &
1483 & typekind=esmf_typekind_r8, &
1486 IF (esmf_logfounderror(rctocheck=rc, &
1487 & msg=esmf_logerr_passthru, &
1489 & file=myfile))
THEN
1501 CALL esmf_stateget (
models(
iwave)%ExportState(ng), &
1502 & itemcount=exportcount, &
1504 IF (esmf_logfounderror(rctocheck=rc, &
1505 & msg=esmf_logerr_passthru, &
1507 & file=myfile))
THEN
1513 IF (.not.
allocated(exportnamelist))
THEN
1514 allocate ( exportnamelist(exportcount) )
1516 CALL esmf_stateget (
models(
iwave)%ExportState(ng), &
1517 & itemnamelist=exportnamelist, &
1519 IF (esmf_logfounderror(rctocheck=rc, &
1520 & msg=esmf_logerr_passthru, &
1522 & file=myfile))
THEN
1531 IF (nuopc_isconnected(
models(
iwave)%ExportState(ng), &
1532 & fieldname=trim(exportnamelist(i)), &
1539 staggerloc=esmf_staggerloc_center
1546 & staggerloc=staggerloc, &
1547 & name=trim(exportnamelist(i)), &
1549 IF (esmf_logfounderror(rctocheck=rc, &
1550 & msg=esmf_logerr_passthru, &
1552 & file=myfile))
THEN
1559 DO localde=0,localdecount-1
1563 CALL esmf_fieldget (field, &
1564 & localde=localde, &
1565 & farrayptr=ptr2d, &
1567 IF (esmf_logfounderror(rctocheck=rc, &
1568 & msg=esmf_logerr_passthru, &
1570 & file=myfile))
THEN
1581 IF (
associated(ptr2d) )
nullify (ptr2d)
1586 CALL nuopc_realize (exportstate, &
1589 IF (esmf_logfounderror(rctocheck=rc, &
1590 & msg=esmf_logerr_passthru, &
1592 & file=myfile))
THEN
1599 IF (localpet.eq.0)
THEN
1600 WRITE (
cplout,10) trim(exportnamelist(i)), &
1601 &
'Export State: ', &
1604 CALL esmf_stateremove (
models(
iwave)%ExportState(ng), &
1605 & (/ trim(exportnamelist(i)) /), &
1607 IF (esmf_logfounderror(rctocheck=rc, &
1608 & msg=esmf_logerr_passthru, &
1610 & file=myfile))
THEN
1618 IF (
allocated(exportnamelist) )
deallocate (exportnamelist)
1630 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
1631 & itemcount=importcount, &
1633 IF (esmf_logfounderror(rctocheck=rc, &
1634 & msg=esmf_logerr_passthru, &
1636 & file=myfile))
THEN
1642 IF (.not.
allocated(importnamelist))
THEN
1643 allocate (importnamelist(importcount))
1645 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
1646 & itemnamelist=importnamelist, &
1648 IF (esmf_logfounderror(rctocheck=rc, &
1649 & msg=esmf_logerr_passthru, &
1651 & file=myfile))
THEN
1660 IF (nuopc_isconnected(
models(
iwave)%ImportState(ng), &
1661 & fieldname=trim(importnamelist(i)), &
1669 staggerloc=esmf_staggerloc_center
1677 & staggerloc=staggerloc, &
1678 & indexflag=esmf_index_global, &
1679 & name=trim(importnamelist(i)), &
1681 IF (esmf_logfounderror(rctocheck=rc, &
1682 & msg=esmf_logerr_passthru, &
1684 & file=myfile))
THEN
1691 DO localde=0,localdecount-1
1695 CALL esmf_fieldget (field, &
1696 & localde=localde, &
1697 & farrayptr=ptr2d, &
1699 IF (esmf_logfounderror(rctocheck=rc, &
1700 & msg=esmf_logerr_passthru, &
1702 & file=myfile))
THEN
1713 IF (
associated(ptr2d))
nullify (ptr2d)
1718 CALL nuopc_realize (
models(
iwave)%ImportState(ng), &
1721 IF (esmf_logfounderror(rctocheck=rc, &
1722 & msg=esmf_logerr_passthru, &
1724 & file=myfile))
THEN
1731 IF (localpet.eq.0)
THEN
1732 WRITE (
cplout,10) trim(importnamelist(i)), &
1733 &
'Import State: ', &
1736 CALL esmf_stateremove (
models(
iwave)%ImportState(ng), &
1737 & trim(importnamelist(i)), &
1739 IF (esmf_logfounderror(rctocheck=rc, &
1740 & msg=esmf_logerr_passthru, &
1742 & file=myfile))
THEN
1750 IF (
allocated(importnamelist))
deallocate (importnamelist)
1755 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_SetStates', &
1775 integer,
intent(out) :: rc
1777 TYPE (esmf_gridcomp) :: model
1781 integer :: localpet, petcount, phase
1785 character (ESMF_MAXSTR) :: str1, str2
1787 character (len=*),
parameter :: myfile = &
1788 & __FILE__//
", WAM_ModelAdvance"
1790 TYPE (esmf_clock) :: clock
1791 TYPE (esmf_state) :: exportstate, importstate
1792 TYPE (esmf_time) :: referencetime
1793 TYPE (esmf_time) :: currenttime, stoptime
1794 TYPE (esmf_timeinterval) ::
timestep
1795 TYPE (esmf_vm) :: vm
1802 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_ModelAdvance', &
1812 CALL esmf_gridcompget (model, &
1814 & importstate=importstate, &
1815 & exportstate=exportstate, &
1816 & currentphase=phase, &
1819 IF (esmf_logfounderror(rctocheck=rc, &
1820 & msg=esmf_logerr_passthru, &
1822 & file=myfile))
THEN
1828 CALL esmf_vmget (vm, &
1829 & localpet=localpet, &
1830 & petcount=petcount, &
1832 IF (esmf_logfounderror(rctocheck=rc, &
1833 & msg=esmf_logerr_passthru, &
1835 & file=myfile))
THEN
1844 CALL esmf_clockget (clock, &
1846 & stoptime=stoptime, &
1847 & reftime=reftime, &
1848 & currtime=currenttime, &
1850 IF (esmf_logfounderror(rctocheck=rc, &
1851 & msg=esmf_logerr_passthru, &
1853 & file=myfile))
THEN
1861 CALL esmf_timeintervalget (
timestep, &
1864 IF (esmf_logfounderror(rctocheck=rc, &
1865 & msg=esmf_logerr_passthru, &
1867 & file=myfile))
THEN
1875 IF ((
debuglevel.ge.0).and.(localpet.eq.0))
THEN
1879 CALL esmf_timeget (currenttime, &
1880 & timestringisofrac=str1, &
1882 IF (esmf_logfounderror(rctocheck=rc, &
1883 & msg=esmf_logerr_passthru, &
1885 & file=myfile))
THEN
1891 CALL esmf_timeget (currenttime+
timestep, &
1892 & timestringisofrac=str2, &
1894 IF (esmf_logfounderror(rctocheck=rc, &
1895 & msg=esmf_logerr_passthru, &
1897 & file=myfile))
THEN
1902 WRITE (
cplout,10) trim(str1), trim(str2), phase
1904 WRITE (
cplout,20) trim(str1), trim(str2), phase, trun
1913 & (currenttime.ne.reftime).or.restarted))
THEN
1917 IF (esmf_logfounderror(rctocheck=rc, &
1918 & msg=esmf_logerr_passthru, &
1920 & file=myfile))
THEN
1941 IF (esmf_logfounderror(rctocheck=rc, &
1942 & msg=esmf_logerr_passthru, &
1944 & file=myfile))
THEN
1952 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_ModelAdvance', &
1958 10
FORMAT (/,
' ESMF, Running WAM: ',a,
' --> ',a,
' Phase: ',i1)
1959 20
FORMAT (/,
' ESMF, Running WAV: ',a,
' --> ',a,
' Phase: ',i1, &
1960 &
' [', f15.2,
' s]')
2026 USE wam_grid_module,
ONLY : nx, ny, nsea, l_s_mask
2027 USE wam_user_interface,
ONLY : us_esmf, vs_esmf
2031 integer,
intent(in) :: ng
2032 integer,
intent(out) :: rc
2034 TYPE (esmf_gridcomp) :: model
2038 integer :: id, ifld, tile
2039 integer :: iyear, iday, imonth, ihour
2042 real (dp) :: add_offset, scale
2044 real (dp),
allocatable :: arr2d(:,:)
2046 character (ESMF_MAXSTR) :: ofile
2047 character (ESMF_MAXSTR),
allocatable :: importnamelist(:)
2049 character (len=*),
parameter :: myfile = &
2050 & __FILE__//
", WAM_Import"
2052 TYPE (esmf_clock) :: clock
2053 TYPE (esmf_field) :: field
2054 TYPE (esmf_time) :: currenttime
2055 TYPE (esmf_vm) :: vm
2062 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_Import', &
2072 CALL esmf_gridcompget (model, &
2074 & localpet=localpet, &
2077 IF (esmf_logfounderror(rctocheck=rc, &
2078 & msg=esmf_logerr_passthru, &
2080 & file=myfile))
THEN
2088 CALL esmf_clockget (clock, &
2089 & currtime=currenttime, &
2091 IF (esmf_logfounderror(rctocheck=rc, &
2092 & msg=esmf_logerr_passthru, &
2094 & file=myfile))
THEN
2098 CALL esmf_timeget (currenttime, &
2104 IF (esmf_logfounderror(rctocheck=rc, &
2105 & msg=esmf_logerr_passthru, &
2107 & file=myfile))
THEN
2115 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
2116 & itemcount=importcount, &
2118 IF (esmf_logfounderror(rctocheck=rc, &
2119 & msg=esmf_logerr_passthru, &
2121 & file=myfile))
THEN
2125 IF (.not.
allocated(importnamelist))
THEN
2126 allocate ( importnamelist(importcount) )
2128 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
2129 & itemnamelist=importnamelist, &
2131 IF (esmf_logfounderror(rctocheck=rc, &
2132 & msg=esmf_logerr_passthru, &
2134 & file=myfile))
THEN
2142 fld_loop :
DO ifld=1,importcount
2147 CALL esmf_stateget (
models(
iwave)%ImportState(ng), &
2148 & trim(importnamelist(ifld)), &
2151 IF (esmf_logfounderror(rctocheck=rc, &
2152 & msg=esmf_logerr_passthru, &
2154 & file=myfile))
THEN
2160 IF (.not.
allocated(arr2d))
THEN
2161 allocate ( arr2d(nx,ny) )
2164 DO tile=0,petcount-1
2165 CALL esmf_fieldgather (field, &
2170 IF (esmf_logfounderror(rctocheck=rc, &
2171 & msg=esmf_logerr_passthru, &
2173 & file=myfile))
THEN
2181 WRITE (
cplout,10) localpet, tile, &
2182 & adjustl(
"IND/WAV/IMP/"//importnamelist(ifld)), &
2191 add_offset=
models(
iwave)%ImportField(id)%add_offset
2193 SELECT CASE (trim(adjustl(importnamelist(ifld))))
2198 us_esmf(1:nsea)=pack(arr2d, l_s_mask)
2199 us_esmf(1:nsea)=(us_esmf(1:nsea)*scale)+add_offset
2204 vs_esmf(1:nsea)=pack(arr2d, l_s_mask)
2205 vs_esmf(1:nsea)=(vs_esmf(1:nsea)*scale)+add_offset
2210 us_esmf(1:nsea)=pack(arr2d, l_s_mask)
2211 us_esmf(1:nsea)=(us_esmf(1:nsea)*scale)+add_offset
2216 vs_esmf(1:nsea)=pack(arr2d, l_s_mask)
2217 vs_esmf(1:nsea)=(vs_esmf(1:nsea)*scale)+add_offset
2224 WRITE (ofile,20)
'wam_import', trim(importnamelist(ifld)), &
2225 & iyear, imonth, iday, ihour
2226 CALL esmf_fieldwrite (field, &
2228 & overwrite=.true., &
2230 IF (esmf_logfounderror(rctocheck=rc, &
2231 & msg=esmf_logerr_passthru, &
2233 & file=myfile))
THEN
2243 IF (
allocated(importnamelist))
deallocate (importnamelist)
2244 IF (
allocated(arr2d))
deallocate (arr2d)
2247 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_Import', &
2253 10
FORMAT (
' PET(',i3,
') - tile(',i2,
') - ', a20,
' : ', 4i8)
2254 20
FORMAT (a,
'_',a,
'_',i4.4,3(
'-',i2.2),
'.nc')
2267 USE wam_model_module,
ONLY : z0, ustar, tauw
2271 integer,
intent(out) :: rc
2273 TYPE (esmf_gridcomp) :: model
2277 integer :: ifld, imin, imax, jmin, jmax
2278 integer :: iyear, iday, imonth, ihour
2279 integer :: exportcount
2280 integer :: localde, localdecount, localpet, petcount
2282 real (r8),
pointer :: ptr(:,:) => null()
2284 character (ESMF_MAXSTR) :: ofile
2285 character (ESMF_MAXSTR),
allocatable :: importnamelist(:)
2287 character (len=*),
parameter :: myfile = &
2288 & __FILE__//
", WAM_Export"
2290 TYPE (esmf_clock) :: clock
2291 TYPE (esmf_field) :: field
2292 TYPE (esmf_state) :: exportstate
2293 TYPE (esmf_time) :: currenttime
2294 TYPE (esmf_vm) :: vm
2301 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_Export', &
2311 CALL esmf_gridcompget (model, &
2315 IF (esmf_logfounderror(rctocheck=rc, &
2316 & msg=esmf_logerr_passthru, &
2318 & file=myfile))
THEN
2324 CALL esmf_vmget (vm, &
2325 & localpet=localpet, &
2326 & petcount=petcount, &
2328 IF (esmf_logfounderror(rctocheck=rc, &
2329 & msg=esmf_logerr_passthru, &
2331 & file=myfile))
THEN
2340 & localdecount=localdecount, &
2342 IF (esmf_logfounderror(rctocheck=rc, &
2343 & msg=esmf_logerr_passthru, &
2345 & file=myfile))
THEN
2353 CALL esmf_clockget (clock, &
2354 & currtime=currenttime, &
2356 IF (esmf_logfounderror(rctocheck=rc, &
2357 & msg=esmf_logerr_passthru, &
2359 & file=myfile))
THEN
2363 CALL esmf_timeget (currenttime, &
2369 IF (esmf_logfounderror(rctocheck=rc, &
2370 & msg=esmf_logerr_passthru, &
2372 & file=myfile))
THEN
2380 CALL esmf_stateget (
models(
iwave)%ExportState(ng), &
2381 & itemcount=exportcount, &
2383 IF (esmf_logfounderror(rctocheck=rc, &
2384 & msg=esmf_logerr_passthru, &
2386 & file=myfile))
THEN
2390 IF (.not.
allocated(exportnamelist))
THEN
2391 allocate ( exportnamelist(exportcount) )
2394 CALL esmf_stateget (
models(
iwave)%ExportState(ng), &
2395 & itemnamelist=exportnamelist, &
2397 IF (esmf_logfounderror(rctocheck=rc, &
2398 & msg=esmf_logerr_passthru, &
2400 & file=myfile))
THEN
2408 fld_loop :
DO ifld=1,exportcount
2412 CALL esmf_stateget (
models(
iwave)%ExportState(ng), &
2413 & trim(exportnamelist(ifld)), &
2416 IF (esmf_logfounderror(rctocheck=rc, &
2417 & msg=esmf_logerr_passthru, &
2419 & file=myfile))
THEN
2426 de_loop :
DO localde=0,localdecount-1
2427 CALL esmf_fieldget (field, &
2428 & localde=localde, &
2431 IF (esmf_logfounderror(rctocheck=rc, &
2432 & msg=esmf_logerr_passthru, &
2434 & file=myfile))
THEN
2444 imin=lbound(ptr, dim=1)
2445 imax=ubound(ptr, dim=1)
2446 jmin=lbound(ptr, dim=2)
2447 jmax=ubound(ptr, dim=2)
2449 SELECT CASE (trim(adjustl(exportnamelist(ifld))))
2454 CALL wam_unpack (vm, ptr, imin, imax, jmin, jmax, &
2456 IF (esmf_logfounderror(rctocheck=rc, &
2457 & msg=esmf_logerr_passthru, &
2459 & file=myfile))
THEN
2466 CALL wam_unpack (vm, ptr, imin, imax, jmin, jmax, &
2468 IF (esmf_logfounderror(rctocheck=rc, &
2469 & msg=esmf_logerr_passthru, &
2471 & file=myfile))
THEN
2477 CALL wam_unpack (vm, ptr, imin, imax, jmin, jmax, &
2479 IF (esmf_logfounderror(rctocheck=rc, &
2480 & msg=esmf_logerr_passthru, &
2482 & file=myfile))
THEN
2490 IF (
associated(ptr))
nullify (ptr)
2496 &
models(
iwave)%ExportField(ifld)%debug_write)
THEN
2497 WRITE (ofile,10) ng, trim(exportnamelist(ifld)), &
2498 & iyear, imonth, iday, ihour
2499 CALL esmf_fieldwrite (field, &
2501 & overwrite=.true., &
2503 IF (esmf_logfounderror(rctocheck=rc, &
2504 & msg=esmf_logerr_passthru, &
2506 & file=myfile))
THEN
2514 IF (
allocated(exportnamelist))
deallocate (exportnamelist)
2517 WRITE (
trac,
'(a,a,i0)')
'<== Exitinh WAM_Export', &
2522 10
FORMAT (
'wam_',i2.2,
'_export_',a,
'_',i4.4,3(
'-',i2.2),
'.nc')
2536 USE wam_mpi_module,
ONLY : nstart, nend, pelocal, irank
2537 USE wam_grid_module,
ONLY : nx, ny, nsea, l_s_mask
2541 integer,
intent(in) :: imin, imax, jmin, jmax
2542 integer,
intent(inout) :: rc
2544 real (r4),
intent(in) :: var(1:nsea)
2545 real (r8),
intent(inout) :: ptr(imin:imax,jmin:jmax)
2547 TYPE (esmf_vm),
intent(in) :: vm
2551 integer :: localpet, petcount
2552 integer :: i, j, k, ii, jj, ijs, ijl
2554 integer (i4b),
allocatable :: offsets_recv(:)
2555 integer (i4b),
allocatable :: blocksize(:)
2557 real (r4),
allocatable :: work1(:), work2(:,:)
2559 character (len=*),
parameter :: myfile = &
2560 & __FILE__//
", WAM_Unpack"
2567 WRITE (
trac,
'(a,a,i0)')
'==> Entering WAM_Unpack', &
2578 CALL esmf_vmget (vm, &
2579 & localpet=localpet, &
2580 & petcount=petcount, &
2582 IF (esmf_logfounderror(rctocheck=rc, &
2583 & msg=esmf_logerr_passthru, &
2585 & file=myfile))
THEN
2593 IF (.not.
allocated(work1))
THEN
2594 allocate ( work1(1:nsea) )
2597 IF (.not.
allocated(work2))
THEN
2598 allocate ( work2(nx,ny) )
2602 IF (.not.
allocated(blocksize))
THEN
2603 allocate ( blocksize(petcount) )
2606 IF (.not.
allocated(offsets_recv))
THEN
2607 allocate ( offsets_recv(petcount) )
2618 CALL esmf_vmallgatherv (vm,
2619 & senddata=(/ ijl-ijs+1 /), &
2621 & recvdata=blocksize, &
2622 & recvcounts=(/ (1, k=0,petcount-1) /), &
2623 & recvoffsets=(/ (k, k=0,petcount-1) /), &
2625 IF (esmf_logfounderror(rctocheck=rc, &
2626 & msg=esmf_logerr_passthru, &
2628 & file=myfile))
THEN
2632 CALL esmf_vmallgatherv (vm,
2633 & senddata= (/ ijs-1 /), &
2635 & recvdata=offsets_recv, &
2636 & recvcounts=(/ (1, k=0,petcount-1) /), &
2637 & recvoffsets=(/ (k, k=0,petcount-1) /), &
2639 IF (esmf_logfounderror(rctocheck=rc, &
2640 & msg=esmf_logerr_passthru, &
2642 & file=myfile))
THEN
2650 CALL esmf_vmallgatherv (vm, &
2651 & senddata=var(1:blocksize(irank)), &
2652 & sendcount=blocksize(irank), &
2654 & recvcounts=blocksize, &
2655 & recvoffsets=offsets_recv, &
2657 IF (esmf_logfounderror(rctocheck=rc, &
2658 & msg=esmf_logerr_passthru, &
2660 & file=myfile))
THEN
2672 IF (work2(i,j).lt.
tol_r4)
THEN
2682 IF (
allocated(work1))
deallocate (work1)
2683 IF (
allocated(work2))
deallocate (work2)
2684 IF (
allocated(blocksize))
deallocate (blocksize)
2685 IF (
allocated(offsets_recv))
deallocate (offsets_recv)
2688 WRITE (
trac,
'(a,a,i0)')
'<== Exiting WAM_Unpack', &