SUBROUTINE arpsout( mptr , initdata , nestgrd0 ) 1,75 !********************************************************************* ! call the model output routine to produce normal data dump ! and printing for grid mptr. ! ! Implementation for ARPS 4.0 ! Author: Ming Xue, 10/27/1992 ! Updates: E.J. Adlerman ! August 1995 for Arps 4.0.22 !********************************************************************* INTEGER :: mptr ! pointer to a grid INTEGER :: initdata ! flag indicating if output is for data at initial time INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'agrigrid.inc' INCLUDE 'agricpu.inc' INCLUDE 'agricst.inc' ! INCLUDE 'phycst.inc' ! Unchanging physical constants INCLUDE 'globcst.inc' ! Global constants that control model INCLUDE 'bndry.inc' ! Boundary condition control parameters INCLUDE 'sfcphycst.inc' ! Unchanging physical constants INCLUDE 'cumucst.inc' ! Work arrays for cumulus parameterization INTEGER :: nx,ny,nz INTEGER :: nxy,nxyz INTEGER :: nstyps ! Number of soil type PARAMETER (nstyps=4) INTEGER :: exbcbufsz ! EXBC buffer size INTEGER :: nxp,nyp,nzp ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! mgrid = mptr nestgrd = nestgrd0 mptrbase = 1 !********************************************************************* ! here we get the pointers to the data !********************************************************************* CALL resett ! !----------------------------------------------------------------------- ! ! Get those parameters from coarse grid which may be updated by ! input file. The update should be made to all grids. ! !----------------------------------------------------------------------- ! IF ( initdata == 1 ) THEN nxp = node(5,mptrbase) nyp = node(6,mptrbase) nzp = node(14,mptrbase) iip = igtint(parent,1) irp = igtrel(mptrbase,1) CALL getcnts(nxp,nyp,nzp, a(iip),nsint, a(irp),nsreal) tstartp = tstart tstrtdmpp = tstrtdmp thisdmpp = thisdmp tfmtprtp = tfmtprt tmaxminp = tmaxmin trstoutp = trstout END IF ! !----------------------------------------------------------------------- ! ! Get parameters for this grid. ! !----------------------------------------------------------------------- ! nx = node(5,mptr) ny = node(6,mptr) nz = node(14,mptr) nxy = nx*ny nxyz = nxy*nz ii = igtint(mptr,1) ir = igtrel(mptr,1) !********************************************************************* ! retrieve constant values from the constant arrays !********************************************************************* CALL getcnts(nx,ny,nz, a(ii),nsint, a(ir),nsreal) IF ( initdata == 1 ) THEN tstart = tstartp curtim = tstart tstrtdmp = tstrtdmpp thisdmp = thisdmpp tfmtprt = tfmtprtp tmaxmin = tmaxminp trstout = trstoutp END IF nfmtprt = nint(tfmtprt/dtbig ) IF( nfmtprt == 0 ) nfmtprt = -1 nhisdmp = nint(thisdmp/dtbig) IF( nhisdmp == 0 ) nhisdmp = -1 nstrtdmp = nint(tstrtdmp/dtbig) nrstout = nint(trstout/dtbig) IF( nrstout == 0 ) nrstout = -1 nmaxmin = nint(tmaxmin/dtbig) IF( nmaxmin == 0 ) nmaxmin = -1 nimgdmp = nint(timgdmp/dtbig) IF( nimgdmp == 0 ) nimgdmp = -1 nceltrk = nint(tceltrk/dtbig) IF( nceltrk == 0 ) nceltrk = -1 nplots = nint(tplots /dtbig) IF( nplots == 0 ) nplots = -1 nstep = node(13,mptr) WRITE(6,'(1x,a,i2,a,f8.1)') & 'Calling ARPSOUT for field output for grid ',mptr, & ' at time =', curtim !********************************************************************* ! 1-d x-Arrays !********************************************************************* ix = igtnx1(mptr,id_x) !********************************************************************* ! 1-d y-Arrays !********************************************************************* iy = igtny1(mptr,id_y) !********************************************************************* ! 1-d z-Arrays !********************************************************************* iz = igtnz1(mptr,id_z) !********************************************************************* ! 2-d xy arrays !********************************************************************* ihterain = igtnxy(mptr,id_hterain, 1) isoiltyp = igtnxy(mptr,id_soiltyp, 4) istypfrct = igtnxy(mptr,id_stypfrct,4) ivegtyp = igtnxy(mptr,id_vegtyp, 1) ilai = igtnxy(mptr,id_lai, 1) iroufns = igtnxy(mptr,id_roufns, 1) iveg = igtnxy(mptr,id_veg, 1) itsfc = igtnxy(mptr,id_tsfc, 5) itsoil = igtnxy(mptr,id_tsoil, 5) iwetsfc = igtnxy(mptr,id_wetsfc, 5) iwetdp = igtnxy(mptr,id_wetdp, 5) iwetcanp = igtnxy(mptr,id_wetcanp, 5) iqvsfc = igtnxy(mptr,id_qvsfc, 5) isnowdpth = igtnxy(mptr,id_snowdpth, 1) iraing = igtnxy(mptr,id_raing, 1) irainc = igtnxy(mptr,id_rainc, 1) imapfct = igtnxy(mptr,id_mapfct, 8) iradsw = igtnxy(mptr,id_radsw, 1) irnflx = igtnxy(mptr,id_rnflx, 1) iprcrate = igtnxy(mptr,id_prcrate, 4) iraincv = igtnxy(mptr,id_raincv, 1) inca = igtnxy(mptr,id_nca, 1) iusflx = igtnxy(mptr,id_usflx, 1) ivsflx = igtnxy(mptr,id_vsflx, 1) iptsflx = igtnxy(mptr,id_ptsflx, 1) iqvsflx = igtnxy(mptr,id_qvsflx, 1) !********************************************************************* ! 2-d xz arrays !********************************************************************* ivdtnb = igtnxz(mptr,id_vdtnb,1) ivdtsb = igtnxz(mptr,id_vdtsb,1) ipdtnb = igtnxz(mptr,id_pdtnb,1) ipdtsb = igtnxz(mptr,id_pdtsb,1) !********************************************************************* ! 2-d yz arrays !********************************************************************* iudteb = igtnyz(mptr,id_udteb,1) iudtwb = igtnyz(mptr,id_udtwb,1) ipdteb = igtnyz(mptr,id_pdteb,1) ipdtwb = igtnyz(mptr,id_pdtwb,1) !********************************************************************* ! 3-d arrays !********************************************************************* iu = igtxyz(mptr,id_u, 3) iv = igtxyz(mptr,id_v, 3) iw = igtxyz(mptr,id_w, 3) iwcont = igtxyz(mptr,id_wcont,3) iptprt = igtxyz(mptr,id_ptprt,3) ipprt = igtxyz(mptr,id_pprt, 3) iqv = igtxyz(mptr,id_qv, 3) iqc = igtxyz(mptr,id_qc, 3) iqr = igtxyz(mptr,id_qr, 3) iqi = igtxyz(mptr,id_qi, 3) iqs = igtxyz(mptr,id_qs, 3) iqh = igtxyz(mptr,id_qh, 3) itke = igtxyz(mptr,id_tke, 3) iubar = igtxyz(mptr,id_ubar, 1) ivbar = igtxyz(mptr,id_vbar, 1) iwbar = igtxyz(mptr,id_wbar, 1) iptbar = igtxyz(mptr,id_ptbar, 1) ipbar = igtxyz(mptr,id_pbar, 1) irhostr= igtxyz(mptr,id_rhostr,1) iqvbar = igtxyz(mptr,id_qvbar, 1) izp = igtxyz(mptr,id_zp, 1) ij1 = igtxyz(mptr,id_j1, 1) ij2 = igtxyz(mptr,id_j2, 1) ij3 = igtxyz(mptr,id_j3, 1) ij3inv = igtxyz(mptr,id_j3inv,1) ikmh = igtxyz(mptr,id_kmh, 1) ikmv = igtxyz(mptr,id_kmv, 1) iptcumsrc = igtxyz(mptr,id_ptcumsrc,1) iqcumsrc = igtxyz(mptr,id_qcumsrc, 5) iradfrc = igtxyz(mptr,id_radfrc, 1) iw0avg = igtxyz(mptr,id_w0avg, 1) IF ( lexbc == 1 ) THEN IF ( mptr == 1 ) THEN ! !----------------------------------------------------------------------- ! ! 3-d EXBC arrays for base grid ! !----------------------------------------------------------------------- ! exbcbufsz = nxyz*nexbc3d iexbcbuf = igtexbc(mptr,1,nexbc3d) ELSE ! !----------------------------------------------------------------------- ! ! 3-d EXBC temporary arrays for fine grids ! !----------------------------------------------------------------------- ! exbcbufsz = 1 iexbcbuf = igetsp( exbcbufsz ) END IF ELSE exbcbufsz = 1 iexbcbuf = igetsp( exbcbufsz ) END IF ! !----------------------------------------------------------------------- ! ! 3-d temporary arrays for all grids ! !----------------------------------------------------------------------- ! irhobar = igetsp( nxyz ) item1 = igetsp( nxyz ) item2 = igetsp( nxyz ) item3 = igetsp( nxyz ) item4 = igetsp( nxyz ) item5 = igetsp( nxyz ) item6 = igetsp( nxyz ) item7 = igetsp( nxyz ) item8 = igetsp( nxyz ) item9 = igetsp( nxyz ) item10 = igetsp( nxyz ) item11 = igetsp( nxyz ) cpu0 = f_cputime() IF( initdata == 1) THEN ! !----------------------------------------------------------------------- ! ! Reset runname to runnew and store it back to constant arrays ! before dumping, no matter whether this run is a restart or not. ! ! This approach should be somewhere for initialization instead of ! here. But I couldn't find a better place to reset runname in every ! grid for restart run. ! !----------------------------------------------------------------------- ! IF ( lfnkey /= nmlnthn .OR. runname(1:lfnkey) /= runnew(1:nmlnthn) ) THEN lfnkey = nmlnthn runname(1:lfnkey) = runnew(1:nmlnthn) END IF ! !----------------------------------------------------------------------- ! ! Output the initial fields ! !----------------------------------------------------------------------- ! CALL initout(mptr,nx,ny,nz,nstyps,exbcbufsz, & a(iu),a(iv),a(iw),a(iwcont),a(iptprt),a(ipprt), & a(iqv),a(iqc),a(iqr),a(iqi),a(iqs),a(iqh),a(itke), & a(iubar),a(ivbar),a(iptbar),a(ipbar),a(irhostr),a(iqvbar), & a(ikmh),a(ikmv),a(ix),a(iy),a(iz),a(izp),a(ihterain), & a(imapfct),a(ij1),a(ij2),a(ij3),a(ij3inv), & a(isoiltyp),a(istypfrct), & a(ivegtyp),a(ilai),a(iroufns),a(iveg), & a(itsfc),a(itsoil),a(iwetsfc),a(iwetdp),a(iwetcanp), & a(isnowdpth),a(iraing),a(irainc),a(iprcrate),a(iexbcbuf), & a(iradfrc),a(iradsw),a(irnflx), & a(iusflx),a(ivsflx),a(iptsflx),a(iqvsflx), & a(item1),a(item2), a(item3),a(item4),a(item5), & a(item6),a(item7),a(item8),a(item9),a(item10), & a(item11) ) IF ( rstart ) THEN CALL prtlog(nx,ny,nz,0) END IF CALL strcnts(nx,ny,nz, a(ii),nsint, a(ir),nsreal) ELSE ! !----------------------------------------------------------------------- ! ! Output the data at any model time ! !----------------------------------------------------------------------- ! CALL output(mptr,nx,ny,nz,nstyps,exbcbufsz, & a(iu),a(iv),a(iw),a(iwcont),a(iptprt),a(ipprt), & a(iqv),a(iqc),a(iqr),a(iqi),a(iqs),a(iqh),a(itke), & a(iudteb),a(iudtwb),a(ivdtnb),a(ivdtsb), & a(ipdteb),a(ipdtwb),a(ipdtnb),a(ipdtsb), & a(iubar),a(ivbar),a(iptbar),a(ipbar),a(irhostr),a(iqvbar), & a(ikmh),a(ikmv),a(ix),a(iy),a(iz),a(izp),a(ihterain), & a(imapfct), a(ij1),a(ij2),a(ij3),a(ij3inv), & a(isoiltyp),a(istypfrct), & a(ivegtyp),a(ilai),a(iroufns),a(iveg), & a(itsfc),a(itsoil),a(iwetsfc),a(iwetdp),a(iwetcanp), & a(isnowdpth),a(iqvsfc),a(iptcumsrc),a(iqcumsrc), & a(iw0avg),a(inca),a(iraincv), & a(iraing),a(irainc),a(iprcrate),a(iexbcbuf), & a(iradfrc),a(iradsw),a(irnflx), & a(iusflx),a(ivsflx),a(iptsflx),a(iqvsflx), & a(item1),a(item2),a(item3),a(item4),a(item5), & a(item6),a(item7),a(item8),a(item9),a(item10), & a(item11) ) END IF cpu_usrout= cpu_usrout + f_cputime() - cpu0 !********************************************************************* ! return 2-d and 3-d arrays to their permanent storage when packed. !********************************************************************* !********************************************************************* ! 2-d xy arrays !********************************************************************* CALL retnxy(mptr,id_hterain, 1,ihterain, .false.) CALL retnxy(mptr,id_soiltyp, 4,isoiltyp, .false.) CALL retnxy(mptr,id_stypfrct,4,istypfrct,.false.) CALL retnxy(mptr,id_vegtyp, 1,ivegtyp, .false.) CALL retnxy(mptr,id_lai, 1,ilai, .false.) CALL retnxy(mptr,id_roufns, 1,iroufns, .false.) CALL retnxy(mptr,id_veg, 1,iveg, .false.) CALL retnxy(mptr,id_tsfc, 5,itsfc, .false.) CALL retnxy(mptr,id_tsoil, 5,itsoil, .false.) CALL retnxy(mptr,id_wetsfc, 5,iwetsfc, .false.) CALL retnxy(mptr,id_wetdp, 5,iwetdp, .false.) CALL retnxy(mptr,id_wetcanp, 5,iwetcanp, .false.) CALL retnxy(mptr,id_qvsfc, 5,iqvsfc, .false.) CALL retnxy(mptr,id_snowdpth, 1,isnowdpth, .false.) CALL retnxy(mptr,id_raing, 1,iraing, .false.) CALL retnxy(mptr,id_rainc, 1,irainc, .false.) CALL retnxy(mptr,id_mapfct, 8,imapfct, .false.) CALL retnxy(mptr,id_radsw, 1,iradsw, .false.) CALL retnxy(mptr,id_rnflx, 1,irnflx, .false.) CALL retnxy(mptr,id_prcrate, 4,iprcrate, .false.) CALL retnxy(mptr,id_raincv, 1,iraincv, .false.) CALL retnxy(mptr,id_nca, 1,inca, .false.) CALL retnxy(mptr,id_usflx, 1,iusflx, .false.) CALL retnxy(mptr,id_vsflx, 1,ivsflx, .false.) CALL retnxy(mptr,id_ptsflx, 1,iptsflx, .false.) CALL retnxy(mptr,id_qvsflx, 1,iqvsflx, .false.) !********************************************************************* ! 2-d xz arrays !********************************************************************* CALL retnxz(mptr,id_vdtnb,1,ivdtnb,.false.) CALL retnxz(mptr,id_vdtsb,1,ivdtsb,.false.) CALL retnxz(mptr,id_pdtnb,1,ipdtnb,.false.) CALL retnxz(mptr,id_pdtsb,1,ipdtsb,.false.) !********************************************************************* ! 2-d yz arrays !********************************************************************* CALL retnyz(mptr,id_udteb,1,iudteb,.false.) CALL retnyz(mptr,id_udtwb,1,iudtwb,.false.) CALL retnyz(mptr,id_pdteb,1,ipdteb,.false.) CALL retnyz(mptr,id_pdtwb,1,ipdtwb,.false.) !********************************************************************* ! 3-d arrays !********************************************************************* CALL retxyz(mptr,id_u, 3,iu ,.false.) CALL retxyz(mptr,id_v, 3,iv ,.false.) CALL retxyz(mptr,id_w, 3,iw ,.false.) CALL retxyz(mptr,id_ptprt,3,iptprt,.false.) CALL retxyz(mptr,id_pprt, 3,ipprt ,.false.) CALL retxyz(mptr,id_qv, 3,iqv ,.false.) CALL retxyz(mptr,id_qc, 3,iqc ,.false.) CALL retxyz(mptr,id_qr, 3,iqr ,.false.) CALL retxyz(mptr,id_qi, 3,iqi ,.false.) CALL retxyz(mptr,id_qs, 3,iqs ,.false.) CALL retxyz(mptr,id_qh, 3,iqh ,.false.) CALL retxyz(mptr,id_tke, 3,itke ,.false.) CALL retxyz(mptr,id_ubar, 1,iubar ,.false.) CALL retxyz(mptr,id_vbar, 1,ivbar ,.false.) CALL retxyz(mptr,id_wbar, 1,iwbar ,.false.) CALL retxyz(mptr,id_ptbar, 1,iptbar ,.false.) CALL retxyz(mptr,id_pbar, 1,ipbar ,.false.) CALL retxyz(mptr,id_rhostr,1,irhostr,.false.) CALL retxyz(mptr,id_qvbar, 1,iqvbar ,.false.) CALL retxyz(mptr,id_zp, 1,izp, .false.) CALL retxyz(mptr,id_j1, 1,ij1, .false.) CALL retxyz(mptr,id_j2, 1,ij2, .false.) CALL retxyz(mptr,id_j3, 1,ij3, .false.) CALL retxyz(mptr,id_j3inv,1,ij3inv,.false.) CALL retxyz(mptr,id_kmh, 1,ikmh, .false.) CALL retxyz(mptr,id_kmv, 1,ikmv, .false.) CALL retxyz(mptr,id_ptcumsrc,1,iptcumsrc,.false.) CALL retxyz(mptr,id_qcumsrc, 5,iqcumsrc, .false.) CALL retxyz(mptr,id_radfrc, 1,iradfrc, .false.) CALL retxyz(mptr,id_w0avg, 1,iw0avg, .false.) IF ( lbcopt == 2 .AND. mptr == 1 ) THEN CALL retexbc(mptr,1,nexbc3d,iexbcbuf,.true.) END IF !********************************************************************* ! re-set all tem. space !********************************************************************* CALL resett !********************************************************************* ! we're done here !********************************************************************* RETURN END SUBROUTINE arpsout