SUBROUTINE arpsinit( mptr , nestgrd0 ) 1,100 ! !----------------------------------------------------------------------- ! ! Call the model initialization routine to initialize the model ! variables for grid mptr. ! ! Author: Ming Xue, 10/27/1992 ! ! Updates: E.J. Adlerman ! August 1995 for Arps 4.0.22 ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: mptr, nestgrd0 INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' INCLUDE 'agricpu.inc' INCLUDE 'agricst.inc' INCLUDE 'bndry.inc' ! Boundary condition control parameters INCLUDE 'cumucst.inc' ! cumulus parametization INCLUDE 'globcst.inc' ! Global constants that control model INCLUDE 'phycst.inc' ! Unchanging physical constants INCLUDE 'radcst.inc' ! radiation parametization INCLUDE 'sfcphycst.inc' ! Unchanging physical constants INCLUDE 'soilcst.inc' ! soil-vegetation parametization INCLUDE 'grid.inc' INTEGER :: nx,ny,nz INTEGER :: nxy,nxyz,nxyz0 INTEGER :: i,j,k,ijk INTEGER :: nstyps ! Number of soil type PARAMETER (nstyps=4) INTEGER :: exbcbufsz INTEGER :: iexbcbuf INTEGER :: ii,ir INTEGER :: ix,iy,iz INTEGER :: iifax1,iifax2,itrigs1,itrigs2 INTEGER :: ivwork1,ivwork2,iwsave1,iwsave2 INTEGER :: ihterain,isinlat INTEGER :: isoiltyp,istypfrct,ivegtyp,ilai,iroufns,iveg INTEGER :: itsfc,itsoil,iwetsfc,iwetdp,iwetcanp,iqvsfc,isnowdpth INTEGER :: iptsfc,iraing,irainc,ipbldpth,imapfct INTEGER :: irad2d,iradsw,irnflx INTEGER :: iprcrate,ibcrlx INTEGER :: iraincv,inca INTEGER :: iusflx,ivsflx,iptsflx,iqvsflx INTEGER :: itemxy1 INTEGER :: iudtnb,iudtsb,ivdtnb,ivdtsb,isdtnb INTEGER :: isdtsb,ipdtnb,ipdtsb,iwdtnb,iwdtsb INTEGER :: iudteb,iudtwb,ivdteb,ivdtwb,isdteb INTEGER :: isdtwb,ipdteb,ipdtwb,iwdteb,iwdtwb INTEGER :: iu,iv,iw INTEGER :: iptprt,ipprt,iqv,iqc,iqr,iqi,iqs,iqh,itke INTEGER :: iubar, ivbar, iwbar INTEGER :: iptbar,ipbar,iptbari,ipbari,ippi,iqvbar INTEGER :: irhostr,irhostri INTEGER :: izp, ij1,ij2,ij3,ij3inv,iaj3x,iaj3y,iaj3z INTEGER :: iwcont,ikmh,ikmv,irprntl,icsndsq INTEGER :: iptcumsrc,iqcumsrc,iradfrc,iw0avg INTEGER :: item1,item2,item3,item4,item5 INTEGER :: item6,item7,item8,item9,item10 INTEGER :: item11,item12,item13,item14,item15 INTEGER :: item16,item17,item18,item19,item20 INTEGER :: item21,item22,item23,item24,item25,item26 INTEGER :: item1_0,item2_0,item3_0 REAL :: pmax,pmin,qvmax,qvmin,qrmax,qrmin REAL :: f_cputime INTEGER :: igtint,igtrel,igtns1,igtnx1,igtny1,igtnz1 INTEGER :: igtnxy,igetsp,igtnxz,igtnyz,igtxyz,igtexbc ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! mgrid = mptr nestgrd = nestgrd0 WRITE(6,'(/1x,a,i3/)') & 'Calling ARPSINIT to initialized grid ',mptr !********************************************************************* ! here we get the pointers to the data !********************************************************************* CALL resett nx = node(5,mptr) ny = node(6,mptr) nz = node(14,mptr) nxy = nx*ny nxyz = nxy*nz nxyz0 = (nx+1)*(ny+1)*(nz+1) ii = igtint(mptr,1) ir = igtrel(mptr,1) !********************************************************************* ! 1-d constant-Arrays !********************************************************************* iifax1 = igtns1(mptr,id_ifax1,13) iifax2 = igtns1(mptr,id_ifax2,13) !********************************************************************* ! 1-d x-Arrays !********************************************************************* ix = igtnx1(mptr,id_x) itrigs1 = igtnx1(mptr,id_trigs1) iwsave2 = igtnx1(mptr,id_wsave2) !********************************************************************* ! 1-d y-Arrays !********************************************************************* iy = igtny1(mptr,id_y) itrigs2 = igtny1(mptr,id_trigs2) iwsave1 = igtny1(mptr,id_wsave1) !********************************************************************* ! 1-d z-Arrays !********************************************************************* iz = igtnz1(mptr,id_z) !********************************************************************* ! 2-d xy arrays !********************************************************************* ihterain = igtnxy(mptr,id_hterain, 1) isinlat = igtnxy(mptr,id_sinlat, 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) iptsfc = igtnxy(mptr,id_ptsfc, 1) isnowdpth = igtnxy(mptr,id_snowdpth, 1) iraing = igtnxy(mptr,id_raing, 1) irainc = igtnxy(mptr,id_rainc, 1) ipbldpth = igtnxy(mptr,id_pbldpth, 3) imapfct = igtnxy(mptr,id_mapfct, 8) irad2d = igtnxy(mptr,id_rad2d, 10) iradsw = igtnxy(mptr,id_radsw, 1) irnflx = igtnxy(mptr,id_rnflx, 1) iprcrate = igtnxy(mptr,id_prcrate, 4) ibcrlx = igtnxy(mptr,id_bcrlx, 1) ivwork1 = igtnxy(mptr,id_vwork1, 2) ivwork2 = igtnxy(mptr,id_vwork2, 2) 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) itemxy1 = igetsp(nxy) !********************************************************************* ! 2-d xz arrays !********************************************************************* iudtnb = igtnxz(mptr,id_udtnb,1) iudtsb = igtnxz(mptr,id_udtsb,1) ivdtnb = igtnxz(mptr,id_vdtnb,1) ivdtsb = igtnxz(mptr,id_vdtsb,1) isdtnb = igtnxz(mptr,id_sdtnb,1) isdtsb = igtnxz(mptr,id_sdtsb,1) ipdtnb = igtnxz(mptr,id_pdtnb,1) ipdtsb = igtnxz(mptr,id_pdtsb,1) iwdtnb = igtnxz(mptr,id_wdtnb,1) iwdtsb = igtnxz(mptr,id_wdtsb,1) !********************************************************************* ! 2-d yz arrays !********************************************************************* iudteb = igtnyz(mptr,id_udteb,1) iudtwb = igtnyz(mptr,id_udtwb,1) ivdteb = igtnyz(mptr,id_vdteb,1) ivdtwb = igtnyz(mptr,id_vdtwb,1) isdteb = igtnyz(mptr,id_sdteb,1) isdtwb = igtnyz(mptr,id_sdtwb,1) ipdteb = igtnyz(mptr,id_pdteb,1) ipdtwb = igtnyz(mptr,id_pdtwb,1) iwdteb = igtnyz(mptr,id_wdteb,1) iwdtwb = igtnyz(mptr,id_wdtwb,1) !********************************************************************* ! 3-d arrays !********************************************************************* iu = igtxyz(mptr,id_u, 3) iv = igtxyz(mptr,id_v, 3) iw = igtxyz(mptr,id_w, 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) iptbari = igtxyz(mptr,id_ptbari, 1) ipbari = igtxyz(mptr,id_pbari, 1) irhostr = igtxyz(mptr,id_rhostr, 1) irhostri = igtxyz(mptr,id_rhostri,1) iqvbar = igtxyz(mptr,id_qvbar, 1) ippi = igtxyz(mptr,id_ppi, 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) iaj3x = igtxyz(mptr,id_aj3x ,1) iaj3y = igtxyz(mptr,id_aj3y ,1) iaj3z = igtxyz(mptr,id_aj3z ,1) iwcont = igtxyz(mptr,id_wcont, 1) ikmh = igtxyz(mptr,id_kmh, 1) ikmv = igtxyz(mptr,id_kmv, 1) irprntl = igtxyz(mptr,id_rprntl, 1) icsndsq = igtxyz(mptr,id_csndsq, 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 ! !----------------------------------------------------------------------- ! 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 ) item12 = igetsp( nxyz ) item13 = igetsp( nxyz ) item14 = igetsp( nxyz ) item15 = igetsp( nxyz ) item16 = igetsp( nxyz ) item17 = igetsp( nxyz ) item18 = igetsp( nxyz ) item19 = igetsp( nxyz ) item20 = igetsp( nxyz ) item21 = igetsp( nxyz ) item22 = igetsp( nxyz ) item23 = igetsp( nxyz ) item24 = igetsp( nxyz ) item25 = igetsp( nxyz ) item26 = igetsp( nxyz ) item1_0 = igetsp( nxyz0 ) item2_0 = igetsp( nxyz0 ) item3_0 = igetsp( nxyz0 ) cpu0 = f_cputime() CALL initial(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(iudtnb),a(iudtsb), & a(ivdteb),a(ivdtwb),a(ivdtnb),a(ivdtsb), & a(iwdteb),a(iwdtwb),a(iwdtnb),a(iwdtsb), & a(ipdteb),a(ipdtwb),a(ipdtnb),a(ipdtsb), & a(isdteb),a(isdtwb),a(isdtnb),a(isdtsb), & a(iubar),a(ivbar),a(iptbar),a(ipbar), & a(iptbari),a(ipbari),a(irhostr),a(irhostri), & a(iqvbar),a(ippi),a(icsndsq), & a(ix),a(iy),a(iz),a(izp),a(ihterain),a(imapfct), & a(ij1),a(ij2),a(ij3),a(iaj3x),a(iaj3y),a(iaj3z),a(ij3inv), & a(itrigs1),a(itrigs2),a(iifax1),a(iifax2), & a(iwsave1),a(iwsave2),a(ivwork1),a(ivwork2), & a(isinlat),a(ikmh),a(ikmv),a(irprntl), & 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(iptsfc),a(iqvsfc), & a(iptcumsrc),a(iqcumsrc),a(iw0avg),a(inca),a(iraincv), & a(iraing),a(irainc),a(iprcrate),a(iexbcbuf),a(ibcrlx), & a(iradfrc),a(iradsw),a(irnflx), & a(iusflx),a(ivsflx),a(iptsflx),a(iqvsflx),a(itemxy1), & a(item1),a(item2),a(item3),a(item4),a(item5), & a(item6),a(item7),a(item8),a(item9),a(item10), & a(item11),a(item12),a(item13),a(item14),a(item15), & a(item16),a(item17),a(item18),a(item19),a(item20), & a(item21),a(item22),a(item23),a(item24),a(item25),a(item26), & a(item1_0),a(item2_0),a(item3_0) ) WRITE(6,'(/1x,a,i3,a/)') & 'Grid ',mptr,' was initialized by calling ARPS routine INITIAL.' cpu_init0 = cpu_init0 + f_cputime() - cpu0 hxposs(1) = dx hyposs(1) = dy possk(1) = dtbig rnode(31,mstart) = dz ! !----------------------------------------------------------------------- ! ! The current model time (initial time): ! !----------------------------------------------------------------------- ! curtim = tstart node(13,mptr) = nint( curtim/dtbig ) nstep = node(13,mptr) WRITE(6,'(1x,a,f13.3,a)') & 'The initial model time is at ', curtim,' seconds.' ! !----------------------------------------------------------------------- ! ! Initialize the external boundary data array ! !----------------------------------------------------------------------- ! PRINT *, 'In arpsinit' PRINT *, 'lbcopt = ', lbcopt ! !----------------------------------------------------------------------- ! ! Total number of time steps to be taken: ! This will be not be by the interface to control the time ! integration. The time period of integration is instead ! set in the input file for the interface. ! !----------------------------------------------------------------------- ! nsteps = nint( (tstop-tstart)/dtbig ) ! !----------------------------------------------------------------------- ! ! nsteps is now unused in the model either. It's calculated ! here for safty reason only. ! !----------------------------------------------------------------------- ! ! return 2-d and 3-d arrays to their permanent storage when unpacked. ! !----------------------------------------------------------------------- ! PRINT*,' calling retnxy' !********************************************************************* ! 2-d xy arrays !********************************************************************* CALL retnxy(mptr,id_hterain, 1,ihterain, .true.) CALL retnxy(mptr,id_sinlat, 1,isinlat, .true.) CALL retnxy(mptr,id_soiltyp, 4,isoiltyp, .true.) CALL retnxy(mptr,id_stypfrct,4,istypfrct,.true.) CALL retnxy(mptr,id_vegtyp, 1,ivegtyp, .true.) CALL retnxy(mptr,id_lai, 1,ilai, .true.) CALL retnxy(mptr,id_roufns, 1,iroufns, .true.) CALL retnxy(mptr,id_veg, 1,iveg, .true.) CALL retnxy(mptr,id_tsfc, 5,itsfc, .true.) CALL retnxy(mptr,id_tsoil, 5,itsoil, .true.) CALL retnxy(mptr,id_wetsfc, 5,iwetsfc, .true.) CALL retnxy(mptr,id_wetdp, 5,iwetdp, .true.) CALL retnxy(mptr,id_wetcanp, 5,iwetcanp, .true.) CALL retnxy(mptr,id_qvsfc, 5,iqvsfc, .true.) CALL retnxy(mptr,id_snowdpth, 1,isnowdpth, .true.) CALL retnxy(mptr,id_raing, 1,iraing, .true.) CALL retnxy(mptr,id_rainc, 1,irainc, .true.) CALL retnxy(mptr,id_ptsfc, 1,iptsfc, .true.) CALL retnxy(mptr,id_pbldpth, 3,ipbldpth, .true.) CALL retnxy(mptr,id_mapfct, 8,imapfct, .true.) CALL retnxy(mptr,id_rad2d, 10,irad2d, .true.) CALL retnxy(mptr,id_radsw, 1,iradsw, .true.) CALL retnxy(mptr,id_rnflx, 1,irnflx, .true.) CALL retnxy(mptr,id_prcrate, 4,iprcrate, .true.) CALL retnxy(mptr,id_bcrlx, 1,ibcrlx, .true.) CALL retnxy(mptr,id_vwork1, 2,ivwork1, .true.) CALL retnxy(mptr,id_vwork2, 2,ivwork2, .true.) CALL retnxy(mptr,id_raincv, 1,iraincv, .true.) CALL retnxy(mptr,id_nca, 1,inca, .true.) CALL retnxy(mptr,id_usflx, 1,iusflx, .true.) CALL retnxy(mptr,id_vsflx, 1,ivsflx, .true.) CALL retnxy(mptr,id_ptsflx, 1,iptsflx, .true.) CALL retnxy(mptr,id_qvsflx, 1,iqvsflx, .true.) !********************************************************************* ! 2-d xz arrays !********************************************************************* CALL retnxz(mptr,id_udtnb,1,iudtnb,.true.) CALL retnxz(mptr,id_udtsb,1,iudtsb,.true.) CALL retnxz(mptr,id_vdtnb,1,ivdtnb,.true.) CALL retnxz(mptr,id_vdtsb,1,ivdtsb,.true.) CALL retnxz(mptr,id_sdtnb,1,isdtnb,.true.) CALL retnxz(mptr,id_sdtsb,1,isdtsb,.true.) CALL retnxz(mptr,id_pdtnb,1,ipdtnb,.true.) CALL retnxz(mptr,id_pdtsb,1,ipdtsb,.true.) CALL retnxz(mptr,id_wdtnb,1,iwdtnb,.true.) CALL retnxz(mptr,id_wdtsb,1,iwdtsb,.true.) !********************************************************************* ! 2-d yz arrays !********************************************************************* CALL retnyz(mptr,id_udteb,1,iudteb,.true.) CALL retnyz(mptr,id_udtwb,1,iudtwb,.true.) CALL retnyz(mptr,id_vdteb,1,ivdteb,.true.) CALL retnyz(mptr,id_vdtwb,1,ivdtwb,.true.) CALL retnyz(mptr,id_sdteb,1,isdteb,.true.) CALL retnyz(mptr,id_sdtwb,1,isdtwb,.true.) CALL retnyz(mptr,id_pdteb,1,ipdteb,.true.) CALL retnyz(mptr,id_pdtwb,1,ipdtwb,.true.) CALL retnyz(mptr,id_wdteb,1,iwdteb,.true.) CALL retnyz(mptr,id_wdtwb,1,iwdtwb,.true.) !********************************************************************* ! 3-d arrays !********************************************************************* PRINT*,' calling retxyz for u' CALL retxyz(mptr,id_u ,3,iu , .true.) PRINT*,' calling retxyz for v' CALL retxyz(mptr,id_v ,3,iv , .true.) PRINT*,' calling retxyz for w' CALL retxyz(mptr,id_w ,3,iw , .true.) PRINT*,' calling retxyz for ptprt' CALL retxyz(mptr,id_ptprt,3,iptprt , .true.) PRINT*,' calling retxyz for pprt' pmax = 0.0 pmin = 0.0 PRINT*,'ipprt =', ipprt DO ijk = ipprt, ipprt+nx*ny*nz*3-1 ! print*,'ijk,ip ,nx*ny*nz =', ijk,ipprt,nx*ny*nz, a(ijk) pmax = MAX( pmax, a(ijk)) pmin = MIN( pmax, a(ijk)) END DO PRINT*,' pmin, pmax = ', pmin, pmax, ipprt CALL retxyz(mptr,id_pprt,3,ipprt , .true.) PRINT*,' calling retxyz for qv ' CALL retxyz(mptr,id_qv,3,iqv , .true.) qvmax = 0.0 qvmin = 0.0 DO ijk = iqv, iqv + nx*ny*nz*3 - 1 qvmax = MAX(qvmax,a(ijk)) qvmin = MIN(qvmin,a(ijk)) END DO PRINT*, 'qvmax, qvmin, i#', qvmax,qvmin, iqv PRINT*,' calling retxyz for qc ' CALL retxyz(mptr,id_qc,3,iqc , .true.) qrmax = 0.0 qrmin = 0.0 DO ijk = iqr, iqr+nx*ny*nz*3-1 ! print*,'ijk,iqr,nx*ny*nz =', ijk,iqr,nx*ny*nz, a(ijk) qrmax = MAX(qrmax, a(ijk)) qrmin = MIN(qrmax, a(ijk)) END DO PRINT*,'qrmin, qrmax = ', qrmin, qrmax, iqr PRINT*,' calling retxyz for qr ' CALL retxyz(mptr,id_qr,3,iqr , .true.) PRINT*,' calling retxyz for qi ' CALL retxyz(mptr,id_qi,3,iqi , .true.) PRINT*,' calling retxyz for qs ' CALL retxyz(mptr,id_qs,3,iqs , .true.) PRINT*,' calling retxyz for qh ' CALL retxyz(mptr,id_qh,3,iqh , .true.) PRINT*,' calling retxyz for tke ' CALL retxyz(mptr,id_tke,3,itke , .true.) PRINT*,' calling retxyz for *bar' CALL retxyz(mptr,id_ubar, 1,iubar, .true.) CALL retxyz(mptr,id_vbar, 1,ivbar, .true.) CALL retxyz(mptr,id_wbar, 1,iwbar, .true.) CALL retxyz(mptr,id_ptbar, 1,iptbar, .true.) CALL retxyz(mptr,id_pbar, 1,ipbar, .true.) CALL retxyz(mptr,id_ptbari, 1,iptbari, .true.) CALL retxyz(mptr,id_pbari, 1,ipbari, .true.) CALL retxyz(mptr,id_rhostr, 1,irhostr, .true.) CALL retxyz(mptr,id_rhostri,1,irhostri,.true.) CALL retxyz(mptr,id_qvbar, 1,iqvbar, .true.) PRINT*,' calling retxyz for zp ' CALL retxyz(mptr,id_zp, 1,izp, .true.) CALL retxyz(mptr,id_j1, 1,ij1, .true.) CALL retxyz(mptr,id_j2, 1,ij2, .true.) CALL retxyz(mptr,id_j3, 1,ij3, .true.) CALL retxyz(mptr,id_j3inv,1,ij3inv,.true.) CALL retxyz(mptr,id_aj3x, 1,iaj3x, .true.) CALL retxyz(mptr,id_aj3y, 1,iaj3y, .true.) CALL retxyz(mptr,id_aj3z, 1,iaj3z, .true.) PRINT*,' calling retxyz for wcont' CALL retxyz(mptr,id_wcont, 1,iwcont, .true.) CALL retxyz(mptr,id_kmh, 1,ikmh, .true.) CALL retxyz(mptr,id_kmv, 1,ikmv, .true.) CALL retxyz(mptr,id_rprntl, 1,irprntl, .true.) CALL retxyz(mptr,id_ppi, 1,ippi, .true.) CALL retxyz(mptr,id_csndsq, 1,icsndsq, .true.) CALL retxyz(mptr,id_ptcumsrc,1,iptcumsrc,.true.) CALL retxyz(mptr,id_qcumsrc, 5,iqcumsrc, .true.) CALL retxyz(mptr,id_radfrc, 1,iradfrc, .true.) CALL retxyz(mptr,id_w0avg, 1,iw0avg, .true.) IF ( lbcopt == 2 .AND. mptr == 1 ) THEN CALL retexbc(mptr,1,nexbc3d,iexbcbuf,.true.) END IF PRINT*,' calling resett' ! ! re-set all tem. space ! CALL resett ! !----------------------------------------------------------------------- ! ! Store constant variables of the model into constant arrays ! !----------------------------------------------------------------------- ! PRINT*,' calling strcnts' CALL strcnts(nx,ny,nz, a(ii),nsint, a(ir),nsreal) PRINT*,'ii, nsint, ir, nsreal ', ii, nsint, ir, nsreal DO i = izp, izp+1859,169 PRINT*,'izp values..',i, a(i) END DO DO i = iu, iu+1859,169 PRINT*,'iu values..',i, a(i) END DO ! RETURN END SUBROUTINE arpsinit !********************************************************************* !********************************************************************* !********************************************************************* SUBROUTINE initngrd( mptr, mparent ) 1,44 !********************************************************************* ! To initialize constants and uninitialized fields for a ! new grid mptr. ! ! Author: Ming Xue, 11/15/1992 ! updated: E.J.Adlerman, May 1995, arps4.0.18 !********************************************************************* INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'agrigrid.inc' INCLUDE 'grddsc.inc' INCLUDE 'agricst.inc' ! INCLUDE 'bndry.inc' ! Boundary condition control parameters INCLUDE 'cumucst.inc' ! Cumulus paramet. INCLUDE 'globcst.inc' ! Global constants that control model INCLUDE 'phycst.inc' ! Unchanging physical constants INCLUDE 'sfcphycst.inc' ! Unchanging physical constants INCLUDE 'grid.inc' REAL :: ctrx, ctry ! !----------------------------------------------------------------------- ! ! Set lat/lon for each grid ! !----------------------------------------------------------------------- ! IF(verbose6) WRITE(6,'(1x,a,i3)') 'Calling INITNGRD to initialized grid ',mptr mgrid = mptr ! mparent = node(1,mptr) !********************************************************************* ! it seems that node(1,mptr) has not seen set. ! For now we assume the first grid at one level lower to be the ! parent grid. !********************************************************************* level = node(4,mptr) IF( level <= 1 ) THEN WRITE(6,'(1x,a,i3,/1x,a)') & 'The new grid to be initialized is on an improper level ', & level,'Job stopped in INITNGRD.' STOP END IF ! mparent = lstart( level-1 ) IF( mparent == 0 ) THEN WRITE(6,'(1x,a,i3,/1x,a)') 'No parent grid found for grid ', & mptr,'Job stopped in INITNGRD.' STOP END IF !********************************************************************* ! Initialize the constants and constant arrays for new grid mptr. !********************************************************************* ii = igtint(mptr,1) ir = igtrel(mptr,1) iip = igtint(mparent,1) irp = igtrel(mparent,1) PRINT*,' iip, irp for grid ',mparent,iip,irp IF(.true.) THEN PRINT*,' integers for grid ', mparent DO iii = 1,50 PRINT*,' iii, a(iip),a(irp)',iii, a(iip+iii-1),a(irp+iii-1) ! print*,'iii,a(iip+irp)',iip+irp+iii,a(iip+irp+iii-1) END DO END IF CALL nwgrdcst(mptr, mparent, & a(ii),a(iip),nsint, a(ir),a(irp),nsreal ) !********************************************************************* ! Then initialize not yet initialized arrays. ! Others have be initialized by interpolation from its paraent grid. !********************************************************************* CALL resett nx = node(5,mptr) ny = node(6,mptr) nz = node(14,mptr) nxy = nx*ny nxyz = nxy*nz !********************************************************************* ! 1-d constant arrays !********************************************************************* iifax1 = igtns1(mptr,id_ifax1,13) iifax2 = igtns1(mptr,id_ifax2,13) !********************************************************************* ! 1-d Arrays !********************************************************************* ix = igtnx1(mptr,id_x) itrigs1 = igtnx1(mptr,id_trigs1) iwsave2 = igtnx1(mptr,id_wsave2) iy = igtny1(mptr,id_y) itrigs2 = igtny1(mptr,id_trigs2) iwsave1 = igtny1(mptr,id_wsave1) iz = igtnz1(mptr,id_z) !********************************************************************* ! 2-d Arrays !********************************************************************* imapfct1 = igtnxy(mptr,id_mapfct,1) imapfct2 = igtnxy(mptr,id_mapfct+1,1) imapfct3 = igtnxy(mptr,id_mapfct+2,1) imapfct4 = igtnxy(mptr,id_mapfct+3,1) imapfct5 = igtnxy(mptr,id_mapfct+4,1) imapfct6 = igtnxy(mptr,id_mapfct+5,1) imapfct7 = igtnxy(mptr,id_mapfct+6,1) imapfct8 = igtnxy(mptr,id_mapfct+7,1) ivwork1 = igtnxy(mptr,id_vwork1,2) ivwork2 = igtnxy(mptr,id_vwork2,2) !********************************************************************* ! 3-d arrays !********************************************************************* 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) iaj3x = igtxyz(mptr,id_aj3x ,1) iaj3y = igtxyz(mptr,id_aj3y ,1) iaj3z = igtxyz(mptr,id_aj3z ,1) iwcont = igtxyz(mptr,id_wcont, 1) ikmh = igtxyz(mptr,id_kmh, 1) ikmv = igtxyz(mptr,id_kmv, 1) irprntl= igtxyz(mptr,id_rprntl,1) ! !----------------------------------------------------------------------- ! ! Initialize the computational coordinate arrays x, y and z. ! !----------------------------------------------------------------------- ! DO i=1,nx a(ix+i-1) = xorig + (i-2) * dx END DO DO j=1,ny a(iy+j-1) = yorig + (j-2) * dy END DO DO k=1,nz a(iz+k-1) = zorig + (k-2) * dz END DO ! !----------------------------------------------------------------------- ! ! Set lat/lon for each grid ! !----------------------------------------------------------------------- ! ctrx = 0.5*(a(ix)+a(ix+nx-1)) ctry = 0.5*(a(iy)+a(iy+ny-1)) CALL xytoll(1,1, ctrx,ctry, ctrlat,ctrlon) CALL setcornerll( nx,ny, a(ix),a(iy) ) ! set corner lat/lon WRITE(6,'(a,i3,a,2f15.2)') & 'The x and y at the center of grid ',mptr,' is ',ctrx,ctry WRITE(6,'(a,i3,a,2f15.2)') & 'The lat/lon at the center of grid ',mptr,' is ',ctrlat,ctrlon ! !----------------------------------------------------------------------- ! ! Calculate transformation Jacobians J1, J2 and J3. ! zp and hterrain are interpolated from the parent grid. ! !----------------------------------------------------------------------- ! CALL jacob(nx,ny,nz,a(ix),a(iy),a(iz),a(izp),a(ij1),a(ij2),a(ij3)) DO k=1,nz DO j=1,ny-1 DO i=1,nx-1 ijk = nxy*(k-1) + nx*(j-1) + i a(ij3inv+ijk-1)=1.0/a(ij3+ijk-1) END DO END DO END DO DO k=1,nz DO j=1,ny-1 DO i=2,nx-1 ijk = nxy*(k-1) + nx*(j-1) + i ijk1 = nxy*(k-1) + nx*(j-1) + i-1 a(iaj3x+ijk-1)=0.5*(a(ij3+ijk-1)+a(ij3+ijk1-1)) END DO END DO END DO CALL bcsu(nx,ny,nz,1,ny-1,1,nz,ebc,wbc,a(iaj3x)) DO k=1,nz DO j=2,ny-1 DO i=1,nx-1 ijk = nxy*(k-1) + nx*(j-1) + i ijk1 = nxy*(k-1) + nx*(j-2) + i a(iaj3y+ijk-1)=0.5*(a(ij3+ijk-1)+a(ij3+ijk1-1)) END DO END DO END DO CALL bcsv(nx,ny,nz,1,nx-1,1,nz,nbc,sbc,a(iaj3y)) DO k=2,nz-1 DO j=1,ny-1 DO i=1,nx-1 ijk = nxy*(k-1) + nx*(j-1) + i ijk1 = nxy*(k-2) + nx*(j-1) + i a(iaj3z+ijk-1)=0.5*(a(ij3+ijk-1)+a(ij3+ijk1-1)) END DO END DO END DO CALL bcsw(nx,ny,nz,1,nx-1,1,ny-1,tbc,bbc,a(iaj3z)) ! !----------------------------------------------------------------------- ! ! Set map factors for this grid ! !----------------------------------------------------------------------- ! IF ( mpfctopt /= 0 ) THEN DO j=1,ny-1 DO i=1,nx-1 xs = 0.5*(a(ix+i-1)+a(ix+i)) ys = 0.5*(a(iy+j-1)+a(iy+j)) ij = nx*(j-1) + i CALL xytomf( 1,1,xs,ys,a(imapfct1+ij-1) ) a(imapfct4+ij-1) = 1.0/a(imapfct1+ij-1) a(imapfct7+ij-1) = a(imapfct1+ij-1)*a(imapfct1+ij-1) a(imapfct8+ij-1) = 0.25*a(imapfct1+ij-1) ! for use in sovlwpim ! and wcontra... END DO END DO DO j=1,ny-1 DO i=1,nx ys = 0.5*(a(iy+j-1)+a(iy+j)) ij = nx*(j-1) + i CALL xytomf( 1,1,a(ix+i-1),ys,a(imapfct2+ij-1) ) a(imapfct5+ij-1) = 1.0/a(imapfct2+ij-1) END DO END DO DO j=1,ny DO i=1,nx-1 xs = 0.5*(a(ix+i-1)+a(ix+i)) ij = nx*(j-1) + i CALL xytomf( 1,1,xs,a(iy+j-1),a(imapfct3+ij-1) ) a(imapfct6+ij-1) = 1.0/a(imapfct3+ij-1) END DO END DO ELSE DO j=1,ny DO i=1,nx ij = nx*(j-1) + i a(imapfct1+ij-1) = 1.0 a(imapfct2+ij-1) = 1.0 a(imapfct3+ij-1) = 1.0 a(imapfct4+ij-1) = 1.0 a(imapfct5+ij-1) = 1.0 a(imapfct6+ij-1) = 1.0 a(imapfct7+ij-1) = 1.0 a(imapfct8+ij-1) = 0.25 END DO END DO END IF ! !----------------------------------------------------------------------- ! ! Set the arrays for top boundary option 4 ! !----------------------------------------------------------------------- ! DO i=1,13 a(iifax1+i-1) = 0 a(iifax2+i-1) = 0 END DO DO i=1,3*(nx-1)/2+1 a(itrigs1+i-1) = 0 END DO DO j=1,3*(ny-1)/2+1 a(itrigs2+j-1) = 0 END DO DO j=1,ny+1 DO i=1,nx+1 ij = (nx+1)*(j-1) + i a(ivwork1+ij-1) = 0.0 END DO END DO DO j=1,ny DO i=1,nx+1 ij = (nx+1)*(j-1) + i a(ivwork2+ij-1) = 0.0 END DO END DO DO i=1,3*(nx-1)+15 a(iwsave2+i-1) = 0.0 END DO DO j=1,3*(ny-1)+15 a(iwsave1+j-1) = 0.0 END DO IF ( tbc == 4 ) THEN ! set up the fft work arrays for use in the ! upper radiation boundary condition. IF ( fftopt == 1 ) THEN ! set up periodic work arrays... IF ( ny == 4 ) THEN ! set up trigs in x direction only CALL set99( ! and of special character... ! see fft99f.f for details.... ELSE IF ( nx == 4 ) THEN ! set up trigs in y direction only CALL set99( ! and of special character... ! see fft99f.f for details.... ELSE ! set up for 2-d transform... CALL set99( ! and of special character... ! see fft99f.f for details.... CALL set99( ! and of special character... ! see fft99f.f for details.... END IF ELSE IF ( fftopt == 2 ) THEN ! set up the cos fft arrays... IF(ny == 4)THEN ! set up function in x direction only... CALL vcosti(nx-1,a(iwsave2)) ! nx should be even. ELSE IF(nx == 4)THEN ! set up function in y direction only... CALL vcosti(ny-1,a(iwsave1)) ! ny should be even. ELSE ! set up functions for 2-d transform... CALL vcosti(ny-1,a(iwsave1)) ! ny should be even. CALL vcosti(nx-1,a(iwsave2)) ! nx should be even. END IF ! end of run type if block... END IF ! end of fftopt if block..... END IF ! !----------------------------------------------------------------------- ! ! Fill soiltyp and vegtyp which are integers and can not be ! interpolated. ! !----------------------------------------------------------------------- ! IF ( sfcphy > 0 ) THEN CALL initindex(mptr, mparent) END IF ! !----------------------------------------------------------------------- ! ! Fill wcont and km with zeros. ! They are work arrays between time steps, therefore their values ! here do not matter. ! !----------------------------------------------------------------------- ! CALL filzero( CALL filzero( CALL filzero( CALL filzero( !********************************************************************* ! Specify the initial bubble on the new grid using the analytical ! function. This supercedes the value interpolated from base grid. ! !********************************************************************* ! if(.true.) then IF(.false.) THEN IF( curtim == 0.0 ) THEN ! PRINT*,' Reinitializing the thermal bubble at time ',curtim, & 'for grid ', mptr ! iptprt = igtxyz(mptr,id_ptprt,3) CALL setbubble(mptr, nx,ny,nz,a(ix),a(iy),a(izp), a(iptprt) ) CALL retxyz(mptr,id_ptprt,3,iptprt , .true.) END IF END IF ! !----------------------------------------------------------------------- ! ! return the reset arrays to their permanent storage when unpacked. ! !----------------------------------------------------------------------- ! CALL retnxy(mptr,id_mapfct,8,imapfct1,.true.) CALL retnxy(mptr,id_vwork1,2,ivwork1, .true.) CALL retnxy(mptr,id_vwork2,2,ivwork2, .true.) CALL retxyz(mptr,id_zp, 1,izp, .false.) CALL retxyz(mptr,id_j1, 1,ij1, .true.) CALL retxyz(mptr,id_j2, 1,ij2, .true.) CALL retxyz(mptr,id_j3, 1,ij3, .true.) CALL retxyz(mptr,id_j3inv,1,ij3inv,.true.) CALL retxyz(mptr,id_aj3x, 1,iaj3x, .true.) CALL retxyz(mptr,id_aj3y, 1,iaj3y, .true.) CALL retxyz(mptr,id_aj3z, 1,iaj3z, .true.) CALL retxyz(mptr,id_wcont, 1,iwcont ,.true.) CALL retxyz(mptr,id_kmh, 1,ikmh ,.true.) CALL retxyz(mptr,id_kmv, 1,ikmv ,.true.) CALL retxyz(mptr,id_rprntl,1,irprntl,.true.) !********************************************************************* ! re-set all tem. space !********************************************************************* CALL resett ! !----------------------------------------------------------------------- ! ! Print out the parameters. ! ! Write out a log file of model parameters which can be used as ! the input file to re-run the model for this grid. ! !----------------------------------------------------------------------- ! CALL prtlog(nx,ny,nz,0) CALL strcnts(nx,ny,nz, a(ii),nsint, a(ir),nsreal) PRINT*, '...done with INITNGRD on grid ', mptr RETURN END SUBROUTINE initngrd !********************************************************************* !********************************************************************* !********************************************************************* SUBROUTINE nwgrdcst(mptr, mparent, & 1,2 iconst,iconstp,nsint, rconst,rconstp,nsreal) ! !----------------------------------------------------------------------- ! ! Initialize the constants and constant arrays for new grid mptr. ! ! AUTHOR: Ming Xue ! ! 11/15/1992 ! Updated: E.J.Adlerman, May 1995, arps4.0.18 ! ! 09/26/1996 (Yuhe Liu) ! Added the isotropic option for divergence damping. Parameter ! divdmpnd changed to divdmpndh for horizontal and divdmpndv for ! vertical. ! !----------------------------------------------------------------------- ! INTEGER :: nsint,nsreal INTEGER :: iconst(nsint ),iconstp(nsint) REAL :: rconst(nsreal),rconstp(nsreal) ! INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'bndry.inc' ! Boundary condition control parameters INCLUDE 'cumucst.inc' ! Cumulus param. INCLUDE 'globcst.inc' ! Global constants that control model INCLUDE 'phycst.inc' ! Unchanging physical constants INCLUDE 'sfcphycst.inc' ! Unchanging physical constants INCLUDE 'grid.inc' INTEGER :: i REAL :: dxbase,dybase REAL :: temscl ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! PRINT*, '...starting NWGRDCST on grid', mptr ! !----------------------------------------------------------------------- ! ! First, copy the values of constants from the parent grid. ! Then reset the inappropriate values. ! !----------------------------------------------------------------------- ! DO i=1,nsint iconst(i) = iconstp(i) END DO DO i=1,nsreal rconst(i) = rconstp(i) END DO ! !----------------------------------------------------------------------- ! ! Retrieve constant values from the constant arrays ! !----------------------------------------------------------------------- ! CALL getcnts(nx,ny,nz, iconst,nsint, rconst,nsreal) mgrid = mptr ! !----------------------------------------------------------------------- ! ! Let's save some of the constants of the parent grid. ! !----------------------------------------------------------------------- ! ! ! for run mx03a only ! nocmnt = 2 dxp = dx dyp = dy dzp = dz xorigp = xorig yorigp = yorig cfcmh2p = cfcmh2 cfcmv2p = cfcmv2 cfcmh4p = cfcmh4 cfcmv4p = cfcmv4 cdvdmphp = cdvdmph cdvdmpvp = cdvdmpv dtsmlp = dtsml dtbigp = dtbig ! !----------------------------------------------------------------------- ! ! Reset some parameters for the new grid. ! !----------------------------------------------------------------------- ! nx = node(5,mptr) ny = node(6,mptr) nz = node(14,mptr) dx = rnode(9 ,mptr) dy = rnode(10,mptr) dz = dzp dxinv = 1.0/dx dyinv = 1.0/dy dzinv = 1.0/dz xl = (nx-3)*dx yl = (ny-3)*dy zh = (nz-3)*dz !********************************************************************* ! here we have assumed that for the base grid xorig=yorig=0.0 ! which is not necessarily true. !********************************************************************* dxbase = rnode(9 ,mstart) dybase = rnode(10,mstart) xorig = rnode(1,mptr)-dxbase+dx yorig = rnode(2,mptr)-dybase+dy zorig = zorig dtbig = rnode(11,mptr) IF( vimplct == 1 ) THEN !********************************************************************* ! For implicit case, dtsml does not depend on dz. !********************************************************************* print*,'dtsmlp,dxp,dyp=', dtsmlp, dxp, dyp dtsml = dtsmlp/(1.0/SQRT(1.0/dxp**2+1.0/dyp**2)) & *(1.0/SQRT(1.0/dx **2+1.0/dy **2)) print*,'dtsml ,dx ,dy =', dtsml , dx , dy ELSE dtsml = dtsmlp/(1.0/SQRT(1.0/dxp**2+1.0/dyp**2+1.0/dzmin**2)) & *(1.0/SQRT(1.0/dx **2+1.0/dy **2+1.0/dzmin**2)) END IF nsmstp = nint( 2*dtbig/dtsml ) IF( MOD(2*dtbig,dtsml) /= 0.0 ) nsmstp =nsmstp +1 dtsml = (2*dtbig)/nsmstp cfcmh2 = cfcmh2p*(dx*dy)/(dxp*dyp) ! : *dtbigp/dtbig ! : *dtbigp/dtbig cfcmv2 = cfcmv2p*(dz/dzp)**2 ! : *dtbigp/dtbig cfcmh4 = cfcmh4p*((dx*dy)/(dxp*dyp))**2 ! : *dtbigp/dtbig ! : *dtbigp/dtbig cfcmv4 = cfcmv4p*(dz/dzp)**4 ! : *dtbigp/dtbig IF ( divdmp == 1 ) THEN ! isotropic, cdvdmph=cdvdmpv IF ( runmod == 1 ) THEN temsclp = MIN(dxp,dyp,dzmin) temscl = MIN(dx,dy,dzmin) ELSE IF( runmod == 2 ) THEN temsclp = MIN(dxp,dzmin) temscl = MIN(dx,dzmin) ELSE IF( runmod == 3 ) THEN temsclp = MIN(dyp,dzmin) temscl = MIN(dy,dzmin) ELSE IF( runmod == 4 ) THEN temsclp = dzmin temscl = dzmin END IF divdmpndh = cdvdmphp / ( temsclp**2 / dtsmlp) divdmpndv = divdmpndh cdvdmph = divdmpndh * temscl**2 / dtsml cdvdmpv = cdvdmph ELSE IF ( divdmp == 2 ) THEN IF ( runmod == 1 ) THEN temsclp = MIN( SQRT(dxp*dyp), 5000.0 ) temscl = MIN( SQRT(dx*dy), 5000.0 ) ELSE IF( runmod == 2 ) THEN temsclp = MIN( dxp, 5000.0 ) temscl = MIN( dx, 5000.0 ) ELSE IF( runmod == 3 ) THEN temsclp = MIN( dyp, 5000.0 ) temscl = MIN( dy, 5000.0 ) ELSE IF( runmod == 4 ) THEN temsclp = dzmin temscl = dzmin END IF divdmpndh = cdvdmphp / ( temsclp**2 / dtsmlp ) divdmpndv = cdvdmpvp / ( dzmin**2 / dtsmlp ) cdvdmph = divdmpndh * temscl**2 / dtsml cdvdmpv = divdmpndv * dzmin**2 / dtsml END IF tstart = curtim tstop = tstop nsteps = nint( (tstop-tstart)/dtbig ) !********************************************************************* ! nsteps is now unused in the model either. It's calculated ! here for safty reason only. !********************************************************************* node(13,mptr) = 0 nstep = node(13,mptr) restrt = 0 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 nenergy = nint(tenergy/dtbig) IF ( nenergy == 0 ) nenergy = -1 ! !----------------------------------------------------------------------- ! ! If this is not a base grid, set the lateral boundary ! condition to option 6. ! !----------------------------------------------------------------------- ! IF( mptr /= 1 ) THEN ! if not the base grid ebc = 6 wbc = 6 sbc = 6 nbc = 6 END IF ! !----------------------------------------------------------------------- ! ! Store constant variables of the model into constant arrays ! !----------------------------------------------------------------------- ! CALL strcnts(nx,ny,nz, iconst,nsint, rconst,nsreal) PRINT *, '...done with NWGRDCST on grid..', mptr RETURN END SUBROUTINE nwgrdcst !********************************************************************* !********************************************************************* !********************************************************************* SUBROUTINE setbubble(mptr,nx,ny,nz,x,y,zp,ptprt) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Initialize ptprt with a thermal bubble for grid mptr. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 11/30/1992. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! mptr Pointer to the grid. ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! x x-coordinate of grid points in computational space (m) ! y y-coordinate of grid points in computational space (m) ! zp Vertical coordinate of grid points in physical space (m) ! ! OUTPUT: ! ! ptprt Perturbation potential temperature at all time levels (K) ! !----------------------------------------------------------------------- ! INTEGER :: mptr INTEGER :: nx,ny,nz ! The number of grid points in 3 directions REAL :: x (nx) REAL :: y (ny) REAL :: zp (nx,ny,nz) REAL :: ptprt (nx,ny,nz,3) INCLUDE 'globcst.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! REAL :: xs, ys, zs REAL :: beta, pi2 INTEGER :: i,j,k IF( pt0opt == 1 ) THEN ! Bubble shaped perturbation ! !----------------------------------------------------------------------- ! ! Set the potential temperature perturbation inside a bubble volume. ! !----------------------------------------------------------------------- ! pi2 = 1.5707963267949 IF( ptpert0 == 0.0) THEN DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 ptprt(i,j,k,1) = 0.0 ptprt(i,j,k,2) = 0.0 ptprt(i,j,k,3) = 0.0 END DO END DO END DO ELSE DO k= 1,nz-1 DO j= 1,ny-1 DO i= 1,nx-1 xs = (x(i)+x(i+1))*0.5 ys = (y(j)+y(j+1))*0.5 zs = (zp(i,j,k)+zp(i,j,k+1))*0.5 IF( pt0rady < 0.0 ) THEN ! 2-d bubble in x-z plane. beta = SQRT( ((xs-pt0ctrx)/pt0radx)**2 & + ((zs-pt0ctrz)/pt0radz)**2 ) ELSE IF( pt0radx < 0.0 ) THEN ! 2-d bubble in y-z plane. beta = SQRT( ((ys-pt0ctry)/pt0rady)**2 & + ((zs-pt0ctrz)/pt0radz)**2 ) ELSE ! 3-d bubble beta = SQRT( ((xs-pt0ctrx)/pt0radx)**2 + & ((ys-pt0ctry)/pt0rady)**2 + & ((zs-pt0ctrz)/pt0radz)**2 ) END IF IF(beta >= 1.0) THEN ptprt(i,j,k,1) = 0.0 ELSE ptprt(i,j,k,1) = ptpert0*(COS(pi2*beta)**2) END IF ptprt(i,j,k,2) = ptprt(i,j,k,1) ptprt(i,j,k,3) = ptprt(i,j,k,1) END DO END DO END DO END IF END IF RETURN END SUBROUTINE setbubble SUBROUTINE getdzmin( zp, nx,ny,nz, dzpmin) INTEGER :: nx,ny,nz REAL :: zp(nx,ny,nz) dzpmin = zp(1,1,3)-zp(1,1,2) PRINT *, 'zp1 and zp2', zp(1,1,3), zp(1,1,2) DO k=2,nz-2 DO j=1,ny-1 DO i=1,nx-1 dzpmin=MIN(dzpmin, zp(i,j,k+1)-zp(i,j,k)) END DO END DO END DO RETURN END SUBROUTINE getdzmin