#include <machine.h> subroutine read_guess(jiter,lat1,lon1,nsig,sigi,sigl,& 1,8 del2,del21,a3,factsml,factvml,coriolis,slatd,& mype,nlath,nlon,jcap,nc,nc1,pln,qln,rln,& #ifdef ibm_sp trigs,trigs_2,trigs_3,& #else trigs,& #endif wgts,ltosi,ltosj,iglobal,ltosi_s,ltosj_s,itotsub,& qsat,esat,desdtv,eges,dedlps,dedq,tropprs,& deltat,hrdif,fact10,sfct,isli,sno,& veg_type,veg_frac,soil_type,soil_temp,soil_moi,& ggrid_g31,ggrid_g32,rdivs,& rcwm,rtlat,rtlon,rqlat,rqlon,& dstlast,dstb,ampdivt,npe,& my1,nsig1,k5,npes,nnjc,nnc1,nnc1l,jnpe,nlast,ncommnc,ns2,ncd2,nclevel,& nc1m,nc2,nc3,js1,js2,& spec_6,spec1_3,spec1_6,spec1_9,& tracers_6,vtid_6,pdryini_6,xncld_6,& phat_3,phat_6,phat_9,k4) !$$$ subprogram documentation block ! . . . . ! subprogram: inguessv same as inguess, but add vort,div, del(ps) ! prgmmr: parrish org: w/nmc22 date: 94-02-11 ! ! abstract: augment inguess with vort, div, grad (log(psfc)) ! ! program history log: ! 94-02-11 parrish ! 98-04-03 weiyu yang ! 99-08-24 derber, j., treadon, r., yang, w., first frozen mpp version ! ! input argument list: ! jiter - outloop iteration number, at here jiter=1 ! lat1 - number of gaussian lats in the sub-domain array ! lon1 - number of gaussian longitudes in the sub-domain array ! nsig - number of sigma levels ! nsig1 - number of sigma levels in each pe ! sigi - sigma values at interfaces of sigma layers ! sigl - sigma values at mid-point of each sigma layer ! del2 - n*(n+1)/a**2 ! a3 - hydrostatic matrix ! factsml - factor to ensure proper scalar coefficients are zero ! factvml - factor to ensure proper vector coefficients are zero ! coriolis - coriolis coefficients ! mype - pe number ! nlath - number of gaussian lats in one hemisphere ! nlon - number of longitudes ! jcap - triangular truncation ! pln,qln,rln - used by fft ! trigs - used by fft ! wgts - gaussian integration weights ! ltosi,ltosj - array element indices for gathering local subdomain grid field array ! to the global grid field array, not including the boundary grid points ! of the subdomain ! iglobal - number of the global grid points, 2*nalth*nlon ! ltosi_s,ltosj_s - array element indices for scattering global grid field array ! to local subdomain array, including the boundary grid points of ! the subdomain ! itotsub - total number of grid points of all subdomains, including their boundary area ! ampdivt - amplitude for divergence stats ! npe - total number of pes available ! ! output argument list: ! qsat - 1/(saturation) specific humidity ! deltat - time interval of first guess fields ! hrdif - time interval between first guess fields and ! its former and later guess fields ! fact10 - 10 meter wind factor ! sfct - guess skin temperature ! isli - snow-land-ice mask ! sno - snow-ice mask ! rz_ges - guess mountains on grid ! rp_ges - guess log(sfcp) on grid ! ru_ges - guess u on grid ! rv_ges - guess v on grid ! rt_ges - guess t on grid ! rq_ges - guess specific humidity on grid ! roz_ges - guess ozone on grid in each pe subdomain ! rvorts,rplons,rplats - guess vorticity and grad(log(psfc)) ! dstlast,dstb - coefs of last and guess div-tend ! ! attributes: ! language: f90 ! machine: ibm RS/6000 SP ! !$$$ use type_kinds, only: fp_kind,single implicit none include 'mpi_inc.h' include 'ijstart.h' character(12) sigg03,sigg09 logical ice integer nc,jcap,iglobal,itotsub,lon1,lat1,jiter,nsig,nlon,nlath,mype,ns2 integer j,i,ncommnc,nlast,ncd2,izero,nclevel,npes,nsig1,npe,nnjc,jnpe integer nnc1l,nnc1,nming_ges,nmings,ingsx,nmings2,k1,k,iwan,nrec,nming2 integer ii,nmype,lon2,lat2,it1,ierr,it,inges,isfc,ns1,nc1,n1,iix,ncy integer mm1,nsfc,ncyc,nhdif integer,dimension(2*nlath*nlon):: ltosi,ltosj integer,dimension(3*nlath*nlon):: ltosi_s,ltosj_s integer,dimension(nsig1):: k5,my1,k4 integer,dimension(nclevel):: nc2,nc3,js1,js2,nc1m integer idateg(4),idate5(5) real(fp_kind) ampdivt,deltat,zero real(fp_kind),dimension(ncd2,nlath):: pln,qln,rln #ifdef ibm_sp real(fp_kind),dimension(50000+nlon*4):: trigs,trigs_2,trigs_3 #else real(fp_kind),dimension(nlon+15):: trigs #endif real(fp_kind) wgts(2*nlath) real(fp_kind),dimension(lat1+2,lon1+2,nsig,3):: rdivs real(fp_kind),dimension(lat1+2,lon1+2,nsig,3):: rcwm,rtlat,rtlon,rqlat,rqlon real(fp_kind),dimension(lat1+2,lon1+2,nsig):: rdivs1 real(fp_kind),dimension(lat1+2):: coriolis,slatd real(single) hourg4 real(fp_kind) hourg,hrdif(2) real(fp_kind),dimension(nc):: factsml,factvml,del21 real(fp_kind),dimension(nnc1l):: del2 real(fp_kind),dimension(nnc1l,nsig):: dstlast,dstb real(fp_kind),dimension(nsig):: sigl real(fp_kind),dimension(nsig+1):: sigi real(fp_kind),dimension(nsig,nsig):: a3 real(fp_kind),dimension(nc,nsig1):: spec_6 real(fp_kind),dimension(3,nnc1l,npes):: spec1_3,spec1_6,spec1_9,phat_3,& phat_6,phat_9 real(single) tracers_3,vtid_3,pdryini_3,xncld_3 real(single) tracers_6,vtid_6,pdryini_6,xncld_6 real(single) tracers_9,vtid_9,pdryini_9,xncld_9 real(fp_kind) buffer_time(3) #ifdef ibm_sp integer ireq_time integer,dimension(MPI_STATUS_SIZE)::istat_time integer,dimension(9):: ireq_sfc integer,dimension(MPI_STATUS_SIZE,9)::istat_sfc #endif real(fp_kind),dimension(lat1+2,lon1+2,nsig):: qsat,esat,desdtv,eges,dedlps,dedq integer,dimension(lat1+2,lon1+2):: isli real(fp_kind),dimension(lat1+2,lon1+2):: fact10,sfct,sno,veg_type,veg_frac,tropprs real(fp_kind),dimension(lat1+2,lon1+2):: soil_type,soil_temp,soil_moi,sli real(fp_kind),dimension(3,lat1+2,lon1+2,npes):: ggrid_g31 real(fp_kind),dimension(3,lat1+2,lon1+2,npes,2):: ggrid_g32 real(fp_kind),allocatable,dimension(:,:):: sfc_g ! Start read_guess here. ! !ibm* prefetch_for_store(zero,izero,n1,ns1,inges) zero=0.0; izero=0 n1=nsig+1; ns1=2*nsig+1 ! ! Set 3 and 9 hour sigma file names based on outer iteration number inges=11 if (jiter==1) then ! ! Read surface fields needed for near surface winds and radiance data. !ibm* prefetch_for_store(isfc,nsfc,ncyc,ireq_sfc) isfc=15 nsfc=9 ncyc = (nsfc-1)/npe+1 #ifdef ibm_sp ireq_sfc=mpi_request_null #endif open(isfc,file='sfcanl',form='unformatted') allocate (sfc_g(itotsub,ncyc) ) !ibm* prefetch_for_store(mm1,iix) mm1=mype+1 iix=izero do ncy=1,ncyc do ii=1,npe iix=iix+1 if(iix<nsfc+1)then !ibm* prefetch_for_store(nmype,nrec) nmype=npe-iix+(ncy-1)*npe if(iix == 1)nrec=3 ! surface skin temperature if(iix == 2)nrec=5 ! snow depth if(iix == 3)nrec=13 ! sea land ice factor if(iix == 4)nrec=16 ! 10m wind factor if(iix == 5)nrec=17 ! veg type if(iix == 6)nrec=14 ! veg fraction if(iix == 7)nrec=18 ! soil type if(iix == 8)nrec=6 ! soil temperature if(iix == 9)nrec=4 ! soil moisture if (mype==nmype)call rdbges(sfc_g(1,ncy),nlath,nlon,isfc,nrec, & ltosi_s,ltosj_s,itotsub) #ifdef ibm_sp if(iix == 1)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,sfct,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 2)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,sno,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 3)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,sli,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 4)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,fact10,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 5)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,veg_type,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 6)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,veg_frac,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 7)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,soil_type,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 8)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,soil_temp,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) else if(iix == 9)then call mpe_iscatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,soil_moi,ijn_s(mm1),& mpi_rtype,nmype,mpi_comm_world,ireq_sfc(iix),ierror) end if #else if(iix==1)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,sfct,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==2)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,sno,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==3)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,sli,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==4)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,fact10,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==5)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,veg_type,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==6)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,veg_frac,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==7)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,soil_type,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==8)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,soil_temp,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) else if(iix==9)then call mpi_scatterv(sfc_g(1,ncy),ijn_s,displs_s,mpi_rtype,soil_moi,& ijn_s(mm1),mpi_rtype,nmype,mpi_comm_world,ierror) end if #endif end if end do end do close(isfc) !ibm* prefetch_for_store(sigg03,sigg09) open(inges,file='sigf06',form='unformatted') open(12,file='sigf03',form='unformatted') open(13,file='sigf09',form='unformatted') endif !! else !ibm* prefetch_for_store(sigg03,sigg09) !! open(inges,file='siganl',form='unformatted') !! open(12,file='sanl03',form='unformatted') !! open(13,file='sanl09',form='unformatted') !! endif ! ggrid_g3--- u, z, q, plat, --- v, empty, oz, plon, --- ! vort, ps, hs, sfcts. call inguessv(ggrid_g31,inges,lat1,lon1,nsig,hourg,idateg,rdivs,& rcwm,& rtlat,rtlon,rqlat,rqlon,& del21,factsml,factvml,mype,nlath,nlon,jcap,nc,nc1,& pln,qln,rln,trigs,ltosi_s,ltosj_s,itotsub,npe,& #ifdef ibm_sp trigs_2,trigs_3,& #endif my1,nsig1,npes,ns2,ncd2,nclevel,nnc1,nnc1l,nnjc,& nc1m,nc2,nc3,js1,js2,& spec_6,spec1_6,& tracers_6,vtid_6,pdryini_6,xncld_6,jiter,phat_6,jnpe,nlast,ncommnc,k4) close(inges) ! Compute 1/(saturation) specific humidity from 6 hour guess fields. ! This is used in the moisture (limq) constraint in pcgsoi. !ibm* prefetch_for_store(k1) k1=n1 do k=1,nsig k1=k1+1 do j=1,lon1+2 do i=1,lat1+2 !ibm* prefetch_for_store(qsat(i,j,k),rdivs1(i,j,k)) qsat(i,j,k)=ggrid_g31(1,i,j,k1) ! q. rdivs1(i,j,k)=rdivs(i,j,k,1) end do end do end do !ibm* prefetch_for_store(ice) ice=.true. call genqsat(ggrid_g31,qsat,esat,lat1,lon1,nsig,sigl,desdtv,ice,npes) call vapres(ggrid_g31,sigl,lat1,lon1,nsig,eges,dedlps,dedq,npes) ! ! Compute full divergence tendency from 6 hour guess fields. ! This is used for the divergence tendency constraint in pcgsoi ! ! ***NOTE: rdivs contains divergence on input; vertical velocity on output ! if(ampdivt>zero) then call fulldivt(ggrid_g31,rdivs1,nsig,lat1,lon1,del2,& a3,sigl,sigi,dstlast,coriolis,mype,nlath,nlon,jcap,nc,nc1,& pln,qln,rln,trigs,wgts,ltosi,ltosj,iglobal,npe,nsig1,npes,my1,& nnc1,nnc1l,jnpe,nlast,ncommnc,ns2,k5,ncd2) if(jiter==1.and.nnjc/=izero) then do k=1,nsig do i=1,nnc1l !ibm* prefetch_for_store(dstb(i,k)) dstb(i,k)=dstlast(i,k) end do end do end if end if ! Compute tropopause level (in pressure, hPa) call tpause(lat1,lon1,nsig,npes,ggrid_g31,sigl,slatd,tropprs) ! ! Check for consistency of times from guess files. Do all this on pe 0 if(jiter == 1)then if(mype==0) then !ibm* prefetch_for_store(iwan,deltat,hrdif) iwan=izero; deltat=-9999.0; hrdif=zero !ibm* prefetch_for_store(idate5(1),idate5(2)) idate5(1)=idateg(4); idate5(2)=idateg(2) !ibm* prefetch_for_store(idate5(3),idate5(4),idate5(5)) idate5(3)=idateg(3); idate5(4)=idateg(1); idate5(5)=0 call w3fs21(idate5,nmings) !ibm* prefetch_for_store(nming_ges) nming_ges=nmings+60*hourg write(6,*) 'READ_GUESS: guess file hourg,idateg,nming_ges=',hourg,idateg,& nming_ges if(abs(hourg)>6.001) iwan=iwan+1 do i=1,2 !ibm* prefetch_for_store(ingsx) ingsx=11+i rewind ingsx read(ingsx,end=1112) read(ingsx,end=1112) hourg4,idateg rewind ingsx !ibm* prefetch_for_store(hourg) hourg = hourg4 !ibm* prefetch_for_store(idate5(1),idate5(2)) idate5(1)=idateg(4); idate5(2)=idateg(2) !ibm* prefetch_for_store(idate5(3),idate5(4),idate5(5)) idate5(3)=idateg(3); idate5(4)=idateg(1); idate5(5)=izero call w3fs21(idate5,nmings2) !ibm* prefetch_for_store(nming2) nming2=nmings2+60*hourg write(6,*)'READ_GUESS: supplementary guess file ',hourg,idateg write(6,*)'READ_GUESS: for suppl. guess file, nming2=',nming2 if(nmings2/=nmings.and.(nmings-nmings2)/=360) iwan=iwan+1 !ibm* prefetch_for_store(nhdif, hrdif(i)) nhdif=(nming2-nming_ges)/60.0 hrdif(i)=nhdif if(abs(nhdif)/=3) iwan=iwan+1 go to 1113 1112 continue iwan=iwan+1 1113 continue end do if(iwan==0) then !ibm* prefetch_for_store(deltat) deltat=180.0 end if write(6,*)'READ_GUESS: deltat = ',deltat !ibm* prefetch_for_store(buffer_time(1),buffer_time(2),buffer_time(3)) buffer_time(1) = deltat buffer_time(2) = hrdif(1) buffer_time(3) = hrdif(2) end if !ibm* prefetch_for_store(ireq_time) #ifdef ibm_sp ireq_time=mpi_request_null call mpe_ibcast(buffer_time,3,mpi_rtype,0,mpi_comm_world,ireq_time,ierr) #else call mpi_bcast(buffer_time,3,mpi_rtype,0,mpi_comm_world,ierr) #endif ! ! Wait to get times and surface fields. Load snow-land-ice mask ! into integer array, isli. Then, deallocate work arrays. #ifdef ibm_sp call mpi_wait(ireq_time,istat_time,ierror) #endif !ibm* prefetch_for_store(deltat,hrdif(1),hrdif(2)) deltat = buffer_time(1) hrdif(1) = buffer_time(2) hrdif(2) = buffer_time(3) #ifdef ibm_sp call mpi_waitall(nsfc,ireq_sfc,istat_sfc,ierror) #endif do j=1,lon1+2 do i=1,lat1+2 !ibm* prefetch_for_store(isli(i,j)) isli(i,j)=nint(sli(i,j)+0.0000001) end do end do deallocate(sfc_g) end if ! ! If 3 and/or 9 hour guess fields are available, read them in. if(deltat>zero) then do it=1,2 !ibm* prefetch_for_store(it1,ingsx) ingsx=11+it if(it==1) then call inguessv(ggrid_g32(1,1,1,1,it),ingsx,lat1,lon1,nsig,& hourg,idateg,rdivs(1,1,1,it+1),& rcwm(1,1,1,it+1),& rtlat(1,1,1,it+1),rtlon(1,1,1,it+1),& rqlat(1,1,1,it+1),rqlon(1,1,1,it+1),& del21,factsml,factvml,mype,nlath,nlon,jcap,nc,nc1,& pln,qln,rln,trigs,ltosi_s,ltosj_s,itotsub,npe,& #ifdef ibm_sp trigs_2,trigs_3,& #endif my1,nsig1,npes,ns2,ncd2,nclevel,nnc1,nnc1l,nnjc,& nc1m,nc2,nc3,js1,js2,& spec_6,spec1_3,& tracers_3,vtid_3,pdryini_3,xncld_3,jiter,phat_3,jnpe,nlast,ncommnc,k4) else call inguessv(ggrid_g32(1,1,1,1,it),ingsx,lat1,lon1,nsig,& hourg,idateg,rdivs(1,1,1,it+1),& rcwm(1,1,1,it+1),& rtlat(1,1,1,it+1),rtlon(1,1,1,it+1),& rqlat(1,1,1,it+1),rqlon(1,1,1,it+1),& del21,factsml,factvml,mype,nlath,nlon,jcap,nc,nc1,& pln,qln,rln,trigs,ltosi_s,ltosj_s,itotsub,npe,& #ifdef ibm_sp trigs_2,trigs_3,& #endif my1,nsig1,npes,ns2,ncd2,nclevel,nnc1,nnc1l,nnjc,& nc1m,nc2,nc3,js1,js2,& spec_6,spec1_9,& tracers_9,vtid_9,pdryini_9,xncld_9,jiter,phat_9,jnpe,nlast,ncommnc,k4) end if close(ingsx) end do ! No 3 and/or 9 hour guess fields. Set equal to 6 hour forecast else do it=1,2 do k=1,npes do j=1,lon1+2 do i=1,lat1+2 !ibm* prefetch_for_store(ggrid_g32(1,i,j,k,it)) ggrid_g32(1,i,j,k,it)=ggrid_g31(1,i,j,k) !ibm* prefetch_for_store(ggrid_g32(2,i,j,k,it)) ggrid_g32(2,i,j,k,it)=ggrid_g31(2,i,j,k) !ibm* prefetch_for_store(ggrid_g32(3,i,j,k,it)) ggrid_g32(3,i,j,k,it)=ggrid_g31(3,i,j,k) end do end do end do end do lon2=lon1+2 lat2=lat1+2 do it=2,3 do k=1,nsig do j=1,lon2 do i=1,lat2 rdivs(i,j,k,it) = rdivs(i,j,k,1) rcwm(i,j,k,it) = rcwm(i,j,k,1) rtlat(i,j,k,it) = rtlat(i,j,k,1) rtlon(i,j,k,it) = rtlon(i,j,k,1) rqlat(i,j,k,it) = rqlat(i,j,k,1) rqlon(i,j,k,it) = rqlon(i,j,k,1) end do end do end do end do endif ! ! End of routine return end