subroutine aoicpl_prep(deltim,delt_cpl,phour,fhour,idate, & aoi_fld,global_lats_r,lonsperlar) ! ! Feb 2014 Xingren Wu - Collect Fields for Atm/Ocn/Ice coupling ! Apr 2014 Xingren Wu - Modified: Add SW fluxes for Nir/uv+vis ! Jun 2014 Xingren Wu - Modified: Revise Net SW heat fluxes ! Jul 2014 Xingren Wu - Modified: Add Sea/Land mask ! use resol_def, ONLY: latr, lonr use layout1, ONLY: me, nodes, lats_node_r, & nodes_comp use namelist_physics_def, ONLY: ens_nam,ngrid_a2oi, & sfcio_out use mpi_def, ONLY: mpi_comm_all, & mc_comp, mpi_comm_null use gfs_physics_aoi_var_mod, ONLY: AOI_Var_Data USE machine, ONLY: kind_evod implicit none !! TYPE(AOI_Var_Data) :: aoi_fld integer idate(4) real(kind=kind_evod) deltim,delt_cpl,phour,fhour INTEGER GLOBAL_LATS_R(LATR), lonsperlar(LATR) !! integer noa2oi integer ierr !! !! integer IOPROC !! !------------------------------------------------------------------------- ! print *,' in aoicpl_prep me=',me call mpi_barrier(mpi_comm_all,ierr) if(nodes_comp < 1 .or. nodes_comp > nodes) then print *, ' NODES_COMP UNDEFINED, CANNOT DO I.O ' call mpi_finalize() stop 333 endif ! ioproc = nodes_comp-1 call MPI_BARRIER(mpi_comm_all,ierr) ! !! Data for Atm/Ocn/Ice coupling (average and instantaneous) ! print *,'---- start aoi_fld collection section -----' if(mc_comp /= MPI_COMM_NULL) then if(sfcio_out) then call cplflx_collect(IOPROC,noa2oi,ngrid_a2oi, & deltim,delt_cpl,FHOUR,IDATE, & aoi_fld,global_lats_r,lonsperlar) endif endif ! comp node return end !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE cplflx_collect(IOPROC,noa2oi,ngrid_a2oi, & deltim,delt_cpl,FHOUR,IDATE, & aoi_fld,global_lats_r,lonsperlar) !! ! use resol_def, ONLY: lonr, latr use layout1, ONLY: me, lats_node_r,lats_node_r_max use gfs_physics_aoi_var_mod, ONLY: AOI_Var_Data USE machine, ONLY: kind_evod, kind_io8, kind_io4 use namelist_physics_def, ONLY: a2oi_out,fhout use module_CPLFIELDS, ONLY: fillExportFields implicit none !! TYPE(AOI_Var_Data) :: aoi_fld INTEGER GLOBAL_LATS_R(LATR) INTEGER lonsperlar(LATR) integer IOPROC real(kind=kind_io8) slmsk(LONR,LATS_NODE_R) !! integer j,i,k,noa2oi,ngrid2d,ngrid_a2oi real (kind=kind_io8) rtimer,rtime,cpl_hr real (kind=kind_io8) fhour real (kind=kind_evod) deltim,delt_cpl ! INTEGER IDATE(4) real (kind=kind_io8) glolal(lonr,LATS_NODE_R) real (kind=kind_io8) buffo(lonr,LATS_NODE_R) real (kind=kind_io8) buffol(lonr,latr) real (kind=kind_io8) data4iceocn(lonr,latr,41) ! this will merge with ngrid_a2oi and be deleted real (kind=kind_io8) data2cpl(lonr,latr,ngrid_a2oi) logical chk_cplflx !.................................................................. integer, dimension(lonr,lats_node_r_max) :: kmsk, kmsk0 integer iyr,imo,ida,ihr,ithr,ndig character*8 s character*40 a2oifname,cithr,cform ! if(me.eq.ioproc) print *,'begin cplflx_collect' ! IYR = IDATE(4) IMO = IDATE(2) IDA = IDATE(3) IHR = IDATE(1) ITHR = NINT(FHOUR) NDIG = MAX(log10(ITHR+0.5)+1.,2.) !! kmsk0 = 0 ! delt_cpl=3600.*fhout RTIME = deltim/delt_cpl ! temporary - need change ! write(0,*)' rtimer=',rtimer !.......................................................... ! ! ngrid2d=1 ! MEAN Zonal compt of momentum flux (N/m**2) ! glolal = aoi_fld%DUSFC*RTIME ngrid2d = 1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=2 ! MEAN Merid compt of momentum flux (N/m**2) ! glolal = aoi_fld%DVSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=3 ! MEAN Sensible heat flux (W/m**2) ! glolal = aoi_fld%DTSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=4 ! MEAN Latent heat flux (W/m**2) ! glolal = aoi_fld%DQSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=5 ! MEAN Downward long wave radiation flux (W/m**2) ! glolal = aoi_fld%DLWSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=6 ! MEAN Downward solar radiation flux (W/m**2) ! glolal = aoi_fld%DSWSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=7 ! MEAN Precipitation rate (kg/m**2/s) ! ! glolal = aoi_fld%GESHEM*1.E3*RTIME glolal = aoi_fld%rain*1.E3*RTIME/deltim ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !.......................................................... ! ! ngrid2d=8 ! Instataneous Zonal compt of momentum flux (N/m**2) ! glolal = aoi_fld%DUSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=9 ! Instataneous Merid compt of momentum flux (N/m**2) ! glolal = aoi_fld%DVSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=10 ! Instataneous Sensible heat flux (W/m**2) ! glolal = aoi_fld%DTSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=11 ! Instataneous Latent heat flux (W/m**2) ! glolal = aoi_fld%DQSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=12 ! Instataneous Downward long wave radiation flux (W/m**2) ! glolal = aoi_fld%DLWSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=13 ! Instataneous Downward solar radiation flux (W/m**2) ! glolal = aoi_fld%DSWSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=14 ! Instataneous Temperature (K) 2 m above ground ! glolal = aoi_fld%t2mi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=15 ! Instataneous Specific humidity (kg/kg) 2 m above ground ! glolal = aoi_fld%q2mi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=16 ! Instataneous u wind (m/s) 10 m above ground ! glolal = aoi_fld%u10mi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=17 ! Instataneous v wind (m/s) 10 m above ground ! glolal = aoi_fld%v10mi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=18 ! Instataneous Temperature (K) at surface ! glolal = aoi_fld%tseai ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=19 ! Instataneous Pressure (Pa) land and sea surface ! glolal = aoi_fld%PSURFI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=20 ! Instataneous Surface height (m) ! glolal = aoi_fld%oro ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=21 ! MEAN NET long wave radiation flux (W/m**2) ! glolal = aoi_fld%NLWSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=22 ! MEAN NET solar radiation flux over the ocean (W/m**2) ! glolal = aoi_fld%NSWSFC*RTIME ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=23 ! Instataneous NET long wave radiation flux (W/m**2) ! glolal = aoi_fld%NLWSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=24 ! Instataneous NET solar radiation flux over the ocean (W/m**2) ! glolal = aoi_fld%NSWSFCI ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=25 ! MEAN sfc downward nir direct flux (W/m**2) ! glolal = aoi_fld%dnirbm*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=26 ! MEAN sfc downward nir diffused flux (W/m**2) ! glolal = aoi_fld%dnirdf*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=27 ! MEAN sfc downward uv+vis direct flux (W/m**2) ! glolal = aoi_fld%dvisbm*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=28 ! MEAN sfc downward uv+vis diffused flux (W/m**2) ! glolal = aoi_fld%dvisdf*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=29 ! Instataneous sfc downward nir direct flux (W/m**2) ! glolal = aoi_fld%dnirbmi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=30 ! Instataneous sfc downward nir diffused flux (W/m**2) ! glolal = aoi_fld%dnirdfi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=31 ! Instataneous sfc downward uv+vis direct flux (W/m**2) ! glolal = aoi_fld%dvisbmi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=32 ! Instataneous sfc downward uv+vis diffused flux (W/m**2) ! glolal = aoi_fld%dvisdfi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=33 ! MEAN NET downward nir direct flux over the ocean (W/m**2) ! glolal = aoi_fld%nnirbm*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=34 ! MEAN NET downward nir diffused flux over the ocean (W/m**2) ! glolal = aoi_fld%nnirdf*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=35 ! MEAN NET downward uv+vis direct flux over the ocean (W/m**2) ! glolal = aoi_fld%nvisbm*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=36 ! MEAN NET downward uv+vis diffused flux over the ocean (W/m**2) ! glolal = aoi_fld%nvisdf*rtime ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=37 ! Instataneous NET downward nir direct flux over the ocean (W/m**2) ! glolal = aoi_fld%nnirbmi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=38 ! Instataneous NET downward nir diffused flux over the ocean (W/m**2) ! glolal = aoi_fld%nnirdfi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=39 ! Instataneous NET downward uv+vis direct flux over the ocean (W/m**2) ! glolal = aoi_fld%nvisbmi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=40 ! Instataneous NET downward uv+vis diffused flux over the ocean (W/m**2) ! glolal = aoi_fld%nvisdfi ngrid2d = ngrid2d+1 CALL uninterpred(1,kmsk0,buffo,glolal,global_lats_r,lonsperlar) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... ! ! ngrid2d=41 ! Land-Sea Mask ! glolal = aoi_fld%slimsk ngrid2d = ngrid2d+1 kmsk = nint(glolal) CALL uninterpred(1,kmsk,slmsk,glolal,global_lats_r,lonsperlar) buffo = mod(slmsk,2._kind_io8) call unsplit2d_phys_r(ioproc,buffol,buffo,global_lats_r) data4iceocn(:,:,ngrid2d)=buffol(:,:) !.......................................................... if(me.eq.ioproc) then print *,'ioproc,ngrid2d,global_lats_r,rtimer', & ioproc,ngrid2d,global_lats_r,rtimer if (a2oi_out) then write(s,'(i4,i2.2,i2.2)'),iyr,imo,ida write(cform,'("(i",i1,".",i1,")")') ndig,ndig write(cithr,cform) ithr a2oifname='A2OIf.'//trim(s)//'.'//trim(cithr) open(noa2oi,file=a2oifname,form='unformatted', & status='unknown') do k=1,ngrid2d write(noa2oi) data4iceocn(:,:,k) enddo close(noa2oi) PRINT *,'chk_cplflx,FHOUR,DELTIM,DELT_CPL', & FHOUR,DELTIM,DELT_CPL endif endif !! !.......................................................... ! Fill the export Fields for ESMF/NUOPC style coupling if (ngrid2d .LT. ngrid_a2oi) then print *, & 'WARNING: fields required from coupler is more than available' stop endif do k=1,ngrid_a2oi data2cpl(:,:,k)=data4iceocn(:,:,k) enddo call fillExportFields(data2cpl, lonr, latr, rootPet=ioproc) ! call fillExportFields(data4iceocn, lonr, latr, rootPet=ioproc) !.......................................................... !! aoi_fld%dusfc = 0. aoi_fld%dvsfc = 0. aoi_fld%dtsfc = 0. aoi_fld%dqsfc = 0. aoi_fld%dlwsfc = 0. aoi_fld%dswsfc = 0. aoi_fld%dnirbm = 0. aoi_fld%dnirdf = 0. aoi_fld%dvisbm = 0. aoi_fld%dvisdf = 0. aoi_fld%nlwsfc = 0. aoi_fld%nswsfc = 0. aoi_fld%nnirbm = 0. aoi_fld%nnirdf = 0. aoi_fld%nvisbm = 0. aoi_fld%nvisdf = 0. aoi_fld%rain = 0. if(me.eq.ioproc) PRINT *,'cplflx_collect completed' RETURN END