SUBROUTINE INITPOST_RSM !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: INITPOST INITIALIZE POST FOR RUN ! PRGRMMR: RUSS TREADON ORG: W/NP2 DATE: 93-11-10 ! ! ABSTRACT: THIS ROUTINE INITIALIZES CONSTANTS AND ! VARIABLES AT THE START OF AN ETA MODEL OR POST ! PROCESSOR RUN. ! ! THIS ROUTINE ASSUMES THAT INTEGERS AND REALS ARE THE SAME SIZE ! . ! ! PROGRAM HISTORY LOG: ! 93-11-10 RUSS TREADON - ADDED DOCBLOC ! 98-05-29 BLACK - CONVERSION OF POST CODE FROM 1-D TO 2-D ! 99-01 20 TUCCILLO - MPI VERSION ! 01-10-25 H CHUANG - MODIFIED TO PROCESS HYBRID MODEL OUTPUT ! 02-06-19 MIKE BALDWIN - WRF VERSION ! 02-08-15 H CHUANG - UNIT CORRECTION AND GENERALIZE PROJECTION OPTIONS ! 02-10-31 H CHUANG - MODIFY TO READ WRF BINARY OUTPUT ! 04-01-20 BINBIN ZHOU - MODIFY TO READ RSM WRF FORMAT FILES ! NOTE: All RSM profile variables are defined on mid presure levels (LM) ! Only interface presure levels and geopotential heights ! have LM+1 ! RSM vertical index is resverse to ETA, so need flip in getVariableRSM ! in RSM: sfc=1, top=LM+1, in ETA: sfc=LM+1, top=1 ! 06-03-10 Jun Du - a conversion error was corrected for RSM's precip rate ! ! USAGE: CALL INIT ! INPUT ARGUMENT LIST: ! NONE ! ! OUTPUT ARGUMENT LIST: ! NONE ! ! OUTPUT FILES: ! NONE ! ! SUBPROGRAMS CALLED: ! UTILITIES: ! NONE ! LIBRARY: ! COMMON - CTLBLK ! LOOKUP ! SOILDEPTH ! ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN ! MACHINE : CRAY C-90 !$$$ use vrbls3d use vrbls2d use soil use masks use wrf_io_flags_mod use params_mod use lookup_mod use ctlblk_mod use gridspec_mod ! implicit none ! ! INCLUDE/SET PARAMETERS. ! INCLUDE "mpif.h" ! ! 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_. character(len=31) :: VarName integer :: Status character startdate*19,SysDepInfo*80 ! ! 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 LOGICAL IOOMG,IOALL CHARACTER*32 LABEL CHARACTER*40 CONTRL,FILALL,FILMST,FILTMP,FILTKE,FILUNV & , FILCLD,FILRAD,FILSFC CHARACTER*4 RESTHR CHARACTER FNAME*80,ENVAR*50,BLANK*4 INTEGER IDATB(3),IDATE(8),JDATE(8) ! ! DECLARE VARIABLES. ! REAL SLDPTH2(NSOIL) REAL RINC(5) REAL DUM1D (LM) REAL DUMMY ( IM, JM ) REAL DUMMY2 ( IM, JM ) INTEGER IDUMMY ( IM, JM ) REAL DUM3D ( IM, JM, LM ) REAL DUM3D2 ( IM, JM, LM ) !jw integer ii,jj,js,je,jev,iyear,imn,iday,itmp,ioutcount,istatus, & I,J,L,LL,N,igdout real P2M,TV,TSPH,TMP ! DATA BLANK/' '/ logical frst data frst /.true./ ! !*********************************************************************** ! START INIT HERE. ! WRITE(6,*)'INITPOST: ENTER INITPOST' ! ! ! STEP 1. READ MODEL OUTPUT FILE ! ! !*** ! ! LMH always = LM for sigma-type vert coord ! LMV always = LM for sigma-type vert coord do j = jsta_2l, jend_2u do i = 1, im LMV ( i, j ) = lm LMH ( i, j ) = lm end do end do ! HTM VTM all 1 for sigma-type vert coord do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im HTM ( i, j, l ) = 1.0 VTM ( i, j, l ) = 1.0 end do end do end do ! ! how do I get the filename? ! fileName = '/ptmp/wx20mb/wrfout_01_030500' ! DateStr = '2002-03-05_18:00:00' ! how do I get the filename? if ( frst ) then frst = .false. call ext_int_ioinit(SysDepInfo,Status) print*,'called ioinit', Status call ext_int_open_for_read( trim(fileName), 0, 0, " ", & DataHandle, Status) print*,'called open for read', Status else Status = 0 endif if ( Status /= 0 ) then print*,'error opening ',fileName, ' Status = ', Status ; stop endif ! get date/time info ! this routine will get the next time from the file, not using it print *,'DateStr before calling ext_int_get_next_time=',DateStr ! call ext_int_get_next_time(DataHandle, DateStr, Status) print *,'DateStri,Status,DataHandle = ',DateStr,Status,DataHandle ! The end j row is going to be jend_2u for all variables. JS=JSTA_2L JE=JEND_2U ! ! Getting start time call ext_int_get_dom_ti_char(DataHandle,'START_DATE',startdate, & status ) print*,'startdate= ',startdate jdate=0 idate=0 read(startdate,15)iyear,imn,iday,ihrst 15 format(i4,1x,i2,1x,i2,1x,i2) print*,'start yr mo day hr =',iyear,imn,iday,ihrst print*,'processing yr mo day hr =' & ,idat(3),idat(1),idat(2),idat(4) idate(1)=iyear idate(2)=imn idate(3)=iday idate(5)=ihrst SDAT(1)=imn SDAT(2)=iday SDAT(3)=iyear jdate(1)=idat(3) jdate(2)=idat(1) jdate(3)=idat(2) jdate(5)=idat(4) CALL W3DIFDAT(JDATE,IDATE,2,RINC) ifhr=nint(rinc(2)) print*,' in INITPOST ifhr fileName=',ifhr,fileName ! OK, since all of the variables are dimensioned/allocated to be ! the same size, this means we have to be careful int getVariable ! to not try to get too much data. For example, ! DUM3D is dimensioned IM,JM,LM but there might actually ! only be im,jm,lm points of data available for a particular variable. ! get metadata ! get metadata ! NMM does not output mp_physics yet so hard-wire it to Ferrier scheme ! call ext_int_get_dom_ti_real(DataHandle,'MP_PHYSICS' ! + ,itmp,1,ioutcount,istatus) ! imp_physics=itmp imp_physics=5 print*,'MP_PHYSICS= ',imp_physics call ext_int_get_dom_ti_real(DataHandle,'DX',tmp & ,1,ioutcount,istatus) dxval=nint(tmp) write(6,*) 'dxval= ', dxval call ext_int_get_dom_ti_real(DataHandle,'DY',tmp & ,1,ioutcount,istatus) dyval=nint(tmp) write(6,*) 'dyval= ', dyval call ext_int_get_dom_ti_real(DataHandle,'DT',tmp & ,1,ioutcount,istatus) DT=tmp write(6,*) 'DT = ', DT call ext_int_get_dom_ti_real(DataHandle,'CEN_LAT',tmp & ,1,ioutcount,istatus) cenlat=nint(tmp*1000.) write(6,*) 'cenlat= ', cenlat call ext_int_get_dom_ti_real(DataHandle,'CEN_LON',tmp & ,1,ioutcount,istatus) cenlon=nint(tmp*1000.) write(6,*) 'cenlon= ', cenlon call ext_int_get_dom_ti_real(DataHandle,'TRUELAT1',tmp & ,1,ioutcount,istatus) truelat1=nint(tmp*1000.) write(6,*) 'truelat1= ', truelat1 call ext_int_get_dom_ti_real(DataHandle,'TRUELAT2',tmp & ,1,ioutcount,istatus) truelat2=nint(tmp*1000.) write(6,*) 'truelat2= ',truelat2,'(store orientation, deg)' call ext_int_get_dom_ti_integer(DataHandle,'MAP_PROJ',itmp & ,1,ioutcount,istatus) maptype=itmp write(6,*) 'maptype is ', maptype ! Binbin Zhou: for polar projection, cenlon is not-useful, should use ! orientation, so: set cenlon = truelat2 write(6,*) 'orientation(in cenlon in polar proj)=', cenlon ! get 3-D variables print*,'im,jm,lm= ',im,jm,lm ! VarName='U' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im u ( i, j, l ) = dum3d ( i, j, l ) end do end do ! fill up UH which is U at P-points do j = jsta_2l, jend_2u do i = 1, im UH (I,J,L) = dum3d(I,J,L) end do end do end do ii=im/2 jj=(jsta+jend)/2 ll=lm print*,'UH at ',ii,jj,ll,' = ',UH (ii,jj,ll) VarName='V' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im v ( i, j, l ) = dum3d ( i, j, l ) end do end do ! fill up VH which is V at P-points do j = jsta_2l, jend_2u do i = 1, im VH(I,J,L) = dum3d(I,J,L) end do end do end do print*,'finish reading V' print*,'VH at ',ii,jj,ll,' = ',VH (ii,jj,ll) ! fill up vertical velocity VarName='W' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) ! do l = 1, lm ! do j = jsta_2l, jend_2u ! do i = 1, im ! w ( i, j, l ) = dum3d ( i, j, l ) ! end do ! end do ! end do ! fill up WH which is W at P-points DO L=1,LM DO I=1,IM DO J=JSTA_2L,JEND_2U OMGA(I,J,L) = DUM3D(I,J,L) ENDDO ENDDO ENDDO print*,'OMGA at ',ii,jj,ll,' = ',OMGA (ii,jj,ll) print*,'finish reading W' ! ! read geopotential on mid levels/compute geopotential height of mid levels VarName='PH' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) ! ph is geopotential, geopotential height z=ph/9.8 DO L=1,LM DO I=1,IM DO J=JS,JE ZMID(I,J,L)=DUM3D(I,J,L)/9.8 ENDDO ENDDO ENDDO DO L=1,LM print*,'ZMID at 120,187=', ZMID(120,187,L) END DO ! read geopotential on interface levels/compute geopotential height of interface levels VarName='PHINT' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) DO L=1,LM DO I=1,IM DO J=JS,JE ZINT(I,J,L)=DUM3D(I,J,L)/9.8 !geopotential height ENDDO ENDDO ENDDO !Surface (L=LM+1) geopotential height equal to surface height,read in later print*,'ZMID at ',ii,jj,ll,' = ',ZMID(ii,jj,ll) ! print*,'ZINT at ',ii,jj,ll+1,' = ',ZINT(ii,jj,ll+1) ! ! reading temperature VarName='T' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im t ( i, j, l ) = dum3d ( i, j, l ) end do end do end do do l=1,lm print*,'theta at ',ii,jj,l,' = ',T(ii,jj,l) end do print*,'finish reading T' ! VarName='MU0' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,PT, ! & 1,1,1,1,1,1,1,1) PT=0.0 ! ! reading TKE ! VarName='TKE' ! call getVariable(fileName,DateStr,DataHandle,'TKE_MYJ',DUM3D, ! IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im q2 ( i, j, l ) = SPVAL end do end do end do ! ! reading specific humidity VarName='QVAPOR' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im q ( i, j, l ) = dum3d ( i, j, l ) end do end do end do print*,'finish reading specific humidity' print*,'Q at ',ii,jj,ll,' = ',Q(ii,jj,ll) ! reading specific cloud water content VarName='QCLOUD' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im cwm ( i, j, l ) = dum3d ( i, j, l ) end do end do end do print*,'finish reading specific cloud water content' ! ! reading pressure on mid levels (All variables are on mid levels) VarName='PB' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im PMID(I,J,L)=DUM3D(I,J,L) !now that I have P, convert theta to t, RSM already is actual T !cbzhou: t ( i, j, l ) = T(I,J,L)*(PMID(I,J,L)*1.E-5)**CAPA !now that I have T,q,P compute omega from wh ! omga(I,J,L) = -WH(I,J,L)*pmid(i,j,l)*9.8/ ! & (287.04*t(i,j,l)*(1.+0.608*q(i,j,l))) ! omga(I,J,L) = WH(I,J,L) WH(I,J,L) = OMGA(I,J,L) * (RD*T(I,J,L)* & (1.+D608*Q(I,J,L)))/(PMID(I,J,L)*G) end do end do end do ! reading pressure on interface levels VarName='PBINT' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,LM) do l = 1, lm do j = jsta_2l, jend_2u do i = 1, im PINT(I,J,L)=DUM3D(I,J,L) ALPINT(I,J,L)=ALOG(PINT(I,J,L)) end do end do end do !surface (LM+1) pressure PINT(I,J,LM+1) will be read in later ! reading soil temperature VarName='TSLB' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,NSOIL) do l = 1, nsoil do j = jsta_2l, jend_2u do i = 1, im ! stc ( i, j, l ) = dum3d ( i, j, l ) ! flip soil layer again because wrf soil variable vertical indexing ! is the same with eta and vertical indexing was flipped for both ! atmospheric and soil layers within getVariable stc ( i, j, l ) = dum3d ( i, j, nsoil-l+1) end do end do end do print*,'STC at ',ii,jj,N,' = ',stc(ii,jj,1),stc(ii,jj,2) ! ! reading soil moisture VarName='SMOIS' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM3D, & IM,1,JM,LM,IM,JS,JE,NSOIL) do l = 1, nsoil do j = jsta_2l, jend_2u do i = 1, im smc ( i, j, l ) = dum3d ( i, j, nsoil-l+1) end do end do end do print*,'SMC at ',ii,jj,N,' = ',smc(ii,jj,1),smc(ii,jj,2) ! reading sfc pressure VarName='MU' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) DO I=1,IM DO J=JS,JE PINT(I,J,LM+1) = DUMMY(I,J) ENDDO ENDDO print*,'PINT at ',ii,jj,lm+1,'=',pint(ii,jj,lm+1) !bzhou: RSM has PINT data, read it it insead of deriving it ! DO L=2,LM ! DO I=1,IM ! DO J=JSTA_2L,JEND_2U ! PINT(I,J,L)=EXP((ALOG(PMID(I,J,L-1))+ ! & ALOG(PMID(I,J,L)))*0.5) ! ave of ln p ! ALPINT(I,J,L)=ALOG(PINT(I,J,L)) ! ENDDO ! ENDDO ! END DO ! print*,'PINT at ',ii,jj,ll,' = ',pint(ii,jj,ll) ! print*,'T at ',ii,jj,ll,' = ',t(ii,jj,ll) ! ! reading 2 m mixing ratio VarName='Q2' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im QSHLTR ( i, j ) = dummy ( i, j ) end do end do print*,'QSHLTR at ',ii,jj,' = ',QSHLTR(ii,jj) ! ! reading 2m theta VarName='TH2' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im TSHLTR ( i, j ) = dummy ( i, j ) Tv=T(I,J,NINT(LMH(I,J)))*(1.+0.61*Q(I,J,NINT(LMH(I,J)))) ! P2m = PINT(I,J,LM+1)*exp(-0.068283/T(I,J,LMH(I,J))) !convert to potential T P2m = PINT(I,J,LM+1)*exp(-0.068283/Tv) !convert to potential T TSHLTR( i, j ) = TSHLTR( i, j )/(P2m*1.E-5)**CAPA !according to SURFCE.f end do end do print*,'TSHLTR at ',ii,jj,' = ',TSHLTR(ii,jj) ! ! reading 10 m wind VarName='U10' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im U10 ( i, j ) = dummy ( i, j ) end do end do print*,'U10 at ',ii,jj,' = ',U10(ii,jj) VarName='V10' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im V10 ( i, j ) = dummy ( i, j ) end do end do print*,'V10 at ',ii,jj,' = ',V10(ii,jj) ! either assign SLDPTH to be the same as eta (which is original ! setup in WRF LSM) or extract thickness of soil layers from wrf ! output ! assign SLDPTH (soil depth): RSM Model has 2 soil levels: SLDPTH(1)=0.10 SLDPTH(2)=1.90 ! ! reading SMSTAV ! VarName='SMSTAV' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im SMSTAV ( i, j ) = 0.0 end do end do ! ! reading SURFACE RUNOFF VarName='SFROFF' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im SSROFF ( i, j ) = dummy ( i, j ) end do end do ! ! reading UNDERGROUND RUNOFF ! VarName='UDROFF' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im BGROFF ( i, j ) = 0.0 end do end do ! reading VEGETATION TYPE VarName='IVGTYP' call getIVariable(fileName,DateStr,DataHandle,VarName,IDUMMY & & ,IM,1,JM,1,IM,JS,JE,1) print*,'IVGTYP at ',ii,jj,' = ',IDUMMY(ii,jj) do j = jsta_2l, jend_2u do i = 1, im IVGTYP( i, j ) = idummy ( i, j ) end do end do VarName='ISLTYP' call getIVariable(fileName,DateStr,DataHandle,VarName,IDUMMY & ,IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im ISLTYP( i, j ) = idummy ( i, j ) end do end do VarName='VEGFRA' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im VEGFRC ( i, j ) = dummy ( i, j ) end do end do print*,'VEGFRC at ',ii,jj,' = ',VEGFRC(ii,jj) !accumulated snow (depth) VarName='ACSNOW' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im ACSNOW ( i, j ) = dummy ( i, j ) * 0.001 end do end do !accumulated melted snow VarName='ACSNOM' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im ACSNOM ( i, j ) = dummy ( i, j ) * 0.001 end do end do !Snow water equilalent VarName='SNOW' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) VarName='CANWAT' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im CMC ( i, j ) = dummy ( i, j ) end do end do VarName='SST' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im SST ( i, j ) = dummy ( i, j ) end do end do print*,'SST at ',ii,jj,' = ',sst(ii,jj) ! VarName='WEASD' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) ! VarName='TKE_MYJ' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) VarName='THZ0' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im THZ0 ( i, j ) = dummy ( i, j ) end do end do print*,'THZ0 at ',ii,jj,' = ',THZ0(ii,jj) VarName='QZ0' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im QZ0 ( i, j ) = dummy ( i, j ) end do end do print*,'QZ0 at ',ii,jj,' = ',QZ0(ii,jj) VarName='UZ0' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im UZ0 ( i, j ) = dummy ( i, j ) end do end do print*,'UZ0 at ',ii,jj,' = ',UZ0(ii,jj) ! VarName='VZ0' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im VZ0 ( i, j ) = 0.0 end do end do VarName='QSFC' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im QS ( i, j ) = dummy ( i, j ) end do end do print*,'QS at ',ii,jj,' = ',QS(ii,jj) VarName='AKHS' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im AKHS ( i, j ) = dummy ( i, j ) end do end do VarName='AKMS' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im AKMS ( i, j ) = dummy ( i, j ) end do end do VarName='MAPFAC_M' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) ! VarName='F' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) ! VarName='E' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) ! reading terrain height VarName='HGT' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im FIS ( i, j ) = dummy ( i, j ) * G if(i.eq.80.and.j.eq.42)print*,'Debug: sample fis,zint=' & ,dummy( i, j ),zint(i,j,lm) ZINT(i,j,LM+1)=dummy ( i, j ) !BZhou: surface geopotential height=terrain height end do end do print*,'FIS at ',ii,jj,ll,' = ',FIS(ii,jj) print*,'ZINT at',ii,jj,LM+1,'=',ZINT(i,j,LM+1) write(6,*) 'past getting of HGT' VarName='TSK' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im THS ( i, j ) = dummy ( i, j ) ! wait to convert to theta later end do end do ! print*,'THS at ',ii,jj,' = ',THS(ii,jj) ! ! reading p_top, RSM set it to be 0.0 ! VarName='P_TOP' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,PT, ! & 1,1,1,1,1,1,1,1) PT=0.0 DO I=1,IM DO J=JS,JE PINT (I,J,LM+1) = PINT (I,J,LM+1)+PT THS ( i, j ) = THS ( i, j ) & *(P1000/PINT(I,J,NINT(LMH(I,J))+1))**CAPA PINT (I,J,1) = PT ALPINT(I,J,LM+1)=ALOG(PINT(I,J,LM+1)) ALPINT(I,J,1)=ALOG(PINT(I,J,1)) ENDDO ENDDO print*,'PSFC at ',ii,jj,' = ',PINT (ii,jj,lm+1) print*,'THS at ',ii,jj,' = ',THS(ii,jj) ! VarName='FNM' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='FNP' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='RDNW' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='RDN' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='DNW' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='DN' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='ZNU' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) ! VarName='ZNW' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUM1D, ! & 1,1,1,LM,1,1,1,LM) !C !C PREC is "GRID PRECIPITATION RATE" !C RAINC is "ACCUMULATED TOTAL PRECIPITATION" !C RAINNC is "ACCUMULATED TOTAL GRID SCALE PRECIPITATION" write(6,*) 'getting PREC' VarName='PREC' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im ! PREC ( i, j ) = dummy ( i, j )*0.001 PREC ( i, j ) = dummy ( i, j ) !correction done by Jun Du end do end do print*,'PREC at ',ii,jj,' = ',PREC(ii,jj) write(6,*) 'getting RAINC' VarName='RAINC' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im ACPREC ( i, j ) = dummy ( i, j )*0.001 end do end do print*,'CUPREC at ',ii,jj,' = ',CUPREC(ii,jj) write(6,*) 'getting RAINNC' VarName='RAINNC' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im ANCPRC ( i, j ) = dummy ( i, j )*0.001 end do end do print*,'ANCPRC at ',ii,jj,' = ',ANCPRC(ii,jj) write(6,*) 'past getting RAINNC' !convective = total - grid-scale do j = jsta_2l, jend_2u do i = 1, im CUPREC ( i, j ) = ACPREC ( i, j ) - ANCPRC ( i, j ) end do end do ! VarName='RAINCV' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) ! do j = jsta_2l, jend_2u ! do i = 1, im ! CUPPT ( i, j ) = ! end do ! end do ! VarName='RAINBL' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) ! downward short wave flux at sfc VarName='GSW' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im RSWIN ( i, j ) = dummy ( i, j ) end do end do print*,'RSWIN at ',ii,jj,' = ',RSWIN(ii,jj) ! downward long wave flux at sfc VarName='GLW' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im RLWIN ( i, j ) = dummy ( i, j ) end do end do print*,'RLWIN at ',ii,jj,' = ',RLWIN(ii,jj) ! RSM, like NCAR WRF does not output zenith angle so make czen=czmean so that ! RSWIN can be output normally in SURFCE do j = jsta_2l, jend_2u do i = 1, im CZEN ( i, j ) = 1.0 CZMEAN ( i, j ) = CZEN ( i, j ) end do end do VarName='XLAT' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im GDLAT ( i, j ) = dummy ( i, j ) f(i,j) = 1.454441e-4*sin(gdlat(i,j)*0.01745329) end do end do VarName='XLONG' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im GDLON ( i, j ) = dummy ( i, j ) end do end do print*,'GDLON at ', ii,jj,'=',GDLON( ii, jj ) print*,'read past GDLON' do j=jsta_2l, jend_2u write(*,*) j, GDLAT ( 1, j ), GDLON(1,j) end do ! VarName='LU_INDEX' ! call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & ! IM,1,JM,1,IM,JS,JE,1) VarName='TMN' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im TG ( i, j ) = dummy ( i, j ) SOILTB ( i, j ) = dummy ( i, j ) end do end do ! ! XLAND 1 land 2 sea VarName='XLAND' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im SM ( i, j ) = dummy ( i, j ) - 1.0 end do end do ! !instantaneous sensible heat flux VarName='HFX' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im TWBS ( i, j ) = dummy ( i, j ) end do end do !instantaneous latent heat flux VarName='QFX' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im QWBS ( i, j ) = dummy ( i, j ) end do end do ! RSM has no averaged sensible and latent heat fluxes VarName='SNOWC' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im SNO ( i, j ) = dummy ( i, j ) end do end do VarName='HCLDFR' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im CFRACH( i, j ) = dummy ( i, j )*0.01 end do end do VarName='MCLDFR' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im CFRACM( i, j ) = dummy ( i, j )*0.01 end do end do VarName='LCLDFR' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im CFRACL( i, j ) = dummy ( i, j )*0.01 end do end do ! following cloud top and base height data is not used by wrfpost ! they can be derived from wrfpost VarName='HCLDTL' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) VarName='MCLDTL' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) VarName='LCLDTL' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) VarName='HCLDBL' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) VarName='MCLDBL' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) VarName='LCLDBL' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) ! upward short wave flux at sfc VarName='UGSW' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im RSWOUT ( i, j ) = dummy ( i, j ) end do end do print*,'RSWOUT at ',ii,jj,' = ',RSWOUT(ii,jj) ! upward long wave flux at sfc VarName='UGLW' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im RADOT ( i, j ) = dummy ( i, j ) end do end do print*,'RADOT at ',ii,jj,' = ',RADOT(ii,jj) ! ground heat flux VarName='GRDFLX' call getVariableRSM(fileName,DateStr,DataHandle,VarName,DUMMY, & IM,1,JM,1,IM,JS,JE,1) do j = jsta_2l, jend_2u do i = 1, im GRNFLX ( i, j ) = dummy ( i, j ) end do end do print*,'GRNFLX at ', ii,jj,'=',GRNFLX ( ii, jj ) ! For hydrometeors fraction, currently, set all are rime: ! After Brad Ferrier give us code, they will be adapted here F_RimeF = 1.0 F_rain = 0.0 F_ice = 0.0 CFR = SPVAL/H100 EXCH_H = SPVAL RLWTT = SPVAL RSWTT = SPVAL TTND = SPVAL TCUCN = SPVAL TRAIN = SPVAL ! SET SOME FIELDS TO MISSING VALUES SINCE RSM DOES NOT OUTPUT THESES FIELDS do j = jsta_2l, jend_2u do i = 1, im SI(I,J)=SPVAL CLDEFI(I,J)=SPVAL TH10(I,J)=SPVAL Q10(I,J)=SPVAL ALBASE(I,J)=SPVAL/H100 ALBEDO(I,J)=SPVAL ISLOPE(I,J)=NINT(SPVAL) PCTSNO(I,J)=SPVAL SOILTB(I,J)=SPVAL SSROFF(I,J)=SPVAL/1000. BGROFF(I,J)=SPVAL/1000. SFCEVP(I,J)=SPVAL/1000. SFCEXC(I,J)=SPVAL CNVCFR(I,J)=SPVAL ! SM(I,J)=0. enddo enddo ! pos east !BZhou all commented for RSM (maptype = 2) ! call collect_loc(gdlat,dummy) ! if(me.eq.0)then ! latstart=nint(dummy(1,1)*1000.) ! latlast=nint(dummy(im,jm)*1000.) ! end if ! write(6,*) 'laststart,latlast B calling bcast= ' ! +, latstart,latlast ! 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 A calling bcast= ' ! +, latstart,latlast ! call collect_loc(gdlon,dummy) ! if(me.eq.0)then ! lonstart=nint(dummy(1,1)*1000.) ! lonlast=nint(dummy(im,jm)*1000.) ! end if ! write(6,*)'lonstart,lonlast B calling bcast= ' ! +, lonstart,lonlast ! 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 ! if(me.eq.0)then latstart=GDLAT(1,1)*1000 lonstart=GDLON(1,1)*1000 end if !! !! !! write(6,*) 'filename in INITPOST=', filename,' is' !MEB not sure how to get these do j = jsta_2l, jend_2u do i = 1, im DX ( i, j ) = dxval !MEB ??? DY ( i, j ) = dyval !MEB ??? end do end do !MEB not sure how to get these ! close up shop call ext_int_ioclose ( DataHandle, Status ) ! generate look up table for lifted parcel calculations THL=210. PLQ=70000. PT=200.0 !RSM model top pressure = 2. mb, ie 200Pa CALL TABLE(PTBL,TTBL,PT, & RDQ,RDTH,RDP,RDTHE,PL,THL,QS0,SQS,STHE,THE0) CALL TABLEQ(TTBLQ,RDPQ,RDTHEQ,PLQ,THL,STHEQ,THE0Q) ! ! IF(ME.EQ.0)THEN ! WRITE(6,*)' NMAP : ',NMAP ! WRITE(6,*)' TSHDE (POSTED FORECAST HOURS) BELOW: ' ! WRITE(6,50) (TSHDE(K),K=1,99) 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 ! ! COMPUTE DERIVED TIME STEPPING CONSTANTS. ! !MEB need to get DT ! DT = 120. !MEB need to get integraion DT !read from files NPHS = 4 !MEB need to get physics DT DTQ2 = DT * NPHS !MEB need to get physics DT TSPH = 3600./DT !MEB need to get DT !MEB need to get DT !how am i going to get this information? ! NPREC = INT(TPREC *TSPH+D50) ! NHEAT = INT(THEAT *TSPH+D50) ! NCLOD = INT(TCLOD *TSPH+D50) ! NRDSW = INT(TRDSW *TSPH+D50) ! NRDLW = INT(TRDLW *TSPH+D50) ! NSRFC = INT(TSRFC *TSPH+D50) !how am i going to get this information? ! ! IF(ME.EQ.0)THEN ! WRITE(6,*)' ' ! WRITE(6,*)'DERIVED TIME STEPPING CONSTANTS' ! WRITE(6,*)' NPREC,NHEAT,NSRFC : ',NPREC,NHEAT,NSRFC ! WRITE(6,*)' NCLOD,NRDSW,NRDLW : ',NCLOD,NRDSW,NRDLW ! ENDIF ! ! COMPUTE DERIVED MAP OUTPUT CONSTANTS. ! SET ALL COUNTERS TO ZEROES SINCE RSM DOES NOT OUTPUT ACCUMULATED AUQNTITIES TSRFC=0. !in case buket does not get emptied TRDLW=0. TRDSW=0. THEAT=0. TCLOD=0. ! TPREC=0. DO L = 1,LSM ALSL(L) = ALOG(SPL(L)) END DO ! !HC WRITE IGDS OUT FOR WEIGHTMAKER TO READ IN AS KGDSIN if(me.eq.0)then print*,'writing out igds' igdout=110 ! open(igdout,file='griddef.out',form='unformatted' ! + ,status='unknown') if(maptype .eq. 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 .EQ. 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 !store orientation value for polar WRITE(igdout)DXVAL WRITE(igdout)DYVAL WRITE(igdout)0 WRITE(igdout)64 WRITE(igdout)0 WRITE(igdout)0 WRITE(igdout)255 ! check by Binbin write(*,*) 'For griddef.out file:' WRITE(*,*)5 WRITE(*,*)im WRITE(*,*)jm WRITE(*,*)LATSTART WRITE(*,*)LONSTART WRITE(*,*)8 WRITE(*,*)CENLON WRITE(*,*)DXVAL WRITE(*,*)DYVAL WRITE(*,*)0 WRITE(*,*)64 WRITE(*,*)0 WRITE(*,*)0 WRITE(*,*)255 ELSE IF(MAPTYPE .EQ. 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 END IF end if RETURN END