!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE initgemio ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE initgemio(nxlg,nylg,mapproj,trulat1,trulat2,trulon, & 1
lat1,lon1,lat2,lon2,iret)
! IMPLICIT NONE
!-----------------------------------------------------------------------
!
! PURPOSE: Initial IO interface for GEMPAK package
!
!-----------------------------------------------------------------------
!
! Author: Yunheng Wang (04/02/2007)
!
!-----------------------------------------------------------------------
INTEGER, INTENT(IN) :: nxlg, nylg
INTEGER, INTENT(IN) :: mapproj
REAL, INTENT(IN) :: trulat1, trulat2, trulon
REAL, INTENT(IN) :: lat1, lon1, lat2, lon2
INTEGER, INTENT(OUT) :: iret
!-----------------------------------------------------------------------
!
! GEMPAK variables
!
!-----------------------------------------------------------------------
!
CHARACTER(LEN=3), PARAMETER :: cproj(0:3) = (/'CED','STR','LCC','MER'/)
! CHARACTER (LEN=72) :: gdarea
CHARACTER (LEN=72) :: chproj
! REAL, PARAMETER :: deltan = 1.0
! REAL, PARAMETER :: deltax = -9999., deltay = -9999.
LOGICAL, PARAMETER :: angflg = .TRUE.
REAL :: angle1,angle2,angle3
REAL :: gbnds(4)
LOGICAL :: notopn ! should be deleted
!-----------------------------------------------------------------------
! Include files:
!-----------------------------------------------------------------------
INCLUDE 'GEMPRM.PRM'
INCLUDE 'mp.inc'
REAL :: rnvblk (llnnav), anlblk (llnanl)
COMMON /gemblk/rnvblk,anlblk,notop
!fpp$ expand (f_qvsat)
!dir$ inline always f_qvsat
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
iret = 0
CALL in_bdta(iret) ! initializing GEMPAK sans TAE
!
!-----------------------------------------------------------------------
!
! Initializing GEMPAK
!
!-----------------------------------------------------------------------
!
chproj = cproj(mapproj)
angle2 = trulon
!
! modify projection if polar stereographic
!
IF (chproj == 'STR') THEN
angle1=90.0
angle3=0.0
IF(myproc == 0) THEN
WRITE (*,*) '**********************************'
WRITE (*,*) '**********************************'
WRITE (*,*) ' '
WRITE (*,*) 'SETTING ANGLE1=90. FOR GEMPAK FILE'
WRITE (*,*) 'SETTING ANGLE3=0.0 FOR GEMPAK FILE'
WRITE (*,*) '(GEMPAK origin is at North Pole)'
WRITE (*,*) ' '
WRITE (*,*) '**********************************'
WRITE (*,*) '**********************************'
END IF
ELSE
angle1=trulat1
angle3=trulat2
IF(myproc == 0) THEN
WRITE (*,*) '**********************************'
WRITE (*,*) '**********************************'
WRITE (*,*) ' '
WRITE (*,*) ' SETTING ANGLE1=TRULAT1 '
WRITE (*,*) ' SETTING ANGLE3=TRULAT2 '
WRITE (*,*) ' '
WRITE (*,*) '**********************************'
WRITE (*,*) '**********************************'
END IF
END IF
gbnds(1)=lat1
gbnds(2)=lon1
gbnds(3)=lat2
gbnds(4)=lon2
! WRITE(gdarea,'(f8.4,a1,f9.4,a1,f8.4,a1,f9.4)') &
! lat1,';',lon1,';',lat2,';',lon2
CALL gr_mnav(chproj, nxlg,nylg,lat1,lon1,lat2,lon2, &
angle1,angle2,angle3,angflg, &
rnvblk, iret)
RETURN
END SUBROUTINE initgemio
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE enswrtgem ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE enswrtgem (nx,ny, filename, lens, & 2,30
ctime,year,month,day,hour,minute, &
iprgem,nprgem,ihtgem,nhtgem, &
hgtp,uwndp,vwndp,wwndp,tmpp,sphp, &
uwndh,vwndh,wwndh, &
psf,mslp,vort500,temp2m,dewp2m,qv2m, &
u10m,v10m,hgtsfc,refl1km,refl4km,cmpref, &
accppt,convppt,cape,mcape,cin,mcin,lcl, &
srh01,srh03,uh25,sh01,sh06,thck,li,brn,pw)
INTEGER :: nx,ny
CHARACTER (LEN=*) :: filename
CHARACTER (LEN=72) :: gdfile
INTEGER :: lens, nchout
INTEGER :: imxgrd
PARAMETER (imxgrd=500)
INTEGER :: ivsfc,ivprs,ivtheta,ivhgt
PARAMETER (ivsfc=0,ivprs=1,ivtheta=2,ivhgt=3)
INTEGER :: level(2)
INTEGER :: ighdr(2)
INTEGER :: ipktyp, nbits
PARAMETER (ipktyp=1,nbits=16)
CHARACTER (LEN=20) :: gemtime(2)
CHARACTER (LEN=12) :: parm
INTEGER :: nprgem,nhtgem
INTEGER :: iprgem(nprgem),ihtgem(nhtgem)
REAL :: hgtp(nx,ny,nprgem),uwndp(nx,ny,nprgem),vwndp(nx,ny,nprgem)
REAL :: wwndp(nx,ny,nprgem),tmpp(nx,ny,nprgem),sphp(nx,ny,nprgem)
REAL :: uwndh(nx,ny,nhtgem),vwndh(nx,ny,nhtgem),wwndh(nx,ny,nhtgem)
REAL :: psf(nx,ny),mslp(nx,ny),vort500(nx,ny)
REAL :: temp2m(nx,ny),dewp2m(nx,ny),qv2m(nx,ny)
REAL :: u10m(nx,ny),v10m(nx,ny),hgtsfc(nx,ny)
REAL :: refl1km(nx,ny),refl4km(nx,ny),cmpref(nx,ny)
REAL :: accppt(nx,ny),convppt(nx,ny)
REAL :: cape(nx,ny),mcape(nx,ny),cin(nx,ny),mcin(nx,ny),lcl(nx,ny)
REAL :: srh01(nx,ny),srh03(nx,ny),uh25(nx,ny),sh01(nx,ny),sh06(nx,ny)
REAL :: thck(nx,ny),li(nx,ny),brn(nx,ny),pw(nx,ny)
INTEGER :: i,j,k,klev,iret,igdfil
INTEGER :: year,month,day,hour,minute
INTEGER :: iyr,ifhr,ifmin,ifile,ihd
REAL :: ctime
LOGICAL :: wrtflg,rewrite,notopn,gemExist
INCLUDE 'mp.inc'
INCLUDE 'GEMPRM.PRM'
REAL :: rnvblk (llnnav), anlblk (llnanl)
COMMON /gemblk/ rnvblk,anlblk,notopn
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Begining of executable code ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Build the GEMPAK grid time string
! It has format yymodd/hhmnFHHH
! yy: year mo: month dd: GMT day
! hh: GMT hour mn: minute
! F: seperation charcter
! HHH: forecast hour (000 = analysis)
! example time(1)='950126/1200F000'
!
!-----------------------------------------------------------------------
!
curtim = ctime
gemtime(1)=' '
gemtime(2)=' '
iyr=MOD(year,100)
ifhr=INT(curtim/3600.)
ifmin=nint((curtim-(ifhr*3600.))/60.)
IF(curtim == 0) THEN
WRITE(gemtime(1), &
'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a4)') &
iyr,month,day,'/',hour,minute,'F000'
ELSE
WRITE(gemtime(1), &
'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3,i2.2)') &
iyr,month,day,'/',hour,minute,'F',ifhr,ifmin
END IF
IF(myproc==0) WRITE(6,'(a,a)') ' GEMPAK time string ',gemtime(1)
!
!-----------------------------------------------------------------------
!
! Initialize header, grid area coordinates and analysis block
!
!-----------------------------------------------------------------------
!
! IF(notopn) THEN
ihd = 2
ighdr(1)=0
ighdr(2)=0
!
DO i=1,llnanl
anlblk(i) = 0.
END DO
! END IF
!
!-----------------------------------------------------------------------
!
! Open/Create the grid file
!
!-----------------------------------------------------------------------
!
gdfile = filename(1:lens)
! WRITE (6, *) 'Opening GEMPAK file ',gdfile(1:lens)
! CALL gd_opnf ( gdfile, wrtflg, igdfil, navsz, rnvblk, &
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
inquire (file=gdfile,exist=gemExist)
IF ( gemExist ) THEN
IF(myproc==0) THEN
WRITE (6, *) 'GEMPAK file ',trim(gdfile),' already exists!'
stop " STOP!!!"
END IF
ELSE
IF(myproc==0) THEN
WRITE (6, *) 'Creating file ',trim(gdfile)
CALL gd_cref ( gdfile, llnnav, rnvblk, llnanl, &
anlblk, ihd, imxgrd, igdfil, iret )
END IF
IF( iret /= 0 ) GO TO 950
END IF
!
!-----------------------------------------------------------------------
!
! Set write flag to true
!
!-----------------------------------------------------------------------
!
wrtflg=.true.
! CALL gd_swrt( igdfil, wrtflg, iret )
IF(myproc==0) CALL gd_swrt( igdfil, wrtflg, iret )
IF( iret /= 0 ) GO TO 950
notopn=.false.
!-----------------------------------------------------------------------
!
! Output one level fields
!
!-----------------------------------------------------------------------
!
level(1)=0
level(2)=-1
IF(myproc==0) PRINT *, ' Writing surface pressure'
parm='PRES'
CALL gemdump2d
( igdfil, psf, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing MSLP pressure'
parm='PMSL'
CALL gemdump2d
( igdfil, mslp, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
!
!
IF(myproc==0) PRINT *,' Writing 1-h total accumulated rainfall'
parm='P01M'
CALL gemdump2d
( igdfil, accppt, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
! IF(myproc==0) PRINT *,' Writing 1-h convective rainfall'
! parm='RAIN_C'
! CALL gemdump2d( igdfil, convppt, &
! nx, ny, ighdr, &
! gemtime, level, ivsfc, parm, &
! rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *,' Writing precipitable water'
parm='PWAT'
CALL gemdump2d
( igdfil, pw, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 2-m temperature (C)'
parm='TMPF'
CALL gemdump2d
( igdfil, temp2m, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 2-m dew point temperature (C)'
parm='DWPF'
CALL gemdump2d
( igdfil, dewp2m, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 2-m specific humidity'
parm='MIXR'
CALL gemdump2d
( igdfil, qv2m, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
!
IF(myproc==0) PRINT *, ' Writing 10-m u velocity'
parm='UREL'
CALL gemdump2d
( igdfil, u10m, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
!
IF(myproc==0) PRINT *, ' Writing 10-m v velocity'
parm='VREL'
CALL gemdump2d
( igdfil, v10m, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
! IF(myproc==0) PRINT *, ' Writing 500 hPa vorticity'
! parm='VORT'
! CALL gemdump2d( igdfil, vort500, &
! nx, ny, ighdr, &
! gemtime, level, ivsfc, parm, &
! rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing surface geopotential height'
parm='HGHT'
CALL gemdump2d
( igdfil, hgtsfc, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 1-km AGL reflectivity'
parm='REFL1KM'
CALL gemdump2d
( igdfil, refl1km, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 4-km AGL reflectivity'
parm='REFL4KM'
CALL gemdump2d
( igdfil, refl4km, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing composite reflectivity'
parm='REFLCMP'
CALL gemdump2d
( igdfil, cmpref, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing surface-based CAPE'
parm='CAPE'
CALL gemdump2d
( igdfil, cape, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing moist unstable CAPE'
parm='MUCAPE'
CALL gemdump2d
( igdfil, mcape, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing surface-based CIN'
parm='CINS'
CALL gemdump2d
( igdfil, cin, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing moist unstable CIN'
parm='MUCIN'
CALL gemdump2d
( igdfil, mcin, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing surface-based LCL'
parm='HLCL'
CALL gemdump2d
( igdfil, lcl, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 0-1 km AGL storm-relative helicity'
parm='SRH01'
CALL gemdump2d
( igdfil, srh01, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 0-3 km AGL storm-relative helicity'
parm='SRH03'
CALL gemdump2d
( igdfil, srh03, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing updraft helicity'
parm='VHEL'
CALL gemdump2d
( igdfil, uh25, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 0-1 km AGL wind shear'
parm='SHR01'
CALL gemdump2d
( igdfil, sh01, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
IF(myproc==0) PRINT *, ' Writing 0-6 km AGL wind shear'
parm='SHR06'
CALL gemdump2d
( igdfil, sh06, &
nx, ny, ighdr, &
gemtime, level, ivsfc, parm, &
rewrite, ipktyp, nbits, iret)
!
!-----------------------------------------------------------------------
!
! Output constant pressure level data
!
!-----------------------------------------------------------------------
!
IF( nprgem > 0 ) THEN
rewrite=.false.
DO klev=1,nprgem
level(1)=iprgem(klev)
level(2)=-1
IF(myproc==0) PRINT *, ' Writing GEMPAK data at pr= ',iprgem(klev),' hPa'
parm='HGHT'
CALL gemdump2d
( igdfil, hgtp(1,1,klev), &
nx, ny, ighdr, &
gemtime, level, ivprs, parm, &
rewrite, ipktyp, nbits, iret)
parm='UREL'
CALL gemdump2d
( igdfil, uwndp(1,1,klev), &
nx, ny, ighdr, &
gemtime, level, ivprs, parm, &
rewrite, ipktyp, nbits, iret)
parm='VREL'
CALL gemdump2d
( igdfil, vwndp(1,1,klev), &
nx, ny, ighdr, &
gemtime, level, ivprs, parm, &
rewrite, ipktyp, nbits, iret)
parm='VVEL'
CALL gemdump2d
( igdfil, wwndp(1,1,klev), &
nx, ny, ighdr, &
gemtime, level, ivprs, parm, &
rewrite, ipktyp, nbits, iret)
parm='TMPC'
CALL gemdump2d
( igdfil, tmpp(1,1,klev), &
nx, ny, ighdr, &
gemtime, level, ivprs, parm, &
rewrite, ipktyp, nbits, iret)
parm='MIXR'
CALL gemdump2d
( igdfil, sphp(1,1,klev), &
nx, ny, ighdr, &
gemtime, level, ivprs, parm, &
rewrite, ipktyp, nbits, iret)
END DO ! nprgem-loop
END IF
!
!-----------------------------------------------------------------------
!
! Output AGL height level data
!
!-----------------------------------------------------------------------
!
! IF( nhtgem > 0 ) THEN
! rewrite=.false.
!
! DO klev=1,nhtgem
! level(1)=ihtgem(klev)
! level(2)=-1
! IF(myproc==0) PRINT *, ' Writing GEMPAK data at z= ',ihtgem(klev),' km AGL'
! parm='UREL'
! CALL gemdump2d( igdfil, uwndh(1,1,klev), &
! nx, ny, ighdr, &
! gemtime, level, ivhgt, parm, &
! rewrite, ipktyp, nbits, iret)
! parm='VREL'
! CALL gemdump2d( igdfil, vwndh(1,1,klev), &
! nx, ny, ighdr, &
! gemtime, level, ivhgt, parm, &
! rewrite, ipktyp, nbits, iret)
! parm='VVEL'
! CALL gemdump2d( igdfil, wwndh(1,1,klev), &
! nx, ny, ighdr, &
! gemtime, level, ivhgt, parm, &
! rewrite, ipktyp, nbits, iret)
! END DO ! nhtgem-loop
! END IF
! IF(myproc==0) THEN
! print *,'igdfil,iret:',igdfil,iret
IF (myproc == 0) CALL gd_clos(igdfil,iret)
! print *,'iret:',ire
! Generate a ready file
! CALL getunit( nchout )
! OPEN (UNIT=nchout,FILE=trim(gdfile)//"_ready")
! WRITE (nchout,'(a)') trim(gdfile)//"_ready"
! CLOSE (nchout)
! CALL retunit (nchout )
! END IF
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
RETURN
950 CONTINUE
IF(myproc == 0) WRITE(6,'(a)') ' Error setting up GEMPAK file'
STOP
RETURN
END SUBROUTINE enswrtgem
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GEMDUMP2D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gemdump2d(igdfil,qfield, & 29,3
nx, ny, ighdr, &
gemtime, level, ivflag, parm, &
rewrite, ipktyp, nbits, iret)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Write out one single 2D field in gempak format. This interface is
! specially written for MPI dump to a joined GEMPAK file
!
!-----------------------------------------------------------------------
!
! AUTHOR: Fanyou Kong
! 02/20/2007
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'mp.inc'
INTEGER :: igdfil, iret, istat
INTEGER :: nx,ny
INTEGER :: ivflag
INTEGER :: level(2)
INTEGER :: ighdr(2)
CHARACTER (LEN=20) :: gemtime(2)
CHARACTER (LEN=12) :: parm
REAL :: qfield(nx,ny)
LOGICAL :: rewrite
integer nbits, ipktyp
INTEGER :: nxlg, nylg
REAL, ALLOCATABLE :: out2d(:,:)
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Begining of executable code ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
nxlg = nproc_x*(nx-3)+3
nylg = nproc_y*(ny-3)+3
ALLOCATE (out2d( nxlg,nylg ),stat=istat)
CALL edgfill
(qfield,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1)
! IF (mp_opt > 0 .AND. joindmp > 0) THEN
IF (mp_opt > 0 ) THEN
! Write joined single file for the 2D field
CALL mpimerge2d
(qfield,nx,ny,out2d)
! CALL edgfill(qfield,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1)
IF (myproc == 0) THEN
CALL gd_wpgd( igdfil, out2d, &
nxlg,nylg, ighdr, &
gemtime, level, ivflag, parm, &
rewrite, ipktyp, nbits, iret)
END IF
CALL mpupdatei
(iret,1)
ELSE
! Write non-MPI file for the 3D field
CALL gd_wpgd( igdfil, qfield, &
nx,ny, ighdr, &
gemtime, level, ivflag, parm, &
rewrite, ipktyp, nbits, iret)
END IF
DEALLOCATE(out2d)
RETURN
END SUBROUTINE gemdump2d