!> @file !> @brief initpost_netcdf() initializes post for run. !> !> @author Hui-Ya Chuang @date 2016-03-04 !> This routine initializes constants and !> variables at the start of GFS model or post !> processor run. !> !> ### Program History Log !> Date | Programmer | Comments !> -----|------------|--------- !> 2007-03-01 | Hui-Ya Chuang | Initial. Start from INITPOST_GFS_NEMS_MPIIO.f !> 2021-03-11 | Bo Cui | Change local arrays to dimension (im,jsta:jend) !> 2021-10-26 | Jesse Meng | 2D DECOMPOSITION !> 2022-02-07 | Wen Meng | Changes for parallel netcdf read !> 2022-03-15 | Wen Meng | Unify regional and global interfaces !> 2022-03-22 | Wen Meng | Read PWAT from model !> 2022-04-08 | Bo Cui | 2D decomposition for unified fv3 read interfaces !> 2022-06-05 | Hui-Ya Chuang | Modify dx/dy computation for RRFS domain over north pole !> 2022-07-10 | Wen Meng | Output lat/lon on four coner points of rotated lat-lon grids in text file. !> 2022-07-18 | Wen Meng | Read instant top of atmos ULWRF from model !> 2022-09-18 | Li(Kate) Zhang| Add aerosol fileds for GEFS-Aerosols (gocart_on) and UFS-Aerosols(nasa_on) model !> 2022-10-28 | Eric James | Modifications to allow passing through soil moisture availability field from RUC LSM for RRFS !> 2022-11-08 | Kai Wang | Read time averaged PM2.5 and O3 concentration from model !> 2022-11-08 | Wen Meng | Remove instant PM2.5 calculation !> 2022-11-16 | Eric James | Read smoke, dust, biomass burning, and hourly wildfire potential from RRFS !> 2022-12-07 | Wen Meng | Read AOD from AQM model !> 2022-12-23 | Eric Aligo | Read six winter weather diagnostics from model !> 2023-01-30 | Sam Trahan | Read cldfra or cldfra_bl, whichever is available !> 2023-02-23 | Eric James | Read coarse PM and aodtot from RRFS !> 2023-03-02 | Sam Trahan | Read lightning threat index fields !> !> @author Hui-Ya Chuang @date 2016-03-04 SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d) use netcdf use vrbls4d, only: dust, SALT, SUSO, SOOT, WASO, smoke, fv3dust, coarsepm, & no3,nh4, PP25, PP10 use vrbls3d, only: t, q, uh, vh, pmid, pint, alpint, dpres, zint, zmid, o3, & qqr, qqs, cwm, qqi, qqw, omga, rhomid, q2, cfr, rlwtt, rswtt, tcucn, & tcucns, train, el_pbl, exch_h, vdifftt, vdiffmois, dconvmois, nradtt, & o3vdiff, o3prod, o3tndy, mwpv, unknown, vdiffzacce, zgdrag,cnvctummixing, & vdiffmacce, mgdrag, cnvctvmmixing, ncnvctcfrac, cnvctumflx, cnvctdmflx, & cnvctzgdrag, sconvmois, cnvctmgdrag, cnvctdetmflx, duwt, duem, dusd, dudp, & dusv,ssem,sssd,ssdp,sswt,sssv,bcem,bcsd,bcdp,bcwt,bcsv,ocem,ocsd,ocdp,ocwt,ocsv, & wh, qqg, ref_10cm, qqnifa, qqnwfa, avgpmtf, avgozcon, aextc55, taod5503d use vrbls2d, only: f, pd, fis, pblh, ustar, z0, ths, qs, twbs, qwbs, avgcprate, & cprate, avgprec, prec, lspa, sno, sndepac, si, cldefi, th10, q10, tshltr, pshltr, & tshltr, albase, avgalbedo, avgtcdc, czen, czmean, mxsnal, landfrac, radot, sigt4, & cfrach, cfracl, cfracm, avgcfrach, qshltr, avgcfracl, avgcfracm, cnvcfr, & islope, cmc, grnflx, vegfrc, acfrcv, ncfrcv, acfrst, ncfrst, ssroff, & bgroff, rlwin, rlwtoa, cldwork, alwin, alwout, alwtoa, rswin, rswinc, & rswout, aswin, auvbin, auvbinc, aswout, aswtoa, sfcshx, sfclhx, subshx, & snopcx, sfcux, sfcvx, sfcuxi, sfcvxi, sfcuvx, gtaux, gtauy, potevp, u10, v10, smstav,& smstot, ivgtyp, isltyp, sfcevp, sfcexc, 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, maxtshltr, & mintshltr, maxrhshltr, fdnsst, acgraup, graup_bucket, acfrain, frzrn_bucket, & snow_acm, snow_bkt, & minrhshltr, dzice, smcwlt, suntime, fieldcapa, htopd, hbotd, htops, hbots, & cuppt, dusmass, ducmass, dusmass25, ducmass25, aswintoa,rel_vort_maxhy1, & maxqshltr, minqshltr, acond, sr, u10h, v10h,refd_max, w_up_max, w_dn_max, & up_heli_max,up_heli_min,up_heli_max03,up_heli_min03,rel_vort_max01,u10max, v10max, & avgedir,avgecan,paha,pahi,avgetrans,avgesnow,avgprec_cont,avgcprate_cont,rel_vort_max, & avisbeamswin,avisdiffswin,airbeamswin,airdiffswin,refdm10c_max,wspd10max, & alwoutc,alwtoac,aswoutc,aswtoac,alwinc,aswinc,avgpotevp,snoavg, & ti,aod550,du_aod550,ss_aod550,su_aod550,oc_aod550,bc_aod550,prate_max,maod,dustpm10, & dustcb,bccb,occb,sulfcb,sscb,dustallcb,ssallcb,dustpm,sspm,pp25cb,pp10cb,no3cb,nh4cb,& pwat, ebb, hwp, aodtot, aqm_aod550, ltg1_max,ltg2_max,ltg3_max use soil, only: sldpth, sllevel, sh2o, smc, stc use masks, only: lmv, lmh, htm, vtm, gdlat, gdlon, dx, dy, hbm2, sm, sice use physcons_post, only: grav => con_g, fv => con_fvirt, rgas => con_rd, & eps => con_eps, epsm1 => con_epsm1 use params_mod, only: erad, dtr, tfrz, h1, d608, rd, p1000, capa,pi use lookup_mod, only: thl, plq, ptbl, ttbl, rdq, rdth, rdp, rdthe, pl, qs0, sqs, sthe, & ttblq, rdpq, rdtheq, stheq, the0q, the0 use ctlblk_mod, only: me, mpi_comm_comp, icnt, idsp, jsta, jend, ihrst, idat, sdat, ifhr, & ifmin, filename, tprec, tclod, trdlw, trdsw, tsrfc, tmaxmin, td3d, restrt, sdat, & jend_m, imin, imp_physics, dt, spval, pdtop, pt, qmin, nbin_du, nphs, dtq2, ardlw,& ardsw, asrfc, avrain, avcnvc, theat, gdsdegr, spl, lsm, alsl, im, jm, im_jm, lm, & jsta_2l, jend_2u, nsoil, lp1, icu_physics, ivegsrc, novegtype, nbin_ss, nbin_bc, & nbin_oc, nbin_su, nbin_no3, nbin_nh4, gocart_on, nasa_on, pt_tbl, hyb_sigp, & filenameFlux, fileNameAER, & iSF_SURFACE_PHYSICS,rdaod, modelname, aqf_on, & ista, iend, ista_2l, iend_2u,iend_m use gridspec_mod, only: maptype, gridtype, latstart, latlast, lonstart, lonlast, cenlon, & dxval, dyval, truelat2, truelat1, psmapf, cenlat,lonstartv, lonlastv, cenlonv, & latstartv, latlastv,cenlatv,latstart_r,latlast_r,lonstart_r,lonlast_r, STANDLON, & latse,lonse,latnw,lonnw use upp_physics, only: fpvsnew !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - implicit none ! ! type(nemsio_gfile) :: nfile,ffile,rfile integer,parameter :: nvar2d=48 ! character(nemsio_charkind) :: name2d(nvar2d) integer :: nvar3d, numDims ! character(nemsio_charkind), allocatable :: name3din(:), name3dout(:) ! character(nemsio_charkind) :: varname,levtype ! ! INCLUDE/SET PARAMETERS. ! INCLUDE "mpif.h" ! integer,parameter:: MAXPTS=1000000 ! max im*jm points ! ! real,parameter:: con_g =9.80665e+0! gravity ! real,parameter:: con_rv =4.6150e+2 ! gas constant H2O ! real,parameter:: con_rd =2.8705e+2 ! gas constant air ! real,parameter:: con_fvirt =con_rv/con_rd-1. ! real,parameter:: con_eps =con_rd/con_rv ! real,parameter:: con_epsm1 =con_rd/con_rv-1 ! ! This version of INITPOST shows how to initialize, open, read from, and ! close a NetCDF dataset. In order to change it to read an internal (binary) ! dataset, do a global replacement of _ncd_ with _int_. real, parameter :: gravi = 1.0/grav character(len=20) :: VarName, VcoordName integer :: Status, fldsize, fldst, recn, recn_vvel character startdate*19,SysDepInfo*80,cgar*1 character startdate2(19)*4, flatlon*40 logical :: read_lonlat=.true. ! ! NOTE: SOME INTEGER VARIABLES ARE READ INTO DUMMY ( A REAL ). THIS IS OK ! AS LONG AS REALS AND INTEGERS ARE THE SAME SIZE. ! ! ALSO, EXTRACT IS CALLED WITH DUMMY ( A REAL ) EVEN WHEN THE NUMBERS ARE ! INTEGERS - THIS IS OK AS LONG AS INTEGERS AND REALS ARE THE SAME SIZE. LOGICAL RUNB,SINGLRST,SUBPOST,NEST,HYDRO,IOOMG,IOALL logical, parameter :: debugprint = .false., zerout = .false. ! logical, parameter :: debugprint = .true., zerout = .false. logical :: convert_rad_to_deg=.false. CHARACTER*32 varcharval ! CHARACTER*40 CONTRL,FILALL,FILMST,FILTMP,FILTKE,FILUNV,FILCLD,FILRAD,FILSFC CHARACTER*4 RESTHR CHARACTER FNAME*255,ENVAR*50 INTEGER IDATE(8),JDATE(8),JPDS(200),JGDS(200),KPDS(200),KGDS(200) ! LOGICAL*1 LB(IM,JM) ! ! INCLUDE COMMON BLOCKS. ! ! DECLARE VARIABLES. ! ! REAL fhour integer nfhour ! forecast hour from nems io file integer fhzero !bucket real dtp !physics time step real dz REAL RINC(5) REAL DUMMY(IM,JM) !jw integer ii,jj,js,je,iyear,imn,iday,itmp,ioutcount,istatus, & I,J,L,ll,k,kf,irtn,igdout,n,Index,nframe, & nframed2,iunitd3d,ierr,idum,iret,nrec,idrt integer ncid3d,ncid2d,varid,nhcas,varid_bl,iret_bl real TSTART,TLMH,TSPH,ES,FACT,soilayert,soilayerb,zhour,dum, & tvll,pmll,tv, tx1, tx2 character*20,allocatable :: recname(:) integer, allocatable :: reclev(:), kmsk(:,:) real, allocatable :: glat1d(:), glon1d(:), qstl(:) real, allocatable :: wrk1(:,:), wrk2(:,:) real, allocatable :: p2d(:,:), t2d(:,:), q2d(:,:), & qs2d(:,:), cw2d(:,:), cfr2d(:,:) real, dimension(lm+1) :: ak5, bk5 real*8, allocatable :: pm2d(:,:), pi2d(:,:) real, allocatable :: tmp(:) real :: buf(ista_2l:iend_2u,jsta_2l:jend_2u) real :: buf2(ista_2l:iend_2u,jsta_2l:jend_2u) real :: buf3d(ista_2l:iend_2u,jsta_2l:jend_2u,lm) real :: chem_2d(ista_2l:iend_2u,jsta_2l:jend_2u) real :: chemT(ista_2l:iend_2u,jsta_2l:jend_2u,lm) real :: dt1(ista_2l:iend_2u,jsta_2l:jend_2u,lm) real :: dt2(ista_2l:iend_2u,jsta_2l:jend_2u,lm) real :: dt3(ista_2l:iend_2u,jsta_2l:jend_2u,lm) real :: dt4(ista_2l:iend_2u,jsta_2l:jend_2u,lm) real :: dt5(ista_2l:iend_2u,jsta_2l:jend_2u,lm) ! real buf(ista_2l:iend_2u,jsta_2l:jend_2u),bufsoil(im,nsoil,jsta_2l:jend_2u) & ! ,buf3d(ista_2l:iend_2u,jsta_2l:jend_2u,lm),buf3d2(im,lp1,jsta_2l:jend_2u) real LAT integer isa, jsa, latghf, jtem, idvc, idsl, nvcoord, ip1, nn, npass integer, parameter :: npass2=5, npass3=30 real, parameter :: third=1.0/3.0 INTEGER, DIMENSION(2) :: ij4min, ij4max REAL :: omgmin, omgmax real, allocatable :: d2d(:,:), u2d(:,:), v2d(:,:), omga2d(:,:) REAL, ALLOCATABLE :: ps2d(:,:),psx2d(:,:),psy2d(:,:) real, allocatable :: div3d(:,:,:) real(kind=4),allocatable :: vcrd(:,:) real :: dum_const real, allocatable :: extsmoke(:,:,:), extdust(:,:,:) if (modelname == 'FV3R') then allocate(extsmoke(ista_2l:iend_2u,jsta_2l:jend_2u,lm)) allocate(extdust(ista_2l:iend_2u,jsta_2l:jend_2u,lm)) endif !*********************************************************************** ! START INIT HERE. ! WRITE(6,*)'INITPOST: ENTER INITPOST_NETCDF' WRITE(6,*)'me=',me, & 'jsta_2l=',jsta_2l,'jend_2u=', & jend_2u,'im=',im, & 'ista_2l=',ista_2l,'iend_2u=',iend_2u, & 'ista=',ista,'iend=',iend, & 'iend_m=',iend_m ! isa = (ista+iend) / 2 jsa = (jsta+jend) / 2 !$omp parallel do private(i,j) do j = jsta_2l, jend_2u do i= ista_2l, iend_2u buf(i,j) = spval enddo enddo Status=nf90_get_att(ncid3d,nf90_global,'ak',ak5) if(Status/=0)then print*,'ak not found; assigning missing value' ak5=spval else if(me==0)print*,'ak5= ',ak5 end if Status=nf90_get_att(ncid3d,nf90_global,'idrt',idrt) if(Status/=0)then print*,'idrt not in netcdf file,reading grid' Status=nf90_get_att(ncid3d,nf90_global,'grid',varcharval) if(Status/=0)then print*,'idrt and grid not in netcdf file, set default to latlon' idrt=0 MAPTYPE=0 else if(trim(varcharval)=='rotated_latlon')then MAPTYPE=207 idrt=207 Status=nf90_get_att(ncid3d,nf90_global,'cen_lon',dum_const) if(Status/=0)then print*,'cen_lon not found; assigning missing value' cenlon=spval else if(dum_const<0.)then cenlon=nint((dum_const+360.)*gdsdegr) else cenlon=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'cen_lat',dum_const) if(Status/=0)then print*,'cen_lat not found; assigning missing value' cenlat=spval else cenlat=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'lon1',dum_const) if(Status/=0)then print*,'lonstart_r not found; assigning missing value' lonstart_r=spval else if(dum_const<0.)then lonstart_r=nint((dum_const+360.)*gdsdegr) else lonstart_r=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'lat1',dum_const) if(Status/=0)then print*,'latstart_r not found; assigning missing value' latstart_r=spval else latstart_r=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'lon2',dum_const) if(Status/=0)then print*,'lonlast_r not found; assigning missing value' lonlast_r=spval else if(dum_const<0.)then lonlast_r=nint((dum_const+360.)*gdsdegr) else lonlast_r=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'lat2',dum_const) if(Status/=0)then print*,'latlast_r not found; assigning missing value' latlast_r=spval else latlast_r=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'dlon',dum_const) if(Status/=0)then print*,'dlmd not found; assigning missing value' dxval=spval else dxval=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'dlat',dum_const) if(Status/=0)then print*,'dphd not found; assigning missing value' dyval=spval else dyval=dum_const*gdsdegr end if ! print*,'lonstart,latstart,cenlon,cenlat,dyval,dxval', & ! lonstart,latstart,cenlon,cenlat,dyval,dxval ! Jili Dong add support for regular lat lon (2019/03/22) start else if(trim(varcharval)=='latlon')then MAPTYPE=0 idrt=0 Status=nf90_get_att(ncid3d,nf90_global,'lon1',dum_const) if(Status/=0)then print*,'lonstart not found; assigning missing value' lonstart=spval else if(dum_const<0.)then lonstart=nint((dum_const+360.)*gdsdegr) else lonstart=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'lat1',dum_const) if(Status/=0)then print*,'latstart not found; assigning missing value' latstart=spval else latstart=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'lon2',dum_const) if(Status/=0)then print*,'lonlast not found; assigning missing value' lonlast=spval else if(dum_const<0.)then lonlast=nint((dum_const+360.)*gdsdegr) else lonlast=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'lat2',dum_const) if(Status/=0)then print*,'latlast not found; assigning missing value' latlast=spval else latlast=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'dlon',dum_const) if(Status/=0)then print*,'dlmd not found; assigning missing value' dxval=spval else dxval=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'dlat',dum_const) if(Status/=0)then print*,'dphd not found; assigning missing value' dyval=spval else dyval=dum_const*gdsdegr end if print*,'lonstart,latstart,dyval,dxval', & lonstart,lonlast,latstart,latlast,dyval,dxval ! Jili Dong add support for regular lat lon (2019/03/22) end ELSE IF (trim(varcharval)=='lambert_conformal')then MAPTYPE=1 idrt=1 Status=nf90_get_att(ncid3d,nf90_global,'cen_lon',dum_const) if(Status/=0)then print*,'cen_lon not found; assigning missing value' cenlon=spval else if(dum_const<0.)then cenlon=nint((dum_const+360.)*gdsdegr) else cenlon=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'cen_lat',dum_const) if(Status/=0)then print*,'cen_lat not found; assigning missing value' cenlat=spval else cenlat=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'lon1',dum_const) if(Status/=0)then print*,'lonstart not found; assigning missing value' lonstart=spval else if(dum_const<0.)then lonstart=nint((dum_const+360.)*gdsdegr) else lonstart=dum_const*gdsdegr end if end if Status=nf90_get_att(ncid3d,nf90_global,'lat1',dum_const) if(Status/=0)then print*,'latstart not found; assigning missing value' latstart=spval else latstart=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'stdlat1',dum_const) if(Status/=0)then print*,'stdlat1 not found; assigning missing value' truelat1=spval else truelat1=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'stdlat2',dum_const) if(Status/=0)then print*,'stdlat2 not found; assigning missing value' truelat2=spval else truelat2=dum_const*gdsdegr end if Status=nf90_get_att(ncid3d,nf90_global,'dx',dum_const) if(Status/=0)then print*,'dx not found; assigning missing value' dxval=spval else dxval=dum_const*1.E3 end if Status=nf90_get_att(ncid3d,nf90_global,'dy',dum_const) if(Status/=0)then print*,'dphd not found; assigning missing value' dyval=spval else dyval=dum_const*1.E3 end if STANDLON = cenlon print*,'lonstart,latstart,cenlon,cenlat,truelat1,truelat2, & stadlon,dyval,dxval', & lonstart,latstart,cenlon,cenlat,truelat1,truelat2,standlon,dyval,dxval else if(trim(varcharval)=='gaussian')then MAPTYPE=4 idrt=4 else ! setting default maptype MAPTYPE=0 idrt=0 end if end if end if if(me==0)print*,'idrt MAPTYPE= ',idrt,MAPTYPE ! STEP 1. READ MODEL OUTPUT FILE ! ! !*** ! ! LMH and LMV always = LM for sigma-type vert coord !$omp parallel do private(i,j) do j = jsta_2l, jend_2u do i = ista_2l, iend_2u LMV(i,j) = lm LMH(i,j) = lm end do end do ! HTM VTM all 1 for sigma-type vert coord !$omp parallel do private(i,j,l) do l = 1, lm do j = jsta_2l, jend_2u do i = ista_2l, iend_2u HTM (i,j,l) = 1.0 VTM (i,j,l) = 1.0 end do end do end do Status=nf90_get_att(ncid3d,nf90_global,'nhcas',nhcas) if(Status/=0)then print*,'nhcas not in netcdf file, set default to nonhydro' nhcas=0 end if if(me==0)print*,'nhcas= ',nhcas if (nhcas == 0 ) then !non-hydrostatic case nrec=19 allocate (recname(nrec)) recname=[character(len=20) :: 'ugrd','vgrd','spfh','tmp','o3mr', & 'presnh','dzdt', 'clwmr','dpres', & 'delz','icmr','rwmr', & 'snmr','grle','smoke','dust', & 'coarsepm','smoke_ext','dust_ext'] else nrec=8 allocate (recname(nrec)) recname=[character(len=20) :: 'ugrd','vgrd','tmp','spfh','o3mr', & 'hypres', 'clwmr','dpres'] endif ! write(0,*)'nrec=',nrec !allocate(recname(nrec),reclevtyp(nrec),reclev(nrec)) allocate(glat1d(jm),glon1d(im)) ! hardwire idate for now ! idate=(/2017,08,07,00,0,0,0,0/) ! get cycle start time Status=nf90_inq_varid(ncid3d,'time',varid) if(Status/=0)then print*,'time not in netcdf file, stopping' STOP 1 else Status=nf90_get_att(ncid3d,varid,'units',varcharval) if(Status/=0)then print*,'time unit not available' else print*,'time unit read from netcdf file= ',varcharval ! assume use hours as unit ! idate_loc=index(varcharval,'since')+6 read(varcharval,101)idate(1),idate(2),idate(3),idate(4),idate(5) end if ! Status=nf90_inquire_dimension(ncid3d,varid,len=ntimes) ! allocate(fhours(ntimes)) ! status = nf90_inq_varid(ncid3d,varid,fhours) ! Status=nf90_get_var(ncid3d,varid,nfhour,start=(/1/), & ! count=(/1/)) ! if(Status/=0)then ! print*,'forecast hour not in netcdf file, stopping' ! STOP 1 ! end if end if 101 format(T13,i4,1x,i2,1x,i2,1x,i2,1x,i2) print*,'idate= ',idate(1:5) ! Jili Dong check output format for coordinate reading Status=nf90_inq_varid(ncid3d,'grid_xt',varid) Status=nf90_inquire_variable(ncid3d,varid,ndims = numDims) if(numDims==1.and.modelname=="FV3R") then read_lonlat=.true. else read_lonlat=.false. end if ! Jili Dong add support for new write component output ! get longitude if (read_lonlat) then Status=nf90_inq_varid(ncid3d,'lon',varid) Status=nf90_inquire_variable(ncid3d,varid,ndims = numDims) if(debugprint)print*,'number of dim for gdlon ',numDims else Status=nf90_inq_varid(ncid3d,'grid_xt',varid) Status=nf90_inquire_variable(ncid3d,varid,ndims = numDims) if(debugprint)print*,'number of dim for gdlon ',numDims end if if(numDims==1)then Status=nf90_get_var(ncid3d,varid,glon1d) do j=jsta,jend do i=ista,iend gdlon(i,j) = real(glon1d(i),kind=4) end do end do lonstart = nint(glon1d(1)*gdsdegr) lonlast = nint(glon1d(im)*gdsdegr) ! Jili Dong add support for regular lat lon (2019/03/22) start if (MAPTYPE == 0) then if(lonstart<0.)then lonstart=lonstart+360.*gdsdegr end if if(lonlast<0.)then lonlast=lonlast+360.*gdsdegr end if end if ! Jili Dong add support for regular lat lon (2019/03/22) end else if(numDims==2)then Status=nf90_get_var(ncid3d,varid,dummy) if(maxval(abs(dummy))<2.0*pi)convert_rad_to_deg=.true. if(convert_rad_to_deg)then do j=jsta,jend do i=ista,iend gdlon(i,j) = real(dummy(i,j),kind=4)*180./pi end do end do else do j=jsta,jend do i=ista,iend gdlon(i,j) = real(dummy(i,j),kind=4) end do end do end if if(convert_rad_to_deg)then lonstart = nint(dummy(1,1)*gdsdegr)*180./pi lonlast = nint(dummy(im,jm)*gdsdegr)*180./pi lonse = nint(dummy(im,1)*gdsdegr)*180./pi lonnw = nint(dummy(1,jm)*gdsdegr)*180./pi else lonstart = nint(dummy(1,1)*gdsdegr) lonlast = nint(dummy(im,jm)*gdsdegr) lonse = nint(dummy(im,1)*gdsdegr) lonnw = nint(dummy(1,jm)*gdsdegr) end if ! Jili Dong add support for regular lat lon (2019/03/22) start if (MAPTYPE == 0) then if(lonstart<0.)then lonstart=lonstart+360.*gdsdegr end if if(lonlast<0.)then lonlast=lonlast+360.*gdsdegr end if end if ! Jili Dong add support for regular lat lon (2019/03/22) end end if print*,'lonstart,lonlast ',lonstart,lonlast ! Jili Dong add support for new write component output ! get latitude if (read_lonlat) then Status=nf90_inq_varid(ncid3d,'lat',varid) Status=nf90_inquire_variable(ncid3d,varid,ndims = numDims) if(debugprint)print*,'number of dim for gdlat ',numDims else Status=nf90_inq_varid(ncid3d,'grid_yt',varid) Status=nf90_inquire_variable(ncid3d,varid,ndims = numDims) if(debugprint)print*,'number of dim for gdlat ',numDims end if if(numDims==1)then Status=nf90_get_var(ncid3d,varid,glat1d) do j=jsta,jend do i=ista,iend gdlat(i,j) = real(glat1d(j),kind=4) end do end do latstart = nint(glat1d(1)*gdsdegr) latlast = nint(glat1d(jm)*gdsdegr) else if(numDims==2)then Status=nf90_get_var(ncid3d,varid,dummy) if(maxval(abs(dummy))1000.)print*,'bad T ',t(i,j,l) enddo enddo enddo call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(11),qqi(ista_2l,jsta_2l,1),lm) call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(12),qqr(ista_2l,jsta_2l,1),lm) call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(13),qqs(ista_2l,jsta_2l,1),lm) call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(14),qqg(ista_2l,jsta_2l,1),lm) ! read for regional FV3 if (modelname == 'FV3R') then call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(15),smoke(ista_2l,jsta_2l,1,1),lm) call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(16),fv3dust(ista_2l,jsta_2l,1,1),lm) call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(17),coarsepm(ista_2l,jsta_2l,1,1),lm) call read_netcdf_3d_para(ncid2d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(18),extsmoke(ista_2l,jsta_2l,1),lm) call read_netcdf_3d_para(ncid2d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,recname(19),extdust(ista_2l,jsta_2l,1),lm) endif ! calculate CWM from FV3 output do l=1,lm do j=jsta,jend do i=ista,iend cwm(i,j,l)=qqg(i,j,l)+qqs(i,j,l)+qqr(i,j,l)+qqi(i,j,l)+qqw(i,j,l) enddo enddo if(debugprint)print*,'sample l,t,q,u,v,w= ',isa,jsa,l & ,t(isa,jsa,l),q(isa,jsa,l),uh(isa,jsa,l),vh(isa,jsa,l) & ,wh(isa,jsa,l) if(debugprint)print*,'sample l cwm for FV3',l, & cwm(isa,jsa,l) end do ! instantaneous 3D cloud fraction if ( imp_physics==11) then !GFDL MP VarName='cld_amt' call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,cfr(ista_2l,jsta_2l,1),lm) else iret_bl = nf90_inq_varid(ncid2d,'cldfra_bl',varid_bl) iret = nf90_inq_varid(ncid2d,'cldfra',varid) if(iret_bl==NF90_NOERR .and. iret==NF90_NOERR) then write(0,*) 'WARNING: BOTH cldfra_bl AND cldfra ARE AVAILABLE. USING cldfra.' VarName='cldfra' else if(iret_bl==NF90_NOERR) then VarName='cldfra_bl' else if(iret==NF90_NOERR) then VarName='cldfra' else VarName='nope' endif if(VarName /= 'nope') then call read_netcdf_3d_para(ncid2d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,cfr(ista_2l,jsta_2l,1),lm) endif endif ! do l=1,lm ! if(debugprint)print*,'sample ',VarName,'isa,jsa,l =' & ! ,cfr(isa,jsa,l),isa,jsa,l ! enddo !===================================== ! For AQF Hourly average field PM2.5 !===================================== if (aqf_on) then ! *********** VarName need to be in lower case ************ ! === It will cause problem if not use the lower case ===== ! ********************************************************* !-- rename input o3_ave and pm25_ave to NCO grib2 name OZCON and PMTF VarName='o3_ave' call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avgozcon(ista_2l,jsta_2l,1),lm) VarName='pm25_ave' call read_netcdf_3d_para(ncid3d,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avgpmtf(ista_2l,jsta_2l,1),lm) VarName='aod' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,aqm_aod550(ista_2l,jsta_2l)) endif ! -- aqf_on !============================ ! read for regional FV3 if (modelname == 'FV3R') then ! max hourly updraft velocity VarName='upvvelmax' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,w_up_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',w_up_max(isa,jsa) ! max hourly downdraft velocity VarName='dnvvelmax' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,w_dn_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',w_dn_max(isa,jsa) ! max hourly updraft helicity VarName='uhmax25' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,up_heli_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',up_heli_max(isa,jsa) ! min hourly updraft helicity VarName='uhmin25' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,up_heli_min(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',up_heli_min(isa,jsa) ! max hourly 0-3km updraft helicity VarName='uhmax03' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,up_heli_max03(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',up_heli_max03(isa,jsa) ! min hourly 0-3km updraft helicity VarName='uhmin03' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,up_heli_min03(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',up_heli_min03(isa,jsa) ! max 0-1km relative vorticity max VarName='maxvort01' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,rel_vort_max01(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' = ',rel_vort_max01(isa,jsa) ! max 0-2km relative vorticity max VarName='maxvort02' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,rel_vort_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',rel_vort_max(isa,jsa) ! max hybrid lev 1 relative vorticity max VarName='maxvorthy1' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,rel_vort_maxhy1(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',rel_vort_maxhy1(isa,jsa) ! biomass burning emissions VarName='ebb_smoke_hr' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ebb(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',ebb(isa,jsa) ! hourly wildfire potential VarName='hwp' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,hwp(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',hwp(isa,jsa) ! total aod VarName='aodtot' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,aodtot(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',aodtot(isa,jsa) endif ! lightning threat index 1 VarName='ltg1_max' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ltg1_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',ltg1_max(isa,jsa) ! lightning threat index 2 VarName='ltg2_max' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ltg2_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',ltg2_max(isa,jsa) ! lightning threat index 3 VarName='ltg3_max' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ltg3_max(ista_2l,jsta_2l)) if(debugprint)print*,'sample ',VarName,' =',ltg3_max(isa,jsa) ! surface pressure VarName='pressfc' call read_netcdf_2d_para(ncid3d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pint(ista_2l,jsta_2l,lp1)) do j=jsta,jend do i=ista,iend ! if(pint(i,j,lp1)>1.0E6 .or. pint(ista_2l,jsta_2l,lp1)<50000.) & ! print*,'bad psfc ',i,j,pint(i,j,lp1) end do end do if(debugprint)print*,'sample ',VarName,' =',pint(isa,jsa,lp1) pt = ak5(1) do j=jsta,jend do i=ista,iend pint(i,j,1)= pt end do end do do l=2,lp1 do j=jsta,jend do i=ista,iend if (dpres(i,j,l-1)= pmid(i,j,l)) then hbot(i,j) = l ! if(i==ii .and. j==jj)print*,'sample pbot,pmid= ', & ! pbot(i,j),pmid(i,j,l),hbot(i,j) exit end if end do end if end do end do if(debugprint)print*,'sample hbot = ',hbot(isa,jsa) ! retrieve time averaged low cloud top pressure using nemsio VarName='pres_avelct' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ptopl) ! if(debugprint)print*,'sample l',VarName,' = ',1,ptopl(isa,jsa) ! retrieve time averaged low cloud bottom pressure using nemsio VarName='pres_avelcb' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pbotl) ! if(debugprint)print*,'sample l',VarName,' = ',1,pbotl(isa,jsa) ! retrieve time averaged low cloud top temperature using nemsio VarName='tmp_avelct' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,Ttopl) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,Ttopl(isa,jsa) ! retrieve time averaged middle cloud top pressure using nemsio VarName='pres_avemct' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ptopm) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,ptopm(isa,jsa) ! retrieve time averaged middle cloud bottom pressure using nemsio VarName='pres_avemcb' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pbotm) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,pbotm(isa,jsa) ! retrieve time averaged middle cloud top temperature using nemsio VarName='tmp_avemct' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,Ttopm) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,Ttopm(isa,jsa) ! retrieve time averaged high cloud top pressure using nemsio ********* VarName='pres_avehct' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,ptoph) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,ptoph(isa,jsa) ! retrieve time averaged high cloud bottom pressure using nemsio VarName='pres_avehcb' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pboth) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,pboth(isa,jsa) ! retrieve time averaged high cloud top temperature using nemsio VarName='tmp_avehct' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,Ttoph) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ',1,Ttoph(isa,jsa) ! retrieve boundary layer cloud cover using nemsio VarName='tcdc_avebndcl' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pblcfr) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', 1,pblcfr(isa,jsa) ! where (pblcfr /= spval)pblcfr=pblcfr/100. ! convert to fraction !$omp parallel do private(i,j) do j = jsta_2l, jend_2u do i=ista,iend if (pblcfr(i,j) < spval) pblcfr(i,j) = pblcfr(i,j) * 0.01 enddo enddo ! retrieve cloud work function VarName='cwork_aveclm' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,cldwork) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', 1,cldwork(isa,jsa) ! accumulated total (base+surface) runoff VarName='watr_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,runoff) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) runoff(i,j) = spval enddo enddo ! total water storage in aquifer VarName='wa_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,twa) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) twa(i,j) = spval enddo enddo ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', 1,runoff(isa,jsa) ! accumulated evaporation of intercepted water VarName='ecan_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,tecan) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) tecan(i,j) = spval enddo enddo ! accumulated plant transpiration VarName='etran_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,tetran) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) tetran(i,j) = spval enddo enddo ! accumulated soil surface evaporation VarName='edir_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,tedir) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) tedir(i,j) = spval enddo enddo ! retrieve shelter max temperature using nemsio VarName='t02max' if(modelname=='GFS') VarName='tmax_max2m' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,maxtshltr) ! retrieve shelter min temperature using nemsio VarName='t02min' if(modelname=='GFS') VarName='tmin_min2m' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,mintshltr) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', & ! 1,mintshltr((ista+iend)/2,(jsta+jend)/2) ! retrieve shelter max RH VarName='rh02max' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,maxrhshltr) ! retrieve shelter min temperature using nemsio VarName='rh02min' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,minrhshltr) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', & ! 1,mintshltr((ista+iend)/2,(jsta+jend)/2) ! retrieve shelter max specific humidity using nemsio VarName='spfhmax_max2m' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,maxqshltr) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', ! 1,maxqshltr(isa,jsa) ! retrieve shelter min temperature using nemsio VarName='spfhmin_min2m' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,minqshltr) ! retrieve ice thickness using nemsio VarName='icetk' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,dzice) ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', 1,dzice(isa,jsa) ! retrieve wilting point using nemsio VarName='wilt' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,smcwlt) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) smcwlt(i,j) = spval enddo enddo ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', 1,smcwlt(isa,jsa) ! retrieve sunshine duration using nemsio VarName='sunsd_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,suntime) ! retrieve field capacity using nemsio VarName='fldcp' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,fieldcapa) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) fieldcapa(i,j) = spval enddo enddo ! if(debugprint)print*,'sample l',VcoordName,VarName,' = ', 1,fieldcapa(isa,jsa) ! retrieve time averaged surface visible beam downward solar flux VarName='vbdsf_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avisbeamswin) VcoordName='sfc' l=1 ! retrieve time averaged surface visible diffuse downward solar flux VarName='vddsf_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avisdiffswin) ! retrieve time averaged surface near IR beam downward solar flux VarName='nbdsf_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,airbeamswin) ! retrieve time averaged surface near IR diffuse downward solar flux VarName='nddsf_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,airdiffswin) ! retrieve time averaged surface clear sky outgoing LW VarName='csulf' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,alwoutc) ! retrieve time averaged TOA clear sky outgoing LW VarName='csulftoa' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,alwtoac) ! retrieve time averaged surface clear sky outgoing SW VarName='csusf' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,aswoutc) ! retrieve time averaged TOA clear sky outgoing LW VarName='csusftoa' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,aswtoac) ! retrieve time averaged surface clear sky incoming LW VarName='csdlf' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,alwinc) ! retrieve time averaged surface clear sky incoming SW VarName='csdsf' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,aswinc) ! retrieve storm runoff using nemsio VarName='ssrun_acc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,SSROFF) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) ssroff(i,j) = spval enddo enddo ! retrieve direct soil evaporation VarName='evbs_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avgedir) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) avgedir(i,j) = spval enddo enddo ! retrieve CANOPY WATER EVAP VarName='evcw_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avgecan) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) avgecan(i,j) = spval enddo enddo ! retrieve AVERAGED PRECIP ADVECTED HEAT FLUX VarName='pah_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,paha) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) paha(i,j) = spval enddo enddo ! retrieve instantaneous PRECIP ADVECTED HEAT FLUX VarName='pahi' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pahi) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) pahi(i,j) = spval enddo enddo ! retrieve PLANT TRANSPIRATION VarName='trans_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avgetrans) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) avgetrans(i,j) = spval enddo enddo ! retrieve snow sublimation VarName='sbsno_ave' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,avgesnow) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j)==1.0 .and. sice(i,j)==0.) avgesnow(i,j)=spval enddo enddo ! retrive total soil moisture VarName='soilm' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,smstot) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) smstot(i,j) = spval enddo enddo ! retrieve snow phase change heat flux VarName='snohf' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,snopcx) ! mask water areas !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend if (sm(i,j) /= 0.0) snopcx(i,j) = spval enddo enddo ! retrieve pwater VarName='pwat' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,VarName,pwat) ! GFS does not have deep convective cloud top and bottom fields !$omp parallel do private(i,j) do j=jsta,jend do i=ista,iend HTOPD(i,j) = SPVAL HBOTD(i,j) = SPVAL HTOPS(i,j) = SPVAL HBOTS(i,j) = SPVAL CUPPT(i,j) = SPVAL enddo enddo print *, 'gocart_on=',gocart_on print *, 'nasa_on=',nasa_on if (gocart_on) then ! retrieve dust emission fluxes do K = 1, nbin_du if ( K == 1) VarName='duem001' if ( K == 2) VarName='duem002' if ( K == 3) VarName='duem003' if ( K == 4) VarName='duem004' if ( K == 5) VarName='duem005' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) duem(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve dust sedimentation fluxes do K = 1, nbin_du if ( K == 1) VarName='dust1sd' if ( K == 2) VarName='dust2sd' if ( K == 3) VarName='dust3sd' if ( K == 4) VarName='dust4sd' if ( K == 5) VarName='dust5sd' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) dusd(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve dust dry deposition fluxes do K = 1, nbin_du if ( K == 1) VarName='dust1dp' if ( K == 2) VarName='dust2dp' if ( K == 3) VarName='dust3dp' if ( K == 4) VarName='dust4dp' if ( K == 5) VarName='dust5dp' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) dudp(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve dust wet deposition fluxes do K = 1, nbin_du if ( K == 1) VarName='dust1wtl' if ( K == 2) VarName='dust2wtl' if ( K == 3) VarName='dust3wtl' if ( K == 4) VarName='dust4wtl' if ( K == 5) VarName='dust5wtl' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) duwt(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve dust scavenging fluxes do K = 1, nbin_du if ( K == 1) VarName='dust1wtc' if ( K == 2) VarName='dust2wtc' if ( K == 3) VarName='dust3wtc' if ( K == 4) VarName='dust4wtc' if ( K == 5) VarName='dust5wtc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) dusv(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve seasalt emission fluxes do K = 1, nbin_ss if ( K == 1) VarName='ssem001' if ( K == 2) VarName='ssem002' if ( K == 3) VarName='ssem003' if ( K == 4) VarName='ssem004' if ( K == 5) VarName='ssem005' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ssem(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve seasalt emission fluxes do K = 1, nbin_ss if ( K == 1) VarName='seas1sd' if ( K == 2) VarName='seas2sd' if ( K == 3) VarName='seas3sd' if ( K == 4) VarName='seas4sd' if ( K == 5) VarName='seas5sd' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) sssd(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve seasalt dry deposition fluxes do K = 1, nbin_ss if ( K == 1) VarName='seas1dp' if ( K == 2) VarName='seas2dp' if ( K == 3) VarName='seas3dp' if ( K == 4) VarName='seas4dp' if ( K == 5) VarName='seas5dp' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ssdp(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve seasalt wet deposition fluxes do K = 1, nbin_ss if ( K == 1) VarName='seas1wtl' if ( K == 2) VarName='seas2wtl' if ( K == 3) VarName='seas3wtl' if ( K == 4) VarName='seas4wtl' if ( K == 5) VarName='seas5wtl' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) sswt(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve seasalt scavenging fluxes do K = 1, nbin_ss if ( K == 1) VarName='seas1wtc' if ( K == 2) VarName='seas1wtc' if ( K == 3) VarName='seas1wtc' if ( K == 4) VarName='seas1wtc' if ( K == 5) VarName='seas1wtc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) sssv(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve bc emission fluxes do K = 1, nbin_bc if ( K == 1) VarName='bceman' if ( K == 2) VarName='bcembb' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) bcem(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve bc sedimentation fluxes do K = 1, nbin_bc if ( K == 1) VarName='bc1sd' if ( K == 2) VarName='bc2sd' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) bcsd(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve bc dry deposition fluxes do K = 1, nbin_bc if ( K == 1) VarName='bc1dp' if ( K == 2) VarName='bc2dp' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) bcdp(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve bc large wet deposition fluxes do K = 1, nbin_bc if ( K == 1) VarName='bc1wtl' if ( K == 2) VarName='bc2wtl' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) bcwt(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve bc convective wet deposition fluxes do K = 1, nbin_bc if ( K == 1) VarName='bc1wtc' if ( K == 2) VarName='bc2wtc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) bcsv(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve oc emission fluxes do K = 1, nbin_oc if ( K == 1) VarName='oceman' if ( K == 2) VarName='ocembb' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ocem(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve oc sedimentation fluxes do K = 1, nbin_oc if ( K == 1) VarName='oc1sd' if ( K == 2) VarName='oc2sd' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ocsd(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve oc dry deposition fluxes do K = 1, nbin_oc if ( K == 1) VarName='oc1dp' if ( K == 2) VarName='oc2dp' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ocdp(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve oc large wet deposition fluxes do K = 1, nbin_oc if ( K == 1) VarName='oc1wtl' if ( K == 2) VarName='oc2wtl' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ocwt(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve oc convective wet deposition fluxes do K = 1, nbin_oc if ( K == 1) VarName='oc1wtc' if ( K == 2) VarName='oc2wtc' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) ocsv(1:im,jsta_2l:jend_2u,K)=chem_2d(1:im,jsta_2l:jend_2u) enddo ! retrieve MIE AOD VarName='maod' call read_netcdf_2d_para(ncid2d,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u,& spval,VarName,chem_2d) maod(1:im,jsta_2l:jend_2u)=chem_2d(1:im,jsta_2l:jend_2u) endif ! gocart_on ! done with flux file, close it for now Status=nf90_close(ncid2d) ! deallocate(tmp,recname,reclevtyp,reclev) ! pos east ! call collect_loc(gdlat,dummy) ! if(me == 0)then ! latstart = nint(dummy(1,1)*gdsdegr) ! latlast = nint(dummy(im,jm)*gdsdegr) ! print*,'laststart,latlast B bcast= ',latstart,latlast,'gdsdegr=',gdsdegr,& ! 'dummy(1,1)=',dummy(1,1),dummy(im,jm),'gdlat=',gdlat(1,1) ! end if ! call mpi_bcast(latstart,1,MPI_INTEGER,0,mpi_comm_comp,irtn) ! call mpi_bcast(latlast,1,MPI_INTEGER,0,mpi_comm_comp,irtn) ! write(6,*) 'laststart,latlast,me A calling bcast=',latstart,latlast,me ! call collect_loc(gdlon,dummy) ! if(me == 0)then ! lonstart = nint(dummy(1,1)*gdsdegr) ! lonlast = nint(dummy(im,jm)*gdsdegr) ! end if ! call mpi_bcast(lonstart,1,MPI_INTEGER,0,mpi_comm_comp,irtn) ! call mpi_bcast(lonlast, 1,MPI_INTEGER,0,mpi_comm_comp,irtn) ! write(6,*)'lonstart,lonlast A calling bcast=',lonstart,lonlast ! ! generate look up table for lifted parcel calculations THL = 210. PLQ = 70000. pt_TBL = 10000. ! this is for 100 hPa added by Moorthi CALL TABLE(PTBL,TTBL,PT_TBL, & RDQ,RDTH,RDP,RDTHE,PL,THL,QS0,SQS,STHE,THE0) CALL TABLEQ(TTBLQ,RDPQ,RDTHEQ,PLQ,THL,STHEQ,THE0Q) ! ! IF(ME == 0)THEN WRITE(6,*)' SPL (POSTED PRESSURE LEVELS) BELOW: ' WRITE(6,51) (SPL(L),L=1,LSM) 50 FORMAT(14(F4.1,1X)) 51 FORMAT(8(F8.1,1X)) ENDIF ! !$omp parallel do private(l) DO L = 1,LSM ALSL(L) = LOG(SPL(L)) END DO ! !HC WRITE IGDS OUT FOR WEIGHTMAKER TO READ IN AS KGDSIN if(me == 0)then print*,'writing out igds' igdout = 110 ! open(igdout,file='griddef.out',form='unformatted' ! + ,status='unknown') if(maptype == 1)THEN ! Lambert conformal WRITE(igdout)3 WRITE(6,*)'igd(1)=',3 WRITE(igdout)im WRITE(igdout)jm WRITE(igdout)LATSTART WRITE(igdout)LONSTART WRITE(igdout)8 WRITE(igdout)CENLON WRITE(igdout)DXVAL WRITE(igdout)DYVAL WRITE(igdout)0 WRITE(igdout)64 WRITE(igdout)TRUELAT2 WRITE(igdout)TRUELAT1 WRITE(igdout)255 ELSE IF(MAPTYPE == 2)THEN !Polar stereographic WRITE(igdout)5 WRITE(igdout)im WRITE(igdout)jm WRITE(igdout)LATSTART WRITE(igdout)LONSTART WRITE(igdout)8 WRITE(igdout)CENLON WRITE(igdout)DXVAL WRITE(igdout)DYVAL WRITE(igdout)0 WRITE(igdout)64 WRITE(igdout)TRUELAT2 !Assume projection at +-90 WRITE(igdout)TRUELAT1 WRITE(igdout)255 ! Note: The calculation of the map scale factor at the standard ! lat/lon and the PSMAPF ! Get map factor at 60 degrees (N or S) for PS projection, which will ! be needed to correctly define the DX and DY values in the GRIB GDS if (TRUELAT1 < 0.) THEN LAT = -60. else LAT = 60. end if CALL MSFPS (LAT,TRUELAT1*0.001,PSMAPF) ELSE IF(MAPTYPE == 3) THEN !Mercator WRITE(igdout)1 WRITE(igdout)im WRITE(igdout)jm WRITE(igdout)LATSTART WRITE(igdout)LONSTART WRITE(igdout)8 WRITE(igdout)latlast WRITE(igdout)lonlast WRITE(igdout)TRUELAT1 WRITE(igdout)0 WRITE(igdout)64 WRITE(igdout)DXVAL WRITE(igdout)DYVAL WRITE(igdout)255 ELSE IF(MAPTYPE == 0 .OR. MAPTYPE == 203)THEN !A STAGGERED E-GRID WRITE(igdout)203 WRITE(igdout)im WRITE(igdout)jm WRITE(igdout)LATSTART WRITE(igdout)LONSTART WRITE(igdout)136 WRITE(igdout)CENLAT WRITE(igdout)CENLON WRITE(igdout)DXVAL WRITE(igdout)DYVAL WRITE(igdout)64 WRITE(igdout)0 WRITE(igdout)0 WRITE(igdout)0 ELSE IF(MAPTYPE == 207)THEN !Rotated lat-lon grid write(flatlon,1001)ifhr open(112,file=trim(flatlon),form='formatted', & status='unknown') write(112,1002)LATSTART/1000,LONSTART/1000,& LATSE/1000,LONSE/1000,LATNW/1000,LONNW/1000,& LATLAST/1000,LONLAST/1000 1001 format('latlons_corners.txt.f',I3.3) 1002 format(4(I6,I7,X)) close(112) END IF end if ! ! RETURN END subroutine read_netcdf_3d_para(ncid,im,jm,ista,ista_2l,iend,iend_2u,jsta,jsta_2l,jend,jend_2u, & spval,varname,buf,lm) use netcdf use ctlblk_mod, only : me use params_mod, only : small implicit none INCLUDE "mpif.h" character(len=20),intent(in) :: varname real,intent(in) :: spval integer,intent(in) :: ncid,im,jm,lm,jsta_2l,jend_2u,jsta,jend integer,intent(in) :: ista_2l,iend_2u,ista,iend real,intent(out) :: buf(ista_2l:iend_2u,jsta_2l:jend_2u,lm) integer :: varid,iret,ii,jj,i,j,l,kk integer :: start(3), count(3), stride(3) real,parameter :: spval_netcdf=9.99e+20 real :: fill_value iret = nf90_inq_varid(ncid,trim(varname),varid) if (iret /= 0) then if (me == 0) print*,VarName," not found -Assigned missing values" !$omp parallel do private(i,j,l) do l=1,lm do j=jsta,jend do i=ista,iend buf(i,j,l)=spval enddo enddo enddo else iret = nf90_get_att(ncid,varid,"_FillValue",fill_value) if (iret /= 0) fill_value = spval_netcdf start = (/ista,jsta,1/) ii=iend-ista+1 jj=jend-jsta+1 count = (/ii,jj,lm/) iret = nf90_get_var(ncid,varid,buf(ista:iend,jsta:jend,1:lm),start=start,count=count) if (iret /= 0) then print*," iret /=0, Error in reading varid " endif do l=1,lm do j=jsta,jend do i=ista,iend if(abs(buf(i,j,l)-fill_value)