SUBROUTINE PROF_NMMB_SERIAL(filename,ITAG,INCR) C C$$$ SUBPROGRAM DOCUMENTATION BLOCK C . . . C SUBROUTINE: PROF PROFILE SOUNDINGS C PRGRMMR: BLACK ORG: W/NP22 DATE: 99-04-22 C C ABSTRACT: THIS ROUTINE GENERATES THE RAW PROFILE SOUNDING C OUTPUT FILES FROM THE FORECAST RESTRT FILE AND C AUXILIARY FILES C C PROGRAM HISTORY LOG: C 99-04-22 T BLACK - ORIGINATOR C 02-07-01 G MANIKIN - FIXED PROBLEM WITH DHCNVC AND DHRAIN C COMPUTATIONS - SEE COMMENTS BELOW C 03-04-01 M PYLE - BEGAN CONVERTING FOR WRF C 04-05-26 M PYLE - MADE CHANGES FOR WRF-NMM C 08-09-11 M PYLE - NMMB VERSION READING NEMSIO C 13-11-07 M PYLE - fold in parallel NEMSIO read from post C C USAGE: CALL PROF FROM PROGRAM POST0 C C INPUT ARGUMENT LIST: C NHB - THE UNIT NUMBER FOR READING THE NHB FILE C LRSTRT - THE UNIT NUMBER FOR READING THE RESTRT FILE C ITAG - THE FORECAST HOUR WE ARE DEALING WITH C LCLAS1 - THE UNIT NUMBER FOR WRITING THE PROFILE DATA C C OUTPUT ARGUMENT LIST: C NONE C C SUBPROGRAMS CALLED: C UNIQUE: C C----------------------------------------------------------------------- c use vrbls3d c use vrbls2d c use soil c use masks use kinds, only : i_llong use nemsio_module C use nemsio_module_mpi C include 'wrf_io_flags.h' include 'mpif.h' ! INCLUDE "parmeta" INCLUDE "parmsoil" C----------------------------------------------------------------------- P A R A M E T E R & (NSTAT=1500,LCL1ML=15,LCL1SL=52 &, D608=0.608) C----------------------------------------------------------------------- C C PARMS FOR HOURLY PROFILER OUTPUT C NSTAT - MAX NUMBER OF STATIONS C NWORDM - DIMENSION OF OUTPUT ARRAY, MUST BE LARGE ENOUGH C TO HOLD ALL VARIABLES C (MAX NO MULTI-LAYER VARIABLES*LM + NO OF SINGLE LAYER VARS) C LCL1ML - NUMBER OF MULTI-LAYER VARIABLES OUTPUT FOR CLASS 1 C LCL1SL - NUMBER OF SINGLE LAYER VARIABLES OUTPUT FOR CLASS 1 C C------------------------------------------------------------------------ P A R A M E T E R & (ITB=76,JTB=134) P A R A M E T E R & (A2=17.2693882,A3=273.16,A4=35.86,PQ0=379.90516,DTR=1.74532925E-2 &, G=9.81,GI=1./G,RD=287.04,CP=1004.6,CAPA=RD/CP,RHCRIT=0.9999) C PARAMETER (GAMMA=6.5/1000.,ZSL=0.0) PARAMETER (TAUCR=RD*GI*290.66,CONST=0.005*G/RD) PARAMETER (GORD=G/RD,DP=60.E2) C------------------------------------------------------------------------ type(nemsio_gfile) :: nfile, nfile_old character(len=20) :: VarName character(len=20) :: VcoordName character*8,allocatable:: recname(:) character*16,allocatable :: reclevtyp(:) integer,allocatable:: reclev(:) R E A L & STNLAT(NSTAT),STNLON(NSTAT) I N T E G E R & IDSTN(NSTAT),IHINDX(NSTAT),JHINDX(NSTAT) &, IVINDX(NSTAT),JVINDX(NSTAT) REAL, ALLOCATABLE:: UL(:) &,FIS(:),THS(:),HBOT(:) &,CFRACL(:),CFRACM(:),CFRACH(:),SNO(:) &,SOILTB(:),SFCEXC(:),SMSTAV(:),SMSTOT(:) &,Z0(:),CZEN(:),CZMEAN(:),SR(:) &,ACPREC(:),CUPREC(:),ACSNOW(:),ACSNOM(:) &,SSROFF(:),BGROFF(:),SFCSHX(:),SFCLHX(:) &,SUBSHX(:),SNOPCX(:),ASWIN(:),ASWOUT(:) &,ASWTOA(:),ALWIN(:),ALWOUT(:),ALWTOA(:) &,TSHLTR(:),TSHLTR_hold(:),QSHLTR(:),PSHLTR(:) &,TH10(:),Q10(:),U10(:),V10(:) &,TLMIN(:),TLMAX(:),AVRAIN(:),APHTIM(:),ACUTIM(:) &,SMC(:,:),CMC(:),STC(:,:),SH2O(:,:) &,VEGFRC(:),POTFLX(:),PSLP(:),PDSL1(:) &,EGRID2(:),SM(:),SICE(:) &,HBM2(:),FACTR(:) &,PTBL(:,:),TTBL(:,:),VEGFRA(:) &,T(:,:),Q(:,:),U(:,:),V(:,:),Q2(:,:) &,CWM(:,:),TRAIN(:,:),TCUCN(:,:) &,F_RAIN(:,:),F_ICE(:,:),CLDFRA(:,:) &,F_RIMEF(:,:) &,RSWTT(:,:),RLWTT(:,:),RTOP(:,:) &,OMGA(:,:) &,PRODAT(:),FPACK(:) &,STATPR(:),STACPR(:),STAEVP(:) &,STAPOT(:),STASHX(:),STASUB(:),STAPCX(:) &,STASWI(:),STASWO(:),STALWI(:),STALWO(:) &,STALWT(:),STASWT(:),STASNM(:),STASRF(:) &,STABRF(:),STASNO(:),DHCNVC(:,:),DHRAIN(:,:) &,STADHC(:),STADHR(:),CPRATE(:) &,ACPREC0(:),CUPREC0(:),SFCLHX0(:),POTFLX0(:) &,SFCSHX0(:),SUBSHX0(:),SNOPCX0(:),ASWIN0(:) &,ASWOUT0(:),ALWIN0(:),ALWOUT0(:),ALWTOA0(:) &,ASWTOA0(:),ACSNOW0(:),ACSNOM0(:),SSROFF0(:) &,BGROFF0(:),AVRAIN0(:),APHTIM0(:),ACUTIM0(:) &,TCUCN0(:,:),TRAIN0(:,:), glat1d(:),glon1d(:) ! integer, allocatable:: icnt(:),idsp(:) integer :: icnt(0:127),idsp(0:127) C real, allocatable:: DUMSOIL(:),DUMSOIL3(:,:,:) &,DUM3D(:,:,:),DUM3D2(:,:,:),DUM3DIKJ(:,:,:) &,DUM3D3(:,:,:),DUMMY2(:,:),DUMMY(:,:) &,PD(:),PDS(:),GDLAT(:,:),GDLON(:,:) &,GDLAT2(:,:),GDLON2(:,:) &,PMID(:,:),PINT(:,:) &,W(:,:),WH(:,:) real, allocatable:: CROT(:),SROT(:) LOGICAL:: PRINT_DIAG, convert_rad_to_deg C------------------------------------------------------------------------ C integer, allocatable:: IDUM(:,:),LMH(:,:),IDUMMY(:,:) I N T E G E R & IDAT(3),IDAT0(3),GDS(200),fldsize,tmpsize,ITAGPREV DATA SPVAL/-9999./ C C------------------------------------------------------------------------ L O G I C A L & RUN,RESTRT,FRST C------------------------------------------------------------------------ C H A R A C T E R & RSTFIL*98,RESTHR*4,LABEL*32,CISTAT*8,CIDSTN(NSTAT)*8 &,FNAME*98,ENVAR*98,BLANK*4 C new stuff character(len=31) :: varin character(len=256) :: fileName,filename_prev character(len=256) :: fileName_alt integer :: Status character(len=19):: startdate,datestr,datestrold character SysDepInfo*80 character(len=3):: ITAGLAB character(len=2):: hrp character(len=8):: minp character(len=2):: IMINLAB real:: rinc(5) integer:: IDATE(8),JDATE(8),IDATENEW(8) integer:: IDATE7(7) integer this_offset, this_length C------------------------------------------------------------------------ DATA BLANK/' '/ DATA hrp /'h_'/ DATA minp /'m_00.00s'/ DATA IMINLAB /'00'/ C------------------------------------------------------------------------ C*** C*** READ IN THE INFORMATION FILE ABOUT THE SOUNDINGS C*** ! write(0,*) 'filename at top ', filename c write(0,*) 'startedate= ', startdate datestr=startdate REWIND 19 C READ(19)NUMSTA,IDSTN,STNLAT,STNLON 1, IHINDX,JHINDX,IVINDX,JVINDX,CIDSTN ! WRITE(0,20)NUMSTA 20 FORMAT('INIT: NUMBER OF PROFILE STATIONS ',I5) ! if (ITAG .eq. 0) then ! WRITE(0,30)(IDSTN(N),STNLAT(N)/DTR,STNLON(N)/DTR ! 1, IHINDX(N),JHINDX(N),IVINDX(N),JVINDX(N) ! 2, CIDSTN(N),N=1,NUMSTA) ! endif 30 FORMAT(2X,I6,2F8.2,4I8,4X,A8) c if (ITAG .eq. 0) then FRST=.TRUE. c else c FRST=.FALSE. c endif call mpi_init(ierr) call mpi_comm_rank(MPI_COMM_WORLD,mype,ierr) call mpi_comm_size(MPI_COMM_WORLD,npes,ierr) if (MYPE .eq. 0) then WRITE(0,20)NUMSTA if (ITAG .eq. 0) then WRITE(0,30)(IDSTN(N),STNLAT(N)/DTR,STNLON(N)/DTR 1, IHINDX(N),JHINDX(N),IVINDX(N),JVINDX(N) 2, CIDSTN(N),N=1,NUMSTA) endif endif call nemsio_init() call nemsio_open(nfile,trim(filename),'read', & iret=iret) if (mype .eq. 0) then write(0,*) 'iret from curr file open: ', iret write(0,*) 'filename after open: ', filename endif call nemsio_getfilehead(nfile,iret=iret,nrec=nrec) allocate(recname(nrec),reclevtyp(nrec),reclev(nrec)) write(0,*) 'nrec: ', nrec call nemsio_getfilehead(nfile,iret=iret & & ,idate=idate(1:7),nfhour=nfhour,recname=recname & & ,reclevtyp=reclevtyp,reclev=reclev,nframe=nframe & & ,dimx=im,dimy=jm,dimz=lm) ! write(0,*) 'what is nrec: ', nrec impf=im+nframe jmpf=jm+nframe nframed2=nframe/2 ! do I=1,7 ! write(0,*) 'I,IDATE(I): ', I, IDATE(I) ! enddo C Getting start time C Getting tstart C C reset imn,iyear,iday,ihrst since they are packed into IDAT which C is written into the profile output file! C imn=IDATE(2) iday=IDATE(3) iyear=IDATE(1) ! ihrst=IDATE(5) ihrst=IDATE(4) C ! endif if (mype .eq. 0) then write(0,*) 'to big allocate block' endif !! do parallel instead? call para_range(1,jm,npes,mype, & jsta,jend) ! ! do i = 0, npes - 1 ! call para_range(1,jm,npes,i,jsx,jex) ! icnt(i) = (jex-jsx+1)*im ! idsp(i) = (jsx-1)*im ! if ( mype .eq. 0 ) then ! write(0,*) ' i, icnt(i),idsp(i) = ',i,icnt(i), ! & idsp(i) ! end if ! end do ! force each task to do full range ! this gets everyone past the barrier ! jsta=1 ! jend=jm jsta_2l = max(jsta - 2, 1 ) jend_2u = min(jend + 2, jm ) write(0,*) 'jsta, jend: ', jsta, jend ! The end j row is going to be jend_2u for all variables except for V. ! JSTA_2L=1 ! JEND_2U=JM JS=JSTA_2L JE=JEND_2U IF (JEND_2U.EQ.JM) THEN JEV=JEND_2U+1 ELSE JEV=JEND_2U ENDIF me=0 VarName='dt' if(me == 0)then call nemsio_getheadvar(nfile,trim(VarName),garb,iret) if (iret /= 0) then print*,VarName," not found in file-Assigned missing values" dt=spval else dt=garb end if NTSD=INT(0.5+ITAG*3600./dt) if (NPES .gt. 1) then call mpi_bcast(NTSD,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) endif ! write(0,*) 'NTSD: ', NTSD end if ! former parameter statements ! write(0,*) 'LM: ', LM NWORDM=(LCL1ML+1)*LM+2*LCL1SL LRECPR=4*(8+9+LCL1ML*LM+LCL1SL) if (mype .eq. 0) then write(0,*) 'NWORDM, LRECPR: ', NWORDM, LRECPR endif ! former parameter statements ALLOCATE( UL(2*LM) &,FIS(NUMSTA),THS(NUMSTA),HBOT(NUMSTA) &,CFRACL(NUMSTA),CFRACM(NUMSTA),CFRACH(NUMSTA),SNO(NUMSTA) &,SOILTB(NUMSTA),SFCEXC(NUMSTA),SMSTAV(NUMSTA),SMSTOT(NUMSTA) &,Z0(NUMSTA),CZEN(NUMSTA),CZMEAN(NUMSTA),SR(NUMSTA)) ALLOCATE (ACPREC(NUMSTA),CUPREC(NUMSTA) &,ACSNOW(NUMSTA),ACSNOM(NUMSTA) &,SSROFF(NUMSTA),BGROFF(NUMSTA),SFCSHX(NUMSTA),SFCLHX(NUMSTA) &,SUBSHX(NUMSTA),SNOPCX(NUMSTA),ASWIN(NUMSTA),ASWOUT(NUMSTA) &,ASWTOA(NUMSTA),ALWIN(NUMSTA),ALWOUT(NUMSTA),ALWTOA(NUMSTA) &,TSHLTR(NUMSTA),TSHLTR_hold(NUMSTA),QSHLTR(NUMSTA),PSHLTR(NUMSTA) &,TH10(NUMSTA),Q10(NUMSTA),U10(NUMSTA),V10(NUMSTA) &,TLMIN(NUMSTA),TLMAX(NUMSTA),AVRAIN(NUMSTA),APHTIM(NUMSTA) &,ACUTIM(NUMSTA) &,SMC(NUMSTA,NSOIL),CMC(NUMSTA),STC(NUMSTA,NSOIL) &,SH2O(NUMSTA,NSOIL) &,VEGFRC(NUMSTA),POTFLX(NUMSTA),PSLP(NUMSTA),PDSL1(NUMSTA) &,EGRID2(NUMSTA),SM(NUMSTA),SICE(NUMSTA)) ALLOCATE(HBM2(NUMSTA),FACTR(NUMSTA) &,PTBL(ITB,JTB),TTBL(JTB,ITB),VEGFRA(NUMSTA) &,T(NUMSTA,LM),Q(NUMSTA,LM),U(NUMSTA,LM),V(NUMSTA,LM) &,Q2(NUMSTA,LM) &,CWM(NUMSTA,LM),TRAIN(NUMSTA,LM) &,F_RAIN(NUMSTA,LM),F_ICE(NUMSTA,LM),CLDFRA(NUMSTA,LM) &,TCUCN(NUMSTA,LM),F_RIMEF(NUMSTA,LM) &,RSWTT(NUMSTA,LM),RLWTT(NUMSTA,LM) &,RTOP(NUMSTA,LM) &,OMGA(NUMSTA,LM) &,PRODAT(NWORDM),FPACK(NWORDM) &,STATPR(NUMSTA),STACPR(NUMSTA),STAEVP(NUMSTA) &,STAPOT(NUMSTA),STASHX(NUMSTA),STASUB(NUMSTA),STAPCX(NUMSTA) &,STASWI(NUMSTA),STASWO(NUMSTA),STALWI(NUMSTA),STALWO(NUMSTA) &,STALWT(NUMSTA),STASWT(NUMSTA),STASNM(NUMSTA),STASRF(NUMSTA) &,STABRF(NUMSTA),STASNO(NUMSTA),DHCNVC(LM,NUMSTA) &,DHRAIN(LM,NUMSTA) &,STADHC(LM),STADHR(LM),CPRATE(NUMSTA) &,ACPREC0(NUMSTA),CUPREC0(NUMSTA),SFCLHX0(NUMSTA),POTFLX0(NUMSTA) &,SFCSHX0(NUMSTA),SUBSHX0(NUMSTA),SNOPCX0(NUMSTA),ASWIN0(NUMSTA) &,ASWOUT0(NUMSTA),ALWIN0(NUMSTA),ALWOUT0(NUMSTA),ALWTOA0(NUMSTA) &,ASWTOA0(NUMSTA),ACSNOW0(NUMSTA),ACSNOM0(NUMSTA),SSROFF0(NUMSTA) &,BGROFF0(NUMSTA),AVRAIN0(NUMSTA),APHTIM0(NUMSTA),ACUTIM0(NUMSTA) &,TCUCN0(NUMSTA,LM),TRAIN0(NUMSTA,LM)) ! write(0,*) 'past alloc 1' ALLOCATE ( DUMSOIL(NSOIL),DUMSOIL3(IM,NSOIL,JM) &,DUM3D(IM,JM,LM),DUM3D2(IM,JM,LM+1),DUM3DIKJ(IM,LM,JM) &,DUM3D3(IM,JM,LM+1),DUMMY2(IM,JM),DUMMY(IM,JM) &,PD(NUMSTA),PDS(NUMSTA) &,PMID(NUMSTA,LM),PINT(NUMSTA,LM+1) &,W(NUMSTA,LM+1),WH(NUMSTA,LM) ) ! write(0,*) 'past alloc 2' ALLOCATE(GDLAT(IM,JSTA_2L:JEND_2U)) ALLOCATE(GDLON(IM,JSTA_2L:JEND_2U)) allocate(glon1d(impf*jmpf)) allocate(glat1d(impf*jmpf)) ! write(0,*) 'past alloc 3' ALLOCATE(GDLAT2(IM,JSTA:JEND)) ALLOCATE(GDLON2(IM,JSTA:JEND)) ! write(0,*) 'past alloc 4' ALLOCATE(IDUM(IM,JM),LMH(IM,JM),IDUMMY(IM,JM)) ! write(0,*) 'past allocated' if (ITAG .eq. 0) then PRINT_DIAG=.TRUE. else PRINT_DIAG=.FALSE. endif ! write(0,*) 'allocated' HBM2=1.0 if (mype .eq. 0) then write(0,*) 'filename here: ', filename endif ! start reading nemsio files using parallel read ! fldsize=(jend-jsta+1)*im ! tmpsize=fldsize*nrec ! allocate(tmp(tmpsize)) ! tmp=0. ! write(0,*) 'shape(tmp): ', shape(tmp) ! write(0,*) 'call nemsio_denseread' ! call nemsio_denseread(nfile,1,im,jsta,jend,tmp,iret=iret) ! write(0,*) 'past nemsio_denseread' ! if(iret/=0)then ! write(0,*) 'failure using mpi io read, stopping' ! write(0,*) 'iret: ', iret ! stop ! end if varname='glat' VcoordName='sfc' L=1 ! write(0,*) 'call assignnemsiovar for glat' ! write(0,*) 'size(tmp): ', size(tmp) ! write(0,*) 'fldsize*nrec: ', fldsize*nrec ! write(0,*) 'call assignnemsiovar' ! write(0,*) 'return assignnemsiovar' write(0,*) 'call nemsio_readrecv' call nemsio_readrecv(nfile,trim(varname),trim(vcoordname), & L,glat1D,nframe=nframe,iret=iret) write(0,*) 'iret from nemsio read of glat: ', iret ! Check if glat is in degrees or radians, convert to degrees if ! the former if(maxval(abs(glat1D))