diff --git a/io/module_wrt_grid_comp.F90 b/io/module_wrt_grid_comp.F90 index 8d6c44b17..6a3b8ee01 100644 --- a/io/module_wrt_grid_comp.F90 +++ b/io/module_wrt_grid_comp.F90 @@ -2295,7 +2295,7 @@ subroutine wrt_run(wrt_comp, imp_state_write, exp_state_write,clock,rc) !** write out log file ! if (mype == lead_write_task) then - open(newunit=nolog,file='atm.logf'//trim(cfhour),form='FORMATTED') + open(newunit=nolog,file='log.atm.f'//trim(cfhour),form='FORMATTED') write(nolog,100)nfhour,idate(1:6) 100 format(' completed fv3gfs fhour=',f10.3,2x,6(i4,2x)) close(nolog) diff --git a/io/post_fv3.F90 b/io/post_fv3.F90 index 33f098ab9..7cc6ab45e 100644 --- a/io/post_fv3.F90 +++ b/io/post_fv3.F90 @@ -40,7 +40,7 @@ subroutine post_run_fv3(wrt_int_state,grid_id,mype,mpicomp,lead_write, & !----------------------------------------------------------------------- ! use ctlblk_mod, only : komax,ifhr,ifmin,modelname,datapd,fld_info, & - npset,grib,gocart_on,jsta, & + npset,grib,jsta, & jend,ista,iend, im, nsoil, filenameflat,numx use gridspec_mod, only : maptype, gridtype,latstart,latlast, & lonstart,lonlast @@ -86,7 +86,7 @@ subroutine post_run_fv3(wrt_int_state,grid_id,mype,mpicomp,lead_write, & grib = "grib2" gridtype = "A" - nsoil = 4 + nsoil = wrt_int_state%nsoil nwtpg = wrt_int_state%petcount jts = wrt_int_state%out_grid_info(grid_id)%j_start !<-- Starting J of this write task's subsection jte = wrt_int_state%out_grid_info(grid_id)%j_end !<-- Ending J of this write task's subsection @@ -493,17 +493,23 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) ! Jul 2019 J. Wang Initial code ! Apr 2022 W. Meng Unify set_postvars_gfs and ! set_postvars_regional to set_postvars_fv3 +! Apr 2023 W. Meng Sync RRFS and GFS changes from off-line post ! !----------------------------------------------------------------------- !*** set up post fields from nmint_state !----------------------------------------------------------------------- ! use esmf + use vrbls4d, only: dust, smoke, fv3dust, coarsepm, SALT, SUSO, SOOT, & + WASO,no3,nh4, PP25, PP10 use vrbls3d, only: t, q, uh, vh, wh, alpint, dpres, zint, zmid, o3, & qqr, qqs, cwm, qqi, qqw, qqg, omga, cfr, pmid, & q2, rlwtt, rswtt, tcucn, tcucns, train, el_pbl, & pint, exch_h, ref_10cm, qqni, qqnr, qqnwfa, & - qqnifa + qqnifa, effri, effrl, effrs, aextc55, taod5503d, & + duem, dusd, dudp, duwt, dusv, ssem, sssd, ssdp, & + sswt, sssv, bcem, bcsd, bcdp, bcwt, bcsv, ocem, & + ocsd, ocdp, ocwt, ocsv, rhomid use vrbls2d, only: f, pd, sigt4, fis, pblh, ustar, z0, ths, qs, twbs,& qwbs, avgcprate, cprate, avgprec, prec, lspa, sno,& cldefi, th10, q10, tshltr, pshltr, albase, & @@ -520,7 +526,7 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) acsnow, acsnom, sst, thz0, qz0, uz0, vz0, ptop, & htop, pbot, hbot, ptopl, pbotl, ttopl, ptopm, & pbotm, ttopm, ptoph, pboth, pblcfr, ttoph, runoff,& - tecan, tetran, tedir, twa, & + tecan, tetran, tedir, twa, sndepac, & maxtshltr, mintshltr, maxrhshltr, minrhshltr, & dzice, smcwlt, suntime, fieldcapa, htopd, hbotd, & htops, hbots, aswintoa, maxqshltr, minqshltr, & @@ -536,17 +542,24 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) sfcvxi, t10m, t10avg, psfcavg, akhsavg, akmsavg, & albedo, tg, prate_max, pwat, snow_acm, snow_bkt, & acgraup, graup_bucket, acfrain, frzrn_bucket, & - ltg1_max, ltg2_max, ltg3_max - use soil, only: sldpth, sh2o, smc, stc + ltg1_max, ltg2_max, ltg3_max, aodtot, ebb, hwp, & + aod550,du_aod550,ss_aod550,su_aod550,oc_aod550, & + bc_aod550,maod, & + dustpm10, dustcb, bccb, occb, sulfcb, sscb, & + dustallcb, ssallcb, dustpm, sspm, pp25cb, pp10cb, & + no3cb, nh4cb, dusmass, ducmass, dusmass25,ducmass25 + use soil, only: sldpth, sh2o, smc, stc, sllevel use masks, only: lmv, lmh, htm, vtm, gdlat, gdlon, dx, dy, hbm2, sm, sice use ctlblk_mod, only: im, jm, lm, lp1, jsta, jend, jsta_2l, jend_2u, jsta_m,jend_m, & - ista, iend, ista_2l, iend_2u, ista_m,iend_m, & + ista, iend, ista_2l, iend_2u, ista_m,iend_m,qmin, & lsm, pt, imp_physics, spval, mpi_comm_comp, gdsdegr, & tprec, tclod, trdlw, trdsw, tsrfc, tmaxmin, theat, & ardlw, ardsw, asrfc, avrain, avcnvc, iSF_SURFACE_PHYSICS,& td3d, idat, sdat, ifhr, ifmin, dt, nphs, dtq2, pt_tbl, & - alsl, spl, ihrst, modelname - use params_mod, only: erad, dtr, capa, p1000, small + alsl, spl, ihrst, modelname, nsoil, rdaod, gocart_on, & + gccpp_on, nasa_on, d2d_chem, nbin_ss, nbin_bc, nbin_oc,& + nbin_du,nbin_su, nbin_no3, nbin_nh4 + use params_mod, only: erad, dtr, capa, p1000, small,h1, d608, pi, rd use gridspec_mod,only: latstart, latlast, lonstart, lonlast, cenlon, cenlat, & dxval, dyval, truelat2, truelat1, psmapf, cenlat, & lonstartv, lonlastv, cenlonv, latstartv, latlastv, & @@ -590,8 +603,11 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) real,dimension(:), allocatable :: slat,qstl real,external::FPVSNEW real,dimension(:,:),allocatable :: dummy, p2d, t2d, q2d, qs2d, & - cw2d, cfr2d - character(len=80) :: fieldname, wrtFBName, flatlon + cw2d, cfr2d, accswe_ice, accswe_land, & + snacc_land, snacc_ice + real,dimension(:,:,:),allocatable :: extsmoke, extdust + character(len=80) :: fieldname, wrtFBName, flatlon, & + VarName type(ESMF_Grid) :: wrtGrid type(ESMF_Field) :: theField type(ESMF_Field), allocatable :: fcstField(:) @@ -679,6 +695,17 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) dtq2 = wrt_int_state%dtp nphs = 2. dt = dtq2/nphs + + !Allocate for regional models only + if(modelname=='FV3R') then + allocate(extsmoke(ista:iend,jsta:jend,lm)) + allocate(extdust(ista:iend,jsta:jend,lm)) + allocate(accswe_ice(ista:iend,jsta:jend)) + allocate(accswe_land(ista:iend,jsta:jend)) + allocate(snacc_ice(ista:iend,jsta:jend)) + allocate(snacc_land(ista:iend,jsta:jend)) + endif + ! ! GFS does not have convective cloud efficiency ! similated precip @@ -796,12 +823,10 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) ! shelter rh max, maxrhshltr ! shelter rh min, minrhshltr !$omp parallel do default(none),private(i,j),shared(jsta_2l,jend_2u,im,spval,ista_2l,iend_2u), & -!$omp& shared(smstav,sfcevp,acsnow,acsnom,qz0,uz0,vz0,maxrhshltr,minrhshltr) +!$omp& shared(sfcevp,acsnom,qz0,uz0,vz0,maxrhshltr,minrhshltr) do j=jsta_2l,jend_2u do i=ista_2l,iend_2u - smstav(i,j) = spval sfcevp(i,j) = spval - acsnow(i,j) = spval acsnom(i,j) = spval qz0(i,j) = spval uz0(i,j) = spval @@ -1089,6 +1114,39 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) enddo endif + ! total aod + if(trim(fieldname)=='aodtot') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,aodtot,arrayr42d,fillValue,spval) + do j=jsta,jend + do i=ista, iend + aodtot(i,j)=arrayr42d(i,j) + if(abs(arrayr42d(i,j)-fillValue) < small) aodtot(i,j)=spval + enddo + enddo + endif + + ! biomass burning emissions + if(trim(fieldname)=='ebb_smoke_hr') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,ebb,arrayr42d,fillValue,spval) + do j=jsta,jend + do i=ista, iend + ebb(i,j)=arrayr42d(i,j) + if(abs(arrayr42d(i,j)-fillValue) < small) ebb(i,j)=spval + enddo + enddo + endif + + ! wildfire potential + if(trim(fieldname)=='hwp') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,hwp,arrayr42d,fillValue,spval) + do j=jsta,jend + do i=ista, iend + hwp(i,j)=arrayr42d(i,j) + if(abs(arrayr42d(i,j)-fillValue) < small) hwp(i,j)=spval + enddo + enddo + endif + ! frictional velocity if(trim(fieldname)=='fricv') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,ustar,arrayr42d,fillValue,spval) @@ -1616,6 +1674,20 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) enddo endif + !assign soil depths for RUC LSM, hard wire 9 soil depths here + !so they aren't missing. + if (nsoil==9) then + sllevel(1) = 0.0 + sllevel(2) = 0.01 + sllevel(3) = 0.04 + sllevel(4) = 0.1 + sllevel(5) = 0.3 + sllevel(6) = 0.6 + sllevel(7) = 1.0 + sllevel(8) = 1.6 + sllevel(9) = 3.0 + endif + ! liquid volumetric soil mpisture in fraction if(trim(fieldname)=='soill1') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,sh2o,arrayr42d,sm,fillValue) @@ -1712,6 +1784,65 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) enddo endif + if(nsoil==9) then + ! volumetric soil moisture + if(trim(fieldname)=='soilw5') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,smc,arrayr42d,sm,fillValue) + do j=jsta,jend + do i=ista, iend + smc(i,j,5) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) smc(i,j,5) = spval + if (sm(i,j) /= 0.0) smc(i,j,5) = spval + enddo + enddo + endif + + if(trim(fieldname)=='soilw6') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,smc,arrayr42d,sm,fillValue) + do j=jsta,jend + do i=ista, iend + smc(i,j,6) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) smc(i,j,6) = spval + if (sm(i,j) /= 0.0) smc(i,j,6) = spval + enddo + enddo + endif + + if(trim(fieldname)=='soilw7') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,smc,arrayr42d,sm,fillValue) + do j=jsta,jend + do i=ista, iend + smc(i,j,7) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) smc(i,j,7) = spval + if (sm(i,j) /= 0.0) smc(i,j,7) = spval + enddo + enddo + endif + + if(trim(fieldname)=='soilw8') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,smc,arrayr42d,sm,fillValue) + do j=jsta,jend + do i=ista, iend + smc(i,j,8) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) smc(i,j,8) = spval + if (sm(i,j) /= 0.0) smc(i,j,8) = spval + enddo + enddo + endif + + if(trim(fieldname)=='soilw9') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,smc,arrayr42d,sm,fillValue) + do j=jsta,jend + do i=ista, iend + smc(i,j,9) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) smc(i,j,9) = spval + if (sm(i,j) /= 0.0) smc(i,j,9) = spval + enddo + enddo + endif + + endif !nsoil + ! soil temperature if(trim(fieldname)=='soilt1') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,stc,arrayr42d,sm,sice,fillValue) @@ -1764,6 +1895,75 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) enddo endif + if(nsoil==9) then + + ! soil temperature + if(trim(fieldname)=='soilt5') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,stc,arrayr42d,sm,sice,fillValue) + do j=jsta,jend + do i=ista, iend + stc(i,j,5) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) stc(i,j,5) = spval + !mask open water areas, combine with sea ice tmp + if (sm(i,j) /= 0.0 .and. sice(i,j) ==0.) stc(i,j,5) = spval + enddo + enddo + endif + + ! soil temperature + if(trim(fieldname)=='soilt6') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,stc,arrayr42d,sm,sice,fillValue) + do j=jsta,jend + do i=ista, iend + stc(i,j,6) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) stc(i,j,6) = spval + !mask open water areas, combine with sea ice tmp + if (sm(i,j) /= 0.0 .and. sice(i,j) ==0.) stc(i,j,6) = spval + enddo + enddo + endif + + ! soil temperature + if(trim(fieldname)=='soilt7') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,stc,arrayr42d,sm,sice,fillValue) + do j=jsta,jend + do i=ista, iend + stc(i,j,7) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) stc(i,j,7) = spval + !mask open water areas, combine with sea ice tmp + if (sm(i,j) /= 0.0 .and. sice(i,j) ==0.) stc(i,j,7) = spval + enddo + enddo + endif + + ! soil temperature + if(trim(fieldname)=='soilt8') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,stc,arrayr42d,sm,sice,fillValue) + do j=jsta,jend + do i=ista, iend + stc(i,j,8) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) stc(i,j,8) = spval + !mask open water areas, combine with sea ice tmp + if (sm(i,j) /= 0.0 .and. sice(i,j) ==0.) stc(i,j,8) = spval + enddo + enddo + endif + + ! soil temperature + if(trim(fieldname)=='soilt9') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,stc,arrayr42d,sm,sice,fillValue) + do j=jsta,jend + do i=ista, iend + stc(i,j,9) = arrayr42d(i,j) + if( abs(arrayr42d(i,j)-fillValue) < small) stc(i,j,9) = spval + !mask open water areas, combine with sea ice tmp + if (sm(i,j) /= 0.0 .and. sice(i,j) ==0.) stc(i,j,9) = spval + enddo + enddo + endif + + endif !nsoil + ! time averaged incoming sfc longwave if(trim(fieldname)=='dlwrf_ave') then !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,alwin,arrayr42d,fillValue,spval) @@ -2138,167 +2338,625 @@ subroutine set_postvars_fv3(wrt_int_state,grid_id,mype,mpicomp) enddo endif - ! inst cloud top pressure - if(trim(fieldname)=='prescnvclt') then - !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,spval,ptop,arrayr42d,fillValue) + ! wetness + if(trim(fieldname)=='wetness') then + !$omp parallel do default(none) private(i,j) shared(jsta,jend,ista,iend,smstav,arrayr42d,fillvalue,spval) do j=jsta,jend do i=ista, iend - ptop(i,j) = arrayr42d(i,j) - if( abs(arrayr42d(i,j)-fillValue) < small) ptop(i,j) = spval - if(ptop(i,j) <= 0.0) ptop(i,j) = spval + smstav(i,j) = arrayr42d(i,j) + if(abs(arrayr42d(i,j)-fillvalue)