!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SVIDUMP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE svidump(nx,ny,nz,nstyps, nchout,graffn, grdbas, & 1,4
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, &
ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1, tem2)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Dump a data file for the visualization program Savi3D.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Jason J. Levit
! 07/20/92
!
! MODIFICATION HISTORY:
!
! 08/02/92 (J. Levit)
! Added full documentation and performed a clean-up.
!
! 08/04/92 (M. Xue)
! Subroutine streamlined to conform to data dump format standards.
!
! 8/23/92 (M. Xue)
! Modify to perform the dumping of both base and t-dependent arrays
! and added control on grid staggering.
!
! 9/18/92 (J. Levit, M. Xue)
! Added code to produce a configuration file for Savi3D.
!
! 11/2/92 (M. Xue)
!
! Major overhaul. grafwritescalarpoint is called rather than
! grafwritesclararray. This elliminates the need to define the
! grid work array and make the data writing more flexible.
!
! The capability to write out part of a data array implemented.
!
! 09/02/94 (J. Levit & Y. Lu)
! Cleaned up documentation.
!
! 11/10/94 (Liping Sun & Min Zou)
! Upgraded to version 1.2.2 of Savi3D. The file format was changed
! from GRAF to MeRAF.
!
! 11/10/94 (Y. Liu)
! Merged the upgraded version with the documentation cleaned up
! version.
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! 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
!
! graffn Name of the Savi3D MeRAF file.
! grdbas Flag indicating if this is a call for the data dump
! of grid and base state arrays only. If so, grdbas=1
! (not used in this routine).
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w Vertical component of Cartesian velocity at a given
! time level (m/s)
! ptprt Perturbation potential temperature at a given time
! level (K)
! pprt Perturbation pressure at a given time level (Pascal)
! qv Water vapor specific humidity at a given time level
! (kg/kg)
! qc Cloud water mixing ratio at a given time level (kg/kg)
! qr Rainwater mixing ratio at a given time level (kg/kg)
! qi Cloud ice mixing ratio at a given time level (kg/kg)
! qs Snow mixing ratio at a given time level (kg/kg)
! qh Hail mixing ratio at a given time level (kg/kg)
!
! tke Turbulent Kinetic Energy ((m/s)**2)
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! wbar Base state vertial velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhobar Base state density (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space(m)
! hterain Terrain height (m)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! soiltyp Soil type
! stypfrct Soil type fraction
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsfc Temperature at ground (K) (in top 1 cm layer)
! tsoil Deep soil temperature (K) (in deep 1 m layer)
! wetsfc Surface soil moisture in the top 1 cm layer
! wetdp Deep soil moisture in the deep 1 m layer
! wetcanp Canopy water amount
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! grafgrid Passed from a dummy variable, used to define the grid
! in Savi3D
!
! OUTPUT:
!
! None.
!
! WORK ARRAY:
!
! tem1 Temporary work array.
! tem2 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
!
CHARACTER (LEN=* ) :: graffn ! Name of the Savi3D MeRAF file
INTEGER :: grdbas ! If this is a grid/base state dump
!
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
!
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2)
!
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
!
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity (kg/kg)
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined
! at w-point of the staggered grid.
REAL :: hterain(nx,ny) ! Terrain height.
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as - d( zp )/d( x )
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as - d( zp )/d( y )
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as d( zp )/d( z )
INTEGER :: nstyps
INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type
REAL :: stypfrct(nx,ny,nstyps) ! Soil type
INTEGER :: vegtyp(nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsfc (nx,ny,0:nstyps) ! Temperature at surface (K)
REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K)
REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture
REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: tem1 (nx*ny*nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'meraf.inc'
INCLUDE 'globcst.inc'
! include 'grafibm.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: nxout,nyout,nzout ! The size of array to be written out.
INTEGER :: ist ,ind ,isk ,jst ,jnd ,jsk ,kst ,knd ,ksk
INTEGER :: ist1,ind1,isk1,jst1,jnd1,jsk1,kst1,knd1,ksk1
INTEGER :: uid, vid, wid, uprtid, vprtid, wprtid !*****
INTEGER :: qvprtid, qcid, qrid, qwid, qiid, qsid, qhid !*****
INTEGER :: vortid, divid, ubarid, vbarid, wbarid !*****
INTEGER :: pbarid, rhobarid, qvbarid !*****
INTEGER :: windid, totalwindid !*****
INTEGER :: ptprtid, ptbarid, pprtid !*****
INTEGER :: value ! *****
INTEGER :: frame ! *****
INTEGER :: ierr ! Used as an int'l error code by Savi3D.
INTEGER :: i,j,k ! Used by do loops.
INTEGER :: ii,jj,kk
INTEGER :: nchout ! Unused.
INTEGER :: ishf, jshf, kshf
CHARACTER (LEN=50) :: configname ! Used to create Savi3D config file.
CHARACTER (LEN=20) :: schemename !
CHARACTER (LEN=40) :: errorstring !
REAL*8 xbase,ybase,zbase ! ****
REAL :: conx, cony ! Used to create Savi3D config file.
INTEGER :: gbwrtn ! See if grid and base state
! parameter/arrays have been written
! into the data file
INTEGER :: ncalls
DATA gbwrtn,ncalls /0,0/
SAVE gbwrtn,ncalls
CHARACTER (LEN=7) :: chtem2
CHARACTER (LEN=7) :: chtem1
! Used to create Savi3D config file.
CHARACTER (LEN=6) :: timhms
! integer year,month,day,hour,minute,second,node ! def. in globcst.inc
INTEGER :: node
REAL :: tem
REAL :: xcord,ycord,zcord
REAL*8 second1 ! Used for Savi3D
INTEGER :: nchout0 ! Used to open Savi3D config file.
INTEGER :: setdomn,setskip
SAVE setdomn, setskip
SAVE ist,ind,isk,jst,jnd,jsk,kst,knd,ksk
DATA setdomn/0/, setskip /0/
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF( setdomn == 0 ) THEN
ist = 1
ind = nx-1
jst = 1
jnd = ny-1
kst = 1
knd = nz-1
END IF
IF( setskip == 0 ) THEN
isk = 1
jsk = 1
ksk = 1
END IF
WRITE(6,'(/1x,a,f8.1,a/)') &
'Writing Savi3D data set at time=',curtim,' s.'
!
!-----------------------------------------------------------------------
!
! The dimension of the array to be written out:
!
!-----------------------------------------------------------------------
!
nxout = (ind-ist)/isk +1
nyout = (jnd-jst)/jsk +1
nzout = (knd-kst)/ksk +1
IF( ncalls == 0) THEN
!
!-----------------------------------------------------------------------
!
! Create the Savi3D configuration file.
!
!-----------------------------------------------------------------------
!
CALL getunit
( nchout0 )
CALL gtlfnkey
(runname, lfnkey)
configname=runname(1:lfnkey)//'.sviconfig'
OPEN (UNIT=nchout0, &
FILE=configname(1:10+lfnkey),STATUS='unknown', &
FORM='formatted')
cony=(y(ind)-y(ist))/111111.0
conx=(x(jnd)-x(jst))/111111.0
WRITE(chtem1,'(f7.3)') cony
WRITE(chtem2,'(f7.3)') conx
DO i=1,7
IF ( chtem1(i:i) == ' ') chtem1(i:i) = '0'
IF ( chtem2(i:i) == ' ') chtem2(i:i) = '0'
END DO
WRITE (nchout0,'(4a)') &
'toplat=',chtem1,',btmlat=000.000,lftlon=000.000,rhtlon=',chtem2
WRITE (nchout0,'(a,a)') 'MeRAF_gridded=',graffn
WRITE (nchout0,'(a)') 'initzstretch=1'
WRITE (6,'(a,a)') 'MeRAF_gridded=',graffn
WRITE (6,'(a)') 'initzstretch=1'
CLOSE (nchout0)
CALL retunit( nchout0 )
ncalls = 1
END IF
ishf = 1
jshf = 1
kshf = 1
!
!-----------------------------------------------------------------------
!
! Setup for the MeRAF interface. This is only done at time=0,
! and calls are made to Savi3D subroutines to define the type of
! grid which the data are being written to.
!
! Also, the scalar variables are defined for Savi3D here.
!
!-----------------------------------------------------------------------
!
IF ( gbwrtn == 0 ) THEN
PRINT*,' Opening Savi3D file ',graffn
!
!-----------------------------------------------------------------------
!
! Create the data set
!
!-----------------------------------------------------------------------
!
CALL mcreatedataset (graffn,'ARPS 4.0',true,dsindex,ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to create data set'
PRINT*, 'Error Message: ',errorstring
END IF
!
!-----------------------------------------------------------------------
!
! Create a Grid
!
!-----------------------------------------------------------------------
!
CALL mcreategrid(dsindex,'ARPS 4.0',' ','3-D Model', &
3, nxout, nyout, nzout, ' ',' ', gridid, ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to create grid scheme'
PRINT*, 'Error Message: ',errorstring
END IF
!
!-----------------------------------------------------------------------
!
! Set up Grid
!
!-----------------------------------------------------------------------
!
CALL mconfigurelocations(gridid, me_non_time_var, &
mecartesian, ' ', ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to configue locations'
PRINT*, 'Error Message: ',errorstring
END IF
frame=0
xbase=0.0D0
ybase=0.0D0
zbase=0.0D0
CALL msetxyzbase (gridid, xbase, ybase, zbase, ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to set base point'
PRINT*, 'Error Message: ',errorstring
END IF
!
!-----------------------------------------------------------------------
!
! Define Scalars
!
!-----------------------------------------------------------------------
!
IF (varout == 1) THEN
CALL mdefinescalar (gridid,'u','X-velocity total wind', &
'm/s', 'X-velocity total wind', &
me_time_var, uid)
IF ( uid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'u'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar(gridid,'v','Y-velocity total wind', &
'm/s', 'Y-velocity total wind', &
me_time_var, vid)
IF ( vid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'v'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar(gridid,'w','Z-velocity total wind', &
'm/s', 'Z-velocity total wind', &
me_time_var, wid)
IF ( wid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'w'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar(gridid,'uprt','X-velocity perturbation', &
'm/s', 'X-velocity perturbation', &
me_time_var, uprtid)
IF ( uprtid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'uprt'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar(gridid,'vprt','Y-velocity perturbation', &
'm/s', 'Y-velocity perturbation', &
me_time_var, vprtid)
IF ( vprtid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'vprt'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar(gridid,'wprt','Z-velocity perturbation', &
'm/s', 'Z-velocity perturbation', &
me_time_var, wprtid)
IF ( wprtid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'wprt'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'ptprt', &
'Perturbation Potential Temperature','deg K', &
'Perturbation Potential Temperature', &
me_time_var, ptprtid)
IF ( ptprtid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'ptprt'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'pprt', &
'Perturbation Pressure','mb', &
'Perturbation Pressure', &
me_time_var, pprtid)
IF ( pprtid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'pprt'
PRINT*, 'Error Message: ',errorstring
END IF
END IF
IF (mstout == 1) THEN
CALL mdefinescalar (gridid,'qvprt', &
'Water Vapor Mixing Ratio Perturbation','g/kg', &
'Water Vapor Mixing Ratio Perturbation', &
me_time_var, qvprtid)
IF ( qvprtid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'qvprt'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'qc', &
'Cloud Water Mixing Ratio','g/kg', &
'Cloud Water Mixing Ratio', &
me_time_var, qcid)
IF ( qcid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'qc'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'qr', &
'Rain Water Mixing Ratio','g/kg', &
'Rain Water Mixing Ratio', &
me_time_var, qrid)
IF ( qrid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'qr'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'qw', &
'Total Water Mixing Ratio','g/kg', &
'Total Water Mixing Ratio', &
me_time_var, qwid)
IF ( qwid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'qw'
PRINT*, 'Error Message: ',errorstring
END IF
IF (iceout == 1) THEN
CALL mdefinescalar (gridid,'qi', &
'Cloud Ice Mixing Ratio','g/kg', &
'Cloud Ice Mixing Ratio', &
me_time_var, qiid)
IF ( qiid == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar', 'qi'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'qs', &
'Snow Mixing Ratio','g/kg', &
'Snow Mixing Ratio', &
me_time_var, qsid)
IF (qsid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','qs'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'qh', &
'Hail Mixing Ratio','g/kg', &
'Hail Mixing Ratio', &
me_time_var, qhid)
IF (qhid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','qh'
PRINT*, 'Error Message: ',errorstring
END IF
END IF
END IF
CALL mdefinescalar (gridid,'Vort','Vertical vorticity', &
'1/s', 'Vertical vorticity', &
me_time_var, vortid)
IF (vortid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','Vort'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'Div','Horizontal divergence', &
'1/s', 'Horizontal divergence', &
me_time_var, divid)
IF (divid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','Div'
PRINT*, 'Error Message: ',errorstring
END IF
!
!-----------------------------------------------------------------------
!
! The definitions for the time invariant scalars for Savi3D.
! They are only written once to the Savi3D MeRAF file (at time=0).
!
!-----------------------------------------------------------------------
!
IF (basout == 1) THEN
CALL mdefinescalar (gridid,'ubar', &
'Base State X Wind Velocity ','m/s', &
'Base State X Wind Velocity', &
me_time_var, ubarid)
IF (ubarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','ubar'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'vbar', &
'Base State Y Wind Velocity ','m/s', &
'Base State Y Wind Velocity', &
me_time_var, vbarid)
IF (vbarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','vbar'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'wbar', &
'Base State Z Wind Velocity ','m/s', &
'Base State Z Wind Velocity', &
me_time_var, wbarid)
IF (wbarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','wbar'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'ptbar', &
'Base State Potential Temperature ','deg K', &
'Base State Potential Temperature', &
me_time_var, ptbarid)
IF (ptbarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','ptbar'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'pbar', &
'Base State Pressure ','mb', &
'Base State Pressure', &
me_time_var, pbarid)
IF (pbarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','pbar'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinescalar (gridid,'rhobar', &
'Base State Air Density ','kg/m**3', &
'Base State Air Density', &
me_time_var, rhobarid)
IF (rhobarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','rhobar'
PRINT*, 'Error Message: ',errorstring
END IF
IF (mstout == 1) THEN
CALL mdefinescalar (gridid,'qvbar', &
'Base State Water Vapor Mixing Ratio ','g/kg', &
'Base State Water Vapor Mixing Ratio', &
me_time_var, qvbarid)
IF (qvbarid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define scalar','qvbar'
PRINT*, 'Error Message: ',errorstring
END IF
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Vector definitions for Savi3D. Also, define the starting date,
! time, and time step for Savi3D.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Define Vectors
!
!-----------------------------------------------------------------------
!
IF (varout == 1) THEN
CALL mdefinevectori(gridid,'Pertubation_Wind', &
'Pertubation_Wind', &
uprtid, vprtid, wprtid, windid)
IF (windid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define vector','Wind'
PRINT*, 'Error Message: ',errorstring
END IF
CALL mdefinevectori(gridid,'Total_Wind','Total_Wind', &
uid, vid, wid, totalwindid)
IF (totalwindid == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to define vector','Total_Wind'
PRINT*, 'Error Message: ',errorstring
END IF
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Write buffers
!
!-----------------------------------------------------------------------
!
CALL msetbufferwrite (gridid, ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to set buffer write mode'
PRINT*, 'Error Message: ',errorstring
END IF
!
!-----------------------------------------------------------------------
!
! Set Grid Point Locations
!
!-----------------------------------------------------------------------
!
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
ii=(i-ist)/isk+1
jj=(j-jst)/jsk+1
kk=(k-kst)/ksk+1
xcord =(x(i)+x(i+ishf)-x(ist)-x(ist+ishf) )
ycord =(y(j)+y(j+jshf)-y(jst)-y(jst+jshf) )
zcord =(zp(i,j,k)+zp (i,j,k+kshf))
CALL msetxyzlocation( gridid, ii, jj, kk, xcord,ycord, &
zcord, ierr)
IF( ierr == meerr) THEN
CALL mgeterror(errorstring)
PRINT*,'Error: Unable to set Locations'
PRINT*,'Error Message: ',errorstring
END IF
node=node+1
END DO
END DO
END DO
IF ( node /= nxout*nyout*nzout ) THEN
WRITE(6,'(1x,a,a)') 'nxout*nyout*nzout value incorrect.', &
' Job stopped in SVIDUMP.'
CALL arpsstop
(' ',1)
END IF
!-----------------------------------------------------------------------
!
! Write the base state time invariant scalars to the Savi3D file.
! Data is written the first time this routine is called.
!
!-----------------------------------------------------------------------
!
CALL mstartframew (gridid, ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to start frame write'
PRINT*, 'Error Message: ',errorstring
END IF
frame=frame+1
PRINT*, 'frame=', frame
year = 1994
month = 7
day = 1
CALL cvttim
(curtim, timhms)
READ(timhms,'(3i2)') hour, minute,second
second1=second
PRINT*,'year=',year,',month=',month,',day=',day
PRINT*,'hour=',hour,',minute=',minute,',second=',second1
! CALL GrafTimeStart(grafh,year,month,day,hour,minute,second)
CALL msettimestampu( gridid, year, month, day, hour, minute, &
second1, 0, 0, ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to set time stamp'
PRINT*, 'Error Message: ',errorstring
END IF
IF ( gbwrtn == 0 ) THEN
IF (basout == 1 ) THEN
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = ((ubar(i,j,k)+ubar(i+ishf,j,k))*0.5)
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,ubarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. ubarID=', ubarid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = ((vbar(i,j,k)+vbar(i+ishf,j,k))*0.5)
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,vbarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. vbarID=', vbarid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = ((wbar(i,j,k)+wbar(i+ishf,j,k))*0.5)
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,wbarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. wbarID=', wbarid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = ptbar(i,j,k)
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,ptbarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. ptbar=', ptbarid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = pbar(i,j,k)/100.0
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,pbarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. pbarID=', pbarid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = rhobar(i,j,k)
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,rhobarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. rhobarID=',rhobarid
PRINT*, 'Error Message: ',errorstring
END IF
IF (mstout == 1) THEN
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = qvbar(i,j,k)*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,qvbarid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qvbarID=', qvbarid
PRINT*, 'Error Message: ',errorstring
END IF
END IF
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Write the scalar arrays to the Savi3D file, and mark the end
! of the frame to the file.
!
!-----------------------------------------------------------------------
!
IF (varout == 1) THEN
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = (u(i,j,k)+u(i+ishf,j,k))*0.5
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, uid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. uID=', uid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) =(v(i,j,k)+v(i,j+jshf,k))*0.5
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, vid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. vID=', vid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) =(w(i,j,k)+w(i,j,k+kshf))*0.5
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, wid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. wID=', wid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) =(u(i,j,k)+u(i+ishf,j,k) &
-ubar(i,j,k)-ubar(i+ishf,j,k))*.5
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, uprtid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. uprtID=', uprtid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) =(v(i,j,k)+v(i,j+jshf,k) &
-vbar(i,j,k)-vbar(i,j+jshf,k))*.5
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, vprtid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. vprtID=', vprtid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) =(w(i,j,k)+w(i,j,k+kshf))*0.5
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, wprtid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. wprID=', wprtid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = ptprt(i,j,k)
END DO
END DO
END DO
CALL mwritescalararrayi (gridid,ptprtid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. ptprtID=', ptprtid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = pprt(i,j,k)*0.01
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, pprtid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. pprtID=', pprtid
PRINT*, 'Error Message: ',errorstring
END IF
END IF
IF (mstout == 1) THEN
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) =(qv(i,j,k)-qvbar(i,j,k))*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi(gridid,qvprtid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qvprtID=', qvprtid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = qc(i,j,k)*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, qcid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qcID=', qcid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = qr(i,j,k)*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, qrid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qrID=', qrid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = (qc(i,j,k)+qr(i,j,k))*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, qwid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qwID=', qwid
PRINT*, 'Error Message: ',errorstring
END IF
IF (iceout == 1) THEN
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = qi(i,j,k)*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, qiid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qiID=', qiid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = qs(i,j,k)*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, qsid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF (ierr == meerr) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qsID=', qsid
PRINT*, 'Error Message: ',errorstring
END IF
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = qh(i,j,k)*1000.0
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, qhid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. qhID=', qhid
PRINT*, 'Error Message: ',errorstring
END IF
END IF
END IF
!
! Vorticity:
!
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
tem2(i,j,k)= &
(v(i+1,j,k)-v(i-1,j,k)+v(i+1,j+1,k)-v(i-1,j+1,k))/ &
(4*(x(i+1)-x(i)))- &
(u(i,j+1,k)-u(i,j-1,k)+u(i+1,j+1,k)-u(i+1,j-1,k))/ &
(4*(y(j+1)-y(j)))
END DO
END DO
END DO
DO j=2,ny-2
DO i=2,nx-2
tem2(i,j, 1)=tem2(i,j, 2)
tem2(i,j,nz-1)=tem2(i,j,nz-2)
END DO
END DO
DO k=1,nz-1
DO j=2,ny-2
tem2( 1,j,k)=tem2( 2,j,k)
tem2(nx-1,j,k)=tem2(nx-2,j,k)
END DO
END DO
DO k=1,nz-1
DO i=1,nx-1
tem2(i, 1,k)=tem2(i, 2,k)
tem2(i,ny-1,k)=tem2(i,ny-2,k)
END DO
END DO
node = 0
DO k=kst,knd,ksk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = tem2(i,j,k)
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, vortid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. VortID=', vortid
PRINT*, 'Error Message: ',errorstring
END IF
!
! Divergernce:
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem2(i,j,k)= &
(u(i+1,j,k)-u(i,j,k))/(x(i+1)-x(i))+ &
(v(i,j+1,k)-v(i,j,k))/(y(j+1)-y(j))
END DO
END DO
END DO
node = 0
DO k=kst,knd,ksk
! DO 4200 i=ist,ind,isk
DO j=jst,jnd,jsk
DO i=ist,ind,isk
node = node + 1
tem1(node) = tem2(i,j,k)
END DO
END DO
END DO
CALL mwritescalararrayi (gridid, divid,1,nxout, &
1,nyout,1,nzout,tem1,ierr)
IF ( ierr == meerr ) THEN
CALL mgeterror (errorstring)
PRINT*, 'Error: Unable to write scalar. DivID=', divid
PRINT*, 'Error Message: ',errorstring
END IF
CALL mendcurrentframew (gridid, ierr)
gbwrtn = 1 ! This routine has been called once.
RETURN
ENTRY sdmpdomn(ist1,ind1,jst1,jnd1,kst1,knd1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! To set the start and end indicies of the model subdomain
! in which the data is dumped out.
!
!-----------------------------------------------------------------------
!
ist = ist1
jst = jst1
kst = kst1
ind = ind1
jnd = jnd1
knd = knd1
setdomn = 1
PRINT*,'setdomn in sdmpdomn', setdomn
RETURN
ENTRY sdmpskip(isk1, jsk1, ksk1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! To set data skip parameters for data dump.
!
!-----------------------------------------------------------------------
!
isk = isk1
jsk = jsk1
ksk = ksk1
setskip = 1
RETURN
END SUBROUTINE svidump
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GWRISCALARARRAY ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
! SUBROUTINE GWriScalarArray(gridh,variable_name,input_array,nxyz)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Handles the call to Savi3D routine GrafWriteScalarArray
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 01/28/1993
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
! implicit none
! integer gridh
! character variable_name*(*)
! integer nxyz
! real input_array(nxyz)
! integer ierr
! CALL GrafWriteScalarArray(gridh,variable_name,input_array,ierr)
! RETURN
!
END