From 50190015445427a6671cf6060494ae50a8de1234 Mon Sep 17 00:00:00 2001 From: "john.derber" Date: Thu, 4 Nov 2021 14:44:13 +0000 Subject: [PATCH 01/26] GitHub Issue NOAA-EMC/GSI#219. Improve minimization and fix bug in vqc. --- src/gsi/berror.f90 | 147 ++++++---------------------- src/gsi/compute_derived.f90 | 7 +- src/gsi/compute_qvar3d.f90 | 4 +- src/gsi/constants.f90 | 1 - src/gsi/crtm_interface.f90 | 36 +++---- src/gsi/evalqlim.f90 | 8 +- src/gsi/genqsat.f90 | 3 +- src/gsi/gsimod.F90 | 8 +- src/gsi/intjcmod.f90 | 6 +- src/gsi/jfunc.f90 | 8 +- src/gsi/observer.F90 | 6 -- src/gsi/pcgsoi.f90 | 110 ++++++++++----------- src/gsi/prt_guess.f90 | 8 +- src/gsi/read_guess.F90 | 4 +- src/gsi/setupcldtot.F90 | 1 - src/gsi/setupq.f90 | 15 ++- src/gsi/setuprhsall.f90 | 5 - src/gsi/setupw.f90 | 29 +++--- src/gsi/stpcalc.f90 | 185 ++++++++++++++++++------------------ src/gsi/stpjcmod.f90 | 14 +-- src/gsi/stpw.f90 | 38 ++++---- src/gsi/update_guess.f90 | 4 +- 22 files changed, 268 insertions(+), 379 deletions(-) diff --git a/src/gsi/berror.f90 b/src/gsi/berror.f90 index 71bd4f1ea8..3a683c9b94 100644 --- a/src/gsi/berror.f90 +++ b/src/gsi/berror.f90 @@ -33,7 +33,6 @@ module berror ! 2011-04-07 todling - move newpc4pred to radinfo ! 2012-10-09 Gu - add fut2ps to project unbalanced temp to surface pressure in static B modeling ! 2013-05-27 zhu - add background error variances for aircraft temperature bias correction coefficients -! 2013-10-02 zhu - add reset_predictors_var ! ! subroutines included: ! sub init_berror - initialize background error related variables @@ -120,7 +119,6 @@ module berror public :: create_berror_vars public :: destroy_berror_vars public :: set_predictors_var - public :: reset_predictors_var public :: init_rftable public :: initable public :: create_berror_vars_reg @@ -377,15 +375,14 @@ subroutine set_predictors_var ! !$$$ use constants, only: zero,one,two,one_tenth,r10 - use radinfo, only: ostats,varA,jpch_rad,npred,inew_rad,newpc4pred,biaspredvar - use aircraftinfo, only: aircraft_t_bc_pof,aircraft_t_bc,biaspredt,ntail,npredt,ostats_t,varA_t + use radinfo, only: varA,jpch_rad,npred,inew_rad,newpc4pred,biaspredvar + use aircraftinfo, only: aircraft_t_bc_pof,aircraft_t_bc,biaspredt,ntail,npredt,varA_t use gridmod, only: twodvar_regional use jfunc, only: nrclen, ntclen implicit none integer(i_kind) i,j,ii real(r_kind) stndev - real(r_kind) obs_count logical new_tail stndev = one/biaspredvar @@ -407,17 +404,12 @@ subroutine set_predictors_var do j=1,npred ii=ii+1 if (inew_rad(i)) then - varprd(ii)=10000.0_r_kind + varA(j,i)=r10 else - if (ostats(i)<=20.0_r_kind) then - varA(j,i)=two*varA(j,i)+1.0e-6_r_kind - varprd(ii)=varA(j,i) - else - varprd(ii)=1.1_r_kind*varA(j,i)+1.0e-6_r_kind - end if - if (varprd(ii)>r10) varprd(ii)=r10 - if (varA(j,i)>10000.0_r_kind) varA(j,i)=10000.0_r_kind + varA(j,i)=1.1_r_kind*varA(j,i)+1.0e-6_r_kind + varA(j,i)= min(r10,varA(j,i)) end if + varprd(ii)=varA(j,i) end do end do @@ -427,50 +419,33 @@ subroutine set_predictors_var do j=1,npredt ii=ii+1 - if (aircraft_t_bc_pof) then - obs_count = ostats_t(j,i) - new_tail = varA_t(j,i)==zero - end if + new_tail = varA_t(j,i)==zero if (aircraft_t_bc) then - obs_count = ostats_t(1,i) new_tail = .true. if (any(varA_t(:,i)/=zero)) new_tail = .false. end if if (new_tail) then - varprd(ii)=one_tenth*one_tenth - if (aircraft_t_bc .and. j==2) varprd(ii)=1.0e-4_r_kind - if (aircraft_t_bc .and. j==3) varprd(ii)=1.0e-5_r_kind - else - if (obs_count<=10.0_r_kind) then - if (aircraft_t_bc .and. j==2) then - varA_t(j,i)=1.01_r_kind*varA_t(j,i)+1.0e-6_r_kind - else if (aircraft_t_bc .and. j==3) then - varA_t(j,i)=1.01_r_kind*varA_t(j,i)+1.0e-7_r_kind - else - varA_t(j,i)=1.01_r_kind*varA_t(j,i)+1.0e-5_r_kind - end if - varprd(ii)=varA_t(j,i) + if (aircraft_t_bc .and. j==2) then + varA_t(j,i)=1.0e-4_r_kind + else if (aircraft_t_bc .and. j==3) then + varA_t(j,i)=1.0e-5_r_kind else - if (aircraft_t_bc .and. j==2) then - varprd(ii)=1.005_r_kind*varA_t(j,i)+1.0e-6_r_kind - else if (aircraft_t_bc .and. j==3) then - varprd(ii)=1.005_r_kind*varA_t(j,i)+1.0e-7_r_kind - else - varprd(ii)=1.005_r_kind*varA_t(j,i)+1.0e-5_r_kind - end if + varA_t(j,i)=one_tenth*one_tenth end if - if (varprd(ii)>one_tenth) varprd(ii)=one_tenth - if (varA_t(j,i)>one_tenth) varA_t(j,i)=one_tenth + else if (aircraft_t_bc .and. j==2) then - if (varprd(ii)>1.0e-3_r_kind) varprd(ii)=1.0e-3_r_kind - if (varA_t(j,i)>1.0e-3_r_kind) varA_t(j,i)=1.0e-3_r_kind - end if - if (aircraft_t_bc .and. j==3) then - if (varprd(ii)>1.0e-4_r_kind) varprd(ii)=1.0e-4_r_kind - if (varA_t(j,i)>1.0e-4_r_kind) varA_t(j,i)=1.0e-4_r_kind + varA_t(j,i)=1.005_r_kind*varA_t(j,i)+1.0e-6_r_kind + varA_t(j,i)=min(varA_t(j,i),1.0e-3_r_kind) + else if (aircraft_t_bc .and. j==3) then + varA_t(j,i)=1.005_r_kind*varA_t(j,i)+1.0e-7_r_kind + varA_t(j,i)=min(varA_t(j,i),1.0e-4_r_kind) + else + varA_t(j,i)=1.005_r_kind*varA_t(j,i)+1.0e-5_r_kind + varA_t(j,i)=min(varA_t(j,i),one_tenth) end if end if + varprd(ii)=varA_t(j,i) end do end do end if @@ -479,70 +454,6 @@ subroutine set_predictors_var return end subroutine set_predictors_var - - subroutine reset_predictors_var -!$$$ subprogram documentation block -! . . . . -! subprogram: reset_predictors_var sets variances for bias correction predictors -! prgmmr: yanqiu org: np20 date: 2013-10-01 -! -! abstract: resets variances for bias correction predictors -! -! program history log: -! output argument list: -! 2013-10-01 zhu -! -! attributes: -! language: f90 -! machine: ibm RS/6000 SP -! -!$$$ - use constants, only: one,one_tenth - use radinfo, only: newpc4pred,jpch_rad,npred,ostats,inew_rad,iuse_rad - use aircraftinfo, only: aircraft_t_bc_pof,aircraft_t_bc,biaspredt,ntail,npredt,ostats_t - use gridmod, only: twodvar_regional - use jfunc, only: nrclen, ntclen - implicit none - - integer(i_kind) i,j,ii,obs_count - real(r_kind) stndev - - stndev = one/biaspredt - -! reset variances for bias predictor coeff. based on current data count - if (.not. twodvar_regional .and. newpc4pred) then - ii=0 - do i=1,jpch_rad - do j=1,npred - ii=ii+1 - if (.not.inew_rad(i) .and. iuse_rad(i)>0 .and. ostats(i)<=20.0_r_kind) then - varprd(ii)=1.0e-6_r_kind - end if - end do - end do - - if ((aircraft_t_bc_pof .or. aircraft_t_bc) .and. ntclen>0) then - ii=nrclen-ntclen - do i=1,ntail - do j=1,npredt - ii=ii+1 - - if (aircraft_t_bc_pof) obs_count = ostats_t(j,i) - if (aircraft_t_bc) obs_count = ostats_t(1,i) - - if (obs_count<=10.0_r_kind .and. varprd(ii)>stndev) then - varprd(ii)=stndev - if (aircraft_t_bc .and. j==2) varprd(ii)=one_tenth*stndev - if (aircraft_t_bc .and. j==3) varprd(ii)=one_tenth*one_tenth*stndev - end if - end do - end do - end if - end if - - return - end subroutine reset_predictors_var - subroutine pcinfo !$$$ subprogram documentation block ! . . . . @@ -590,13 +501,12 @@ subroutine pcinfo do i=1,jpch_rad do j=1,npred ii=ii+1 -! if (ostats(i)>zero) vprecond(nclen1+ii)=vprecond(nclen1+ii)/(one+rstats(j,i)*varprd(ii)) if (ostats(i)>zero) vprecond(nclen1+ii)=one/(one+rstats(j,i)*varprd(ii)) if (ostats(i)>20.0_r_kind) then if (rstats(j,i)>zero) then varA(j,i)=one/(one/varprd(ii)+rstats(j,i)) else - varA(j,i)=10000.0_r_kind + if(varA(j,i) <= zero)varA(j,i)=10000.0_r_kind end if end if end do @@ -612,13 +522,18 @@ subroutine pcinfo ii=ii+1 jj=jj+1 - if (aircraft_t_bc_pof) obs_count = ostats_t(j,i) - if (aircraft_t_bc) obs_count = ostats_t(1,i) + obs_count=0 + if (aircraft_t_bc_pof) then + obs_count = ostats_t(j,i) + else if (aircraft_t_bc) then + obs_count = ostats_t(1,i) + end if -! if (obs_count>zero) vprecond(nclen1+ii)=vprecond(nclen1+ii)/(one+rstats_t(j,i)*varprd(jj)) if (obs_count>zero) vprecond(nclen1+ii)=one/(one+rstats_t(j,i)*varprd(jj)) if (obs_count>3.0_r_kind) then varA_t(j,i)=one/(one/varprd(jj)+rstats_t(j,i)) + else + if(varA_t(j,i) <= zero)varA_t(j,i)=10000.0_r_kind end if end do end do diff --git a/src/gsi/compute_derived.f90 b/src/gsi/compute_derived.f90 index a33dbe1f41..46413d9986 100644 --- a/src/gsi/compute_derived.f90 +++ b/src/gsi/compute_derived.f90 @@ -89,7 +89,7 @@ subroutine compute_derived(mype,init_pass) use kinds, only: r_kind,i_kind use jfunc, only: jiter,jiterstart,& qoption,switch_on_derivatives,& - tendsflag,clip_supersaturation + tendsflag,superfact,clip_supersaturation use control_vectors, only: cvars3d use control_vectors, only: nrf_var use control_vectors, only: an_amp0 @@ -178,7 +178,6 @@ subroutine compute_derived(mype,init_pass) if(init_pass .and. (ntguessig<1 .or. ntguessig>nfldsig)) & call die(myname,'invalid init_pass, ntguessig =',ntguessig) - ! Get required indexes from control vector names nrf3_q=getindex(cvars3d,'q') iq_loc=getindex(nrf_var,'q') @@ -202,12 +201,12 @@ subroutine compute_derived(mype,init_pass) ! Limit q to be >= qmin ges_q(i,j,k)=max(ges_q(i,j,k),qmin) ! limit q to be <= ges_qsat - if(clip_supersaturation) ges_q(i,j,k) = min(ges_q(i,j,k),ges_qsat(i,j,k,ii)) + if(clip_supersaturation) ges_q(i,j,k) = min(ges_q(i,j,k),superfact*ges_qsat(i,j,k,ii)) end do end do end do end do - + ! Load guess cw for use in inner loop ! Get pointer to cloud water mixing ratio it=ntguessig diff --git a/src/gsi/compute_qvar3d.f90 b/src/gsi/compute_qvar3d.f90 index 54aa7721bf..851212d4f5 100644 --- a/src/gsi/compute_qvar3d.f90 +++ b/src/gsi/compute_qvar3d.f90 @@ -37,7 +37,7 @@ subroutine compute_qvar3d !$$$ use kinds, only: r_kind,i_kind,r_single use berror, only: dssv - use jfunc, only: varq,qoption,varcw,cwoption,clip_supersaturation + use jfunc, only: varq,qoption,varcw,cwoption,clip_supersaturation,superfact use derivsmod, only: qsatg,qgues use control_vectors, only: cvars3d use gridmod, only: lat2,lon2,nsig @@ -94,7 +94,7 @@ subroutine compute_qvar3d ! Limit q to be >= qmin ges_q(i,j,k)=max(ges_q(i,j,k),qmin) ! Limit q to be <= ges_qsat - if(clip_supersaturation) ges_q(i,j,k)=min(ges_q(i,j,k),ges_qsat(i,j,k,it)) + if(clip_supersaturation) ges_q(i,j,k)=min(ges_q(i,j,k),superfact*ges_qsat(i,j,k,it)) end do end do end do diff --git a/src/gsi/constants.f90 b/src/gsi/constants.f90 index da2368d70f..77aa027061 100644 --- a/src/gsi/constants.f90 +++ b/src/gsi/constants.f90 @@ -238,7 +238,6 @@ module constants real(r_kind),parameter:: ke2 = 0.00002_r_kind real(r_kind),parameter:: row = r1000 real(r_kind),parameter:: rrow = one/row -! real(r_kind),parameter:: qmin = 1.e-7_r_kind !lower bound on ges_q ! Constant used to process ozone real(r_kind),parameter:: constoz = 604229.0_r_kind diff --git a/src/gsi/crtm_interface.f90 b/src/gsi/crtm_interface.f90 index d03715059f..3de679f7f4 100644 --- a/src/gsi/crtm_interface.f90 +++ b/src/gsi/crtm_interface.f90 @@ -171,8 +171,6 @@ module crtm_interface real(r_kind) , save ,allocatable,dimension(:,:) :: cloud_efr ! effective radius of cloud type in CRTM real(r_kind) , save ,allocatable,dimension(:) :: cf ! effective radius of cloud type in CRTM real(r_kind) , save ,allocatable,dimension(:) :: hwp_guess ! column total for each hydrometeor - - real(r_kind) , save ,allocatable,dimension(:,:,:,:) :: gesqsat ! qsat to calc rh for aero particle size estimate real(r_kind) , save ,allocatable,dimension(:) :: table,table2,tablew ! GFDL saturation water vapor pressure tables real(r_kind) , save ,allocatable,dimension(:) :: des2,desw ! GFDL saturation water vapor presure real(r_kind) , save ,allocatable,dimension(:) :: lcloud4crtm_wk ! cloud info usage index for each channel @@ -326,7 +324,6 @@ subroutine init_crtm(init_pass,mype_diaghdr,mype,nchanl,nreal,isis,obstype,radmo use radinfo, only: crtm_coeffs_path use radinfo, only: radjacindxs,radjacnames,jpch_rad,nusis,nuchan use aeroinfo, only: aerojacindxs - use guess_grids, only: ges_tsen,ges_prsl,nfldsig use gridmod, only: fv3_full_hydro use mpeu_util, only: getindex use constants, only: zero,max_varname_length @@ -347,9 +344,9 @@ subroutine init_crtm(init_pass,mype_diaghdr,mype,nchanl,nreal,isis,obstype,radmo integer(i_kind), parameter :: length = 2621 ! lenth of GFL qsat table ! local variables - integer(i_kind) :: ier,ii,error_status,iderivative + integer(i_kind) :: ier,ii,error_status integer(i_kind) :: k, subset_start, subset_end - logical :: ice,Load_AerosolCoeff,Load_CloudCoeff + logical :: Load_AerosolCoeff,Load_CloudCoeff character(len=20),dimension(1) :: sensorlist integer(i_kind) :: indx,iii,icloud4crtm ! ...all "additional absorber" variables @@ -840,16 +837,6 @@ subroutine init_crtm(init_pass,mype_diaghdr,mype,nchanl,nreal,isis,obstype,radmo endif ! nvege_type endif ! regional or IGBP -! Calculate RH when aerosols are present and/or cloud-fraction used - if (n_actual_aerosols_wk>0 .or. n_clouds_fwd_wk>0) then - allocate(gesqsat(lat2,lon2,nsig,nfldsig)) - ice=.true. - iderivative=0 - do ii=1,nfldsig - call genqsat(gesqsat(1,1,1,ii),ges_tsen(1,1,1,ii),ges_prsl(1,1,1,ii),lat2,lon2,nsig,ice,iderivative) - end do - endif - ! Initial GFDL saturation water vapor pressure tables if (n_actual_aerosols_wk>0 .or. n_clouds_fwd_wk>0 .and. imp_physics==11) then @@ -905,7 +892,6 @@ subroutine destroy_crtm if (error_status /= success) & write(6,*)myname_,': ***ERROR*** error_status=',error_status if (n_actual_aerosols_wk>0 .or. n_clouds_fwd_wk>0) then - deallocate(gesqsat) if (imp_physics==11) then deallocate(table) deallocate(table2) @@ -1048,7 +1034,7 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & use radinfo, only: nsigradjac use gsi_nstcouplermod, only: nst_gsi use guess_grids, only: ges_tsen,& - ges_prsl,ges_prsi,tropprs,dsfct,add_rtm_layers, & + ges_prsl,ges_prsi,ges_qsat,tropprs,dsfct,add_rtm_layers, & hrdifsig,nfldsig,hrdifsfc,nfldsfc,ntguessfc,isli2,sno2, & hrdifaer,nfldaer ! for separate aerosol input file use cloud_efr_mod, only: efr_ql,efr_qi,efr_qr,efr_qs,efr_qg,efr_qh @@ -1908,14 +1894,14 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & end if ! lread_ext_aerosol end if ! n_actual_aerosols_wk > 0 do k=1,nsig - qs(k) = (gesqsat(ix ,iy ,k,itsig )*w00+ & - gesqsat(ixp,iy ,k,itsig )*w10+ & - gesqsat(ix ,iyp,k,itsig )*w01+ & - gesqsat(ixp,iyp,k,itsig )*w11)*dtsig + & - (gesqsat(ix ,iy ,k,itsigp)*w00+ & - gesqsat(ixp,iy ,k,itsigp)*w10+ & - gesqsat(ix ,iyp,k,itsigp)*w01+ & - gesqsat(ixp,iyp,k,itsigp)*w11)*dtsigp + qs(k) = (ges_qsat(ix ,iy ,k,itsig )*w00+ & + ges_qsat(ixp,iy ,k,itsig )*w10+ & + ges_qsat(ix ,iyp,k,itsig )*w01+ & + ges_qsat(ixp,iyp,k,itsig )*w11)*dtsig + & + (ges_qsat(ix ,iy ,k,itsigp)*w00+ & + ges_qsat(ixp,iy ,k,itsigp)*w10+ & + ges_qsat(ix ,iyp,k,itsigp)*w01+ & + ges_qsat(ixp,iyp,k,itsigp)*w11)*dtsigp rh(k) = q(k)/qs(k) end do endif diff --git a/src/gsi/evalqlim.f90 b/src/gsi/evalqlim.f90 index 085fa87724..a5ad216cd8 100644 --- a/src/gsi/evalqlim.f90 +++ b/src/gsi/evalqlim.f90 @@ -33,7 +33,7 @@ subroutine evalqlim(sval,pbc,rval) use kinds, only: r_kind,i_kind,r_quad use constants, only: zero,one,zero_quad use gridmod, only: lat1,lon1,nsig,istart,wgtfactlats - use jfunc, only: factqmin,factqmax + use jfunc, only: factqmin,factqmax,superfact use derivsmod, only: qgues,qsatg use mpl_allreducemod, only: mpl_allreduce use gsi_bundlemod, only: gsi_bundle @@ -83,9 +83,9 @@ subroutine evalqlim(sval,pbc,rval) endif ! Compute penalty for excess q if (q>qsatg(i,j,k)) then - term=(factqmax*wgtfactlats(ii))*(q-qsatg(i,j,k))& - /(qsatg(i,j,k)*qsatg(i,j,k)) - zbc(2) = zbc(2) + term*(q-qsatg(i,j,k)) + term=(factqmax*wgtfactlats(ii))*((q-superfact*qsatg(i,j,k))& + /qsatg(i,j,k))**2 + zbc(2) = zbc(2) + term ! Adjoint rq(i,j,k) = rq(i,j,k) + term endif diff --git a/src/gsi/genqsat.f90 b/src/gsi/genqsat.f90 index 2719ed28f8..ed0eb152e6 100644 --- a/src/gsi/genqsat.f90 +++ b/src/gsi/genqsat.f90 @@ -121,7 +121,6 @@ subroutine genqsat(qsat,tsen,prsl,lat2,lon2,nsig,ice,iderivative) end do do i=1,lat2 tdry = mint(i) - if( abs(tdry) < 1.0e-8_r_kind ) tdry = 1.0e-8_r_kind tr = ttp/tdry if (tdry >= ttp .or. .not. ice) then estmax(i) = psat * (tr**xa) * exp(xb*(one-tr)) @@ -137,7 +136,6 @@ subroutine genqsat(qsat,tsen,prsl,lat2,lon2,nsig,ice,iderivative) do k = 1,nsig do i = 1,lat2 tdry = tsen(i,j,k) - if( abs(tdry) < 1.0e-8_r_kind ) tdry = 1.0e-8_r_kind tr = ttp/tdry if (tdry >= ttp .or. .not. ice) then es = psat * (tr**xa) * exp(xb*(one-tr)) @@ -164,6 +162,7 @@ subroutine genqsat(qsat,tsen,prsl,lat2,lon2,nsig,ice,iderivative) qsat(i,j,k) = max(qmin,qsat(i,j,k)) if(iderivative > 0)then +! if(es <= esmax .and. iderivative == 2 .and. qsat(i,j,k) > qmin )then if(es <= esmax .and. iderivative == 2)then idpupdate=.true. idtupdate=.true. diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index 48a6475eee..1e12efdd39 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -93,7 +93,7 @@ module gsimod pvis,pcldch,scale_cv,estvisoe,estcldchoe,vis_thres,cldch_thres,cao_check use qcmod, only: troflg,lat_c,nrand use pcpinfo, only: npredp,diag_pcp,dtphys,deltim,init_pcp - use jfunc, only: iout_iter,iguess,miter,factqmin,factqmax, & + use jfunc, only: iout_iter,iguess,miter,factqmin,factqmax,superfact,limitqobs, & factql,factqi,factqr,factqs,factqg, & factv,factl,factp,factg,factw10m,facthowv,factcldch,niter,niter_no_qc,biascor,& init_jfunc,qoption,cwoption,switch_on_derivatives,tendsflag,jiterstart,jiterend,R_option,& @@ -489,6 +489,8 @@ module gsimod ! gencode - source generation code ! factqmin - weighting factor for negative moisture constraint ! factqmax - weighting factor for supersaturated moisture constraint +! superfact- amount of supersaturation allowed 1.01 = 1% supersaturation +! limitqobs- limit q obs to be <= 100%RH based on model temperatures ! clip_supersaturation - flag to remove supersaturation during each outer loop default=.false. ! deltim - model timestep ! dtphys - physics timestep @@ -686,7 +688,7 @@ module gsimod ! NOTE: for now, if in regional mode, then iguess=-1 is forced internally. ! add use of guess file later for regional mode. - namelist/setup/gencode,factqmin,factqmax,clip_supersaturation, & + namelist/setup/gencode,factqmin,factqmax,superfact,limitqobs,clip_supersaturation, & factql,factqi,factqr,factqs,factqg, & factv,factl,factp,factg,factw10m,facthowv,factcldch,R_option,deltim,dtphys,& biascor,bcoption,diurnalbc,& @@ -1942,6 +1944,8 @@ subroutine gsimain_initialize dmesh=one factqmin=zero factqmax=zero + superfact=1._r_kind + limitqobs=.false. if (hilbert_curve) then write(6,*) 'Disabling hilbert_curve cross validation when oneobtest=.true.' hilbert_curve=.false. diff --git a/src/gsi/intjcmod.f90 b/src/gsi/intjcmod.f90 index d264cd4b5c..c0c23151ee 100644 --- a/src/gsi/intjcmod.f90 +++ b/src/gsi/intjcmod.f90 @@ -71,7 +71,7 @@ subroutine intlimq(rval,sval,itbin) ! !$$$ use gridmod, only: nsig,lat1,lon1,istart,wgtfactlats - use jfunc, only: factqmin,factqmax + use jfunc, only: factqmin,factqmax,superfact use gsi_metguess_mod, only: gsi_metguess_bundle use guess_grids, only: ges_qsat use mpimod, only: mype @@ -116,8 +116,8 @@ subroutine intlimq(rval,sval,itbin) /(ges_qsat(i,j,k,itbin)*ges_qsat(i,j,k,itbin)) ! Upper constraint limit - else if (q > ges_qsat(i,j,k,itbin)) then - rq(i,j,k) = rq(i,j,k) + (factqmax*wgtfactlats(ii))*(q-ges_qsat(i,j,k,itbin))/ & + else if (q > superfact*ges_qsat(i,j,k,itbin)) then + rq(i,j,k) = rq(i,j,k) + (factqmax*wgtfactlats(ii))*(q-superfact*ges_qsat(i,j,k,itbin))/ & (ges_qsat(i,j,k,itbin)*ges_qsat(i,j,k,itbin)) end if diff --git a/src/gsi/jfunc.f90 b/src/gsi/jfunc.f90 index 1f1adc5702..d65b4c8fd3 100644 --- a/src/gsi/jfunc.f90 +++ b/src/gsi/jfunc.f90 @@ -130,7 +130,7 @@ module jfunc public :: switch_on_derivatives,jiterend,jiterstart,jiter,iter,niter,miter public :: diurnalbc,bcoption,biascor,nval2d,xhatsave,first public :: factqmax,factqmin,clip_supersaturation,last,yhatsave,nvals_len,nval_levs,nval_levs_ens,iout_iter,nclen - public :: factql,factqi,factqr,factqs,factqg + public :: factql,factqi,factqr,factqs,factqg,superfact,limitqobs public :: niter_no_qc,print_diag_pcg,penorig,gnormorig,iguess public :: factg,factv,factp,factl,R_option,factw10m,facthowv,factcldch,diag_precon,step_start public :: pseudo_q2 @@ -139,7 +139,7 @@ module jfunc logical first,last,switch_on_derivatives,tendsflag,print_diag_pcg,tsensible,diag_precon logical clip_supersaturation,R_option - logical pseudo_q2 + logical pseudo_q2,limitqobs logical cnvw_option integer(i_kind) iout_iter,miter,iguess,nclen,qoption,cwoption integer(i_kind) jiter,jiterstart,jiterend,iter @@ -150,7 +150,7 @@ module jfunc integer(i_kind),dimension(0:50):: niter,niter_no_qc real(r_kind) factqmax,factqmin,gnormorig,penorig,biascor(2),diurnalbc,factg,factv,factp,factl,& - factw10m,facthowv,factcldch,step_start + factw10m,facthowv,factcldch,step_start,superfact real(r_kind) factql,factqi,factqr,factqs,factqg integer(i_kind) bcoption real(r_kind),allocatable,dimension(:,:):: varq @@ -202,6 +202,8 @@ subroutine init_jfunc factqmin=zero factqmax=zero + superfact=1.00_r_kind + limitqobs=.false. factql=zero factqi=zero factqr=zero diff --git a/src/gsi/observer.F90 b/src/gsi/observer.F90 index 7ac91e5eed..00f51448ac 100644 --- a/src/gsi/observer.F90 +++ b/src/gsi/observer.F90 @@ -173,12 +173,6 @@ subroutine guess_init_ #endif /* _LAG_MODEL_ */ endif -! Read output from previous min. - if (l4dvar.and.jiterstart>1) then - else - ! If requested and if available, read guess solution. - endif - ! Generate coefficients for compact differencing if(.not.regional)then if(.not.cdiff_created()) call create_cdiff_coefs() diff --git a/src/gsi/pcgsoi.f90 b/src/gsi/pcgsoi.f90 index bce3aa0835..0f7f3d32d8 100644 --- a/src/gsi/pcgsoi.f90 +++ b/src/gsi/pcgsoi.f90 @@ -170,15 +170,14 @@ subroutine pcgsoi() character(5) step(2) integer(i_kind) i,istep,iobs,ii,nprt real(r_kind) stp,b,converge - real(r_kind) gsave,small_step + real(r_kind) gsave,small_step,aindex real(r_kind) gnormx,penx,penalty,penaltynew - real(r_double) pennorm - real(r_quad) zjo - real(r_quad) :: zdla - real(r_quad),dimension(4):: dprod - real(r_kind),dimension(3):: gnorm real(r_kind) :: zgini,zfini,fjcost(4),fjcostnew(4),zgend,zfend real(r_kind) :: fjcost_e + real(r_kind),dimension(3):: gnorm + real(r_double) pennorm + real(r_quad) :: zdla,zjo + real(r_quad),dimension(4):: dprod type(control_vector) :: gradx,grady,dirx,diry,ydiff,xdiff type(gsi_bundle) :: sval(nobs_bins), rval(nobs_bins) type(gsi_bundle) :: eval(ntlevs_ens) @@ -322,7 +321,7 @@ subroutine pcgsoi() end if ! 2. Multiply by background error - call multb(lanlerr,gradx,grady) + call multb(gradx,grady) if(iorthomax>0) then ! save gradients @@ -338,34 +337,23 @@ subroutine pcgsoi() ! 3. Calculate new norm of gradients and factors going into b calculation dprod(1) = qdot_prod_sub(gradx,grady) - if(iter > 0)then - gsave=gnorm(3) - if (lanlerr) then -! xdiff used as a temporary array - do i=1,nclen - xdiff%values(i)=vprecond(i)*gradx%values(i) - end do - dprod(2) = qdot_prod_sub(xdiff,grady) - call mpl_allreduce(2,qpvals=dprod) - gnorm(2)=dprod(2) - gnorm(3)=dprod(2) - else - do i=1,nclen - xdiff%values(i)=vprecond(i)*(gradx%values(i)-xdiff%values(i)) - ydiff%values(i)=vprecond(i)*(grady%values(i)-ydiff%values(i)) - end do - dprod(2) = qdot_prod_sub(xdiff,grady) - dprod(3) = qdot_prod_sub(ydiff,gradx) + if(iter > 0 .and. .not. lanlerr)then + dprod(3) = qdot_prod_sub(xdiff,grady) + dprod(4) = qdot_prod_sub(ydiff,gradx) ! xdiff used as a temporary array - do i=1,nclen - xdiff%values(i)=vprecond(i)*gradx%values(i) - end do - dprod(4) = qdot_prod_sub(xdiff,grady) - call mpl_allreduce(4,qpvals=dprod) -! Two dot products in gnorm(2) should be same, but are slightly -! different due to round off, so use average. - gnorm(2)=0.5_r_quad*(dprod(2)+dprod(3)) - gnorm(3)=dprod(4) + do i=1,nclen + xdiff%values(i)=vprecond(i)*gradx%values(i) + end do + dprod(2) = qdot_prod_sub(xdiff,grady) + call mpl_allreduce(4,qpvals=dprod) +! Two dot products in dprod(3) and dprod(4) should be same, but are slightly +! different due to round off, so use average. + gnorm(2)=dprod(2)-0.5_r_quad*(dprod(3)+dprod(4)) + gnorm(3)=dprod(2) + if(mype == 0)then + aindex=abs(dprod(3)/dprod(2)) + write(iout_iter,*) 'NL Index ',aindex + if(aindex > 0.5_r_kind .or. print_verbose) write(iout_iter,*) 'NL Values ', dprod(3),dprod(2) end if else ! xdiff used as a temporary array @@ -375,38 +363,36 @@ subroutine pcgsoi() dprod(2) = qdot_prod_sub(xdiff,grady) call mpl_allreduce(2,qpvals=dprod) if(print_diag_pcg) call prt_control_norms(grady,'grady') + gnorm(2)=dprod(2) gnorm(3)=dprod(2) end if gnorm(1)=dprod(1) - if(mype == 0)write(iout_iter,*)'Minimization iteration',iter + if(mype == 0)write(iout_iter,*)'Minimization iteration',iter ! 4. Calculate b and new search direction b=zero if (.not. restart .or. iter > 0) then - if (gsave>1.e-16_r_kind .and. iter>0) b=gnorm(2)/gsave - if (b7.0_r_kind) then - if (mype==0) then - if (iout_6) write(6,105) gnorm(2),gsave,b - write(iout_iter,105) gnorm(2),gsave,b + if (iter > 1 .or. .not. read_success)then + if (gsave>1.e-16_r_kind) b=gnorm(2)/gsave + if (b10.0_r_kind) then + if (mype==0) then + if (iout_6) write(6,105) gnorm(2),gsave,b + write(iout_iter,105) gnorm(2),gsave,b + endif + b=zero endif - b=zero - endif - if (mype==0 .and. print_verbose) write(6,888)'pcgsoi: gnorm(1:3),b=',gnorm,b - if(read_success .and. iter == 1)b=zero - - if (.not. lanlerr) then - do i=1,nclen - xdiff%values(i)=gradx%values(i) - ydiff%values(i)=grady%values(i) - end do + if (mype==0 .and. print_verbose) write(6,888)'pcgsoi: gnorm(1:3),b=',gnorm,b end if -! Calculate new search direction + do i=1,nclen - dirx%values(i)=-vprecond(i)*grady%values(i)+b*dirx%values(i) - diry%values(i)=-vprecond(i)*gradx%values(i)+b*diry%values(i) +! Calculate new search direction + ydiff%values(i)=vprecond(i)*grady%values(i) + dirx%values(i)=-ydiff%values(i)+b*dirx%values(i) + xdiff%values(i)=vprecond(i)*gradx%values(i) + diry%values(i)=-xdiff%values(i)+b*diry%values(i) end do else ! If previous solution available, transfer into local arrays. @@ -416,9 +402,11 @@ subroutine pcgsoi() end do call read_guess_solution(diry,mype,read_success) ! Multiply by background error - call multb(lanlerr,diry,dirx) + call multb(diry,dirx) + restart=.false. endif - + gsave=gnorm(3) + ! 5. Calculate stepsize and update solution ! Convert search direction from control space to physical space do ii=1,nobs_bins @@ -568,7 +556,7 @@ subroutine pcgsoi() end do ! Multiply by background error - call multb(lanlerr,gradx,grady) + call multb(gradx,grady) ! Print final Jo table zgend=dot_product(gradx,grady,r_quad) @@ -630,8 +618,7 @@ subroutine pcgsoi() ! if (mype==0) write(6,*)'pcgsoi: Updating guess' if(iwrtinc<=0) call update_guess(sval,sbias) -! cloud analysis after iteration -! if(jiter == miter .and. i_gsdcldanal_type==1) then +! gsd cloud analysis after iteration if(jiter == miter) then if(i_gsdcldanal_type==2) then call gsdcloudanalysis4nmmb(mype) @@ -833,7 +820,7 @@ subroutine periodic_(gradx) end subroutine periodic_ -subroutine multb(lanlerr,vec1,vec2) +subroutine multb(vec1,vec2) !$$$ subprogram documentation block ! . . . . ! subprogram: multb multiply vec1 by background error to equal vec2 @@ -863,7 +850,6 @@ subroutine multb(lanlerr,vec1,vec2) type(control_vector),intent(inout) :: vec1 type(control_vector),intent(inout) :: vec2 - logical ,intent(in ) :: lanlerr if(periodic)call periodic_(vec1) ! start by setting vec2=vec1 and then operate on vec2 (unless gram_schmidt) @@ -892,7 +878,7 @@ end subroutine multb subroutine c2s(hat,val,bias,llprt,ltest) !$$$ subprogram documentation block ! . . . . -! subprogram: multb control2state for all options +! subprogram: c2s control2state for all options ! prgmmr: derber ! ! abstract: generalized control2state @@ -958,7 +944,7 @@ end subroutine c2s subroutine c2s_ad(hat,val,bias,llprt) !$$$ subprogram documentation block ! . . . . -! subprogram: multb control2state for all options +! subprogram: c2s_ad adjoint of control2state for all options ! prgmmr: derber ! ! abstract: generalized control2state diff --git a/src/gsi/prt_guess.f90 b/src/gsi/prt_guess.f90 index ad5cb80025..e1e251195a 100644 --- a/src/gsi/prt_guess.f90 +++ b/src/gsi/prt_guess.f90 @@ -165,7 +165,7 @@ subroutine prt_guess(sgrep) zloc(nvars+7) = minval(ges_cwmr_it(2:lat1+1,2:lon1+1,1:nsig)) zloc(nvars+8) = minval(ges_cf_it(2:lat1+1,2:lon1+1,1:nsig)) zloc(nvars+9) = minval(ges_div_it(2:lat1+1,2:lon1+1,1:nsig)) - zloc(nvars+10) = minval(ges_vor_it(2:lat1+1,2:lon1+1,1:nsig)) + zloc(nvars+10) = minval(ges_vor_it(2:lat1+1,2:lon1+1,1:nsig)) zloc(nvars+11) = minval(ges_prsl (2:lat1+1,2:lon1+1,1:nsig,ntsig)) zloc(nvars+12) = minval(ges_ps_it (2:lat1+1,2:lon1+1 )) zloc(nvars+13) = minval(sfct (2:lat1+1,2:lon1+1, ntsfc)) @@ -178,7 +178,7 @@ subroutine prt_guess(sgrep) zloc(2*nvars+7) = maxval(ges_cwmr_it(2:lat1+1,2:lon1+1,1:nsig)) zloc(2*nvars+8) = maxval(ges_cf_it(2:lat1+1,2:lon1+1,1:nsig)) zloc(2*nvars+9) = maxval(ges_div_it(2:lat1+1,2:lon1+1,1:nsig)) - zloc(2*nvars+10) = maxval(ges_vor_it(2:lat1+1,2:lon1+1,1:nsig)) + zloc(2*nvars+10) = maxval(ges_vor_it(2:lat1+1,2:lon1+1,1:nsig)) zloc(2*nvars+11) = maxval(ges_prsl (2:lat1+1,2:lon1+1,1:nsig,ntsig)) zloc(2*nvars+12) = maxval(ges_ps_it (2:lat1+1,2:lon1+1 )) zloc(2*nvars+13) = maxval(sfct (2:lat1+1,2:lon1+1, ntsfc)) @@ -188,8 +188,8 @@ subroutine prt_guess(sgrep) ! Gather contributions - call mpi_allgather(zloc,3*nvars+3,mpi_rtype, & - & zall,3*nvars+3,mpi_rtype, mpi_comm_world,ierror) + call mpi_gather(zloc,3*nvars+3,mpi_rtype, & + & zall,3*nvars+3,mpi_rtype,0, mpi_comm_world,ierror) if (mype==0) then zmin=zero diff --git a/src/gsi/read_guess.F90 b/src/gsi/read_guess.F90 index 364d4e305b..ecd85aa983 100644 --- a/src/gsi/read_guess.F90 +++ b/src/gsi/read_guess.F90 @@ -89,7 +89,7 @@ subroutine read_guess(iyear,month,idd,mype) !$$$ use kinds, only: r_kind,i_kind - use jfunc, only: bcoption,clip_supersaturation + use jfunc, only: bcoption,clip_supersaturation,superfact use guess_grids, only: nfldsig,ges_tsen,load_prsges,load_geop_hgt,ges_prsl,& ges_tsen1, geop_hgti, ges_geopi, ges_q1 use m_gsiBiases,only : bkg_bias_correction,nbc @@ -250,7 +250,7 @@ subroutine read_guess(iyear,month,idd,mype) do k=1,nsig do j=1,lon2 do i=1,lat2 - satval = min(ges_q(i,j,k),satq(i,j,k)) + satval = min(ges_q(i,j,k),superfact*satq(i,j,k)) satval = max(qmin,satval) ges_q(i,j,k) = satval ges_tsen(i,j,k,it)= ges_tv(i,j,k)/(one+fv*ges_q(i,j,k)) diff --git a/src/gsi/setupcldtot.F90 b/src/gsi/setupcldtot.F90 index fc3978e3d2..565075bec3 100755 --- a/src/gsi/setupcldtot.F90 +++ b/src/gsi/setupcldtot.F90 @@ -109,7 +109,6 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di external:: tintrp2a1,tintrp2a11 external:: tintrp31,tintrp3 external:: grdcrd1 - external:: genqsat external:: stop2 ! Declare local variables diff --git a/src/gsi/setupq.f90 b/src/gsi/setupq.f90 index 77c43ba121..8189b0bcb5 100644 --- a/src/gsi/setupq.f90 +++ b/src/gsi/setupq.f90 @@ -149,13 +149,13 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav use nc_diag_read_mod, only: nc_diag_read_init, nc_diag_read_get_dim, nc_diag_read_close use gsi_4dvar, only: nobs_bins,hr_obsbin,min_offset use oneobmod, only: oneobtest,maginnov,magoberr - use guess_grids, only: ges_lnprsl,hrdifsig,nfldsig,ges_tsen,ges_prsl,pbl_height + use guess_grids, only: ges_lnprsl,hrdifsig,nfldsig,ges_tsen,ges_prsl,pbl_height,ges_qsat use gridmod, only: lat2,lon2,nsig,get_ijk,twodvar_regional use constants, only: zero,one,r1000,r10,r100 use constants, only: huge_single,wgtlim,three use constants, only: tiny_r_kind,five,half,two,huge_r_kind,r0_01 use qcmod, only: npres_print,ptopq,pbotq,dfact,dfact1,njqc,vqc,nvqc - use jfunc, only: jiter,last,jiterstart,miter + use jfunc, only: jiter,last,jiterstart,miter,superfact,limitqobs use convinfo, only: nconvtype,cermin,cermax,cgross,cvar_b,cvar_pg,ictype use convinfo, only: ibeta,ikapa use convinfo, only: icsubtype @@ -417,7 +417,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav iderivative=0 do jj=1,nfldsig call genqsat(qg(1,1,1,jj),ges_tsen(1,1,1,jj),ges_prsl(1,1,1,jj),lat2,lon2,nsig,ice,iderivative) - call genqsat(qg2m(1,1,jj),ges_tsen(1,1,1,jj),ges_prsl(1,1,1,jj),lat2,lon2, 1,ice,iderivative) + qg2m(:,:,jj)=qg(:,:,1,jj) end do @@ -516,9 +516,15 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! Scale errors by guess saturation q - call tintrp31(qg,qsges,dlat,dlon,dpres,dtime,hrdifsig,& + qob = data(iqob,i) + if(limitqobs) then + call tintrp31(ges_qsat,qsges,dlat,dlon,dpres,dtime,hrdifsig,& mype,nfldsig) + qob=min(qob,superfact*qsges) + end if + call tintrp31(qg,qsges,dlat,dlon,dpres,dtime,hrdifsig,& + mype,nfldsig) ! Interpolate 2-m qs to obs locations/times if((i_use_2mq4b > 0) .and. ((itype > 179 .and. itype < 190) .or. itype == 199) & .and. .not.twodvar_regional)then @@ -527,7 +533,6 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! Load obs error and value into local variables obserror = max(cermin(ikx)*r0_01,min(cermax(ikx)*r0_01,data(ier,i))) - qob = data(iqob,i) rmaxerr=rmaxerr*qsges rmaxerr=max(small2,rmaxerr) diff --git a/src/gsi/setuprhsall.f90 b/src/gsi/setuprhsall.f90 index 8e34876201..3efcb69859 100644 --- a/src/gsi/setuprhsall.f90 +++ b/src/gsi/setuprhsall.f90 @@ -150,7 +150,6 @@ subroutine setuprhsall(ndata,mype,init_pass,last_pass) use lag_fields, only: lag_presetup,lag_state_write,lag_state_read,lag_destroy_uv use mpeu_util, only: getindex use mpl_allreducemod, only: mpl_allreduce - use berror, only: reset_predictors_var use rapidrefresh_cldsurf_mod, only: l_PBL_pseudo_SurfobsT,l_PBL_pseudo_SurfobsQ,& l_PBL_pseudo_SurfobsUV,i_gsdcldanal_type,& i_cloud_q_innovation @@ -579,10 +578,6 @@ subroutine setuprhsall(ndata,mype,init_pass,last_pass) call mpl_allreduce(npredt,ntail,rstats_t) end if - if (newpc4pred .or. aircraft_t_bc_pof .or. aircraft_t_bc) then - call reset_predictors_var - end if - ! Collect satellite and precip. statistics call mpi_reduce(aivals,aivals1,size(aivals1),mpi_rtype,mpi_sum,mype_rad, & mpi_comm_world,ierror) diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index aa6fe55094..33f0a62957 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -253,9 +253,9 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_double) rstation_id real(r_kind) qcu,qcv,trop5,tfact,fact real(r_kind) scale,ratio,obserror,obserrlm - real(r_kind) residual,ressw,ress,val,vals,val2,valqc2,dudiff,dvdiff - real(r_kind) valqc,valu,valv,dx10,rlow,rhgh,drpx,prsfc,var_jb - real(r_kind) cg_t,cvar,wgt,term,rat_err2,qcgross + real(r_kind) residual,ressw,ress,vals,val2,dudiff,dvdiff,rat_err2u + real(r_kind) valqc,valu,valv,dx10,rlow,rhgh,drpx,prsfc,var_jb,rat_err2v + real(r_kind) cg_t,cvar,wgt,term,qcgross,valqcu,valqcv real(r_kind) presw,factw,dpres,ugesin,vgesin,rwgt,dpressave real(r_kind) sfcchk,prsln2,error,dtime,dlon,dlat,r0_001,rsig,thirty,rsigp real(r_kind) ratio_errors,goverrd,spdges,spdob,ten,psges,zsges @@ -1222,8 +1222,6 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ratio_errors=ratio_errors*sqrt(data(ihil,i)) ! hilbert weight ! Compute penalty terms (linear & nonlinear qc). if(luse(i))then - val = valu*valu+valv*valv - vals=sqrt(val) if(vqc) then cg_t=cvar_b(ikx) cvar=cvar_pg(ikx) @@ -1238,17 +1236,23 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ibb=0 ikk=0 endif + vals=valu call vqc_setup(vals,ratio_errors,error,cvar,& - cg_t,ibb,ikk,var_jb,rat_err2,wgt,valqc) - rwgt = wgt/wgtlim + cg_t,ibb,ikk,var_jb,rat_err2u,wgt,valqcu) + rwgt = 0.5_r_kind*wgt/wgtlim + vals=valv + call vqc_setup(vals,ratio_errors,error,cvar,& + cg_t,ibb,ikk,var_jb,rat_err2v,wgt,valqcv) + rwgt = rwgt+0.5_r_kind*wgt/wgtlim + valqc=valqcu+valqcv ! Accumulate statistics for obs belonging to this task if (muse(i)) then if(rwgt < one) awork(21) = awork(21)+one jsig = dpres jsig=max(1,min(jsig,nsig)) - awork(4*nsig+jsig+100)=awork(4*nsig+jsig+100)+valu*valu*rat_err2 - awork(5*nsig+jsig+100)=awork(5*nsig+jsig+100)+valv*valv*rat_err2 + awork(4*nsig+jsig+100)=awork(4*nsig+jsig+100)+valu*valu*rat_err2u + awork(5*nsig+jsig+100)=awork(5*nsig+jsig+100)+valv*valv*rat_err2v awork(6*nsig+jsig+100)=awork(6*nsig+jsig+100)+one awork(3*nsig+jsig+100)=awork(3*nsig+jsig+100)+valqc end if @@ -1257,8 +1261,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! as a function of observation type. ress = scale*sqrt(dudiff**2+dvdiff**2) ressw = ress*ress - val2 = half*(valu*valu+valv*valv) - valqc2 = half*valqc + val2 = half*(valu*valu*rat_err2u+valv*valv*rat_err2v) nn=1 if (.not. muse(i)) then nn=2 @@ -1269,8 +1272,8 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav bwork(k,ikx,1,nn) = bwork(k,ikx,1,nn)+one ! count bwork(k,ikx,2,nn) = bwork(k,ikx,2,nn)+spdb ! speed bias bwork(k,ikx,3,nn) = bwork(k,ikx,3,nn)+ressw ! (o-g)**2 - bwork(k,ikx,4,nn) = bwork(k,ikx,4,nn)+val2*rat_err2 ! penalty - bwork(k,ikx,5,nn) = bwork(k,ikx,5,nn)+valqc2 ! nonlin qc penalty + bwork(k,ikx,4,nn) = bwork(k,ikx,4,nn)+val2 ! penalty + bwork(k,ikx,5,nn) = bwork(k,ikx,5,nn)+valqc ! nonlin qc penalty end if end do diff --git a/src/gsi/stpcalc.f90 b/src/gsi/stpcalc.f90 index 8b67e35742..80fac64d61 100644 --- a/src/gsi/stpcalc.f90 +++ b/src/gsi/stpcalc.f90 @@ -280,7 +280,7 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & real(r_kind),dimension(4)::sges real(r_kind),dimension(ioutpen):: outpen,outstp logical :: cxterm,change_dels,ifound - logical :: print_verbose + logical :: print_verbose,pjcalc !************************************************************************************ @@ -296,6 +296,8 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & outpen = zero nsteptot=0 istp_use=0 + kprt=3 + pjcalc=.false. pj=zero_quad ! Begin calculating contributions to penalty and stepsize for various terms @@ -386,12 +388,13 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & pstart=zero_quad pbc=zero_quad + if(iter == 0 .and. kprt >= 2)pjcalc=.true. ! penalty, b and c for background terms pstart(1,1) = qdot_prod_sub(xhatsave,yhatsave) - pj(1,1)=pstart(1,1) + if(pjcalc)pj(1,1)=pstart(1,1) ! two terms in next line should be the same, but roundoff makes average more accurate. @@ -406,7 +409,7 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & if (ljcdfi .and. nobs_bins>1) then call stpjcdfi(dval,sval,pstart(1,2),pstart(2,2),pstart(3,2)) - pj(2,1)=pstart(1,2) + if(pjcalc)pj(2,1)=pstart(1,2) end if ! Penalty, b, c for dry pressure @@ -416,13 +419,15 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & else call stpjcpdry(dval,sval,pstart(1,3),pstart(2,3),pstart(3,3),nobs_bins) end if - pj(3,1)=pstart(1,3) + if(pjcalc)pj(3,1)=pstart(1,3) end if ! iterate over number of stepsize iterations (istp_iter - currently set to a maximum of 5) dels = one_tenth_quad stepsize: do ii=1,istp_iter + pjcalc=.false. + if(iter == 0 .and. kprt >= 2 .and. ii == 1)pjcalc=.true. iis=ii ! Delta stepsize change_dels=.true. @@ -457,11 +462,76 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & ! penalties for moisture constraint if(.not. ltlint)then + if(.not.ljc4tlevs) then + call stplimq(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,4),pbc(1,5),nstep,ntguessig) + if(pjcalc)then + pj(4,1)=pbc(1,4)+pbc(ipenloc,4) + pj(5,1)=pbc(1,5)+pbc(ipenloc,5) + end if + else + do ibin=1,nobs_bins + if (nobs_bins /= nfldsig) then + it=ntguessig + else + it=ibin + end if + call stplimq(dval(ibin),sval(ibin),sges,pbcqmin(1,ibin),pbcqmax(1,ibin),nstep,it) + end do + pbc(:,4)=zero_quad + pbc(:,5)=zero_quad + do ibin=1,nobs_bins + do j=1,nstep + pbc(j,4) = pbc(j,4)+pbcqmin(j,ibin) + pbc(j,5) = pbc(j,5)+pbcqmax(j,ibin) + end do + end do + if(pjcalc)then + do ibin=1,nobs_bins + pj(4,ibin)=pj(4,ibin)+pbcqmin(1,ibin)+pbcqmin(ipenloc,ibin) + pj(5,ibin)=pj(5,ibin)+pbcqmax(1,ibin)+pbcqmax(ipenloc,ibin) + end do + end if + end if +! penalties for gust constraint + if(getindex(cvars2d,'gust')>0) & + call stplimg(dval(1),sval(1),sges,pbc(1,6),nstep) + if(pjcalc)pj(6,1)=pbc(1,6)+pbc(ipenloc,6) + +! penalties for vis constraint + if(getindex(cvars2d,'vis')>0) & + call stplimv(dval(1),sval(1),sges,pbc(1,7),nstep) + if(pjcalc)pj(7,1)=pbc(1,7)+pbc(ipenloc,7) + +! penalties for pblh constraint + if(getindex(cvars2d,'pblh')>0) & + call stplimp(dval(1),sval(1),sges,pbc(1,8),nstep) + if(pjcalc)pj(8,1)=pbc(1,8)+pbc(ipenloc,8) + +! penalties for wspd10m constraint + if(getindex(cvars2d,'wspd10m')>0) & + call stplimw10m(dval(1),sval(1),sges,pbc(1,9),nstep) + if(pjcalc)pj(9,1)=pbc(1,9)+pbc(ipenloc,9) + +! penalties for howv constraint + if(getindex(cvars2d,'howv')>0) & + call stplimhowv(dval(1),sval(1),sges,pbc(1,10),nstep) + if(pjcalc)pj(10,1)=pbc(1,10)+pbc(ipenloc,10) + +! penalties for lcbas constraint + if(getindex(cvars2d,'lcbas')>0) & + call stpliml(dval(1),sval(1),sges,pbc(1,11),nstep) + if(pjcalc)pj(11,1)=pbc(1,11)+pbc(ipenloc,11) + +! penalties for cldch constraint + if(getindex(cvars2d,'cldch')>0) & + call stplimcldch(dval(1),sval(1),sges,pbc(1,12),nstep) + if(pjcalc)pj(12,1)=pbc(1,12)+pbc(ipenloc,12) + if (ljclimqc) then - if (getindex(cvars3d,'ql')>0) then + if (getindex(cvars3d,'ql')>0) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,13),nstep,ntguessig,'ql') - if(ii == 1) pj(13,1)=pbc(1,13)+pbc(ipenloc,13) + if(pjcalc) pj(13,1)=pbc(1,13)+pbc(ipenloc,13) else do ibin=1,nobs_bins if (nobs_bins /= nfldsig) then @@ -477,17 +547,17 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & pbc(j,13) = pbc(j,13)+pbcql(j,ibin) end do end do - if(ii == 1)then + if(pjcalc)then do ibin=1,nobs_bins pj(13,ibin)=pj(13,ibin)+pbcql(1,ibin)+pbcql(ipenloc,ibin) end do end if end if - end if - if (getindex(cvars3d,'qi')>0) then + end if + if (getindex(cvars3d,'qi')>0) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,14),nstep,ntguessig,'qi') - if(ii == 1) pj(14,1)=pbc(1,14)+pbc(ipenloc,14) + if(pjcalc) pj(14,1)=pbc(1,14)+pbc(ipenloc,14) else do ibin=1,nobs_bins if (nobs_bins /= nfldsig) then @@ -503,17 +573,17 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & pbc(j,14) = pbc(j,14)+pbcqi(j,ibin) end do end do - if(ii == 1)then + if(pjcalc)then do ibin=1,nobs_bins pj(14,ibin)=pj(14,ibin)+pbcqi(1,ibin)+pbcqi(ipenloc,ibin) end do end if end if - end if - if (getindex(cvars3d,'qr')>0) then + end if + if (getindex(cvars3d,'qr')>0) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,15),nstep,ntguessig,'qr') - if(ii == 1) pj(15,1)=pbc(1,15)+pbc(ipenloc,15) + if(pjcalc) pj(15,1)=pbc(1,15)+pbc(ipenloc,15) else do ibin=1,nobs_bins if (nobs_bins /= nfldsig) then @@ -529,17 +599,17 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & pbc(j,15) = pbc(j,15)+pbcqr(j,ibin) end do end do - if(ii == 1)then + if(pjcalc)then do ibin=1,nobs_bins pj(15,ibin)=pj(15,ibin)+pbcqr(1,ibin)+pbcqr(ipenloc,ibin) end do end if end if - end if - if (getindex(cvars3d,'qs')>0) then + end if + if (getindex(cvars3d,'qs')>0) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,16),nstep,ntguessig,'qs') - if(ii == 1) pj(16,1)=pbc(1,16)+pbc(ipenloc,16) + if(pjcalc) pj(16,1)=pbc(1,16)+pbc(ipenloc,16) else do ibin=1,nobs_bins if (nobs_bins /= nfldsig) then @@ -555,17 +625,17 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & pbc(j,16) = pbc(j,16)+pbcqs(j,ibin) end do end do - if(ii == 1)then + if(pjcalc)then do ibin=1,nobs_bins pj(16,ibin)=pj(16,ibin)+pbcqs(1,ibin)+pbcqs(ipenloc,ibin) end do end if end if - end if - if (getindex(cvars3d,'qg')>0) then + end if + if (getindex(cvars3d,'qg')>0) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,17),nstep,ntguessig,'qg') - if(ii == 1) pj(17,1)=pbc(1,17)+pbc(ipenloc,17) + if(pjcalc) pj(17,1)=pbc(1,17)+pbc(ipenloc,17) else do ibin=1,nobs_bins if (nobs_bins /= nfldsig) then @@ -581,78 +651,14 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & pbc(j,17) = pbc(j,17)+pbcqg(j,ibin) end do end do - if(ii == 1)then + if(pjcalc)then do ibin=1,nobs_bins pj(17,ibin)=pj(17,ibin)+pbcqg(1,ibin)+pbcqg(ipenloc,ibin) end do end if end if - end if + end if end if ! ljclimqc - if(.not.ljc4tlevs) then - call stplimq(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,4),pbc(1,5),nstep,ntguessig) - if(ii == 1)then - pj(4,1)=pbc(1,4)+pbc(ipenloc,4) - pj(5,1)=pbc(1,5)+pbc(ipenloc,5) - end if - else - do ibin=1,nobs_bins - if (nobs_bins /= nfldsig) then - it=ntguessig - else - it=ibin - end if - call stplimq(dval(ibin),sval(ibin),sges,pbcqmin(1,ibin),pbcqmax(1,ibin),nstep,it) - end do - pbc(:,4)=zero_quad - pbc(:,5)=zero_quad - do ibin=1,nobs_bins - do j=1,nstep - pbc(j,4) = pbc(j,4)+pbcqmin(j,ibin) - pbc(j,5) = pbc(j,5)+pbcqmax(j,ibin) - end do - end do - if(ii == 1)then - do ibin=1,nobs_bins - pj(4,ibin)=pj(4,ibin)+pbcqmin(1,ibin)+pbcqmin(ipenloc,ibin) - pj(5,ibin)=pj(5,ibin)+pbcqmax(1,ibin)+pbcqmax(ipenloc,ibin) - end do - end if - end if -! penalties for gust constraint - if(getindex(cvars2d,'gust')>0) & - call stplimg(dval(1),sval(1),sges,pbc(1,6),nstep) - if(ii == 1)pj(6,1)=pbc(1,6)+pbc(ipenloc,6) - -! penalties for vis constraint - if(getindex(cvars2d,'vis')>0) & - call stplimv(dval(1),sval(1),sges,pbc(1,7),nstep) - if(ii == 1)pj(7,1)=pbc(1,7)+pbc(ipenloc,7) - -! penalties for pblh constraint - if(getindex(cvars2d,'pblh')>0) & - call stplimp(dval(1),sval(1),sges,pbc(1,8),nstep) - if(ii == 1)pj(8,1)=pbc(1,8)+pbc(ipenloc,8) - -! penalties for wspd10m constraint - if(getindex(cvars2d,'wspd10m')>0) & - call stplimw10m(dval(1),sval(1),sges,pbc(1,9),nstep) - if(ii == 1)pj(9,1)=pbc(1,9)+pbc(ipenloc,9) - -! penalties for howv constraint - if(getindex(cvars2d,'howv')>0) & - call stplimhowv(dval(1),sval(1),sges,pbc(1,10),nstep) - if(ii == 1)pj(10,1)=pbc(1,10)+pbc(ipenloc,10) - -! penalties for lcbas constraint - if(getindex(cvars2d,'lcbas')>0) & - call stpliml(dval(1),sval(1),sges,pbc(1,11),nstep) - if(ii == 1)pj(11,1)=pbc(1,11)+pbc(ipenloc,11) - -! penalties for cldch constraint - if(getindex(cvars2d,'cldch')>0) & - call stplimcldch(dval(1),sval(1),sges,pbc(1,12),nstep) - if(ii == 1)pj(12,1)=pbc(1,12)+pbc(ipenloc,12) end if ! penalties for Jo @@ -667,7 +673,7 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end do end do enddo - if(ii == 1)then + if(pjcalc)then do ibin=1,size(pbcjoi,3) do j=1,size(pbcjoi,2) pj(n0+j,ibin)=pj(n0+j,ibin)+pbcjoi(ipenloc,j,ibin)+pbcjoi(1,j,ibin) @@ -866,7 +872,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & exit stepsize end if end do stepsize - kprt=3 if(kprt >= 2 .and. iter == 0)then call mpl_allreduce(ipen,nobs_bins,pj) if(mype == 0)call prnt_j(pj,n0,ipen,kprt) diff --git a/src/gsi/stpjcmod.f90 b/src/gsi/stpjcmod.f90 index 289cc7672a..2c811912a0 100644 --- a/src/gsi/stpjcmod.f90 +++ b/src/gsi/stpjcmod.f90 @@ -77,7 +77,7 @@ subroutine stplimq(rval,sval,sges,outmin,outmax,nstep,itbin) ! !$$$ use gridmod, only: lat1,lon1,nsig,istart,wgtfactlats - use jfunc, only: factqmin,factqmax + use jfunc, only: factqmin,factqmax,superfact use guess_grids, only: ges_qsat use mpimod, only: mype implicit none @@ -125,8 +125,8 @@ subroutine stplimq(rval,sval,sges,outmin,outmax,nstep,itbin) /(ges_qsat(i,j,k,itbin)*ges_qsat(i,j,k,itbin)) else if(qx > ges_qsat(i,j,k,itbin))then - outmax(kk)=outmax(kk)+(factqmax*wgtfactlats(ii))*(qx-ges_qsat(i,j,k,itbin))* & - (qx-ges_qsat(i,j,k,itbin))/(ges_qsat(i,j,k,itbin)*ges_qsat(i,j,k,itbin)) + outmax(kk)=outmax(kk)+(factqmax*wgtfactlats(ii))*(qx-superfact*ges_qsat(i,j,k,itbin))**2 & + /ges_qsat(i,j,k,itbin)**2 end if end if end do @@ -143,9 +143,9 @@ subroutine stplimq(rval,sval,sges,outmin,outmax,nstep,itbin) if(q < zero)then outmin(1)=outmin(1)+(factqmin*wgtfactlats(ii))*q*q/(ges_qsat(i,j,k,itbin)*ges_qsat(i,j,k,itbin)) else - if(q > ges_qsat(i,j,k,itbin))then - outmax(1)=outmax(1)+(factqmax*wgtfactlats(ii))*(q-ges_qsat(i,j,k,itbin))*& - (q-ges_qsat(i,j,k,itbin))/(ges_qsat(i,j,k,itbin)*ges_qsat(i,j,k,itbin)) + if(q > superfact*ges_qsat(i,j,k,itbin))then + outmax(1)=outmax(1)+(factqmax*wgtfactlats(ii))*(q-superfact*ges_qsat(i,j,k,itbin))**2 & + /ges_qsat(i,j,k,itbin)**2 end if end if end do @@ -242,7 +242,7 @@ subroutine stplimqc(rval,sval,sges,out,nstep,itbin,cldtype) endif if (mype==0) write(6,*)'stplimqc: factqc = ', factqc if (mype==0) write(6,*)'stplimqc: ier ier1 = ', ier, ier1 - if ( factqc==0 ) return + if ( factqc <= zero) return if ( ier/=0 .or. ier1/=0 ) return ! Loop over interior of subdomain diff --git a/src/gsi/stpw.f90 b/src/gsi/stpw.f90 index ee1569d731..423019680d 100644 --- a/src/gsi/stpw.f90 +++ b/src/gsi/stpw.f90 @@ -105,7 +105,7 @@ subroutine stpw(whead,rval,sval,out,sges,nstep) real(r_kind) valu,facu,valv,facv,w1,w2,w3,w4,w5,w6,w7,w8 real(r_kind) cg_t,t_pg,var_jb real(r_kind) uu,vv - real(r_kind),dimension(max(1,nstep))::pen + real(r_kind),dimension(max(1,nstep))::pen,penu,penv real(r_kind),pointer,dimension(:):: ru,rv,su,sv type(wNode), pointer :: wptr @@ -157,41 +157,39 @@ subroutine stpw(whead,rval,sval,out,sges,nstep) do kk=1,nstep uu=facu+sges(kk)*valu vv=facv+sges(kk)*valv - pen(kk)= (uu*uu+vv*vv)*wptr%err2 + penu(kk)= (uu*uu)*wptr%err2 + penv(kk)= (vv*vv)*wptr%err2 end do else - pen(1)= (wptr%ures*wptr%ures+wptr%vres*wptr%vres)*wptr%err2 + penu(1)= (wptr%ures*wptr%ures)*wptr%err2 + penv(1)= (wptr%vres*wptr%vres)*wptr%err2 end if ! Modify penalty term if nonlinear QC - if (vqc .and. nlnqc_iter .and. wptr%pg > tiny_r_kind .and. & + t_pg=zero + cg_t=zero + var_jb=zero + ibb=0 + ikk=0 + if (vqc .and. nlnqc_iter .and. wptr%pg > tiny_r_kind .and. & wptr%b > tiny_r_kind) then t_pg=wptr%pg*varqc_iter cg_t=cg_term/wptr%b - else - t_pg=zero - cg_t=zero - endif - + else if(njqc .and. wptr%jb > tiny_r_kind .and. wptr%jb <10.0_r_kind) then ! for Dr. Jim purser' non liear quality control - if(njqc .and. wptr%jb > tiny_r_kind .and. wptr%jb <10.0_r_kind) then var_jb =wptr%jb - else - var_jb=zero - endif + else if(nvqc .and. wptr%ib >0) then ! mix model VQC - if(nvqc .and. wptr%ib >0) then ibb=wptr%ib ikk=wptr%ik - else - ibb=0 - ikk=0 endif - - call vqc_stp(pen,nstep,t_pg,cg_t,var_jb,ibb,ikk) - + call vqc_stp(penu,nstep,t_pg,cg_t,var_jb,ibb,ikk) + call vqc_stp(penv,nstep,t_pg,cg_t,var_jb,ibb,ikk) + do kk=1,nstep + pen(kk)=penu(kk)+penv(kk) + end do out(1) = out(1)+pen(1)*wptr%raterr2 do kk=2,nstep out(kk) = out(kk)+(pen(kk)-pen(1))*wptr%raterr2 diff --git a/src/gsi/update_guess.f90 b/src/gsi/update_guess.f90 index 041ad50e1d..a66495bc27 100644 --- a/src/gsi/update_guess.f90 +++ b/src/gsi/update_guess.f90 @@ -113,7 +113,7 @@ subroutine update_guess(sval,sbias) use mpimod, only: mype use constants, only: zero,one,fv,max_varname_length,qmin,qcmin,tgmin,& r100,one_tenth,tiny_r_kind - use jfunc, only: iout_iter,bcoption,tsensible,clip_supersaturation + use jfunc, only: iout_iter,bcoption,tsensible,clip_supersaturation,superfact use gridmod, only: lat2,lon2,nsig,& regional,twodvar_regional,regional_ozone,& l_reg_update_hydro_delz @@ -269,7 +269,7 @@ subroutine update_guess(sval,sbias) call gsi_bundlegetpointer (gsi_metguess_bundle(it),guess(ic),ptr3dges,istatus) if (trim(guess(ic))=='q') then call upd_positive_fldr3_(ptr3dges,ptr3dinc, qmin) - if(clip_supersaturation) ptr3dges(:,:,:) = min(ptr3dges(:,:,:),ges_qsat(:,:,:,it)) + if(clip_supersaturation) ptr3dges(:,:,:) = min(ptr3dges(:,:,:),superfact*ges_qsat(:,:,:,it)) cycle endif if (trim(guess(ic))=='oz') then From 572b8cd22083f7e4a84fcc640e9677ba89803c18 Mon Sep 17 00:00:00 2001 From: "Edward.Safford" Date: Tue, 16 Nov 2021 15:53:28 +0000 Subject: [PATCH 02/26] GSI github issue #253. Update OznMon satype file. This completes #253 --- .../Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt b/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt index 529ece776b..dc89e86f5d 100644 --- a/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt +++ b/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt @@ -1 +1 @@ -gome_metop-a gome_metop-b omi_aura sbuv2_n19 ompsnp_npp ompstc8_npp +gome_metop-b omi_aura sbuv2_n19 ompsnp_npp ompstc8_npp From 2ce78759499b36b35cfb7da76d46050f5681d8af Mon Sep 17 00:00:00 2001 From: "Edward.Safford" Date: Wed, 17 Nov 2021 14:24:07 +0000 Subject: [PATCH 03/26] GSI #228. Port ConMon to wcoss2. This completes #228. --- util/Conventional_Monitor/ConMon_install.pl | 38 ++++++-- .../build_ConMon_cmake.sh | 59 ++++++------ .../data_extract/ush/ConMon_DE.sh | 4 + util/Conventional_Monitor/get_hostname.pl | 4 +- .../image_gen/ush/mk_horz_hist.sh | 12 +++ .../image_gen/ush/mk_time_vert.sh | 19 ++++ .../image_gen/ush/plot_horz.sh | 12 +-- .../image_gen/ush/plot_horz_uv.sh | 12 +-- .../driver/test_jgdas_vcmon_wcoss2.sh | 89 +++++++++++++++++++ util/Conventional_Monitor/parm/ConMon_config | 10 ++- 10 files changed, 199 insertions(+), 60 deletions(-) create mode 100755 util/Conventional_Monitor/nwprod/gdas_conmon/driver/test_jgdas_vcmon_wcoss2.sh diff --git a/util/Conventional_Monitor/ConMon_install.pl b/util/Conventional_Monitor/ConMon_install.pl index 2b1ebd4f9c..c6659cc30f 100755 --- a/util/Conventional_Monitor/ConMon_install.pl +++ b/util/Conventional_Monitor/ConMon_install.pl @@ -18,8 +18,8 @@ my $machine = `/usr/bin/perl ./get_hostname.pl`; my $my_machine="export MY_MACHINE=$machine"; - if( $machine ne "hera" && $machine ne "wcoss" && - $machine ne "wcoss_c" && $machine ne "wcoss_d" ) { + if( $machine ne "hera" && $machine ne "wcoss" && $machine ne "wcoss_c" + && $machine ne "wcoss_d" && $machine ne "wcoss2" ) { die( "ERROR --- Unrecognized machine hostname, $machine. Exiting now...\n" ); } else { @@ -76,6 +76,9 @@ elsif( $machine eq "wcoss_d" ) { $tankdir = "/gpfs/dell2/emc/modeling/noscrub/$user_name/nbns"; } + elsif( $machine eq "wcoss2" ){ + $tankdir = "/lfs/h2/emc/da/noscrub/$user_name/nbns"; + } print "Please specify TANKDIR location for storage of data and image files.\n"; print " Return to accept default location or enter new location now.\n"; @@ -177,6 +180,10 @@ $my_ptmp="export C_PTMP=\${C_PTMP:-/gpfs/dell2/ptmp}"; $my_stmp="export C_STMP=\${C_STMP:-/gpfs/dell2/stmp}"; } + elsif( $machine eq "wcoss2" ){ + $my_ptmp="export MY_PTMP=\${MY_PTMP:-/lfs/h2/emc/ptmp}"; + $my_stmp="export MY_STMP=\${MY_STMP:-/lfs/h2/emc/stmp}"; + } #--------------------------------------- # @@ -235,11 +242,26 @@ print "\n"; - my $account = "export ACCOUNT=\${ACCOUNT:-fv3-cpu}"; - if( $machine ne "hera" ) { - $account = "export ACCOUNT=\${ACCOUNT:-}"; + my $account = "export ACCOUNT=\${ACCOUNT:-}"; + if( $machine eq "hera" ) { + $account = "export ACCOUNT=\${ACCOUNT:-fv3-cpu}"; + } elsif( $machine eq "wcoss2" ){ + $account = "export ACCOUNT=\${ACCOUNT:-GFS-DEV}"; + } + + my $project = "export PROJECT=\${PROJECT:-GDAS-T2O}"; + if( $machine eq "wcoss2" ){ + $project = "export PROJECT=\${PROJECT:-GDAS-DEV}"; + } elsif( $machine ne "wcoss" && $machine ne "cray" && $machine ne "wcoss_d" ) { + $project="export PROJECT="; } + my $job_queue="export JOB_QUEUE="; + if( $machine eq "cray" || $machine eq "wcoss2" ) { + $job_queue="export JOB_QUEUE=\${JOB_QUEUE:-dev}"; + } elsif( $machine eq "wcoss" || $machine eq "wcoss_d" ){ + $job_queue = "export JOB_QUEUE=\${JOB_QUEUE:-dev_shared}"; + } #------------------------------------------------------------ # @@ -256,6 +278,12 @@ elsif( $_ =~ "ACCOUNT=" ) { print $out "$account\n"; } + elsif( $_ =~ "PROJECT=" ) { + print $out "$project\n"; + } + elsif( $_ =~ "JOB_QUEUE=" ) { + print $out "$job_queue\n"; + } elsif( $_ =~ "CONMON_TANKDIR=" ) { print $out "$my_tankdir\n"; } diff --git a/util/Conventional_Monitor/build_ConMon_cmake.sh b/util/Conventional_Monitor/build_ConMon_cmake.sh index f7b6dbe2e1..1ffe92a9ae 100755 --- a/util/Conventional_Monitor/build_ConMon_cmake.sh +++ b/util/Conventional_Monitor/build_ConMon_cmake.sh @@ -39,6 +39,9 @@ elif [[ -d /scratch1 ]] ; then elif [[ -d /work ]]; then . $MODULESHOME/init/sh target=orion +elif [[ -d /lfs && -d /dfs ]]; then + . $MODULESHOME/init/bash + target=wcoss2 else echo "unknown target = $target" exit 9 @@ -66,33 +69,31 @@ fi # Verify this is a supported machine #--------------------------------------------------- -if [[ ${target} = "hera" || ${target} = "wcoss_c" \ - || ${target} = "wcoss_d" || ${target} = "orion" ]]; then - echo Building nwprod executables on ${target} - echo - - - #------------------------------------- - # load modules - #------------------------------------- - if [ $target = wcoss_d ]; then - module purge - module use -a $dir_modules - module load modulefile.ProdGSI.$target - elif [ $target = wcoss -o $target = gaea ]; then - module purge - module load $dir_modules/modulefile.ProdGSI.$target - elif [ $target = hera -o $target = orion ]; then - module purge - module use $dir_modules - module load modulefile.ProdGSI.$target - elif [ $target = cheyenne ]; then - module purge - source $dir_modules/modulefile.ProdGSI.$target - elif [ $target = wcoss_c ]; then - module purge - module load $dir_modules/modulefile.ProdGSI.$target - fi +echo Building nwprod executables on ${target} +echo + + +#------------------------------------- +# load modules +#------------------------------------- +if [ $target = wcoss_d -o $target = wcoss2 ]; then + module purge + module use -a $dir_modules + module load modulefile.ProdGSI.$target +elif [ $target = wcoss -o $target = gaea ]; then + module purge + module load $dir_modules/modulefile.ProdGSI.$target +elif [ $target = hera -o $target = orion ]; then + module purge + module use $dir_modules + module load modulefile.ProdGSI.$target +elif [ $target = cheyenne ]; then + module purge + source $dir_modules/modulefile.ProdGSI.$target +elif [ $target = wcoss_c ]; then + module purge + module load $dir_modules/modulefile.ProdGSI.$target +fi #------------------------------------- @@ -129,10 +130,6 @@ if [[ ${target} = "hera" || ${target} = "wcoss_c" \ cp $file $C_IG_EXEC/. done -else - echo ${machine} is not supported -fi - set +x diff --git a/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh b/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh index c60237570e..8869f513cb 100755 --- a/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh +++ b/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh @@ -237,6 +237,10 @@ if [ -s $cnvstat -a -s $pgrbf00 -a -s $pgrbf06 ]; then $SUB -A $ACCOUNT --ntasks=1 --time=00:30:00 \ -p service -J ${jobname} -o $C_LOGDIR/DE.${PDY}.${CYC}.log \ ${HOMEgdas_conmon}/jobs/JGDAS_ATMOS_CONMON + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ + -l select=1:mem=5000M ${HOMEgdas_conmon}/jobs/JGDAS_ATMOS_CONMON fi else diff --git a/util/Conventional_Monitor/get_hostname.pl b/util/Conventional_Monitor/get_hostname.pl index 8d89277a21..1d6e931621 100755 --- a/util/Conventional_Monitor/get_hostname.pl +++ b/util/Conventional_Monitor/get_hostname.pl @@ -26,7 +26,9 @@ elsif( -d "/scratch1" ) { $machine = "hera"; } - + elsif( -d "/lfs/h2" ) { + $machine = "wcoss2"; + } print "$machine"; diff --git a/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh b/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh index 63dd2668b9..8114fd1a54 100755 --- a/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh +++ b/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh @@ -57,6 +57,10 @@ set -ax elif [[ $MY_MACHINE = "hera" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:20:00 \ -p service -J ${jobname} -o ${logfile} ${plot_hist} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ + -l select=1:mem=500M ${plot_hist} fi @@ -78,6 +82,10 @@ set -ax elif [[ $MY_MACHINE = "hera" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:20:00 \ -p service -J ${jobname} -o ${logfile} ${plot_horz} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ + -l select=1:mem=500M ${plot_horz} fi @@ -99,6 +107,10 @@ set -ax elif [[ $MY_MACHINE = "hera" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:20:00 \ -p service -J ${jobname} -o ${logfile} ${plot_horz_uv} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ + -l select=1:mem=500M ${plot_horz_uv} fi diff --git a/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh b/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh index d84778f6de..ed465aabb1 100755 --- a/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh +++ b/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh @@ -37,6 +37,10 @@ echo "--> mk_time_vert.sh" elif [[ $MY_MACHINE == "hera" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:15:00 \ -p service -J ${jobname} -o ${logfile} ${pltfile} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=50:00 -N ${jobname} \ + -l select=1:mem=200M ${pltfile} fi #-------------------------------------------- @@ -72,7 +76,18 @@ echo "--> mk_time_vert.sh" ${SUB} -A ${ACCOUNT} --ntasks=1 --time=${walltime} \ -p service -J ${jobname} -o ${logfile} ${pltfile} + elif [[ $MY_MACHINE = "wcoss2" ]]; then + + if [[ ${type} == "uv" || ${type} == "u" || ${type} == "v" ]]; then + walltime="01:30:00" + else + walltime="50:00" + fi + + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=${walltime}\ + -N ${jobname} -l select=1:mem=200M ${pltfile} fi + done @@ -102,6 +117,10 @@ echo "--> mk_time_vert.sh" ${SUB} -A ${ACCOUNT} --ntasks=1 --time=${walltime} \ -p service -J ${jobname} -o ${logfile} ${pltfile} + + elif [[ $MY_MACHINE == "wcoss2" ]]; then + $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=50:00 \ + -N ${jobname} -l select=1:mem=500M ${pltfile} fi done diff --git a/util/Conventional_Monitor/image_gen/ush/plot_horz.sh b/util/Conventional_Monitor/image_gen/ush/plot_horz.sh index 4fd59f880b..f85dcd899a 100755 --- a/util/Conventional_Monitor/image_gen/ush/plot_horz.sh +++ b/util/Conventional_Monitor/image_gen/ush/plot_horz.sh @@ -13,8 +13,6 @@ rc=0 - pdy=`echo $PDATE|cut -c1-8` - cyc=`echo $PDATE|cut -c9-10` hh_tankdir=${C_TANKDIR}/${RUN}.${PDY}/${CYC}/conmon/horz_hist export xsize=x800 @@ -184,20 +182,16 @@ $GRADS -blc "run plothorz_${dtype}.gs" - mkdir -p ${C_IMGNDIR}/pngs/horz/${CYC} + outdir=${C_IMGNDIR}/pngs/horz + mkdir -p ${outdir} img_files=`ls *.png` for imgf in $img_files; do newf=`echo $imgf | sed -e "s/\./.${PDATE}./g"` cp $imgf $newf - mv $newf ${C_IMGNDIR}/pngs/horz/. + mv $newf ${outdir}/. done -# if [[ $CONMON_SUFFIX != "v16rt2" ]]; then -# mv -f *.png ${C_IMGNDIR}/pngs/horz/${CYC}/. -# fi - - done ### dtype loop done ### type loop diff --git a/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh b/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh index 5cefc700ab..7340bf2423 100755 --- a/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh +++ b/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh @@ -10,8 +10,6 @@ set -ax echo "--> plot_horz_uv.sh" rc=0 - pdy=`echo $PDATE|cut -c1-8` - cyc=`echo $PDATE|cut -c9-10` hh_tankdir=${C_TANKDIR}/${RUN}.${PDY}/${CYC}/conmon/horz_hist export savedir=${hh_tankdir} @@ -175,21 +173,15 @@ set -ax ${GRADS} -blc "run plothorz_${dtype}.gs" - outdir=${C_IMGNDIR}/pngs/horz/${CYC} + outdir=${C_IMGNDIR}/pngs/horz mkdir -p ${outdir} img_files=`ls *.png` for imgf in $img_files; do newf=`echo $imgf | sed -e "s/\./.${PDATE}./g"` - cp $imgf $newf - mv $newf ${C_IMGNDIR}/pngs/horz/. + cp $imgf ${C_IMGNDIR}/pngs/horz/${newf} done - if [[ $CONMON_SUFFIX != "v16rt2" ]]; then - mv -f *.png ${outdir}/. - fi - - done ### dtype loop done ### type loop diff --git a/util/Conventional_Monitor/nwprod/gdas_conmon/driver/test_jgdas_vcmon_wcoss2.sh b/util/Conventional_Monitor/nwprod/gdas_conmon/driver/test_jgdas_vcmon_wcoss2.sh new file mode 100755 index 0000000000..c7b43ece20 --- /dev/null +++ b/util/Conventional_Monitor/nwprod/gdas_conmon/driver/test_jgdas_vcmon_wcoss2.sh @@ -0,0 +1,89 @@ +#!/bin/ksh -l + +#PBS -o gdas_vconmon.out +#PBS -e gdas_vconmon.err +#PBS -N gdas_vconmon +#PBS -q dev +#PBS -l select=1:mem=5000M +#PBS -l walltime=30:00 +#PBS -A GFS-DEV + +set -x + +export PDATE=${PDATE:-2021082318} + + +############################################################# +# Specify versions +############################################################# +export gdas_ver=v16.1.5 +export global_shared_ver=v16.1.5 + +############################################################# +# Load modules +############################################################# +module purge + +module load gcc/11.2.0 +module load intel/19.1.3.304 +module load libjpeg/9c +module load grib_util/1.2.3 + +module load prod_util/2.0.10 +module load util_shared/1.4.0 + +module load cray-mpich/8.1.7 +module load netcdf/4.7.4 + +module list + +############################################################# +# Specify whether the run is production or development +############################################################# +export PDY=`echo $PDATE | cut -c1-8` +export CYC=`echo $PDATE | cut -c9-10` +export job=gdas_conmon.${CYC} +export pid=${pid:-$$} +export jobid=${job}.${pid} +export DATAROOT=/lfs/h1/ops/canned/com/gfs/v16.2 +export COMROOT=/lfs/h2/emc/ptmp/${LOGNAME} + +############################################################# +# WCOSS environment settings +############################################################# +export POE=YES + + +############################################################# +# Set user specific variables +############################################################# +export CONMON_SUFFIX=${CONMON_SUFFIX:-test_conmon} + +export NWTEST=/lfs/h2/emc/da/noscrub/Edward.Safford/git/gsi/GSI/util/Conventional_Monitor/nwprod +export HOMEconmon=${HOMEconmon:-${NWTEST}/conmon_shared} + +export HOMEgdas_conmon=${HOMEgdas_conmon:-${NWTEST}/gdas_conmon} +export HOMEgfs_conmon=${HOMEgdas_conmon} + +export JOBGLOBAL=${HOMEgdas_conmon}/jobs +export C_COM_IN=${C_COM_IN:-${DATAROOT}} + +export C_TANKDIR=${C_TANKDIR:-${COMROOT}/${CONMON_SUFFIX}} +if [[ ! -d $C_TANKDIR ]]; then + mkdir -p ${C_TANKDIR} +fi + +export CONMON_WORK_DIR=${CONMON_WORK_DIR:-/lfs/h2/emc/stmp/$LOGNAME/conmon_${CONMON_SUFFIX}} +if [[ -d $CONMON_WORK_DIR ]]; then + rm -rf ${CONMON_WORK_DIR} +fi +mkdir -p ${CONMON_WORK_DIR} + + +############################################################# +# Execute job +############################################################# +$JOBGLOBAL/JGDAS_ATMOS_CONMON + +exit + diff --git a/util/Conventional_Monitor/parm/ConMon_config b/util/Conventional_Monitor/parm/ConMon_config index 2cd923f86d..fa779dd208 100644 --- a/util/Conventional_Monitor/parm/ConMon_config +++ b/util/Conventional_Monitor/parm/ConMon_config @@ -74,8 +74,6 @@ if [[ $CONMON_CONFIG -ne 1 ]]; then export SUB="bsub" export COMPRESS=gzip export UNCOMPRESS="gunzip -f" - export PROJECT=${PROJECT:-GDAS-DEV} - export JOB_QUEUE=${JOB_QUEUE:-dev_shared} elif [[ $MY_MACHINE = "wcoss_d" ]]; then shell=sh @@ -106,8 +104,6 @@ if [[ $CONMON_CONFIG -ne 1 ]]; then export SUB="bsub" export COMPRESS=/usr/bin/gzip export UNCOMPRESS="/usr/bin/gunzip -f" - export PROJECT=${PROJECT:-GFS-DEV} - export JOB_QUEUE=${JOB_QUEUE:-dev_shared} elif [[ $MY_MACHINE = "hera" ]]; then module use -a /apps/modules/modulefamilies/intel @@ -123,11 +119,17 @@ if [[ $CONMON_CONFIG -ne 1 ]]; then export NDATE=/home/Edward.Safford/bin/ndate export COMPRESS=${COMPRESS:-gzip} export UNCOMPRESS=${UNCOMPRESS:-"gunzip -f"} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + export COMPRESS=/usr/bin/gzip + export UNCOMPRESS="/usr/bin/gunzip -f" fi export Z="gz" export ACCOUNT=${ACCOUNT:-} + export PROJECT= + export JOB_QUEUE= export C_STMP=${C_STMP:-/gpfs/dell2/stmp} export C_STMP_USER=${C_STMP_USER:-${C_STMP}/${LOGNAME}} From a21fb6610d1bf5370f318995141bbd5a4b7753e4 Mon Sep 17 00:00:00 2001 From: TingLei-daprediction Date: Fri, 5 Nov 2021 13:22:27 +0000 Subject: [PATCH 04/26] GitHub Issue NOAA-EMC/GSI#218 GSI parallel IO for FV3-LAM --- src/enkf/gridio_fv3reg.f90 | 1 + src/gsi/cplr_get_fv3_regional_ensperts.f90 | 1162 +++++---- src/gsi/gsi_rfv3io_mod.f90 | 2694 ++++++++++---------- src/gsi/gsimod.F90 | 4 + src/gsi/mod_fv3_lola.f90 | 7 + 5 files changed, 1953 insertions(+), 1915 deletions(-) diff --git a/src/enkf/gridio_fv3reg.f90 b/src/enkf/gridio_fv3reg.f90 index cfd8b35b26..0dd03dfb82 100644 --- a/src/enkf/gridio_fv3reg.f90 +++ b/src/enkf/gridio_fv3reg.f90 @@ -591,6 +591,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid tsen_ind = getindex(vars3d, 'tsen') ! Tv (3D) q_ind = getindex(vars3d, 'q') ! Q (3D) cw_ind = getindex(vars3d, 'cw') ! CWM for WRF-NMM + oz_ind = getindex(vars3d, 'oz') ! Oz (3D) w_ind = getindex(vars3d, 'w') ! W for WRF-ARW ph_ind = getindex(vars3d, 'ph') ! PH for WRF-ARW diff --git a/src/gsi/cplr_get_fv3_regional_ensperts.f90 b/src/gsi/cplr_get_fv3_regional_ensperts.f90 index 1d79aef6e0..b54f727b71 100644 --- a/src/gsi/cplr_get_fv3_regional_ensperts.f90 +++ b/src/gsi/cplr_get_fv3_regional_ensperts.f90 @@ -1,14 +1,23 @@ module get_fv3_regional_ensperts_mod use abstract_get_fv3_regional_ensperts_mod,only: abstract_get_fv3_regional_ensperts_class use kinds, only : i_kind + use general_sub2grid_mod, only: sub2grid_info + use constants, only:max_varname_length type, extends(abstract_get_fv3_regional_ensperts_class) :: get_fv3_regional_ensperts_class contains procedure, pass(this) :: get_fv3_regional_ensperts => get_fv3_regional_ensperts_run procedure, pass(this) :: ens_spread_dualres_regional => ens_spread_dualres_regional_fv3_regional procedure, pass(this) :: general_read_fv3_regional - procedure, pass(this) :: general_read_fv3_regional_dirZDA end type get_fv3_regional_ensperts_class + type(sub2grid_info):: grd_fv3lam_ens_dynvar_io_nouv,grd_fv3lam_ens_tracer_io_nouv,grd_fv3lam_ens_uv + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_ens_io_dynmetvars3d_nouv + ! copy of cvars3d excluding uv 3-d fields + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_ens_io_tracermetvars3d_nouv + ! copy of cvars3d excluding uv 3-d fields + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_ens_io_dynmetvars2d_nouv + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_ens_io_tracermetvars2d_nouv contains + subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) !$$$ subprogram documentation block ! . . . . @@ -24,6 +33,7 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) ! 2019-04-22 CAPS(C. Tong) - add direct reflectivity DA option ! ! 2021-08-10 lei - modify for fv3-lam ensemble spread output + ! 2021-11-01 lei - modify for fv3-lam parallel IO ! input argument list: ! ! output argument list: @@ -34,372 +44,477 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) ! !$$$ end documentation block - use kinds, only: r_kind,i_kind,r_single - use constants, only: zero,one,half,zero_single,rd_over_cp,one_tenth - use mpimod, only: mpi_comm_world,ierror,mype - use hybrid_ensemble_parameters, only: n_ens,grd_ens - use hybrid_ensemble_parameters, only: ntlevs_ens,ensemble_path - use control_vectors, only: cvars2d,cvars3d,nc2d,nc3d - use gsi_bundlemod, only: gsi_bundlecreate - use gsi_bundlemod, only: gsi_grid - use gsi_bundlemod, only: gsi_bundle - use gsi_bundlemod, only: gsi_bundlegetpointer - use gsi_bundlemod, only: gsi_bundledestroy - use gsi_bundlemod, only: gsi_gridcreate - use gsi_4dvar, only: ens_fhrlevs - use gsi_rfv3io_mod, only: type_fv3regfilenameg - use hybrid_ensemble_parameters, only: write_ens_sprd - use directDA_radaruse_mod, only: l_use_cvpqx, cvpqx_pval, cld_nt_updt - use directDA_radaruse_mod, only: l_use_dbz_directDA - use directDA_radaruse_mod, only: l_cvpnr - - implicit none - class(get_fv3_regional_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) - integer(i_kind), intent(in ):: nelen - real(r_single),dimension(:,:,:),allocatable,intent(inout):: ps_bar - - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig):: u,v,tv,oz,rh - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2):: ps - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig)::w,ql,qi,qr,qg,qs,qnr - - real(r_single),pointer,dimension(:,:,:):: w3 - real(r_single),pointer,dimension(:,:):: w2 - real(r_kind),pointer,dimension(:,:,:):: x3 - real(r_kind),pointer,dimension(:,:):: x2 - type(gsi_bundle),allocatable,dimension(:):: en_bar - type(gsi_grid):: grid_ens - real(r_kind):: bar_norm,sig_norm,kapr,kap1 - - integer(i_kind):: i,j,k,n,mm1,istatus - integer(i_kind):: ic2,ic3 - integer(i_kind):: m - - - character(255) ensfilenam_str - type(type_fv3regfilenameg)::fv3_filename - - call gsi_gridcreate(grid_ens,grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) - ! Allocate bundle to hold mean of ensemble members - allocate(en_bar(ntlevs_ens)) - do m=1,ntlevs_ens - call gsi_bundlecreate(en_bar(m),grid_ens,'ensemble',istatus,names2d=cvars2d,names3d=cvars3d,bundle_kind=r_kind) - if(istatus/=0) then - write(6,*)' get_fv3_regional_ensperts_netcdf: trouble creating en_bar bundle' - call stop2(9991) - endif - enddo ! for m + use kinds, only: r_kind,i_kind,r_single + use constants, only: zero,one,half,zero_single,rd_over_cp,one_tenth + use mpimod, only: mpi_comm_world,ierror,mype + use hybrid_ensemble_parameters, only: n_ens,grd_ens + use hybrid_ensemble_parameters, only: ntlevs_ens,ensemble_path + use control_vectors, only: cvars2d,cvars3d,nc2d,nc3d + use gsi_bundlemod, only: gsi_bundlecreate + use gsi_bundlemod, only: gsi_grid + use gsi_bundlemod, only: gsi_bundle + use gsi_bundlemod, only: gsi_bundlegetpointer + use gsi_bundlemod, only: gsi_bundledestroy + use gsi_bundlemod, only: gsi_gridcreate + use gsi_4dvar, only: ens_fhrlevs + use gsi_rfv3io_mod, only: type_fv3regfilenameg + use hybrid_ensemble_parameters, only: write_ens_sprd + use directDA_radaruse_mod, only: l_use_cvpqx, cvpqx_pval, cld_nt_updt + use directDA_radaruse_mod, only: l_use_dbz_directDA + use directDA_radaruse_mod, only: l_cvpnr + use general_sub2grid_mod, only: sub2grid_info,general_sub2grid_create_info + use gridmod,only: regional + use gsi_rfv3io_mod, only: fv3lam_io_dynmetvars3d_nouv,fv3lam_io_tracermetvars3d_nouv + use gsi_rfv3io_mod, only: fv3lam_io_dynmetvars2d_nouv,fv3lam_io_tracermetvars2d_nouv + + + implicit none + class(get_fv3_regional_ensperts_class), intent(inout) :: this + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + integer(i_kind), intent(in ):: nelen + real(r_single),dimension(:,:,:),allocatable,intent(inout):: ps_bar - ! print info message for dirZDA - if(mype==0)then - if (l_use_cvpqx) then - if ( cvpqx_pval == 0._r_kind ) then ! CVlogq - write(6,*) 'general_read_fv3_regional_dirZDA: convert qr/qs/qg to log transform.' - else if ( cvpqx_pval > 0._r_kind ) then ! CVpq - write(6,*) 'general_read_fv3_regional_dirZDA: ', & - 'reset minimum of qr/qs/qg to specified values before power transform.' - write(6,*) 'general_read_fv3_regional_dirZDA: convert qr/qs/qg with power transform.' - end if - end if - if ( cld_nt_updt > 0 .and. l_cvpnr) then - write(6,*) 'general_read_fv3_regional_dirZDA: ', & - 'reset minimum of qnr to a specified value before power transform' - write(6,*) 'general_read_fv3_regional_dirZDA: convert qnr with power transform .' - end if - end if + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig):: u,v,tv,oz,rh + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2):: ps + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig)::w,ql,qi,qr,qg,qs,qnr + real(r_single),pointer,dimension(:,:,:):: w3 =>NULL() + real(r_single),pointer,dimension(:,:):: w2 =>NULL() + real(r_kind),pointer,dimension(:,:,:):: x3 =>NULL() + real(r_kind),pointer,dimension(:,:):: x2 =>NULL() + type(gsi_bundle),allocatable,dimension(:):: en_bar + type(gsi_grid):: grid_ens + real(r_kind):: bar_norm,sig_norm,kapr,kap1 + + character(len=64),dimension(:,:),allocatable:: names + character(len=64),dimension(:,:),allocatable:: uvnames + integer(i_kind),dimension(:,:),allocatable:: lnames + integer(i_kind),dimension(:,:),allocatable:: uvlnames + + integer(i_kind):: i,j,k,n,mm1,istatus + integer(i_kind):: ndynvario2d,ntracerio2d + integer(r_kind):: ndynvario3d,ntracerio3d + integer(i_kind):: inner_vars,numfields + integer(i_kind):: ilev,ic2,ic3 + integer(i_kind):: m - do m=1,ntlevs_ens + + character(255) ensfilenam_str + type(type_fv3regfilenameg)::fv3_filename + + call gsi_gridcreate(grid_ens,grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) + ! Allocate bundle to hold mean of ensemble members + allocate(en_bar(ntlevs_ens)) + +!clt setup varnames for IO + ndynvario2d=0 + ntracerio2d=0 + ndynvario3d=size(fv3lam_io_dynmetvars3d_nouv) + ntracerio3d=size(fv3lam_io_tracermetvars3d_nouv) + if (allocated(fv3lam_io_dynmetvars2d_nouv))then + ndynvario2d=size(fv3lam_io_dynmetvars2d_nouv) + endif + if (allocated(fv3lam_io_tracermetvars2d_nouv)) then + ntracerio2d=size(fv3lam_io_tracermetvars2d_nouv) + endif + allocate(fv3lam_ens_io_dynmetvars3d_nouv(ndynvario3d)) + allocate(fv3lam_ens_io_tracermetvars3d_nouv(ndynvario3d)) + fv3lam_ens_io_dynmetvars3d_nouv=fv3lam_io_dynmetvars3d_nouv + fv3lam_ens_io_tracermetvars3d_nouv=fv3lam_io_tracermetvars3d_nouv + if (ndynvario2d > 0 ) then + allocate(fv3lam_ens_io_dynmetvars2d_nouv(ndynvario2d)) + fv3lam_ens_io_dynmetvars2d_nouv=fv3lam_io_dynmetvars2d_nouv + endif + if (ntracerio2d > 0 ) then + allocate(fv3lam_ens_io_tracermetvars2d_nouv(ntracerio2d)) + fv3lam_ens_io_tracermetvars2d_nouv =fv3lam_io_tracermetvars3d_nouv + endif + inner_vars=1 + numfields=inner_vars*(ndynvario3d*grd_ens%nsig+ndynvario2d) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,ndynvario3d + do k=1,grd_ens%nsig + lnames(1,ilev)=k + names(1,ilev)=fv3lam_ens_io_dynmetvars3d_nouv(i) + ilev=ilev+1 + enddo + enddo + do i=1,ndynvario2d + lnames(1,ilev)=1 + names(1,ilev)=fv3lam_ens_io_dynmetvars2d_nouv(i) + ilev=ilev+1 + enddo + - ! - ! INITIALIZE ENSEMBLE MEAN ACCUMULATORS - en_bar(m)%values=zero - - do n=1,n_ens - en_perts(n,m)%valuesr4 = zero - enddo - - mm1=mype+1 - kap1=rd_over_cp+one - kapr=one/rd_over_cp - ! - ! LOOP OVER ENSEMBLE MEMBERS - do n=1,n_ens - write(ensfilenam_str,22) trim(adjustl(ensemble_path)),ens_fhrlevs(m),n + call general_sub2grid_create_info(grd_fv3lam_ens_dynvar_io_nouv,inner_vars,grd_ens%nlat,& + grd_ens%nlon,grd_ens%nsig,numfields,regional,names=names,lnames=lnames) + + inner_vars=1 + numfields=inner_vars*(ntracerio3d*grd_ens%nsig+ntracerio2d) + deallocate(lnames,names) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,ntracerio3d + do k=1,grd_ens%nsig + lnames(1,ilev)=k + names(1,ilev)=fv3lam_ens_io_tracermetvars3d_nouv(i) + ilev=ilev+1 + enddo + enddo + do i=1,ntracerio2d + lnames(1,ilev)=1 + names(1,ilev)=fv3lam_ens_io_tracermetvars2d_nouv(i) + ilev=ilev+1 + enddo + + + call general_sub2grid_create_info(grd_fv3lam_ens_tracer_io_nouv,inner_vars,grd_ens%nlat,& + grd_ens%nlon,grd_ens%nsig,numfields,regional,names=names,lnames=lnames) + + + + + + numfields=grd_ens%nsig + inner_vars=2 + allocate(uvlnames(inner_vars,numfields),uvnames(inner_vars,numfields)) + ilev=1 + do k=1,grd_ens%nsig + uvlnames(1,ilev)=k + uvlnames(2,ilev)=k + uvnames(1,ilev)='u' + uvnames(2,ilev)='v' + ilev=ilev+1 + enddo + call general_sub2grid_create_info(grd_fv3lam_ens_uv,inner_vars,grd_ens%nlat,& + grd_ens%nlon,grd_ens%nsig,numfields,regional,names=uvnames,lnames=uvlnames) + + deallocate(lnames,names,uvlnames,uvnames) + + + do m=1,ntlevs_ens + call gsi_bundlecreate(en_bar(m),grid_ens,'ensemble',istatus,names2d=cvars2d,names3d=cvars3d,bundle_kind=r_kind) + if(istatus/=0) then + write(6,*)' get_fv3_regional_ensperts_netcdf: trouble creating en_bar bundle' + call stop2(9991) + endif + enddo ! for m + + ! print info message for dirZDA + if(mype==0)then + if (l_use_cvpqx) then + if ( cvpqx_pval == 0._r_kind ) then ! CVlogq + write(6,*) 'general_read_fv3_regional_dirZDA: convert qr/qs/qg to log transform.' + else if ( cvpqx_pval > 0._r_kind ) then ! CVpq + write(6,*) 'general_read_fv3_regional_dirZDA: ', & + 'reset minimum of qr/qs/qg to specified values before power transform.' + write(6,*) 'general_read_fv3_regional_dirZDA: convert qr/qs/qg with power transform.' + end if + end if + if ( cld_nt_updt > 0 .and. l_cvpnr) then + write(6,*) 'general_read_fv3_regional_dirZDA: ', & + 'reset minimum of qnr to a specified value before power transform' + write(6,*) 'general_read_fv3_regional_dirZDA: convert qnr with power transform .' + end if + end if + + + do m=1,ntlevs_ens + + + + ! + ! INITIALIZE ENSEMBLE MEAN ACCUMULATORS + en_bar(m)%values=zero + + do n=1,n_ens + en_perts(n,m)%valuesr4 = zero + enddo + + mm1=mype+1 + kap1=rd_over_cp+one + kapr=one/rd_over_cp + ! + ! LOOP OVER ENSEMBLE MEMBERS + do n=1,n_ens + write(ensfilenam_str,22) trim(adjustl(ensemble_path)),ens_fhrlevs(m),n 22 format(a,'fv3SAR',i2.2,'_ens_mem',i3.3) - ! DEFINE INPUT FILE NAME - fv3_filename%grid_spec=trim(ensfilenam_str)//'-fv3_grid_spec' !exmaple thinktobe - fv3_filename%ak_bk=trim(ensfilenam_str)//'-fv3_akbk' - fv3_filename%dynvars=trim(ensfilenam_str)//'-fv3_dynvars' - fv3_filename%tracers=trim(ensfilenam_str)//"-fv3_tracer" - fv3_filename%sfcdata=trim(ensfilenam_str)//"-fv3_sfcdata" - fv3_filename%couplerres=trim(ensfilenam_str)//"-coupler.res" - ! - ! READ ENEMBLE MEMBERS DATA - if (mype == 0) write(6,'(a,a)') 'CALL READ_FV3_REGIONAL_ENSPERTS FOR ENS DATA with the filename str : ',trim(ensfilenam_str) - call this%general_read_fv3_regional(fv3_filename,ps,u,v,tv,rh,oz) - - if ( l_use_dbz_directDA ) then ! Read additional hydrometers and w for dirZDA - call this%general_read_fv3_regional_dirZDA(fv3_filename,ql,qi,qr,qs,qg,qnr,w) - end if - - ! SAVE ENSEMBLE MEMBER DATA IN COLUMN VECTOR - do ic3=1,nc3d - - call gsi_bundlegetpointer(en_perts(n,m),trim(cvars3d(ic3)),w3,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n - call stop2(9992) - end if - call gsi_bundlegetpointer(en_bar(m),trim(cvars3d(ic3)),x3,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for en_bar' - call stop2(9993) - end if - - select case (trim(cvars3d(ic3))) - - case('sf','SF') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = u(j,i,k) - x3(j,i,k)=x3(j,i,k)+u(j,i,k) - end do - end do - end do - - case('vp','VP') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = v(j,i,k) - x3(j,i,k)=x3(j,i,k)+v(j,i,k) - end do - end do - end do - - case('t','T') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = tv(j,i,k) - x3(j,i,k)=x3(j,i,k)+tv(j,i,k) - end do - end do - end do - - case('q','Q') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = rh(j,i,k) - x3(j,i,k)=x3(j,i,k)+rh(j,i,k) - end do - end do - end do - - case('oz','OZ') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = oz(j,i,k) - x3(j,i,k)=x3(j,i,k)+oz(j,i,k) - end do - end do - end do - + ! DEFINE INPUT FILE NAME + fv3_filename%grid_spec=trim(ensfilenam_str)//'-fv3_grid_spec' !exmaple thinktobe + fv3_filename%ak_bk=trim(ensfilenam_str)//'-fv3_akbk' + fv3_filename%dynvars=trim(ensfilenam_str)//'-fv3_dynvars' + fv3_filename%tracers=trim(ensfilenam_str)//"-fv3_tracer" + fv3_filename%sfcdata=trim(ensfilenam_str)//"-fv3_sfcdata" + fv3_filename%couplerres=trim(ensfilenam_str)//"-coupler.res" + ! + ! READ ENEMBLE MEMBERS DATA + if (mype == 0) write(6,'(a,a)') & + 'CALL READ_FV3_REGIONAL_ENSPERTS FOR ENS DATA with the filename str : ',trim(ensfilenam_str) + if (.not.l_use_dbz_directDA ) then ! Read additional hydrometers and w for dirZDA + call this%general_read_fv3_regional(fv3_filename,ps,u,v,tv,rh,oz) + else + call this%general_read_fv3_regional(fv3_filename,ps,u,v,tv,rh,oz, & + g_ql=ql,g_qi=qi,g_qr=qr,g_qs=qs,g_qg=qg,g_qnr=qnr,g_w=w) + end if + + ! SAVE ENSEMBLE MEMBER DATA IN COLUMN VECTOR + do ic3=1,nc3d + + call gsi_bundlegetpointer(en_perts(n,m),trim(cvars3d(ic3)),w3,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n + call stop2(9992) + end if + call gsi_bundlegetpointer(en_bar(m),trim(cvars3d(ic3)),x3,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for en_bar' + call stop2(9993) + end if + + select case (trim(cvars3d(ic3))) + + case('sf','SF') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = u(j,i,k) + x3(j,i,k)=x3(j,i,k)+u(j,i,k) + end do + end do + end do + + case('vp','VP') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = v(j,i,k) + x3(j,i,k)=x3(j,i,k)+v(j,i,k) + end do + end do + end do + + case('t','T') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = tv(j,i,k) + x3(j,i,k)=x3(j,i,k)+tv(j,i,k) + end do + end do + end do + + case('q','Q') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = rh(j,i,k) + x3(j,i,k)=x3(j,i,k)+rh(j,i,k) + end do + end do + end do + + case('oz','OZ') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = oz(j,i,k) + x3(j,i,k)=x3(j,i,k)+oz(j,i,k) + end do + end do + end do + ! save additional ensemble varaible data for direct reflectivity DA - case('ql','QL') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = ql(j,i,k) - x3(j,i,k)=x3(j,i,k)+ql(j,i,k) - end do - end do - end do - - case('qi','QI') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = qi(j,i,k) - x3(j,i,k)=x3(j,i,k)+qi(j,i,k) - end do - end do - end do - - case('qr','QR') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = qr(j,i,k) - x3(j,i,k)=x3(j,i,k)+qr(j,i,k) - end do - end do - end do - - case('qs','QS') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = qs(j,i,k) - x3(j,i,k)=x3(j,i,k)+qs(j,i,k) - end do - end do - end do - - case('qg','QG') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = qg(j,i,k) - x3(j,i,k)=x3(j,i,k)+qg(j,i,k) - end do - end do - end do - - case('qnr','QNR') - - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - if ( l_use_dbz_directDA ) then ! direct reflectivity DA - if ( cld_nt_updt > 0 ) then ! Update Nc - w3(j,i,k) = qnr(j,i,k) - x3(j,i,k)=x3(j,i,k)+qnr(j,i,k) - end if - else ! .not. l_use_dbz_directDA - w3(j,i,k) = qnr(j,i,k) - x3(j,i,k)=x3(j,i,k)+qnr(j,i,k) - end if - end do + case('ql','QL') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = ql(j,i,k) + x3(j,i,k)=x3(j,i,k)+ql(j,i,k) end do end do + end do - case('w','W') - do k=1,grd_ens%nsig - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w3(j,i,k) = w(j,i,k) - x3(j,i,k)=x3(j,i,k)+w(j,i,k) - end do - end do - end do - end select + case('qi','QI') - + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = qi(j,i,k) + x3(j,i,k)=x3(j,i,k)+qi(j,i,k) + end do + end do + end do - end do - - do ic2=1,nc2d - - call gsi_bundlegetpointer(en_perts(n,m),trim(cvars2d(ic2)),w2,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n - call stop2(9994) - end if - call gsi_bundlegetpointer(en_bar(m),trim(cvars2d(ic2)),x2,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for en_bar' - call stop2(9995) - end if - - select case (trim(cvars2d(ic2))) - - case('ps','PS') - - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w2(j,i) = ps(j,i) - x2(j,i)=x2(j,i)+ps(j,i) - end do - end do - - case('sst','SST') - ! IGNORE SST IN HYBRID for now - - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - w2(j,i) = zero - x2(j,i)=zero - end do - end do - - end select - end do - enddo - ! - ! CALCULATE ENSEMBLE MEAN - bar_norm = one/float(n_ens) - en_bar(m)%values=en_bar(m)%values*bar_norm - - ! Copy pbar to module array. ps_bar may be needed for vertical localization - ! in terms of scale heights/normalized p/p - do ic2=1,nc2d - - if(trim(cvars2d(ic2)) == 'ps'.or.trim(cvars2d(ic2)) == 'PS') then - - call gsi_bundlegetpointer(en_bar(m),trim(cvars2d(ic2)),x2,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for en_bar to get ps_bar' - call stop2(9996) - end if - - do i=1,grd_ens%lon2 - do j=1,grd_ens%lat2 - ps_bar(j,i,1)=x2(j,i) - end do - end do - exit - end if - end do - - call mpi_barrier(mpi_comm_world,ierror) - ! - ! - ! CONVERT ENSEMBLE MEMBERS TO ENSEMBLE PERTURBATIONS - sig_norm=sqrt(one/max(one,n_ens-one)) - - do n=1,n_ens - do i=1,nelen - en_perts(n,m)%valuesr4(i)=(en_perts(n,m)%valuesr4(i)-en_bar(m)%values(i))*sig_norm - end do - end do + case('qr','QR') - enddo ! it 4d loop - ! CALCULATE ENSEMBLE SPREAD - write_ens_sprd=.true. - if(write_ens_sprd ) then - call this%ens_spread_dualres_regional(mype,en_perts,nelen) - call mpi_barrier(mpi_comm_world,ierror) ! do we need this mpi_barrier here? - endif - do m=1,ntlevs_ens + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = qr(j,i,k) + x3(j,i,k)=x3(j,i,k)+qr(j,i,k) + end do + end do + end do + + case('qs','QS') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = qs(j,i,k) + x3(j,i,k)=x3(j,i,k)+qs(j,i,k) + end do + end do + end do + + case('qg','QG') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = qg(j,i,k) + x3(j,i,k)=x3(j,i,k)+qg(j,i,k) + end do + end do + end do + + case('qnr','QNR') + + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + if ( l_use_dbz_directDA ) then ! direct reflectivity DA + if ( cld_nt_updt > 0 ) then ! Update Nc + w3(j,i,k) = qnr(j,i,k) + x3(j,i,k)=x3(j,i,k)+qnr(j,i,k) + end if + else ! .not. l_use_dbz_directDA + w3(j,i,k) = qnr(j,i,k) + x3(j,i,k)=x3(j,i,k)+qnr(j,i,k) + end if + end do + end do + end do + + case('w','W') + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = w(j,i,k) + x3(j,i,k)=x3(j,i,k)+w(j,i,k) + end do + end do + end do + end select + + + + end do + + do ic2=1,nc2d + + call gsi_bundlegetpointer(en_perts(n,m),trim(cvars2d(ic2)),w2,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n + call stop2(9994) + end if + call gsi_bundlegetpointer(en_bar(m),trim(cvars2d(ic2)),x2,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for en_bar' + call stop2(9995) + end if + + select case (trim(cvars2d(ic2))) + + case('ps','PS') + + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w2(j,i) = ps(j,i) + x2(j,i)=x2(j,i)+ps(j,i) + end do + end do + + case('sst','SST') + ! IGNORE SST IN HYBRID for now + + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w2(j,i) = zero + x2(j,i)=zero + end do + end do + + end select + end do + enddo + ! + ! CALCULATE ENSEMBLE MEAN + bar_norm = one/float(n_ens) + en_bar(m)%values=en_bar(m)%values*bar_norm + + ! Copy pbar to module array. ps_bar may be needed for vertical localization + ! in terms of scale heights/normalized p/p + do ic2=1,nc2d + + if(trim(cvars2d(ic2)) == 'ps'.or.trim(cvars2d(ic2)) == 'PS') then + + call gsi_bundlegetpointer(en_bar(m),trim(cvars2d(ic2)),x2,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for en_bar to get ps_bar' + call stop2(9996) + end if + + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + ps_bar(j,i,1)=x2(j,i) + end do + end do + exit + end if + end do + + call mpi_barrier(mpi_comm_world,ierror) + ! + ! + ! CONVERT ENSEMBLE MEMBERS TO ENSEMBLE PERTURBATIONS + sig_norm=sqrt(one/max(one,n_ens-one)) + + do n=1,n_ens + do i=1,nelen + en_perts(n,m)%valuesr4(i)=(en_perts(n,m)%valuesr4(i)-en_bar(m)%values(i))*sig_norm + end do + end do + + enddo ! it 4d loop + ! CALCULATE ENSEMBLE SPREAD + write_ens_sprd=.true. + if(write_ens_sprd ) then + call this%ens_spread_dualres_regional(mype,en_perts,nelen) + call mpi_barrier(mpi_comm_world,ierror) ! do we need this mpi_barrier here? + endif + do m=1,ntlevs_ens call gsi_bundledestroy(en_bar(m),istatus) if(istatus/=0) then write(6,*)' in get_fv3_regional_ensperts_netcdf: trouble destroying en_bar bundle' - call stop2(9997) + call stop2(9997) endif - end do + end do - deallocate(en_bar) + deallocate(en_bar) ! - return + return 30 write(6,*) 'get_fv3_regional_ensperts_netcdf: open filelist failed ' call stop2(555) @@ -408,7 +523,8 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) end subroutine get_fv3_regional_ensperts_run - subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g_rh,g_oz) + subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g_rh,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,g_qnr,g_w) !$$$ subprogram documentation block ! first compied from general_read_arw_regional . . . . ! subprogram: general_read_fv3_regional read fv3sar model ensemble members @@ -430,65 +546,84 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g ! !$$$ end documentation block - use netcdf, only: nf90_nowrite - use netcdf, only: nf90_open,nf90_close - use netcdf, only: nf90_inq_dimid,nf90_inquire_dimension - use netcdf, only: nf90_inq_varid,nf90_inquire_variable,nf90_get_var - use kinds, only: r_kind,r_single,i_kind - use gridmod, only: eta1_ll,eta2_ll - use constants, only: zero,one,fv,zero_single,one_tenth,h300 - use hybrid_ensemble_parameters, only: grd_ens,q_hyb_ens - use hybrid_ensemble_parameters, only: fv3sar_ensemble_opt - - use mpimod, only: mpi_comm_world,mpi_rtype - use netcdf_mod, only: nc_check - use gsi_rfv3io_mod,only: type_fv3regfilenameg - use gsi_rfv3io_mod,only:n2d - use gsi_rfv3io_mod,only:mype_t,mype_p ,mype_q,mype_oz - use constants, only: half,zero - use gsi_rfv3io_mod, only: gsi_fv3ncdf_read - use gsi_rfv3io_mod, only: gsi_fv3ncdf_read_v1 - use gsi_rfv3io_mod, only: gsi_fv3ncdf_readuv - use gsi_rfv3io_mod, only: gsi_fv3ncdf_readuv_v1 - use gsi_rfv3io_mod, only: gsi_fv3ncdf2d_read_v1 - - implicit none - ! - ! Declare passed variables - class(get_fv3_regional_ensperts_class), intent(inout) :: this - type (type_fv3regfilenameg) , intent (in) :: fv3_filenameginput - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),intent(out)::g_u,g_v,g_tv,g_rh,g_oz - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2),intent(out):: g_ps - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) ::g_tsen, g_q,g_prsl - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig+1) ::g_prsi - ! - ! Declare local parameters - real(r_kind),parameter:: r0_01 = 0.01_r_kind - real(r_kind),parameter:: r10 = 10.0_r_kind - real(r_kind),parameter:: r100 = 100.0_r_kind - ! - ! Declare local variables - - integer(i_kind):: i,j,k,kp - integer(i_kind) iderivative - - - logical ice + use netcdf, only: nf90_nowrite + use netcdf, only: nf90_open,nf90_close + use netcdf, only: nf90_inq_dimid,nf90_inquire_dimension + use netcdf, only: nf90_inq_varid,nf90_inquire_variable,nf90_get_var + use kinds, only: r_kind,r_single,i_kind + use gridmod, only: eta1_ll,eta2_ll + use constants, only: zero,one,fv,zero_single,one_tenth,h300 + use hybrid_ensemble_parameters, only: grd_ens,q_hyb_ens + use hybrid_ensemble_parameters, only: fv3sar_ensemble_opt + + use mpimod, only: mpi_comm_world,mpi_rtype + use netcdf_mod, only: nc_check + use gsi_rfv3io_mod,only: type_fv3regfilenameg + use gsi_rfv3io_mod,only:n2d + use constants, only: half,zero + use gsi_rfv3io_mod, only: gsi_fv3ncdf_read + use gsi_rfv3io_mod, only: gsi_fv3ncdf_read_v1 + use gsi_rfv3io_mod, only: gsi_fv3ncdf_readuv + use gsi_rfv3io_mod, only: gsi_fv3ncdf_readuv_v1 + use gsi_rfv3io_mod, only: gsi_fv3ncdf2d_read_v1 + use directDA_radaruse_mod, only: l_use_dbz_directDA + use gsi_bundlemod, only: gsi_gridcreate + use gsi_bundlemod, only: gsi_grid + use gsi_bundlemod, only: gsi_bundlecreate,gsi_bundledestroy + use gsi_bundlemod, only: gsi_bundlegetvar + use hybrid_ensemble_parameters, only: grd_ens + use directDA_radaruse_mod, only: l_use_cvpqx, cvpqx_pval, cld_nt_updt + use directDA_radaruse_mod, only: l_cvpnr, cvpnr_pval + + + + implicit none +! +! Declare passed variables + class(get_fv3_regional_ensperts_class), intent(inout) :: this + type (type_fv3regfilenameg) , intent (in) :: fv3_filenameginput + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),intent(out)::g_u,g_v,g_tv,g_rh,g_oz + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),optional,intent(out)::g_ql,g_qi,g_qr + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),optional,intent(out)::g_qs,g_qg,g_qnr,g_w + + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2),intent(out):: g_ps + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig+1) ::g_prsi + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) ::g_prsl ,g_tsen,g_q,g_delp +! +! Declare local parameters + real(r_kind),parameter:: r0_01 = 0.01_r_kind + real(r_kind),parameter:: r10 = 10.0_r_kind + real(r_kind),parameter:: r100 = 100.0_r_kind + ! +! Declare local variables + + integer(i_kind):: i,j,k,kp + + integer(i_kind) iderivative + + + logical ice + + character(len=24),parameter :: myname_ = 'general_read_fv3_regional' + type(gsi_bundle) :: gsibundle_fv3lam_ens_dynvar_nouv + type(gsi_bundle) :: gsibundle_fv3lam_ens_tracer_nouv + type(gsi_grid):: grid_ens - character(len=24),parameter :: myname_ = 'general_read_fv3_regional' + character(len=:),allocatable :: grid_spec !='fv3_grid_spec' + character(len=:),allocatable :: ak_bk !='fv3_akbk' + character(len=:),allocatable :: dynvars !='fv3_dynvars' + character(len=:),allocatable :: tracers !='fv3_tracer' + character(len=:),allocatable :: sfcdata !='fv3_sfcdata' + character(len=:),allocatable :: couplerres!='coupler.res' + integer (i_kind) ier,istatus - character(len=:),allocatable :: grid_spec !='fv3_grid_spec' - character(len=:),allocatable :: ak_bk !='fv3_akbk' - character(len=:),allocatable :: dynvars !='fv3_dynvars' - character(len=:),allocatable :: tracers !='fv3_tracer' - character(len=:),allocatable :: sfcdata !='fv3_sfcdata' - character(len=:),allocatable :: couplerres!='coupler.res' - - associate( this => this ) ! eliminates warning for unused dummy argument needed for binding - end associate + + associate( this => this ) ! eliminates warning for unused dummy argument needed for binding + end associate + call gsi_gridcreate(grid_ens,grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) grid_spec=fv3_filenameginput%grid_spec ak_bk=fv3_filenameginput%ak_bk dynvars=fv3_filenameginput%dynvars @@ -496,46 +631,77 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g sfcdata=fv3_filenameginput%sfcdata couplerres=fv3_filenameginput%couplerres - -!cltthinktobe should be contained in variable like grd_ens + + + if (allocated(fv3lam_ens_io_dynmetvars2d_nouv) ) then + call gsi_bundlecreate(gsibundle_fv3lam_ens_dynvar_nouv,grid_ens,'gsibundle_fv3lam_ens_dynvar_nouv', istatus,& + names2d=fv3lam_ens_io_dynmetvars2d_nouv,names3d=fv3lam_ens_io_dynmetvars3d_nouv) + else + call gsi_bundlecreate(gsibundle_fv3lam_ens_dynvar_nouv,grid_ens,'gsibundle_fv3lam_ens_dynvar_nouv',istatus, & + names3d=fv3lam_ens_io_dynmetvars3d_nouv) + endif + + + if (allocated(fv3lam_ens_io_tracermetvars2d_nouv) ) then + call gsi_bundlecreate(gsibundle_fv3lam_ens_tracer_nouv,grid_ens,'gsibundle_fv3lam_ens_tracer_nouv', istatus,& + names2d=fv3lam_ens_io_tracermetvars2d_nouv,names3d=fv3lam_ens_io_tracermetvars3d_nouv) + else + call gsi_bundlecreate(gsibundle_fv3lam_ens_tracer_nouv,grid_ens,'gsibundle_fv3lam_ens_tracer_nouv',istatus, & + names3d=fv3lam_ens_io_tracermetvars3d_nouv) + endif + + + if(fv3sar_ensemble_opt == 0 ) then - call gsi_fv3ncdf_readuv(dynvars,g_u,g_v) + call gsi_fv3ncdf_readuv(grd_fv3lam_ens_uv,g_u,g_v,fv3_filenameginput) else - call gsi_fv3ncdf_readuv_v1(dynvars,g_u,g_v) + call gsi_fv3ncdf_readuv_v1(grd_fv3lam_ens_uv,g_u,g_v,fv3_filenameginput) endif if(fv3sar_ensemble_opt == 0) then - call gsi_fv3ncdf_read(dynvars,'T','t',g_tsen,mype_t) + call gsi_fv3ncdf_read(grd_fv3lam_ens_dynvar_io_nouv,gsibundle_fv3lam_ens_dynvar_nouv,& + fv3_filenameginput%dynvars,fv3_filenameginput) + call gsi_fv3ncdf_read(grd_fv3lam_ens_tracer_io_nouv,gsibundle_fv3lam_ens_tracer_nouv,& + fv3_filenameginput%tracers,fv3_filenameginput) else - call gsi_fv3ncdf_read_v1(dynvars,'t','T',g_tsen,mype_t) + call gsi_fv3ncdf_read_v1(grd_fv3lam_ens_dynvar_io_nouv,gsibundle_fv3lam_ens_dynvar_nouv,& + fv3_filenameginput%dynvars,fv3_filenameginput) + call gsi_fv3ncdf_read_v1(grd_fv3lam_ens_tracer_io_nouv,gsibundle_fv3lam_ens_tracer_nouv,& + fv3_filenameginput%tracers,fv3_filenameginput) endif + ier=0 + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_dynvar_nouv, 'tsen' ,g_tsen ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'q' ,g_q ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'oz' ,g_oz ,istatus );ier=ier+istatus + if (l_use_dbz_directDA) then + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'ql' ,g_ql ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'qi' ,g_qi ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'qr' ,g_qr ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'qs' ,g_qs ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'qg' ,g_qg ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'qnr',g_qnr ,istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_dynvar_nouv, 'w' , g_w ,istatus );ier=ier+istatus + end if + + if (fv3sar_ensemble_opt == 0) then - call gsi_fv3ncdf_read(dynvars,'DELP','delp',g_prsi,mype_p) + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_dynvar_nouv, 'delp' ,g_delp ,istatus );ier=ier+istatus g_prsi(:,:,grd_ens%nsig+1)=eta1_ll(grd_ens%nsig+1) !thinkto be done , should use eta1_ll from ensemble grid do i=grd_ens%nsig,1,-1 - g_prsi(:,:,i)=g_prsi(:,:,i)*0.001_r_kind+g_prsi(:,:,i+1) + g_prsi(:,:,i)=g_delp(:,:,i)*0.001_r_kind+g_prsi(:,:,i+1) enddo - g_ps(:,:)=g_prsi(:,:,1) + g_ps(:,:)=g_prsi(:,:,1) else ! for the ensemble processed frm CHGRES - call gsi_fv3ncdf2d_read_v1(dynvars,'ps','PS',g_ps,mype_p) + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_dynvar_nouv, 'ps' ,g_ps ,istatus );ier=ier+istatus g_ps=g_ps*0.001_r_kind do k=1,grd_ens%nsig+1 g_prsi(:,:,k)=eta1_ll(k)+eta2_ll(k)*g_ps enddo - endif - if(fv3sar_ensemble_opt == 0) then - call gsi_fv3ncdf_read(tracers,'SPHUM','sphum',g_q,mype_q) - call gsi_fv3ncdf_read(tracers,'O3MR','o3mr',g_oz,mype_oz) - else - call gsi_fv3ncdf_read_v1(tracers,'sphum','SPHUM',g_q,mype_q) - call gsi_fv3ncdf_read_v1(tracers,'o3mr','O3MR',g_oz,mype_oz) - endif - !! tsen2tv !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! do k=1,grd_ens%nsig do j=1,grd_ens%lon2 @@ -544,136 +710,36 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g enddo enddo enddo - if (.not.q_hyb_ens) then - ice=.true. - iderivative=0 - do k=1,grd_ens%nsig - kp=k+1 - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - g_prsl(i,j,k)=(g_prsi(i,j,k)+g_prsi(i,j,kp))*half - end do - end do - end do - call genqsat(g_rh,g_tsen(1,1,1),g_prsl(1,1,1),grd_ens%lat2,grd_ens%lon2,grd_ens%nsig,ice,iderivative) - do k=1,grd_ens%nsig - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - g_rh(i,j,k) = g_q(i,j,k)/g_rh(i,j,k) - end do - end do + if (.not.q_hyb_ens) then + ice=.true. + iderivative=0 + do k=1,grd_ens%nsig + kp=k+1 + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + g_prsl(i,j,k)=(g_prsi(i,j,k)+g_prsi(i,j,kp))*half + end do + end do + end do + call genqsat(g_rh,g_tsen(1,1,1),g_prsl(1,1,1),grd_ens%lat2,grd_ens%lon2,grd_ens%nsig,ice,iderivative) + do k=1,grd_ens%nsig + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + g_rh(i,j,k) = g_q(i,j,k)/g_rh(i,j,k) + end do + end do + end do + else + do k=1,grd_ens%nsig + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + g_rh(i,j,k) = g_q(i,j,k) + end do end do - else - do k=1,grd_ens%nsig - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - g_rh(i,j,k) = g_q(i,j,k) - end do - end do - end do - end if - - - - - - return - end subroutine general_read_fv3_regional - - subroutine general_read_fv3_regional_dirZDA(this,fv3_filenameginput,g_ql,g_qi,g_qr,g_qs,g_qg,g_qnr,g_w) - !$$$ subprogram documentation block - ! firstly copied from general_read_arw_regional . . . . - ! subprogram: general_read_fv3_regional_dirZda read fv3sar model ensemble members - ! prgmmr: Ting org: emc/ncep date: 2018 - ! - ! abstract: read ensemble members from the fv3 model netcdf format (dynamic and tracer) - ! for use with hybrid ensemble option. - ! - ! program history log: - ! 2018- Ting - intial versions - ! 2019-03-13 CAPS(C. Tong) - Port direct radar DA capabilities - ! 2021-05-05 CAPS(J. Park) - Modified to read hydrometeors and w only - ! - ! input argument list: - ! - ! output argument list: - ! - ! attributes: - ! language: f90 - ! machine: ibm RS/6000 SP - ! - !$$$ end documentation block - - use netcdf, only: nf90_nowrite - use netcdf, only: nf90_open,nf90_close - use netcdf, only: nf90_inq_dimid,nf90_inquire_dimension - use netcdf, only: nf90_inq_varid,nf90_inquire_variable,nf90_get_var - use kinds, only: r_kind,r_single,i_kind - use constants, only: one - use hybrid_ensemble_parameters, only: grd_ens - use hybrid_ensemble_parameters, only: fv3sar_ensemble_opt - - use mpimod, only: mpi_comm_world,mpi_rtype - use netcdf_mod, only: nc_check - use gsi_rfv3io_mod,only: type_fv3regfilenameg - use gsi_rfv3io_mod,only:n2d - use gsi_rfv3io_mod,only:mype_qr,mype_qs,mype_qg,mype_qnr,mype_w - use gsi_rfv3io_mod,only:mype_ql,mype_qi - use gsi_rfv3io_mod, only: gsi_fv3ncdf_read - use gsi_rfv3io_mod, only: gsi_fv3ncdf_read_v1 - use directDA_radaruse_mod, only: l_use_cvpqx, cvpqx_pval, cld_nt_updt - use directDA_radaruse_mod, only: l_cvpnr, cvpnr_pval - - implicit none - ! - ! Declare passed variables - class(get_fv3_regional_ensperts_class), intent(inout) :: this - type (type_fv3regfilenameg) , intent (in) :: fv3_filenameginput - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),intent(out)::g_ql,g_qi,g_qr - real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),intent(out)::g_qs,g_qg,g_qnr,g_w - ! - ! Declare local parameters - real(r_kind),parameter:: r0_01 = 0.01_r_kind - real(r_kind),parameter:: r10 = 10.0_r_kind - real(r_kind),parameter:: r100 = 100.0_r_kind - ! - ! Declare local variables - - integer(i_kind):: i,j,k - - character(len=24),parameter :: myname_ = 'general_read_fv3_regional_dirZDA' - - character(len=:),allocatable :: grid_spec !='fv3_grid_spec' - character(len=:),allocatable :: ak_bk !='fv3_akbk' - character(len=:),allocatable :: dynvars !='fv3_dynvars' - character(len=:),allocatable :: tracers !='fv3_tracer' - character(len=:),allocatable :: sfcdata !='fv3_sfcdata' - character(len=:),allocatable :: couplerres!='coupler.res' - - associate( this => this ) ! eliminates warning for unused dummy argument needed for binding - end associate + end do + end if - grid_spec=fv3_filenameginput%grid_spec - ak_bk=fv3_filenameginput%ak_bk - dynvars=fv3_filenameginput%dynvars - tracers=fv3_filenameginput%tracers - sfcdata=fv3_filenameginput%sfcdata - couplerres=fv3_filenameginput%couplerres - if(fv3sar_ensemble_opt == 0) then -! variables for direct reflectivity DA - call gsi_fv3ncdf_read(dynvars,'W','w',g_w,mype_w) - call gsi_fv3ncdf_read(tracers,'LIQ_WAT','liq_wat',g_ql,mype_ql) - call gsi_fv3ncdf_read(tracers,'ICE_WAT','ice_wat',g_qi,mype_qi) - call gsi_fv3ncdf_read(tracers,'RAINWAT','rainwat',g_qr,mype_qr) - call gsi_fv3ncdf_read(tracers,'SNOWWAT','snowwat',g_qs,mype_qs) - call gsi_fv3ncdf_read(tracers,'GRAUPEL','graupel',g_qg,mype_qg) - call gsi_fv3ncdf_read(tracers,'RAIN_NC','rain_nc',g_qnr,mype_qnr) - else - write(6,*) "get_fv3_regional_ensperts for 'fv3sar_bg_opt == 0 is only available & - for now in direct relfectivity DA" - stop - end if ! CV transform do k=1,grd_ens%nsig do i=1,grd_ens%lon2 @@ -717,10 +783,12 @@ subroutine general_read_fv3_regional_dirZDA(this,fv3_filenameginput,g_ql,g_qi,g_ enddo enddo enddo + call gsi_bundledestroy(gsibundle_fv3lam_ens_dynvar_nouv) + call gsi_bundledestroy(gsibundle_fv3lam_ens_tracer_nouv) return - end subroutine general_read_fv3_regional_dirZDA + end subroutine general_read_fv3_regional subroutine ens_spread_dualres_regional_fv3_regional(this,mype,en_perts,nelen) !$$$ subprogram documentation block diff --git a/src/gsi/gsi_rfv3io_mod.f90 b/src/gsi/gsi_rfv3io_mod.f90 index 44a5344297..a61433d653 100644 --- a/src/gsi/gsi_rfv3io_mod.f90 +++ b/src/gsi/gsi_rfv3io_mod.f90 @@ -13,6 +13,7 @@ module gsi_rfv3io_mod ! 2018-02-22 wu - add subroutines for read/write fv3_ncdf ! 2019 ting - modifications for use for ensemble IO and cold start files ! 2019-03-13 CAPS(C. Tong) - Port direct radar DA capabilities. +! 2021-11-01 lei - modify for fv3-lam parallel IO ! subroutines included: ! sub gsi_rfv3io_get_grid_specs ! sub read_fv3_files @@ -37,6 +38,9 @@ module gsi_rfv3io_mod use kinds, only: r_kind,i_kind use gridmod, only: nlon_regional,nlat_regional + use constants, only:max_varname_length + use gsi_bundlemod, only : gsi_bundle + use general_sub2grid_mod, only: sub2grid_info implicit none public type_fv3regfilenameg public bg_fv3regfilenameg @@ -44,7 +48,7 @@ module gsi_rfv3io_mod ! directory names (hardwired for now) type type_fv3regfilenameg - character(len=:),allocatable :: grid_spec !='fv3_grid_spec' + character(len=:),allocatable :: grid_spec !='fv3_grid_spec' character(len=:),allocatable :: ak_bk !='fv3_akbk' character(len=:),allocatable :: dynvars !='fv3_dynvars' character(len=:),allocatable :: tracers !='fv3_tracer' @@ -55,6 +59,7 @@ module gsi_rfv3io_mod end type type_fv3regfilenameg integer(i_kind):: fv3sar_bg_opt=0 + type(type_fv3regfilenameg):: bg_fv3regfilenameg integer(i_kind) nx,ny,nz real(r_kind),allocatable:: grid_lon(:,:),grid_lont(:,:),grid_lat(:,:),grid_latt(:,:) @@ -62,6 +67,24 @@ module gsi_rfv3io_mod integer(i_kind),allocatable:: ijns2d(:),displss2d(:),ijns(:),displss(:) integer(i_kind),allocatable:: ijnz(:),displsz_g(:) + real(r_kind),dimension(:,: ),allocatable:: ges_ps_bg + real(r_kind),dimension(:,: ),allocatable:: ges_ps_inc + real(r_kind),dimension(:,:,: ),allocatable:: ges_delp_bg + type(sub2grid_info) :: grd_fv3lam_dynvar_ionouv + type(sub2grid_info) :: grd_fv3lam_tracer_ionouv + type(sub2grid_info) :: grd_fv3lam_uv + integer(i_kind) ,parameter:: ndynvarslist=13, ntracerslist=8 + character(len=max_varname_length), parameter :: vardynvars(ndynvarslist) =(/"u","v","u_w","u_s", & + "v_w","v_s","t","tv","tsen","w","delp","ps","delzinc"/) + character(len=max_varname_length), parameter :: vartracers(ntracerslist) =(/'q','oz', & + 'ql','qi','qr','qs','qg','qnr'/) + character(len=max_varname_length), parameter :: varfv3name(15) =(/'u','v','W','T','delp','sphum','o3mr', & + 'liq_wat','ice_wat','rainwat','snowwat','graupel','rain_nc','ps','DZ'/) + character(len=max_varname_length), parameter :: vgsiname(15) =(/'u','v','w','tsen','delp','q','oz', & + 'ql','qi','qr','qs','qg','qnr','ps','delzinc'/) + character(len=max_varname_length),dimension(:),allocatable:: name_metvars2d + character(len=max_varname_length),dimension(:),allocatable:: name_metvars3d + ! set default to private private ! set subroutines to public @@ -80,6 +103,8 @@ module gsi_rfv3io_mod public :: k_slmsk,k_tsea,k_vfrac,k_vtype,k_stype,k_zorl,k_smc,k_stc public :: k_snwdph,k_f10m,mype_2d,n2d,k_orog,k_psfc public :: ijns,ijns2d,displss,displss2d,ijnz,displsz_g + public :: fv3lam_io_dynmetvars3d_nouv,fv3lam_io_tracermetvars3d_nouv + public :: fv3lam_io_dynmetvars2d_nouv,fv3lam_io_tracermetvars2d_nouv integer(i_kind) mype_u,mype_v,mype_t,mype_q,mype_p,mype_delz,mype_oz,mype_ql integer(i_kind) mype_qi,mype_qr,mype_qs,mype_qg,mype_qnr,mype_w @@ -100,6 +125,20 @@ module gsi_rfv3io_mod k_orog =11, & !terrain n2d=11 ) logical :: grid_reverse_flag + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_io_dynmetvars3d_nouv + ! copy of cvars3d excluding uv 3-d fields + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_io_tracermetvars3d_nouv + ! copy of cvars3d excluding uv 3-d fields + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_io_dynmetvars2d_nouv + ! copy of cvars3d excluding uv 3-d fields + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_io_tracermetvars2d_nouv + ! copy of cvars3d excluding uv 3-d fields + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_names_gsibundle_dynvar_nouv + !to define names in gsibundle + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_names_gsibundle_tracer_nouv + !to define names in gsibundle + type(gsi_bundle):: gsibundle_fv3lam_dynvar_nouv + type(gsi_bundle):: gsibundle_fv3lam_tracer_nouv contains subroutine fv3regfilename_init(this,grid_spec_input,ak_bk_input,dynvars_input, & @@ -144,8 +183,7 @@ subroutine fv3regfilename_init(this,grid_spec_input,ak_bk_input,dynvars_input, & else this%couplerres='coupler.res' endif - - end subroutine fv3regfilename_init +end subroutine fv3regfilename_init subroutine gsi_rfv3io_get_grid_specs(fv3filenamegin,ierr) @@ -200,14 +238,14 @@ subroutine gsi_rfv3io_get_grid_specs(fv3filenamegin,ierr) integer(i_kind),intent( out) :: ierr integer(i_kind) i,k,ndimensions,iret,nvariables,nattributes,unlimiteddimid integer(i_kind) len,gfile_loc - character(len=128) :: name + character(len=max_varname_length) :: name integer(i_kind) myear,mmonth,mday,mhour,mminute,msecond real(r_kind),allocatable:: abk_fv3(:) integer(i_kind) imiddle,jmiddle - coupler_res_filenam=fv3filenamegin%couplerres - grid_spec=fv3filenamegin%grid_spec - ak_bk=fv3filenamegin%ak_bk + coupler_res_filenam=fv3filenamegin%couplerres + grid_spec=fv3filenamegin%grid_spec + ak_bk=fv3filenamegin%ak_bk !!!!! set regional_time open(24,file=trim(coupler_res_filenam),form='formatted') @@ -289,7 +327,7 @@ subroutine gsi_rfv3io_get_grid_specs(fv3filenamegin,ierr) if( grid_type_fv3_regional == 1 ) then if(mype==0) write(6,*) 'FV3 regional input grid is E-W N-S grid' grid_reverse_flag=.true. ! grid is revered comparing to usual map view - elseif(grid_type_fv3_regional == 2) then + else if(grid_type_fv3_regional == 2) then if(mype==0) write(6,*) 'FV3 regional input grid is W-E S-N grid' grid_reverse_flag=.false. ! grid orientated just like we see on map view else @@ -622,16 +660,24 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) !$$$ end documentation block use kinds, only: r_kind,i_kind use mpimod, only: npe - use guess_grids, only: ges_tsen,ges_prsi + use mpimod, only: mpi_comm_world + use guess_grids, only:ges_prsi use gridmod, only: lat2,lon2,nsig,ijn,eta1_ll,eta2_ll,ijn_s use constants, only: one,fv use gsi_metguess_mod, only: gsi_metguess_bundle - use gsi_bundlemod, only: gsi_bundlegetpointer + use gsi_bundlemod, only: gsi_bundleinquire, gsi_bundlegetpointer + use gsi_bundlemod, only: gsi_bundlecreate,gsi_bundledestroy + use general_sub2grid_mod, only: general_sub2grid_create_info use mpeu_util, only: die use guess_grids, only: ntguessig use directDA_radaruse_mod, only: l_use_cvpqx, cvpqx_pval use directDA_radaruse_mod, only: l_use_dbz_directDA use directDA_radaruse_mod, only: l_cvpnr, cvpnr_pval + use gridmod,only: regional + use gridmod,only: l_reg_update_hydro_delz + use gridmod, only: grd_a + use mpimod, only: mype + use gsi_metguess_mod, only: gsi_metguess_get implicit none @@ -640,13 +686,15 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) integer(i_kind) k,i,j integer(i_kind) it,ier,istatus real(r_kind),dimension(:,:),pointer::ges_ps=>NULL() + real(r_kind),dimension(:,:),pointer::ges_ps_readin=>NULL() real(r_kind),dimension(:,:),pointer::ges_z=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_u=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_v=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_q=>NULL() -! real(r_kind),dimension(:,:,:),pointer::ges_ql=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_oz=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_tv=>NULL() + real(r_kind),dimension(:,:,:),pointer::ges_tsen_readin=>NULL() + real(r_kind),pointer,dimension(:,:,:):: ges_delp =>NULL() real(r_kind),dimension(:,:,:),pointer::ges_ql=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_qi=>NULL() @@ -656,47 +704,24 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) real(r_kind),dimension(:,:,:),pointer::ges_qg=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_qnr=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_w=>NULL() - - character(len=:),allocatable :: dynvars !='fv3_dynvars' - character(len=:),allocatable :: tracers !='fv3_tracer' - - - - dynvars= fv3filenamegin%dynvars - tracers= fv3filenamegin%tracers - - if(npe< 8) then - call die('read_fv3_netcdf_guess','not enough PEs to read in fv3 fields' ) - endif - mype_u=0 - mype_v=mod(1,npe) - mype_t=mod(2,npe) - mype_p=mod(3,npe) - mype_q=mod(4,npe) - mype_ql=mod(5,npe) - mype_oz=mod(6,npe) - mype_2d=mod(7,npe) - mype_delz=mod(8,npe) - - if (l_use_dbz_directDA) then ! direct reflectivity DA - if(npe< 15) then - call die('read_fv3_netcdf_guess','not enough PEs to read in fv3 fields for direct reflectivity DA' ) - endif - mype_qi=mod(9,npe) - mype_qr=mod(10,npe) - mype_qs=mod(11,npe) - mype_qg=mod(12,npe) - mype_qnr=mod(13,npe) - mype_w=mod(14,npe) - end if - + character(len=max_varname_length) :: vartem="" + character(len=64),dimension(:,:),allocatable:: names !to be same as in the grid the dummy sub2grid_info + character(len=64),dimension(:,:),allocatable:: uvnames + integer(i_kind),dimension(:,:),allocatable:: lnames + integer(i_kind),dimension(:,:),allocatable:: uvlnames + integer(i_kind):: inner_vars,numfields + integer(i_kind):: ndynvario2d,ntracerio2d,ilev,jdynvar,jtracer + integer(r_kind):: iuv,ndynvario3d,ntracerio3d + +!clt this block is still maintained for they would be needed for a certain 2d fields IO + mype_2d=mod(1,npe) allocate(ijns(npe),ijns2d(npe),ijnz(npe) ) allocate(displss(npe),displss2d(npe),displsz_g(npe) ) do i=1,npe ijns(i)=ijn_s(i)*nsig ijnz(i)=ijn(i)*nsig - ijns2d(i)=ijn_s(i)*n2d + ijns2d(i)=ijn_s(i)*n2d enddo displss(1)=0 displsz_g(1)=0 @@ -707,102 +732,314 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) displss2d(i)=displss2d(i-1)+ ijns2d(i-1) enddo -! do it=1,nfldsig - it=ntguessig - ier=0 - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'ps' ,ges_ps ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'z' , ges_z ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'u' , ges_u ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'v' , ges_v ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'tv' ,ges_tv ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'q' ,ges_q ,istatus );ier=ier+istatus -! call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'ql' ,ges_ql ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'oz' ,ges_oz ,istatus );ier=ier+istatus - if (l_use_dbz_directDA) then - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'ql' ,ges_ql ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qi' ,ges_qi ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qr' ,ges_qr ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qr' ,ges_iqr ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qs' ,ges_qs ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qg' ,ges_qg ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qnr',ges_qnr ,istatus );ier=ier+istatus - call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'w' , ges_w ,istatus );ier=ier+istatus - end if - if (ier/=0) call die(trim(myname),'cannot get pointers for fv3 met-fields, ier =',ier) - - if( fv3sar_bg_opt == 0) then - call gsi_fv3ncdf_readuv(dynvars,ges_u,ges_v) - else - call gsi_fv3ncdf_readuv_v1(dynvars,ges_u,ges_v) - endif - if( fv3sar_bg_opt == 0) then - call gsi_fv3ncdf_read(dynvars,'T','t',ges_tsen(1,1,1,it),mype_t) - else - call gsi_fv3ncdf_read_v1(dynvars,'t','T',ges_tsen(1,1,1,it),mype_t) - endif + it=ntguessig - if( fv3sar_bg_opt == 0) then - call gsi_fv3ncdf_read(dynvars,'DELP','delp',ges_prsi,mype_p) - ges_prsi(:,:,nsig+1,it)=eta1_ll(nsig+1) - do i=nsig,1,-1 - ges_prsi(:,:,i,it)=ges_prsi(:,:,i,it)*0.001_r_kind+ges_prsi(:,:,i+1,it) - enddo - ges_ps(:,:)=ges_prsi(:,:,1,it) - else - call gsi_fv3ncdf2d_read_v1(dynvars,'ps','PS',ges_ps,mype_p) - ges_prsi(:,:,nsig+1,it)=eta1_ll(nsig+1) - ges_ps=ges_ps*0.001_r_kind - do k=1,nsig - ges_prsi(:,:,k,it)=eta1_ll(k)+eta2_ll(k)*ges_ps - enddo - endif + allocate( name_metvars2d(GSI_MetGuess_Bundle(it)%n2d)) + allocate( name_metvars3d(GSI_MetGuess_Bundle(it)%n3d)) + call gsi_bundleinquire (GSI_MetGuess_Bundle(it),'shortnames::2d', name_metvars2d,istatus) + call gsi_bundleinquire (GSI_MetGuess_Bundle(it),'shortnames::3d', name_metvars3d,istatus) + if(mype == 0) then + do i=1,GSI_MetGuess_Bundle(it)%n2d + write(6,*)'metvardeb333-2d name ', trim(name_metvars2d(i)) + enddo + do i=1,GSI_MetGuess_Bundle(it)%n3d + write(6,*)'metvardeb333-3d name ', trim(name_metvars3d(i)) + enddo + endif + +!here a strict requirment for the names of "u" and "v" is rquired +!maybe more flexibile procedure would relax it + iuv=0 + ndynvario3d=0 + ntracerio3d=0 + do i=1,size(name_metvars3d) + vartem=trim(name_metvars3d(i)) + if(trim(vartem)=='u'.or.trim(vartem)=='v') then + iuv=iuv+1 + else + if(.not.(trim(vartem)=='iqr')) then + if (ifindstrloc(vardynvars,trim(vartem))> 0) then + ndynvario3d=ndynvario3d+1 + else if (ifindstrloc(vartracers,trim(vartem))> 0) then + ntracerio3d=ntracerio3d+1 + else + write(6,*)'the metvarname1 ',trim(vartem),' has not been considered yet, stop' + call stop2(333) + endif + endif ! iqr is the inital qr, need not to be in IO + endif + end do + if (iuv /= 2.or. ndynvario3d<=0.or.ntracerio3d<=0 ) then + write(6,*)"the set up for met variable is not as expected, abort" + call stop2(222) + endif + if (fv3sar_bg_opt == 0.and.ifindstrloc(name_metvars3d,'delp') <= 0)then + ndynvario3d=ndynvario3d+1 ! for delp + endif + if (fv3sar_bg_opt == 1.and.ifindstrloc(name_metvars3d,'delp') > 0)then + ndynvario3d=ndynvario3d-1 ! delp should not be used in IO + endif + if (l_reg_update_hydro_delz.and.fv3sar_bg_opt==0) ndynvario3d=ndynvario3d+1 ! for delzinc + allocate(fv3lam_io_dynmetvars3d_nouv(ndynvario3d)) + allocate(fv3lam_io_tracermetvars3d_nouv(ntracerio3d)) + + jdynvar=0 + jtracer=0 + do i=1,size(name_metvars3d) + vartem=trim(name_metvars3d(i)) + if(.not.(trim(vartem)=='u'.or.trim(vartem)=='v'.or.trim(vartem)=='iqr')) then + if(trim(vartem)=="tv" ) then + jdynvar=jdynvar+1 + fv3lam_io_dynmetvars3d_nouv(jdynvar)="tsen" + else if (ifindstrloc(vardynvars,trim(vartem)) > 0) then + if(.not.(fv3sar_bg_opt==1.and.trim(vartem)=="delp")) then + jdynvar=jdynvar+1 + fv3lam_io_dynmetvars3d_nouv(jdynvar)=trim(vartem) + endif + else if (ifindstrloc(vartracers,trim(vartem)) > 0) then + jtracer=jtracer+1 + fv3lam_io_tracermetvars3d_nouv(jtracer)=trim(vartem) + else + write(6,*)'the metvarname ',vartem,' is not expected, stop' + call flush(6) + call stop2(333) + endif + endif + enddo + if(fv3sar_bg_opt == 0.and.ifindstrloc( fv3lam_io_dynmetvars3d_nouv(1:jdynvar),"delp")<= 0) then + jdynvar=jdynvar+1 + fv3lam_io_dynmetvars3d_nouv(jdynvar)="delp" + endif + if (l_reg_update_hydro_delz.and.fv3sar_bg_opt==0) then + jdynvar=jdynvar+1 + fv3lam_io_dynmetvars3d_nouv(jdynvar)="delzinc" + endif + if(jdynvar /= ndynvario3d.or.jtracer /= ntracerio3d ) then + write(6,*)'ndynvario3d is not as expected, stop' + call flush(6) + call stop2(333) + endif + if(mype == 0) then + write(6,*) ' fv3lam_io_dynmetvars3d_nouv is ',(trim(fv3lam_io_dynmetvars3d_nouv(i)),i=1,ndynvario3d) + write(6,*) ' fv3lam_io_tracermevars3d_nouv is ',(trim(fv3lam_io_tracermetvars3d_nouv(i)),i=1,ntracerio3d) + endif + + ndynvario2d=0 + ntracerio2d=0 + do i=1,size(name_metvars2d) + vartem=trim(name_metvars2d(i)) + if(.not. (trim(vartem)=='ps'.and.fv3sar_bg_opt==0)) then + if (ifindstrloc(vardynvars,trim(vartem))> 0) then + ndynvario2d=ndynvario2d+1 + else if (ifindstrloc(vartracers,trim(vartem)) > 0) then + ntracerio2d=ntracerio2d+1 + else if(trim(vartem)=='z') then + write(6,*)'the metvarname ',trim(vartem),' will be dealt separately' + else + write(6,*)'the metvarname2 ',trim(vartem),' has not been considered yet, stop' + call stop2(333) + endif + endif + end do + if (ndynvario2d > 0) then + allocate(fv3lam_io_dynmetvars2d_nouv(ndynvario2d)) + endif + if (ntracerio2d > 0) allocate(fv3lam_io_tracermetvars2d_nouv(ntracerio2d)) + jdynvar=0 + jtracer=0 + do i=1,size(name_metvars2d) + vartem=trim(name_metvars2d(i)) + if(.not.( (trim(vartem)=='ps'.and.fv3sar_bg_opt==0).or.(trim(vartem)=="z"))) then !z is treated separately + if (ifindstrloc(vardynvars,trim(vartem)) > 0) then + jdynvar=jdynvar+1 + fv3lam_io_dynmetvars2d_nouv(jdynvar)=trim(vartem) + else if (ifindstrloc(vartracers,trim(vartem)) > 0) then + jtracer=jtracer+1 + fv3lam_io_tracermetvars2d_nouv(jdynvar)=trim(vartem) + else + write(6,*)'the metvarname3 ',trim(vartem),' has not been considered yet, stop' + call stop2(333) + endif + endif + end do + if(mype == 0) then + if (allocated(fv3lam_io_dynmetvars2d_nouv)) & + write(6,*)' fv3lam_io_dynmetvars2d_nouv is ',(trim(fv3lam_io_dynmetvars2d_nouv(i)), i=1,ndynvario2d) + if (allocated(fv3lam_io_tracermetvars2d_nouv))& + write(6,*)'fv3lam_io_dynmetvars2d_nouv is ',(trim(fv3lam_io_dynmetvars2d_nouv(i)),i=1,ntracerio3d) + endif + + if (allocated(fv3lam_io_dynmetvars2d_nouv) ) then + call gsi_bundlecreate(gsibundle_fv3lam_dynvar_nouv,GSI_MetGuess_Bundle(it)%grid,'gsibundle_fv3lam_dynvar_nouv',istatus,& + names2d=fv3lam_io_dynmetvars2d_nouv,names3d=fv3lam_io_dynmetvars3d_nouv) + ndynvario2d=size(fv3lam_io_dynmetvars2d_nouv) + else + call gsi_bundlecreate(gsibundle_fv3lam_dynvar_nouv,GSI_MetGuess_Bundle(it)%grid,'gsibundle_fv3lam_dynvar_nouv',istatus, & + names3d=fv3lam_io_dynmetvars3d_nouv) + ndynvario2d=0 + endif + if (allocated(fv3lam_io_tracermetvars2d_nouv) ) then + call gsi_bundlecreate(gsibundle_fv3lam_tracer_nouv,GSI_MetGuess_Bundle(it)%grid,'gsibundle_fv3lam_tracer_varnouv',istatus,& + names2d=fv3lam_io_tracermetvars2d_nouv,names3d=fv3lam_io_tracermetvars2d_nouv) + ntracerio2d=size(fv3lam_io_tracermetvars2d_nouv) + else + call gsi_bundlecreate(gsibundle_fv3lam_tracer_nouv,GSI_MetGuess_Bundle(it)%grid,'gsibundle_fv3lam_tracer_nouv',istatus, & + names3d=fv3lam_io_tracermetvars3d_nouv) + ntracerio2d=0 + endif + + + + inner_vars=1 + numfields=inner_vars*(ndynvario3d*grd_a%nsig+ndynvario2d) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,ndynvario3d + do k=1,grd_a%nsig + lnames(1,ilev)=k + names(1,ilev)=trim(fv3lam_io_dynmetvars3d_nouv(i)) + ilev=ilev+1 + enddo + enddo + do i=1,ndynvario2d + lnames(1,ilev)=1 + names(1,ilev)=trim(fv3lam_io_dynmetvars2d_nouv(i)) + ilev=ilev+1 + enddo + call general_sub2grid_create_info(grd_fv3lam_dynvar_ionouv,inner_vars,grd_a%nlat,& + grd_a%nlon,grd_a%nsig,numfields,regional,names=names,lnames=lnames) + inner_vars=1 + numfields=inner_vars*(ntracerio3d*grd_a%nsig+ntracerio2d) + deallocate(lnames,names) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,ntracerio3d + do k=1,grd_a%nsig + lnames(1,ilev)=k + names(1,ilev)=trim(fv3lam_io_tracermetvars3d_nouv(i)) + ilev=ilev+1 + enddo + enddo + do i=1,ntracerio2d + lnames(1,ilev)=1 + names(1,ilev)=trim(fv3lam_io_tracermetvars2d_nouv(i)) + ilev=ilev+1 + enddo + call general_sub2grid_create_info(grd_fv3lam_tracer_ionouv,inner_vars,grd_a%nlat,& + grd_a%nlon,grd_a%nsig,numfields,regional,names=names,lnames=lnames) + + inner_vars=2 + numfields=grd_a%nsig + allocate(uvlnames(inner_vars,numfields),uvnames(inner_vars,numfields)) + do k=1,grd_a%nsig + uvlnames(1,k)=k + uvlnames(2,k)=k + uvnames(1,k)='u' + uvnames(2,k)='v' + enddo + call general_sub2grid_create_info(grd_fv3lam_uv,inner_vars,grd_a%nlat,& + grd_a%nlon,grd_a%nsig,numfields,regional,names=uvnames,lnames=uvlnames) + + deallocate(lnames,names,uvlnames,uvnames) + - if( fv3sar_bg_opt == 0) then - call gsi_fv3ncdf_read(tracers,'SPHUM','sphum',ges_q,mype_q) -! call gsi_fv3ncdf_read(tracers,'LIQ_WAT','liq_wat',ges_ql,mype_ql) - call gsi_fv3ncdf_read(tracers,'O3MR','o3mr',ges_oz,mype_oz) - else - call gsi_fv3ncdf_read_v1(tracers,'sphum','SPHUM',ges_q,mype_q) - call gsi_fv3ncdf_read_v1(tracers,'o3mr','O3MR',ges_oz,mype_oz) - endif + -!! tsen2tv !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - do k=1,nsig - do j=1,lon2 - do i=1,lat2 - ges_tv(i,j,k)=ges_tsen(i,j,k,it)*(one+fv*ges_q(i,j,k)) - enddo - enddo - enddo - call gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) + ier=0 + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'ps' ,ges_ps ,istatus );ier=ier+istatus + + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'z' , ges_z ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'u' , ges_u ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'v' , ges_v ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'tv' ,ges_tv ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'q' ,ges_q ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'oz' ,ges_oz ,istatus );ier=ier+istatus + if (l_use_dbz_directDA) then + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'ql' ,ges_ql ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qi' ,ges_qi ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qr' ,ges_qr ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'iqr' ,ges_iqr ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qs' ,ges_qs ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qg' ,ges_qg ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qnr',ges_qnr ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'w' , ges_w ,istatus );ier=ier+istatus + end if - if (l_use_dbz_directDA ) then - if( fv3sar_bg_opt == 0) then - call gsi_fv3ncdf_read(dynvars,'W','w',ges_w,mype_w) - call gsi_fv3ncdf_read(tracers,'LIQ_WAT','liq_wat',ges_ql,mype_ql) - call gsi_fv3ncdf_read(tracers,'ICE_WAT','ice_wat',ges_qi,mype_qi) - call gsi_fv3ncdf_read(tracers,'RAINWAT','rainwat',ges_qr,mype_qr) - ges_iqr=ges_qr - call gsi_fv3ncdf_read(tracers,'SNOWWAT','snowwat',ges_qs,mype_qs) - call gsi_fv3ncdf_read(tracers,'GRAUPEL','graupel',ges_qg,mype_qg) - call gsi_fv3ncdf_read(tracers,'RAIN_NC','rain_nc',ges_qnr,mype_qnr) + if (ier/=0) call die(trim(myname),'cannot get pointers for fv3 met-fields, ier =',ier) + if( fv3sar_bg_opt == 0) then + call gsi_fv3ncdf_readuv(grd_fv3lam_uv,ges_u,ges_v,fv3filenamegin) else - write(6,*) "FV3 IO READ for 'fv3sar_bg_opt == 0' is only available for now in direct reflectivity DA" - stop - end if + call gsi_fv3ncdf_readuv_v1(grd_fv3lam_uv,ges_u,ges_v,fv3filenamegin) + endif + if( fv3sar_bg_opt == 0) then + call gsi_fv3ncdf_read(grd_fv3lam_dynvar_ionouv,gsibundle_fv3lam_dynvar_nouv,fv3filenamegin%dynvars,fv3filenamegin) + call gsi_fv3ncdf_read(grd_fv3lam_tracer_ionouv,gsibundle_fv3lam_tracer_nouv,fv3filenamegin%tracers,fv3filenamegin) + else + call gsi_fv3ncdf_read_v1(grd_fv3lam_dynvar_ionouv,gsibundle_fv3lam_dynvar_nouv,fv3filenamegin%dynvars,fv3filenamegin) + call gsi_fv3ncdf_read_v1(grd_fv3lam_tracer_ionouv,gsibundle_fv3lam_tracer_nouv,fv3filenamegin%tracers,fv3filenamegin) + endif + + if( fv3sar_bg_opt == 0) then + call GSI_BundleGetPointer ( gsibundle_fv3lam_dynvar_nouv, 'delp' ,ges_delp ,istatus );ier=ier+istatus + if(istatus==0) ges_delp=ges_delp*0.001_r_kind + endif + call gsi_copy_bundle(gsibundle_fv3lam_dynvar_nouv,GSI_MetGuess_Bundle(it)) + call gsi_copy_bundle(gsibundle_fv3lam_tracer_nouv,GSI_MetGuess_Bundle(it)) + call GSI_BundleGetPointer ( gsibundle_fv3lam_dynvar_nouv, 'tsen' ,ges_tsen_readin ,istatus );ier=ier+istatus + !! tsen2tv !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + do k=1,nsig + do j=1,lon2 + do i=1,lat2 + ges_tv(i,j,k)=ges_tsen_readin(i,j,k)*(one+fv*ges_q(i,j,k)) + enddo + enddo + enddo + if( fv3sar_bg_opt == 0) then + allocate(ges_delp_bg(lat2,lon2,nsig)) + allocate(ges_ps_bg(lat2,lon2)) + ges_delp_bg=ges_delp + ges_prsi(:,:,nsig+1,it)=eta1_ll(nsig+1) + do i=nsig,1,-1 + ges_prsi(:,:,i,it)=ges_delp(:,:,i)+ges_prsi(:,:,i+1,it) + enddo + ges_ps(:,:)=ges_prsi(:,:,1,it) + ges_ps_bg=ges_ps + else + call GSI_BundleGetPointer ( gsibundle_fv3lam_dynvar_nouv, 'ps' ,ges_ps_readin ,istatus );ier=ier+istatus + ges_ps_readin=ges_ps_readin*0.001_r_kind !which is from + ges_ps=ges_ps_readin + ges_ps_bg=ges_ps + ges_prsi(:,:,nsig+1,it)=eta1_ll(nsig+1) + do k=1,nsig + ges_prsi(:,:,k,it)=eta1_ll(k)+eta2_ll(k)*ges_ps + enddo - call convert_qx_to_cvpqx(ges_qr, ges_qs, ges_qg, l_use_cvpqx, cvpqx_pval) ! convert Qx - call convert_nx_to_cvpnx(ges_qnr, l_cvpnr, cvpnr_pval) ! convert Qnx - end if + + endif + + call gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) + + if (l_use_dbz_directDA ) then + if( fv3sar_bg_opt == 0) then + ges_iqr=ges_qr + else + write(6,*) "FV3 IO READ for 'fv3sar_bg_opt == 0' is only available for now in direct reflectivity DA" + stop + end if + + call convert_qx_to_cvpqx(ges_qr, ges_qs, ges_qg, l_use_cvpqx, cvpqx_pval) ! convert Qx + call convert_nx_to_cvpnx(ges_qnr, l_cvpnr, cvpnr_pval) ! convert Qnx + + end if end subroutine read_fv3_netcdf_guess @@ -844,7 +1081,7 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) integer(i_kind),intent(in) :: it real(r_kind),intent(in),dimension(:,:),pointer::ges_z type (type_fv3regfilenameg),intent(in) :: fv3filenamegin - character(len=128) :: name + character(len=max_varname_length) :: name integer(i_kind),allocatable,dimension(:):: dim_id,dim real(r_kind),allocatable,dimension(:):: work real(r_kind),allocatable,dimension(:,:):: a @@ -865,52 +1102,109 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) allocate(work(itotsub*n2d)) allocate( sfcn2d(lat2,lon2,n2d)) - if(mype==mype_2d ) then - iret=nf90_open(sfcdata,nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' problem opening3 ',trim(sfcdata),', Status = ',iret - return - endif - iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) - allocate(dim(ndimensions)) - do k=1,ndimensions - iret=nf90_inquire_dimension(gfile_loc,k,name,len) - dim(k)=len - enddo -!!!!!!!!!!!! read in 2d variables !!!!!!!!!!!!!!!!!!!!!!!!!! - do i=ndimensions+1,nvariables - iret=nf90_inquire_variable(gfile_loc,i,name,len) - if( trim(name)=='f10m'.or.trim(name)=='F10M' ) then - k=k_f10m - else if( trim(name)=='stype'.or.trim(name)=='STYPE' ) then - k=k_stype - else if( trim(name)=='vfrac'.or.trim(name)=='VFRAC' ) then - k=k_vfrac - else if( trim(name)=='vtype'.or.trim(name)=='VTYPE' ) then - k=k_vtype - else if( trim(name)=='zorl'.or.trim(name)=='ZORL' ) then - k=k_zorl - else if( trim(name)=='tsea'.or.trim(name)=='TSEA' ) then - k=k_tsea - else if( trim(name)=='sheleg'.or.trim(name)=='SHELEG' ) then - k=k_snwdph - else if( trim(name)=='stc'.or.trim(name)=='STC' ) then - k=k_stc - else if( trim(name)=='smc'.or.trim(name)=='SMC' ) then - k=k_smc - else if( trim(name)=='SLMSK'.or.trim(name)=='slmsk' ) then - k=k_slmsk - else - cycle + if(mype==mype_2d ) then + iret=nf90_open(sfcdata,nf90_nowrite,gfile_loc) + if(iret/=nf90_noerr) then + write(6,*)' problem opening3 ',trim(sfcdata),', Status = ',iret + return + endif + iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) + allocate(dim(ndimensions)) + do k=1,ndimensions + iret=nf90_inquire_dimension(gfile_loc,k,name,len) + dim(k)=len + enddo + !!!!!!!!!!!! read in 2d variables !!!!!!!!!!!!!!!!!!!!!!!!!! + do i=ndimensions+1,nvariables + iret=nf90_inquire_variable(gfile_loc,i,name,len) + if( trim(name)=='f10m'.or.trim(name)=='F10M' ) then + k=k_f10m + else if( trim(name)=='stype'.or.trim(name)=='STYPE' ) then + k=k_stype + else if( trim(name)=='vfrac'.or.trim(name)=='VFRAC' ) then + k=k_vfrac + else if( trim(name)=='vtype'.or.trim(name)=='VTYPE' ) then + k=k_vtype + else if( trim(name)=='zorl'.or.trim(name)=='ZORL' ) then + k=k_zorl + else if( trim(name)=='tsea'.or.trim(name)=='TSEA' ) then + k=k_tsea + else if( trim(name)=='sheleg'.or.trim(name)=='SHELEG' ) then + k=k_snwdph + else if( trim(name)=='stc'.or.trim(name)=='STC' ) then + k=k_stc + else if( trim(name)=='smc'.or.trim(name)=='SMC' ) then + k=k_smc + else if( trim(name)=='SLMSK'.or.trim(name)=='slmsk' ) then + k=k_slmsk + else + cycle + endif + iret=nf90_inquire_variable(gfile_loc,i,ndims=ndim) + if(allocated(dim_id )) deallocate(dim_id ) + allocate(dim_id(ndim)) + iret=nf90_inquire_variable(gfile_loc,i,dimids=dim_id) + if(allocated(sfc )) deallocate(sfc ) + if(ndim >=3) then !the block of 10 lines is compied from GSL gsi. + allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) + iret=nf90_get_var(gfile_loc,i,sfc) + else if (ndim == 2) then + allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),1)) + iret=nf90_get_var(gfile_loc,i,sfc(:,:,1)) + else + write(*,*) "wrong dimension number ndim =",ndim + call stop2(119) + endif + + call fv3_h_to_ll(sfc(:,:,1),a,nx,ny,nxa,nya,grid_reverse_flag) + + kk=0 + do n=1,npe + ns=displss2d(n)+(k-1)*ijn_s(n) + do j=1,ijn_s(n) + ns=ns+1 + kk=kk+1 + ii=ltosi_s(kk) + jj=ltosj_s(kk) + work(ns)=a(ii,jj) + end do + end do + enddo ! i + iret=nf90_close(gfile_loc) + + !!!! read in orog from dynam !!!!!!!!!!!! + iret=nf90_open(dynvars,nf90_nowrite,gfile_loc) + if(iret/=nf90_noerr) then + write(6,*)' problem opening4 ',trim(dynvars ),gfile_loc,', Status = ',iret + return endif - iret=nf90_inquire_variable(gfile_loc,i,ndims=ndim) - if(allocated(dim_id )) deallocate(dim_id ) - allocate(dim_id(ndim)) - iret=nf90_inquire_variable(gfile_loc,i,dimids=dim_id) - if(allocated(sfc )) deallocate(sfc ) - allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) - iret=nf90_get_var(gfile_loc,i,sfc) - call fv3_h_to_ll(sfc(:,:,1),a,nx,ny,nxa,nya,grid_reverse_flag) + + iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) + if(allocated(dim )) deallocate(dim ) + allocate(dim(ndimensions)) + + do k=1,ndimensions + iret=nf90_inquire_dimension(gfile_loc,k,name,len) + dim(k)=len + enddo + + + do k=ndimensions+1,nvariables + iret=nf90_inquire_variable(gfile_loc,k,name,len) + if(trim(name)=='PHIS' .or. trim(name)=='phis' ) then + iret=nf90_inquire_variable(gfile_loc,k,ndims=ndim) + if(allocated(dim_id )) deallocate(dim_id ) + allocate(dim_id(ndim)) + iret=nf90_inquire_variable(gfile_loc,k,dimids=dim_id) + allocate(sfc1(dim(dim_id(1)),dim(dim_id(2))) ) + iret=nf90_get_var(gfile_loc,k,sfc1) + exit + endif + enddo ! k + iret=nf90_close(gfile_loc) + + k=k_orog + call fv3_h_to_ll(sfc1,a,nx,ny,nxa,nya,grid_reverse_flag) kk=0 do n=1,npe @@ -923,57 +1217,9 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) work(ns)=a(ii,jj) end do end do - enddo ! i - iret=nf90_close(gfile_loc) - -!!!! read in orog from dynam !!!!!!!!!!!! - iret=nf90_open(trim(dynvars ),nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' problem opening4 ',trim(dynvars ),gfile_loc,', Status = ',iret - return - endif - - iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) - if(allocated(dim )) deallocate(dim ) - allocate(dim(ndimensions)) - - do k=1,ndimensions - iret=nf90_inquire_dimension(gfile_loc,k,name,len) - dim(k)=len - enddo - - - do k=ndimensions+1,nvariables - iret=nf90_inquire_variable(gfile_loc,k,name,len) - if(trim(name)=='PHIS' .or. trim(name)=='phis' ) then - iret=nf90_inquire_variable(gfile_loc,k,ndims=ndim) - if(allocated(dim_id )) deallocate(dim_id ) - allocate(dim_id(ndim)) - iret=nf90_inquire_variable(gfile_loc,k,dimids=dim_id) - allocate(sfc1(dim(dim_id(1)),dim(dim_id(2))) ) - iret=nf90_get_var(gfile_loc,k,sfc1) - exit - endif - enddo ! k - iret=nf90_close(gfile_loc) - - k=k_orog - call fv3_h_to_ll(sfc1,a,nx,ny,nxa,nya,grid_reverse_flag) - - kk=0 - do n=1,npe - ns=displss2d(n)+(k-1)*ijn_s(n) - do j=1,ijn_s(n) - ns=ns+1 - kk=kk+1 - ii=ltosi_s(kk) - jj=ltosj_s(kk) - work(ns)=a(ii,jj) - end do - end do - deallocate (dim_id,sfc,sfc1,dim) - endif ! mype + deallocate (dim_id,sfc,sfc1,dim) + endif ! mype !!!!!!! scatter !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -1051,7 +1297,7 @@ subroutine gsi_fv3ncdf2d_read_v1(filenamein,varname,varname2,work_sub,mype_io) allocate (work(itotsub)) if(mype==mype_io ) then - iret=nf90_open(trim(filenamein),nf90_nowrite,gfile_loc) + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc) if(iret/=nf90_noerr) then write(6,*)' gsi_fv3ncdf2d_read_v1: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret write(6,*)' gsi_fv3ncdf2d_read_v1: problem opening with varnam ',trim(varname) @@ -1096,14 +1342,14 @@ subroutine gsi_fv3ncdf2d_read_v1(filenamein,varname,varname2,work_sub,mype_io) return end subroutine gsi_fv3ncdf2d_read_v1 -subroutine gsi_fv3ncdf_read(filenamein,varname,varname2,work_sub,mype_io) +subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_fv3ncdf_read ! prgmmr: wu org: np22 date: 2017-10-10 -! -! abstract: read in a field from a netcdf FV3 file in mype_io -! then scatter the field to each PE +! lei re-write for parallelization date: 2021-09-29 +! similar for horizontal recurisve filtering +! abstract: read in fields excluding u and v ! program history log: ! ! input argument list: @@ -1123,95 +1369,79 @@ subroutine gsi_fv3ncdf_read(filenamein,varname,varname2,work_sub,mype_io) use kinds, only: r_kind,i_kind - use mpimod, only: ierror,mpi_comm_world,npe,mpi_rtype,mype - use gridmod, only: lat2,lon2,nsig,nlat,nlon,itotsub,ijn_s + use mpimod, only: mpi_comm_world,mpi_rtype,mype + use mpimod, only: MPI_INFO_NULL use netcdf, only: nf90_open,nf90_close,nf90_get_var,nf90_noerr use netcdf, only: nf90_nowrite,nf90_inquire,nf90_inquire_dimension use netcdf, only: nf90_inquire_variable + use netcdf, only: nf90_inq_varid use mod_fv3_lola, only: fv3_h_to_ll - use general_commvars_mod, only: ltosi_s,ltosj_s + use gsi_bundlemod, only: gsi_bundle + use general_sub2grid_mod, only: sub2grid_info,general_grid2sub implicit none - character(*) ,intent(in ) :: varname,varname2,filenamein - real(r_kind) ,intent(out ) :: work_sub(lat2,lon2,nsig) - integer(i_kind) ,intent(in ) :: mype_io - character(len=128) :: name - real(r_kind),allocatable,dimension(:,:,:):: uu - integer(i_kind),allocatable,dimension(:):: dim_id,dim - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:):: a - - - integer(i_kind) n,ns,k,len,ndim - integer(i_kind) gfile_loc,iret - integer(i_kind) nz,nzp1,kk,j,mm1,i,ir,ii,jj - integer(i_kind) ndimensions,nvariables,nattributes,unlimiteddimid + type(sub2grid_info), intent(in):: grd_ionouv + type(gsi_bundle),intent(inout) :: cstate_nouv + character(*),intent(in):: filenamein + type (type_fv3regfilenameg),intent(in) ::fv3filenamegin + real(r_kind),allocatable,dimension(:,:):: uu2d + real(r_kind),dimension(1,grd_ionouv%nlat,grd_ionouv%nlon,grd_ionouv%kbegin_loc:grd_ionouv%kend_alloc):: hwork + character(len=max_varname_length) :: varname,vgsiname + character(len=max_varname_length) :: name + character(len=max_varname_length) :: filenamein2 + + + integer(i_kind) nlatcase,nloncase,nxcase,nycase,countloc(3),startloc(3) + integer(i_kind) ilev,ilevtot,inative + integer(i_kind) kbgn,kend + integer(i_kind) gfile_loc,iret,var_id + integer(i_kind) nz,nzp1,mm1 mm1=mype+1 - allocate (work(itotsub*nsig)) - - if(mype==mype_io ) then - iret=nf90_open(trim(filenamein),nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' gsi_fv3ncdf_read: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret - write(6,*)' gsi_fv3ncdf_read:problem opening5 with varnam ',trim(varname) - return - endif - - iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) - allocate(dim(ndimensions)) - allocate(a(nlat,nlon)) - - do k=1,ndimensions - iret=nf90_inquire_dimension(gfile_loc,k,name,len) - dim(k)=len - enddo - - - do k=ndimensions+1,nvariables - iret=nf90_inquire_variable(gfile_loc,k,name,len) - if(trim(name)==varname .or. trim(name)==varname2) then - iret=nf90_inquire_variable(gfile_loc,k,ndims=ndim) - if(allocated(dim_id )) deallocate(dim_id ) - allocate(dim_id(ndim)) - iret=nf90_inquire_variable(gfile_loc,k,dimids=dim_id) - if(allocated(uu )) deallocate(uu ) - allocate(uu(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) - iret=nf90_get_var(gfile_loc,k,uu) - exit - endif - enddo ! k - nz=nsig - nzp1=nz+1 - do i=1,nz - ir=nzp1-i - call fv3_h_to_ll(uu(:,:,i),a,dim(dim_id(1)),dim(dim_id(2)),nlon,nlat,grid_reverse_flag) - kk=0 - do n=1,npe - ns=displss(n)+(ir-1)*ijn_s(n) - do j=1,ijn_s(n) - ns=ns+1 - kk=kk+1 - ii=ltosi_s(kk) - jj=ltosj_s(kk) - work(ns)=a(ii,jj) - end do - end do - enddo ! i - - iret=nf90_close(gfile_loc) - deallocate (uu,a,dim,dim_id) - - endif !mype - - call mpi_scatterv(work,ijns,displss,mpi_rtype,& - work_sub,ijns(mm1),mpi_rtype,mype_io,mpi_comm_world,ierror) + nloncase=grd_ionouv%nlon + nlatcase=grd_ionouv%nlat + nxcase=nx + nycase=ny + kbgn=grd_ionouv%kbegin_loc + kend=grd_ionouv%kend_loc + allocate(uu2d(nxcase,nycase)) + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' gsi_fv3ncdf_read: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret + call flush(6) + call stop2(333) + endif + do ilevtot=kbgn,kend + vgsiname=grd_ionouv%names(1,ilevtot) + if(trim(vgsiname)=='delzinc') cycle !delzinc is not read from DZ ,it's started from hydrostatic height + call getfv3lamfilevname(vgsiname,fv3filenamegin,filenamein2,varname) + name=trim(varname) + if(trim(filenamein) /= trim(filenamein2)) then + write(6,*)'filenamein and filenamein2 are not the same as expected, stop' + call flush(6) + call stop2(333) + endif + ilev=grd_ionouv%lnames(1,ilevtot) + nz=grd_ionouv%nsig + nzp1=nz+1 + inative=nzp1-ilev + startloc=(/1,1,inative/) + countloc=(/nxcase,nycase,1/) + + iret=nf90_inq_varid(gfile_loc,trim(adjustl(varname)),var_id) + iret=nf90_get_var(gfile_loc,var_id,uu2d,start=startloc,count=countloc) + call fv3_h_to_ll(uu2d,hwork(1,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) + enddo ! ilevtot + call general_grid2sub(grd_ionouv,hwork,cstate_nouv%values) + iret=nf90_close(gfile_loc) + deallocate (uu2d) - deallocate (work) + + return end subroutine gsi_fv3ncdf_read -subroutine gsi_fv3ncdf_read_v1(filenamein,varname,varname2,work_sub,mype_io) +subroutine gsi_fv3ncdf_read_v1(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) !$$$ subprogram documentation block ! . . . . @@ -1240,98 +1470,86 @@ subroutine gsi_fv3ncdf_read_v1(filenamein,varname,varname2,work_sub,mype_io) use kinds, only: r_kind,i_kind - use mpimod, only: ierror,mpi_comm_world,npe,mpi_rtype,mype - use gridmod, only: lat2,lon2,nsig,nlat,nlon,itotsub,ijn_s + use mpimod, only: mpi_rtype,mpi_comm_world,mype,MPI_INFO_NULL + use mpimod, only: mpi_comm_world,mpi_rtype,mype use netcdf, only: nf90_open,nf90_close,nf90_get_var,nf90_noerr use netcdf, only: nf90_nowrite,nf90_inquire,nf90_inquire_dimension use netcdf, only: nf90_inquire_variable use netcdf, only: nf90_inq_varid use mod_fv3_lola, only: fv3_h_to_ll - use general_commvars_mod, only: ltosi_s,ltosj_s + use gsi_bundlemod, only: gsi_bundle + use general_sub2grid_mod, only: sub2grid_info,general_grid2sub implicit none - character(*) ,intent(in ) :: varname,varname2,filenamein - real(r_kind) ,intent(out ) :: work_sub(lat2,lon2,nsig) - integer(i_kind) ,intent(in ) :: mype_io - character(len=128) :: name - real(r_kind),allocatable,dimension(:,:,:):: uu - real(r_kind),allocatable,dimension(:,:,:):: temp0 - integer(i_kind),allocatable,dimension(:):: dim - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:):: a - - - integer(i_kind) n,ns,k,len,var_id + type(sub2grid_info), intent(in):: grd_ionouv + character(*),intent(in):: filenamein + type (type_fv3regfilenameg) :: fv3filenamegin + type(gsi_bundle),intent(inout) :: cstate_nouv + real(r_kind),allocatable,dimension(:,:):: uu2d + real(r_kind),dimension(1,grd_ionouv%nlat,grd_ionouv%nlon,grd_ionouv%kbegin_loc:grd_ionouv%kend_alloc):: hwork + character(len=max_varname_length) :: filenamein2 + character(len=max_varname_length) :: varname,vgsiname + + + integer(i_kind) nlatcase,nloncase,nxcase,nycase,countloc(3),startloc(3) + integer(i_kind) kbgn,kend + integer(i_kind) var_id + integer(i_kind) inative,ilev,ilevtot integer(i_kind) gfile_loc,iret - integer(i_kind) nztmp,nzp1,kk,j,mm1,i,ir,ii,jj - integer(i_kind) ndimensions,nvariables,nattributes,unlimiteddimid + integer(i_kind) nzp1,mm1 mm1=mype+1 - allocate (work(itotsub*nsig)) - if(mype==mype_io ) then - iret=nf90_open(trim(filenamein),nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' gsi_fv3ncdf_read_v1: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret - write(6,*)' gsi_fv3ncdf_read_v1: problem opening5 with varnam ',trim(varname) - return - endif + nloncase=grd_ionouv%nlon + nlatcase=grd_ionouv%nlat + nxcase=nx + nycase=ny + kbgn=grd_ionouv%kbegin_loc + kend=grd_ionouv%kend_loc + allocate(uu2d(nxcase,nycase)) + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' gsi_fv3ncdf_read_v1: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret + call flush(6) + call stop2(333) + endif - iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) - allocate(dim(ndimensions)) - allocate(a(nlat,nlon)) - do k=1,ndimensions - iret=nf90_inquire_dimension(gfile_loc,k,name,len) - dim(k)=len - enddo + do ilevtot=kbgn,kend + vgsiname=grd_ionouv%names(1,ilevtot) + call getfv3lamfilevname(vgsiname,fv3filenamegin,filenamein2,varname) + if(trim(filenamein) /= trim(filenamein2)) then + write(6,*)'filenamein and filenamein2 are not the same as expected, stop' + call flush(6) + call stop2(333) + endif + ilev=grd_ionouv%lnames(1,ilevtot) + nz=grd_ionouv%nsig + nzp1=nz+1 + inative=nzp1-ilev + startloc=(/1,1,inative+1/) + countloc=(/nxcase,nycase,1/) + iret=nf90_inq_varid(gfile_loc,trim(adjustl(varname)),var_id) + if(iret/=nf90_noerr) then + write(6,*)' wrong to get var_id ',var_id + call stop2(333) + endif + + iret=nf90_get_var(gfile_loc,var_id,uu2d,start=startloc,count=countloc) - allocate(uu(nx,ny,nsig)) - allocate(temp0(nx,ny,nsig+1)) + call fv3_h_to_ll(uu2d,hwork(1,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) + + enddo ! i + call general_grid2sub(grd_ionouv,hwork,cstate_nouv%values) + iret=nf90_close(gfile_loc) - iret=nf90_inq_varid(gfile_loc,trim(adjustl(varname)),var_id) - if(iret/=nf90_noerr) then - iret=nf90_inq_varid(gfile_loc,trim(adjustl(varname2)),var_id) - if(iret/=nf90_noerr) then - write(6,*)' wrong to get var_id ',var_id - endif - endif - - iret=nf90_get_var(gfile_loc,var_id,temp0) - uu(:,:,:)=temp0(:,:,2:(nsig+1)) - - nztmp=nsig - nzp1=nztmp+1 - do i=1,nztmp - ir=nzp1-i - call fv3_h_to_ll(uu(:,:,i),a,nx,ny,nlon,nlat,grid_reverse_flag) - kk=0 - do n=1,npe - ns=displss(n)+(ir-1)*ijn_s(n) - do j=1,ijn_s(n) - ns=ns+1 - kk=kk+1 - ii=ltosi_s(kk) - jj=ltosj_s(kk) - work(ns)=a(ii,jj) - end do - end do - enddo ! i + deallocate (uu2d) - iret=nf90_close(gfile_loc) - deallocate (uu,a,dim) - deallocate (temp0) - - endif !mype - call mpi_scatterv(work,ijns,displss,mpi_rtype,& - work_sub,ijns(mm1),mpi_rtype,mype_io,mpi_comm_world,ierror) - - deallocate (work) return end subroutine gsi_fv3ncdf_read_v1 -subroutine gsi_fv3ncdf_readuv(dynvarsfile,ges_u,ges_v) +subroutine gsi_fv3ncdf_readuv(grd_uv,ges_u,ges_v,fv3filenamegin) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_fv3ncdf_readuv @@ -1353,68 +1571,80 @@ subroutine gsi_fv3ncdf_readuv(dynvarsfile,ges_u,ges_v) ! !$$$ end documentation block use kinds, only: r_kind,i_kind - use mpimod, only: ierror,mpi_comm_world,npe,mpi_rtype,mype - use gridmod, only: lat2,lon2,nsig,itotsub,ijn_s + use mpimod, only: mpi_comm_world,mpi_rtype,mype,mpi_info_null use netcdf, only: nf90_open,nf90_close,nf90_get_var,nf90_noerr use netcdf, only: nf90_nowrite,nf90_inquire,nf90_inquire_dimension use netcdf, only: nf90_inquire_variable use netcdf, only: nf90_inq_varid - use mod_fv3_lola, only: fv3_h_to_ll,nya,nxa,fv3uv2earth - use general_commvars_mod, only: ltosi_s,ltosj_s + use mod_fv3_lola, only: fv3_h_to_ll,fv3uv2earth + use general_sub2grid_mod, only: sub2grid_info,general_grid2sub implicit none - character(*) ,intent(in ):: dynvarsfile - real(r_kind) ,intent(out ) :: ges_u(lat2,lon2,nsig) - real(r_kind) ,intent(out ) :: ges_v(lat2,lon2,nsig) - character(len=128) :: name - real(r_kind),allocatable,dimension(:,:,:):: uu,temp1 - integer(i_kind),allocatable,dimension(:):: dim_id,dim - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:):: a - real(r_kind),allocatable,dimension(:,:):: u,v + type(sub2grid_info), intent(in):: grd_uv + real(r_kind),dimension(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig),intent(inout)::ges_u + real(r_kind),dimension(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig),intent(inout)::ges_v + type (type_fv3regfilenameg),intent (in) :: fv3filenamegin + real(r_kind),dimension(2,grd_uv%nlat,grd_uv%nlon,grd_uv%kbegin_loc:grd_uv%kend_alloc):: hwork + character(:), allocatable:: filenamein + real(r_kind),allocatable,dimension(:,:):: u2d,v2d + real(r_kind),allocatable,dimension(:,:):: uc2d,vc2d + character(len=max_varname_length) :: filenamein2 + character(len=max_varname_length) :: varname,vgsiname + real(r_kind),allocatable,dimension(:,:,:,:):: worksub + integer(i_kind) u_grd_VarId,v_grd_VarId + integer(i_kind) nlatcase,nloncase + integer(i_kind) nxcase,nycase + integer(i_kind) u_countloc(3),u_startloc(3),v_countloc(3),v_startloc(3) + integer(i_kind) inative,ilev,ilevtot + integer(i_kind) kbgn,kend - integer(i_kind) n,ns,k,len,ndim integer(i_kind) gfile_loc,iret - integer(i_kind) nz,nzp1,kk,j,mm1,i,ir,ii,jj - integer(i_kind) ndimensions,nvariables,nattributes,unlimiteddimid + integer(i_kind) nz,nzp1,mm1 - allocate (work(itotsub*nsig)) mm1=mype+1 - if(mype==mype_u .or. mype==mype_v) then - iret=nf90_open(dynvarsfile,nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' problem opening6 ',trim(dynvarsfile),', Status = ',iret - return - endif - - iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) - - allocate(dim(ndimensions)) - allocate(a(nya,nxa)) - - do k=1,ndimensions - iret=nf90_inquire_dimension(gfile_loc,k,name,len) - dim(k)=len - enddo - - allocate(u(dim(1),dim(4))) - allocate(v(dim(1),dim(4))) - iret=nf90_inq_varid(gfile_loc,trim(adjustl("xaxis_1")),k) !thinkdeb - iret=nf90_get_var(gfile_loc,k,u(:,1)) + nloncase=grd_uv%nlon + nlatcase=grd_uv%nlat + nxcase=nx + nycase=ny + kbgn=grd_uv%kbegin_loc + kend=grd_uv%kend_loc + allocate(u2d(nxcase,nycase+1)) + allocate(v2d(nxcase+1,nycase)) + allocate(uc2d(nxcase,nycase)) + allocate(vc2d(nxcase,nycase)) + allocate (worksub(2,grd_uv%lat2,grd_uv%lon2,grd_uv%nsig)) + filenamein=fv3filenamegin%dynvars + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' problem opening6 ',trim(filenamein),', Status = ',iret + endif + do ilevtot=kbgn,kend + vgsiname=grd_uv%names(1,ilevtot) + call getfv3lamfilevname(vgsiname,fv3filenamegin,filenamein2,varname) + if(trim(filenamein) /= trim(filenamein2)) then + write(6,*)'filenamein and filenamein2 are not the same as expected, stop' + call flush(6) + call stop2(333) + endif + ilev=grd_uv%lnames(1,ilevtot) + nz=grd_uv%nsig + nzp1=nz+1 + inative=nzp1-ilev + u_countloc=(/nxcase,nycase+1,1/) + v_countloc=(/nxcase+1,nycase,1/) + u_startloc=(/1,1,inative/) + v_startloc=(/1,1,inative/) + + call check( nf90_inq_varid(gfile_loc,'u',u_grd_VarId) ) + iret=nf90_get_var(gfile_loc,u_grd_VarId,u2d,start=u_startloc,count=u_countloc) + call check( nf90_inq_varid(gfile_loc,'v',v_grd_VarId) ) + iret=nf90_get_var(gfile_loc,v_grd_VarId,v2d,start=v_startloc,count=v_countloc) + if(.not.grid_reverse_flag) then + call reverse_grid_r_uv (u2d,nxcase,nycase+1,1) + call reverse_grid_r_uv (v2d,nxcase+1,nycase,1) + endif + call fv3uv2earth(u2d(:,:),v2d(:,:),nxcase,nycase,uc2d,vc2d) - do k=ndimensions+1,nvariables - iret=nf90_inquire_variable(gfile_loc,k,name,len) - if(trim(name)=='u'.or.trim(name)=='U' .or. & - trim(name)=='v'.or.trim(name)=='V' ) then - iret=nf90_inquire_variable(gfile_loc,k,ndims=ndim) - if(allocated(dim_id )) deallocate(dim_id ) - allocate(dim_id(ndim)) - iret=nf90_inquire_variable(gfile_loc,k,dimids=dim_id) -! NOTE: dimension of variables on native fv3 grid. -! u and v have an extra row in one of the dimensions - if(allocated(uu)) deallocate(uu) - allocate(uu(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) - iret=nf90_get_var(gfile_loc,k,uu) ! NOTE on transfor to earth u/v: ! The u and v before transferring need to be in E-W/N-S grid, which is ! defined as reversed grid here because it is revered from map view. @@ -1430,60 +1660,24 @@ subroutine gsi_fv3ncdf_readuv(dynvarsfile,ges_u,ges_v) ! ! and the last input parameter for fv3_h_to_ll is alway true: ! -! call fv3_h_to_ll(u,a,nx,ny,nxa,nya,.true.) ! - if(trim(name)=='u'.or.trim(name)=='U') then - allocate(temp1(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) - if(.not.grid_reverse_flag) call reverse_grid_r_uv(uu,dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3))) - temp1=uu - else if(trim(name)=='v'.or.trim(name)=='V') then - if(.not.grid_reverse_flag) call reverse_grid_r_uv(uu,dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3))) - exit - endif - endif - enddo ! k -! transfor to earth u/v, interpolate to analysis grid, reverse vertical order - nz=nsig - nzp1=nz+1 - do i=1,nz - ir=nzp1-i - call fv3uv2earth(temp1(:,:,i),uu(:,:,i),nx,ny,u,v) - if(mype==mype_u)then - call fv3_h_to_ll(u,a,nx,ny,nxa,nya,.true.) - else - call fv3_h_to_ll(v,a,nx,ny,nxa,nya,.true.) - endif - kk=0 - do n=1,npe - ns=displss(n)+(ir-1)*ijn_s(n) - do j=1,ijn_s(n) - ns=ns+1 - kk=kk+1 - ii=ltosi_s(kk) - jj=ltosj_s(kk) - work(ns)=a(ii,jj) - end do - end do - enddo ! i - deallocate(temp1,a) - deallocate (dim,dim_id,uu,v,u) - iret=nf90_close(gfile_loc) - endif ! mype - -!! scatter to ges_u,ges_v !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - call mpi_scatterv(work,ijns,displss,mpi_rtype,& - ges_u,ijns(mm1),mpi_rtype,mype_u,mpi_comm_world,ierror) - call mpi_scatterv(work,ijns,displss,mpi_rtype,& - ges_v,ijns(mm1),mpi_rtype,mype_v,mpi_comm_world,ierror) - deallocate(work) + call fv3_h_to_ll(uc2d,hwork(1,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,.true.) + call fv3_h_to_ll(vc2d,hwork(2,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,.true.) + enddo ! i + + call general_grid2sub(grd_uv,hwork,worksub) + ges_u=worksub(1,:,:,:) + ges_v=worksub(2,:,:,:) + iret=nf90_close(gfile_loc) + + deallocate(u2d,v2d,uc2d,vc2d,worksub) end subroutine gsi_fv3ncdf_readuv -subroutine gsi_fv3ncdf_readuv_v1(dynvarsfile,ges_u,ges_v) +subroutine gsi_fv3ncdf_readuv_v1(grd_uv,ges_u,ges_v,fv3filenamegin) !$$$ subprogram documentation block ! subprogram: gsi_fv3ncdf_readuv_v1 ! prgmmr: wu w org: np22 date: 2017-11-22 -! ! program history log: -! 2019-04 lei modified from gsi_fv3ncdf_readuv to deal with cold start files . . . +! 2019-04 lei modified from gsi_fv3ncdf_readuv to deal with cold start files . ! abstract: read in a field from a "cold start" netcdf FV3 file in mype_u,mype_v ! then scatter the field to each PE ! program history log: @@ -1501,113 +1695,96 @@ subroutine gsi_fv3ncdf_readuv_v1(dynvarsfile,ges_u,ges_v) !$$$ end documentation block use constants, only: half use kinds, only: r_kind,i_kind - use mpimod, only: ierror,mpi_comm_world,npe,mpi_rtype,mype - use gridmod, only: lat2,lon2,nsig,itotsub,ijn_s + use mpimod, only: mpi_comm_world,mpi_rtype,mype,mpi_info_null use netcdf, only: nf90_open,nf90_close,nf90_get_var,nf90_noerr use netcdf, only: nf90_nowrite,nf90_inquire,nf90_inquire_dimension use netcdf, only: nf90_inquire_variable use netcdf, only: nf90_inq_varid - use mod_fv3_lola, only: fv3_h_to_ll,nya,nxa,fv3uv2earth - use general_commvars_mod, only: ltosi_s,ltosj_s + use mod_fv3_lola, only: fv3_h_to_ll,fv3uv2earth + use general_sub2grid_mod, only: sub2grid_info,general_grid2sub implicit none - character(*) ,intent(in ):: dynvarsfile - real(r_kind) ,intent(out ) :: ges_u(lat2,lon2,nsig) - real(r_kind) ,intent(out ) :: ges_v(lat2,lon2,nsig) - character(len=128) :: name - real(r_kind),allocatable,dimension(:,:,:):: uu,temp0 - integer(i_kind),allocatable,dimension(:):: dim - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:):: a - real(r_kind),allocatable,dimension(:,:):: uorv - - integer(i_kind) n,ns,k,len,ndim,var_id + type(sub2grid_info), intent(in):: grd_uv + real(r_kind) ,intent(out ) :: ges_u(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig) + real(r_kind) ,intent(out ) :: ges_v(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig) + type (type_fv3regfilenameg),intent (in) :: fv3filenamegin + real(r_kind),dimension(2,grd_uv%nlat,grd_uv%nlon,grd_uv%kbegin_loc:grd_uv%kend_alloc):: hwork + character(len=:),allocatable :: filenamein + real(r_kind),allocatable,dimension(:,:):: us2d,vw2d + real(r_kind),allocatable,dimension(:,:):: uorv2d + real(r_kind),allocatable,dimension(:,:,:,:):: worksub + character(len=max_varname_length) :: filenamein2 + character(len=max_varname_length) :: varname + integer(i_kind) nlatcase,nloncase + integer(i_kind) kbgn,kend + + integer(i_kind) var_id integer(i_kind) gfile_loc,iret - integer(i_kind) nztmp,nzp1,kk,j,mm1,i,ir,ii,jj - integer(i_kind) ndimensions,nvariables,nattributes,unlimiteddimid + integer(i_kind) j,nzp1,mm1 + integer(i_kind) ilev,ilevtot,inative + integer(i_kind) nxcase,nycase + integer(i_kind) us_countloc(3),us_startloc(3) + integer(i_kind) vw_countloc(3),vw_startloc(3) - allocate (work(itotsub*nsig)) + allocate (worksub(2,grd_uv%lat2,grd_uv%lon2,grd_uv%nsig)) mm1=mype+1 - if(mype==mype_u .or. mype==mype_v) then - iret=nf90_open(dynvarsfile,nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' gsi_fv3ncdf_readuv_v1: problem opening ',trim(dynvarsfile),', Status = ',iret - return - endif - - iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) + nloncase=grd_uv%nlon + nlatcase=grd_uv%nlat + nxcase=nx + nycase=ny + kbgn=grd_uv%kbegin_loc + kend=grd_uv%kend_loc + allocate (us2d(nxcase,nycase+1),vw2d(nxcase+1,nycase)) + allocate (uorv2d(nxcase,nycase)) + filenamein=fv3filenamegin%dynvars + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' gsi_fv3ncdf_read_v1: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret + call flush(6) + call stop2(333) + endif + + do ilevtot=kbgn,kend + varname=grd_uv%names(1,ilevtot) + filenamein2=fv3filenamegin%dynvars + if(trim(filenamein) /= trim(filenamein2)) then + write(6,*)'filenamein and filenamein2 are not the same as expected, stop' + call flush(6) + call stop2(333) + endif + ilev=grd_uv%lnames(1,ilevtot) + nz=grd_uv%nsig + nzp1=nz+1 + inative=nzp1-ilev + us_countloc= (/nlon_regional,nlat_regional+1,1/) + vw_countloc= (/nlon_regional+1,nlat_regional,1/) + us_startloc=(/1,1,inative+1/) + vw_startloc=(/1,1,inative+1/) - allocate(dim(ndimensions)) - allocate(a(nya,nxa)) - - do k=1,ndimensions - iret=nf90_inquire_dimension(gfile_loc,k,name,len) - dim(k)=len - enddo - allocate(uorv(nx,ny)) - if(mype == mype_u) then - allocate(uu(nx,ny+1,nsig)) - else ! for mype_v - allocate(uu(nx+1,ny,nsig)) - endif ! transfor to earth u/v, interpolate to analysis grid, reverse vertical order - if(mype == mype_u) then - iret=nf90_inq_varid(gfile_loc,trim(adjustl("u_s")),var_id) - - iret=nf90_inquire_variable(gfile_loc,var_id,ndims=ndim) - allocate(temp0(nx,ny+1,nsig+1)) - iret=nf90_get_var(gfile_loc,var_id,temp0) - uu(:,:,:)=temp0(:,:,2:nsig+1) - deallocate(temp0) - endif - if(mype == mype_v) then - allocate(temp0(nx+1,ny,nsig+1)) - iret=nf90_inq_varid(gfile_loc,trim(adjustl("v_w")),var_id) - iret=nf90_inquire_variable(gfile_loc,var_id,ndims=ndim) - iret=nf90_get_var(gfile_loc,var_id,temp0) - uu(:,:,:)=(temp0(:,:,2:nsig+1)) - deallocate (temp0) - endif - nztmp=nsig - nzp1=nztmp+1 - do i=1,nztmp - ir=nzp1-i - if(mype == mype_u)then - do j=1,ny - uorv(:,j)=half*(uu(:,j,i)+uu(:,j+1,i)) - enddo - - call fv3_h_to_ll(uorv(:,:),a,nx,ny,nxa,nya,grid_reverse_flag) - else - do j=1,nx - uorv(j,:)=half*(uu(j,:,i)+uu(j+1,:,i)) - enddo - call fv3_h_to_ll(uorv(:,:),a,nx,ny,nxa,nya,grid_reverse_flag) - endif - kk=0 - do n=1,npe - ns=displss(n)+(ir-1)*ijn_s(n) - do j=1,ijn_s(n) - ns=ns+1 - kk=kk+1 - ii=ltosi_s(kk) - jj=ltosj_s(kk) - work(ns)=a(ii,jj) - end do - end do - enddo ! i - deallocate(a) - deallocate (uu,uorv) - iret=nf90_close(gfile_loc) - endif ! mype - -!! scatter to ges_u,ges_v !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - call mpi_scatterv(work,ijns,displss,mpi_rtype,& - ges_u,ijns(mm1),mpi_rtype,mype_u,mpi_comm_world,ierror) - call mpi_scatterv(work,ijns,displss,mpi_rtype,& - ges_v,ijns(mm1),mpi_rtype,mype_v,mpi_comm_world,ierror) - deallocate(work) + iret=nf90_inq_varid(gfile_loc,trim(adjustl("u_s")),var_id) + + iret=nf90_get_var(gfile_loc,var_id,us2d,start=us_startloc,count=us_countloc) + iret=nf90_inq_varid(gfile_loc,trim(adjustl("v_w")),var_id) + iret=nf90_get_var(gfile_loc,var_id,vw2d,start=vw_startloc,count=vw_countloc) + do j=1,ny + uorv2d(:,j)=half*(us2d(:,j)+us2d(:,j+1)) + enddo + + call fv3_h_to_ll(uorv2d(:,:),hwork(1,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) + do j=1,nx + uorv2d(j,:)=half*(vw2d(j,:)+vw2d(j+1,:)) + enddo + call fv3_h_to_ll(uorv2d(:,:),hwork(2,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) + + enddo ! iilevtoto + call general_grid2sub(grd_uv,hwork,worksub) + ges_u=worksub(1,:,:,:) + ges_v=worksub(2,:,:,:) + iret=nf90_close(gfile_loc) + deallocate (us2d,vw2d,worksub) + end subroutine gsi_fv3ncdf_readuv_v1 subroutine wrfv3_netcdf(fv3filenamegin) @@ -1635,16 +1812,17 @@ subroutine wrfv3_netcdf(fv3filenamegin) use kinds, only: r_kind,i_kind use guess_grids, only: ntguessig,ges_tsen use gsi_metguess_mod, only: gsi_metguess_bundle - use gsi_bundlemod, only: gsi_bundlegetpointer + use gsi_bundlemod, only: gsi_bundlegetpointer,gsi_bundleputvar use mpeu_util, only: die + use gridmod, only: lat2,lon2,nsig use gridmod,only: l_reg_update_hydro_delz - use gridmod, only: lat2,lon2,nsig use guess_grids, only:geom_hgti,geom_hgti_bg use directDA_radaruse_mod, only: l_use_cvpqx, cvpqx_pval, cld_nt_updt use directDA_radaruse_mod, only: l_use_dbz_directDA use directDA_radaruse_mod, only: l_cvpnr, cvpnr_pval + use gridmod, only: eta1_ll,eta2_ll implicit none @@ -1652,8 +1830,6 @@ subroutine wrfv3_netcdf(fv3filenamegin) ! Declare local constants logical add_saved - character(len=:),allocatable :: dynvars !='fv3_dynvars' - character(len=:),allocatable :: tracers !='fv3_tracer' ! variables for cloud info integer(i_kind) ier,istatus,it real(r_kind),pointer,dimension(:,: ):: ges_ps =>NULL() @@ -1661,8 +1837,7 @@ subroutine wrfv3_netcdf(fv3filenamegin) real(r_kind),pointer,dimension(:,:,:):: ges_v =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_q =>NULL() - real(r_kind),allocatable,dimension(:,:,:)::ges_delzinc - integer(i_kind) k + integer(i_kind) i,k real(r_kind),pointer,dimension(:,:,:):: ges_ql =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_qi =>NULL() @@ -1671,12 +1846,14 @@ subroutine wrfv3_netcdf(fv3filenamegin) real(r_kind),pointer,dimension(:,:,:):: ges_qg =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_qnr =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_w =>NULL() + real(r_kind),pointer,dimension(:,:,:):: ges_delzinc =>NULL() + real(r_kind),pointer,dimension(:,:,:):: ges_delp =>NULL() + real(r_kind), dimension(lat2,lon2,nsig) :: io_arr_qr, io_arr_qs real(r_kind), dimension(lat2,lon2,nsig) :: io_arr_qg, io_arr_qnr + real(r_kind), dimension(:,:,:),allocatable ::g_prsi - dynvars=fv3filenamegin%dynvars - tracers=fv3filenamegin%tracers it=ntguessig ier=0 @@ -1693,36 +1870,18 @@ subroutine wrfv3_netcdf(fv3filenamegin) call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qnr',ges_qnr,istatus);ier=ier+istatus call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'w' , ges_w ,istatus);ier=ier+istatus end if - - if (ier/=0) call die('get ges','cannot get pointers for fv3 met-fields, ier =',ier) - - add_saved=.true. - -! write out - if(fv3sar_bg_opt == 0) then - call gsi_fv3ncdf_write(dynvars,'T',ges_tsen(1,1,1,it),mype_t,add_saved) - call gsi_fv3ncdf_write(tracers,'sphum',ges_q ,mype_q,add_saved) - call gsi_fv3ncdf_writeuv(dynvars,ges_u,ges_v,mype_v,add_saved) - call gsi_fv3ncdf_writeps(dynvars,'delp',ges_ps,mype_p,add_saved) - if(l_reg_update_hydro_delz) then - allocate(ges_delzinc(lat2,lon2,nsig)) - do k=1,nsig - ges_delzinc(:,:,k)=geom_hgti(:,:,k+1,it)-geom_hgti_bg(:,:,k+1,it)-geom_hgti(:,:,k,it)+geom_hgti_bg(:,:,k,it) - enddo - call gsi_fv3ncdf_write_fv3_dz(dynvars,"DZ",ges_delzinc,mype_delz,add_saved) - deallocate(ges_delzinc) - endif - - else - call gsi_fv3ncdf_write_v1(dynvars,'t',ges_tsen(1,1,1,it),mype_t,add_saved) - call gsi_fv3ncdf_write_v1(tracers,'sphum',ges_q ,mype_q,add_saved) - call gsi_fv3ncdf_writeuv_v1(dynvars,ges_u,ges_v,mype_v,add_saved) - call gsi_fv3ncdf_writeps_v1(dynvars,'ps',ges_ps,mype_p,add_saved) - + if(l_reg_update_hydro_delz) then + allocate(ges_delzinc(lat2,lon2,nsig)) + do k=1,nsig + ges_delzinc(:,:,k)=geom_hgti(:,:,k+1,it)-geom_hgti_bg(:,:,k+1,it)-geom_hgti(:,:,k,it)+geom_hgti_bg(:,:,k,it) + enddo + call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'delzinc',ges_delzinc,istatus) endif - ! additional I/O for direct reflectivity DA capabilities if (l_use_dbz_directDA) then + if( fv3sar_bg_opt == 0) then + write(6,*) "FV3 IO Write for 'fv3sar_bg_opt == 0 is only available for now in direct relfectivity DA" + endif io_arr_qr=ges_qr io_arr_qs=ges_qs @@ -1731,26 +1890,65 @@ subroutine wrfv3_netcdf(fv3filenamegin) call convert_cvpqx_to_qx(io_arr_qr, io_arr_qs, io_arr_qg, l_use_cvpqx, cvpqx_pval) ! Convert Qx back call convert_cvpnx_to_nx(io_arr_qnr, l_cvpnr, cvpnr_pval, cld_nt_updt, ges_q, io_arr_qr, ges_ps) ! Convert Nx back + ges_qr=io_arr_qr + ges_qs=io_arr_qs + ges_qg=io_arr_qg + ges_qnr=io_arr_qnr + endif + call gsi_copy_bundle(GSI_MetGuess_Bundle(it),gsibundle_fv3lam_dynvar_nouv) + call gsi_copy_bundle(GSI_MetGuess_Bundle(it),gsibundle_fv3lam_tracer_nouv) + call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'tsen',ges_tsen(:,:,:,it),istatus) + if( fv3sar_bg_opt == 0) then + call GSI_BundleGetPointer ( gsibundle_fv3lam_dynvar_nouv, 'delp' ,ges_delp ,istatus );ier=ier+istatus + allocate(g_prsi(lat2,lon2,nsig+1)) + allocate(ges_ps_inc(lat2,lon2)) + ges_ps_inc=ges_ps-ges_ps_bg + g_prsi(:,:,nsig+1)=eta1_ll(nsig+1) + do i=nsig,1,-1 + g_prsi(:,:,i)=ges_delp_bg(:,:,i)+g_prsi(:,:,i+1) + enddo + do i=1,nsig+1 + g_prsi(:,:,i)=g_prsi(:,:,i)+eta2_ll(i)*ges_ps_inc + enddo + do i=1,nsig + ges_delp(:,:,i)=g_prsi(:,:,i)-g_prsi(:,:,i+1) + enddo + ges_delp=ges_delp*1000.0_r_kind + deallocate(g_prsi,ges_ps_inc) + + else + ges_ps=ges_ps*1000.0_r_kind + call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'ps',ges_ps,istatus) + endif ! write out - if( fv3sar_bg_opt == 0) then - add_saved=.true. - call gsi_fv3ncdf_write(dynvars,'W',ges_w,mype_w,add_saved) - call gsi_fv3ncdf_write(tracers,'liq_wat',ges_ql,mype_ql,add_saved) - call gsi_fv3ncdf_write(tracers,'ice_wat',ges_qi,mype_qi,add_saved) - call gsi_fv3ncdf_write(tracers,'rainwat',io_arr_qr,mype_qr,add_saved) - call gsi_fv3ncdf_write(tracers,'snowwat',io_arr_qs,mype_qs,add_saved) - call gsi_fv3ncdf_write(tracers,'graupel',io_arr_qg,mype_qg,add_saved) - call gsi_fv3ncdf_write(tracers,'rain_nc',io_arr_qnr,mype_qnr,add_saved) - else - write(6,*) "FV3 IO Write for 'fv3sar_bg_opt == 0 is only available for now in direct relfectivity DA" - stop - end if - end if + if (ier/=0) call die('get ges','cannot get pointers for fv3 met-fields, ier =',ier) + + add_saved=.true. + +! write out + if(fv3sar_bg_opt == 0) then + call gsi_fv3ncdf_write(grd_fv3lam_dynvar_ionouv,gsibundle_fv3lam_dynvar_nouv,& + add_saved,fv3filenamegin%dynvars,fv3filenamegin) + call gsi_fv3ncdf_write(grd_fv3lam_tracer_ionouv,gsibundle_fv3lam_tracer_nouv, & + add_saved,fv3filenamegin%tracers,fv3filenamegin) + call gsi_fv3ncdf_writeuv(grd_fv3lam_uv,ges_u,ges_v,add_saved,fv3filenamegin) + + + else + call gsi_fv3ncdf_write_v1(grd_fv3lam_dynvar_ionouv,gsibundle_fv3lam_dynvar_nouv,& + add_saved,fv3filenamegin%dynvars,fv3filenamegin) + call gsi_fv3ncdf_write_v1(grd_fv3lam_tracer_ionouv,gsibundle_fv3lam_tracer_nouv,& + add_saved,fv3filenamegin%tracers,fv3filenamegin) + call gsi_fv3ncdf_writeuv_v1(grd_fv3lam_uv,ges_u,ges_v,add_saved,fv3filenamegin) + endif + if(allocated(g_prsi)) deallocate(g_prsi) + +! additional I/O for direct reflectivity DA capabilities end subroutine wrfv3_netcdf -subroutine gsi_fv3ncdf_writeuv(dynvars,varu,varv,mype_io,add_saved) +subroutine gsi_fv3ncdf_writeuv(grd_uv,ges_u,ges_v,add_saved,fv3filenamegin) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_nemsio_writeuv @@ -1775,254 +1973,125 @@ subroutine gsi_fv3ncdf_writeuv(dynvars,varu,varv,mype_io,add_saved) ! !$$$ end documentation block - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,npe,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1,nsig, & - ijn,displs_g,itotsub,iglobal, & - nlon_regional,nlat_regional + use mpimod, only: mpi_rtype,mpi_comm_world,mype,mpi_info_null + use netcdf, only: nf90_nowrite,nf90_inquire,nf90_inquire_dimension + use gridmod, only: nlon_regional,nlat_regional use mod_fv3_lola, only: fv3_ll_to_h,fv3_h_to_ll, & fv3uv2earth,earthuv2fv3 - use general_commvars_mod, only: ltosi,ltosj use netcdf, only: nf90_open,nf90_close,nf90_noerr use netcdf, only: nf90_write,nf90_inq_varid use netcdf, only: nf90_put_var,nf90_get_var + use general_sub2grid_mod, only: sub2grid_info,general_sub2grid implicit none - character(len=*),intent(in) :: dynvars !='fv3_dynvars' + type(sub2grid_info), intent(in):: grd_uv + real(r_kind),dimension(2,grd_uv%nlat,grd_uv%nlon,grd_uv%kbegin_loc:grd_uv%kend_alloc):: hwork - real(r_kind) ,intent(in ) :: varu(lat2,lon2,nsig) - real(r_kind) ,intent(in ) :: varv(lat2,lon2,nsig) - integer(i_kind),intent(in ) :: mype_io logical ,intent(in ) :: add_saved + type (type_fv3regfilenameg),intent(in) ::fv3filenamegin + real(r_kind),dimension(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig),intent(inout)::ges_u + real(r_kind),dimension(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig),intent(inout)::ges_v integer(i_kind) :: ugrd_VarId,gfile_loc,vgrd_VarId - integer(i_kind) i,j,mm1,n,k,ns,kr,m - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:,:):: work_sub,work_au,work_av - real(r_kind),allocatable,dimension(:,:,:):: work_bu,work_bv - real(r_kind),allocatable,dimension(:,:):: u,v,workau2,workav2 + integer(i_kind) i,j,mm1,k,nzp1 + integer(i_kind) kbgn,kend + integer(i_kind) inative,ilev,ilevtot + integer(i_kind) nlatcase,nloncase + integer(i_kind) nxcase,nycase + integer(i_kind) u_countloc(3),u_startloc(3),v_countloc(3),v_startloc(3) + character(:),allocatable:: filenamein ,varname + real(r_kind),allocatable,dimension(:,:,:,:):: worksub + real(r_kind),allocatable,dimension(:,:):: work_au,work_av + real(r_kind),allocatable,dimension(:,:):: work_bu,work_bv + real(r_kind),allocatable,dimension(:,:):: u2d,v2d,workau2,workav2 real(r_kind),allocatable,dimension(:,:):: workbu2,workbv2 mm1=mype+1 - - allocate( work(max(iglobal,itotsub)*nsig),work_sub(lat1,lon1,nsig)) -!!!!!! gather analysis u !! revers k !!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=varu(j+1,i+1,k) - end do - end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - allocate( work_au(nlat,nlon,nsig),work_av(nlat,nlon,nsig)) - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_au(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - endif ! mype - -!!!!!! gather analysis v !! reverse k !!!!!!!!!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=varv(j+1,i+1,k) + + nloncase=grd_uv%nlon + nlatcase=grd_uv%nlat + nxcase=nx + nycase=ny + kbgn=grd_uv%kbegin_loc + kend=grd_uv%kend_loc + allocate( u2d(nlon_regional,nlat_regional+1)) + allocate( v2d(nlon_regional+1,nlat_regional)) + allocate( work_bu(nlon_regional,nlat_regional+1)) + allocate( work_bv(nlon_regional+1,nlat_regional)) + allocate (worksub(2,grd_uv%lat2,grd_uv%lon2,grd_uv%nsig)) + allocate( work_au(nlatcase,nloncase),work_av(nlatcase,nloncase)) + do k=1,grd_uv%nsig + do j=1,grd_uv%lon2 + do i=1,grd_uv%lat2 + worksub(1,i,j,k)=ges_u(i,j,k) + worksub(2,i,j,k)=ges_v(i,j,k) end do end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_av(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - deallocate(work,work_sub) - allocate( u(nlon_regional,nlat_regional+1)) - allocate( v(nlon_regional+1,nlat_regional)) - allocate( work_bu(nlon_regional,nlat_regional+1,nsig)) - allocate( work_bv(nlon_regional+1,nlat_regional,nsig)) - call check( nf90_open(trim(dynvars ),nf90_write,gfile_loc) ) - call check( nf90_inq_varid(gfile_loc,'u',ugrd_VarId) ) - call check( nf90_inq_varid(gfile_loc,'v',vgrd_VarId) ) - - if(add_saved)then - allocate( workau2(nlat,nlon),workav2(nlat,nlon)) - allocate( workbu2(nlon_regional,nlat_regional+1)) - allocate( workbv2(nlon_regional+1,nlat_regional)) + end do + call general_sub2grid(grd_uv,worksub,hwork) + filenamein=fv3filenamegin%dynvars + call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + do ilevtot=kbgn,kend + varname=grd_uv%names(1,ilevtot) + ilev=grd_uv%lnames(1,ilevtot) + nz=grd_uv%nsig + nzp1=nz+1 + inative=nzp1-ilev + u_countloc=(/nxcase,nycase+1,1/) + v_countloc=(/nxcase+1,nycase,1/) + u_startloc=(/1,1,inative/) + v_startloc=(/1,1,inative/) + + work_au=hwork(1,:,:,ilevtot) + work_av=hwork(2,:,:,ilevtot) + + call check( nf90_inq_varid(gfile_loc,'u',ugrd_VarId) ) + call check( nf90_inq_varid(gfile_loc,'v',vgrd_VarId) ) + + if(add_saved)then + allocate( workau2(nlatcase,nloncase),workav2(nlatcase,nloncase)) + allocate( workbu2(nlon_regional,nlat_regional+1)) + allocate( workbv2(nlon_regional+1,nlat_regional)) !!!!!!!! readin work_b !!!!!!!!!!!!!!!! - call check( nf90_get_var(gfile_loc,ugrd_VarId,work_bu) ) - call check( nf90_get_var(gfile_loc,vgrd_VarId,work_bv) ) - if(.not.grid_reverse_flag) then - call reverse_grid_r_uv(work_bu,nlon_regional,nlat_regional+1,nsig) - call reverse_grid_r_uv(work_bv,nlon_regional+1,nlat_regional,nsig) - endif - do k=1,nsig - call fv3uv2earth(work_bu(1,1,k),work_bv(1,1,k),nlon_regional,nlat_regional,u,v) - call fv3_h_to_ll(u,workau2,nlon_regional,nlat_regional,nlon,nlat,.true.) - call fv3_h_to_ll(v,workav2,nlon_regional,nlat_regional,nlon,nlat,.true.) + call check( nf90_get_var(gfile_loc,ugrd_VarId,work_bu,start=u_startloc,count=u_countloc) ) + call check( nf90_get_var(gfile_loc,vgrd_VarId,work_bv,start=v_startloc,count=v_countloc) ) + if(.not.grid_reverse_flag) then + call reverse_grid_r_uv(work_bu,nlon_regional,nlat_regional+1,1) + call reverse_grid_r_uv(work_bv,nlon_regional+1,nlat_regional,1) + endif + call fv3uv2earth(work_bu,work_bv,nlon_regional,nlat_regional,u2d,v2d) + call fv3_h_to_ll(u2d,workau2,nlon_regional,nlat_regional,nloncase,nlatcase,.true.) + call fv3_h_to_ll(v2d,workav2,nlon_regional,nlat_regional,nloncase,nlatcase,.true.) !!!!!!!! find analysis_inc: work_a !!!!!!!!!!!!!!!! - work_au(:,:,k)=work_au(:,:,k)-workau2(:,:) - work_av(:,:,k)=work_av(:,:,k)-workav2(:,:) - call fv3_ll_to_h(work_au(:,:,k),u,nlon,nlat,nlon_regional,nlat_regional,.true.) - call fv3_ll_to_h(work_av(:,:,k),v,nlon,nlat,nlon_regional,nlat_regional,.true.) - call earthuv2fv3(u,v,nlon_regional,nlat_regional,workbu2,workbv2) + work_au(:,:)=work_au(:,:)-workau2(:,:) + work_av(:,:)=work_av(:,:)-workav2(:,:) + call fv3_ll_to_h(work_au(:,:),u2d,nloncase,nlatcase,nlon_regional,nlat_regional,.true.) + call fv3_ll_to_h(work_av(:,:),v2d,nloncase,nlatcase,nlon_regional,nlat_regional,.true.) + call earthuv2fv3(u2d,v2d,nlon_regional,nlat_regional,workbu2,workbv2) !!!!!!!! add analysis_inc to readin work_b !!!!!!!!!!!!!!!! - work_bu(:,:,k)=work_bu(:,:,k)+workbu2(:,:) - work_bv(:,:,k)=work_bv(:,:,k)+workbv2(:,:) - enddo - deallocate(workau2,workbu2,workav2,workbv2) - else - do k=1,nsig - call fv3_ll_to_h(work_au(:,:,k),u,nlon,nlat,nlon_regional,nlat_regional,.true.) - call fv3_ll_to_h(work_av(:,:,k),v,nlon,nlat,nlon_regional,nlat_regional,.true.) - call earthuv2fv3(u,v,nlon_regional,nlat_regional,work_bu(:,:,k),work_bv(:,:,k)) - enddo - endif - if(.not.grid_reverse_flag) then - call reverse_grid_r_uv(work_bu,nlon_regional,nlat_regional+1,nsig) - call reverse_grid_r_uv(work_bv,nlon_regional+1,nlat_regional,nsig) - endif - - deallocate(work_au,work_av,u,v) - print *,'write out u/v to ',trim(dynvars ) - call check( nf90_put_var(gfile_loc,ugrd_VarId,work_bu) ) - call check( nf90_put_var(gfile_loc,vgrd_VarId,work_bv) ) - call check( nf90_close(gfile_loc) ) - deallocate(work_bu,work_bv) - end if !mype_io + work_bu(:,:)=work_bu(:,:)+workbu2(:,:) + work_bv(:,:)=work_bv(:,:)+workbv2(:,:) + deallocate(workau2,workbu2,workav2,workbv2) + else + call fv3_ll_to_h(work_au(:,:),u2d,nloncase,nlatcase,nlon_regional,nlat_regional,.true.) + call fv3_ll_to_h(work_av(:,:),v2d,nloncase,nlatcase,nlon_regional,nlat_regional,.true.) + call earthuv2fv3(u2d,v2d,nlon_regional,nlat_regional,work_bu(:,:),work_bv(:,:)) + endif + if(.not.grid_reverse_flag) then + call reverse_grid_r_uv(work_bu,nlon_regional,nlat_regional+1,1) + call reverse_grid_r_uv(work_bv,nlon_regional+1,nlat_regional,1) + endif + + call check( nf90_put_var(gfile_loc,ugrd_VarId,work_bu,start=u_startloc,count=u_countloc) ) + call check( nf90_put_var(gfile_loc,vgrd_VarId,work_bv,start=v_startloc,count=v_countloc) ) + enddo !ilevltot + call check( nf90_close(gfile_loc) ) + deallocate(work_bu,work_bv,u2d,v2d) + deallocate(work_au,work_av) - if(allocated(work))deallocate(work) - if(allocated(work_sub))deallocate(work_sub) end subroutine gsi_fv3ncdf_writeuv - -subroutine gsi_fv3ncdf_writeps(filename,varname,var,mype_io,add_saved) -!$$$ subprogram documentation block -! . . . . -! subprogram: gsi_nemsio_writeps -! pgrmmr: wu -! -! abstract: write out analyzed "delp" to fv_core.res.nest02.tile7.nc -! -! program history log: -! -! input argument list: -! varu,varv -! add_saved -! mype - mpi task id -! mype_io -! -! output argument list: -! -! attributes: -! language: f90 -! machine: -! -!$$$ end documentation block - - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1,nsig - use gridmod, only: ijn,displs_g,itotsub,iglobal - use gridmod, only: nlon_regional,nlat_regional,eta1_ll,eta2_ll - use mod_fv3_lola, only: fv3_ll_to_h,fv3_h_to_ll - use general_commvars_mod, only: ltosi,ltosj - use netcdf, only: nf90_open,nf90_close - use netcdf, only: nf90_write,nf90_inq_varid - use netcdf, only: nf90_put_var,nf90_get_var - implicit none - - real(r_kind) ,intent(in ) :: var(lat2,lon2) - integer(i_kind),intent(in ) :: mype_io - logical ,intent(in ) :: add_saved - character(*) ,intent(in ) :: varname,filename - - integer(i_kind) :: VarId,gfile_loc - integer(i_kind) i,j,mm1,k,kr,kp - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:):: work_sub,work_a - real(r_kind),allocatable,dimension(:,:,:):: work_b,work_bi - real(r_kind),allocatable,dimension(:,:):: workb2,worka2 - - mm1=mype+1 - allocate( work(max(iglobal,itotsub)),work_sub(lat1,lon1) ) - do i=1,lon1 - do j=1,lat1 - work_sub(j,i)=var(j+1,i+1) - end do - end do - call mpi_gatherv(work_sub,ijn(mm1),mpi_rtype, & - work,ijn,displs_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - if(mype==mype_io) then - allocate( work_a(nlat,nlon)) - do i=1,iglobal - work_a(ltosi(i),ltosj(i))=work(i) - end do - allocate( work_bi(nlon_regional,nlat_regional,nsig+1)) - allocate( work_b(nlon_regional,nlat_regional,nsig)) - call check( nf90_open(trim(filename),nf90_write,gfile_loc) ) - call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) - allocate( workb2(nlon_regional,nlat_regional)) - - if(add_saved)then - allocate( worka2(nlat,nlon)) -!!!!!!!! read in guess delp !!!!!!!!!!!!!! - call check( nf90_get_var(gfile_loc,VarId,work_b) ) - work_bi(:,:,1)=eta1_ll(nsig+1) - do i=2,nsig+1 - work_bi(:,:,i)=work_b(:,:,i-1)*0.001_r_kind+work_bi(:,:,i-1) - enddo - call fv3_h_to_ll(work_bi(:,:,nsig+1),worka2,nlon_regional,nlat_regional,nlon,nlat,grid_reverse_flag) -!!!!!!! analysis_inc Psfc: work_a - work_a(:,:)=work_a(:,:)-worka2(:,:) - call fv3_ll_to_h(work_a,workb2,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - do k=1,nsig+1 - kr=nsig+2-k -!!!!!!! ges_prsi+hydrostatic analysis_inc !!!!!!!!!!!!!!!! - work_bi(:,:,k)=work_bi(:,:,k)+eta2_ll(kr)*workb2(:,:) - enddo - - else - call fv3_ll_to_h(work_a,workb2,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - do k=1,nsig+1 - kr=nsig+2-k -!!!!!!! Psfc_ges+hydrostatic analysis_inc !!!!!!!!!!!!!!!! - work_bi(:,:,k)=eta1_ll(kr)+eta2_ll(kr)*workb2(:,:) - enddo - endif -! delp - do k=nsig,1,-1 - kp=k+1 - work_b(:,:,k)=(work_bi(:,:,kp)-work_bi(:,:,k))*1000._r_kind - enddo - - call check( nf90_put_var(gfile_loc,VarId,work_b) ) - call check( nf90_close(gfile_loc) ) - if (allocated(worka2)) deallocate(worka2) - if (allocated(workb2)) deallocate(workb2) - - deallocate(work_b,work_a,work_bi) - - end if !mype_io - - deallocate(work,work_sub) -end subroutine gsi_fv3ncdf_writeps -subroutine gsi_fv3ncdf_writeuv_v1(dynvars,varu,varv,mype_io,add_saved) +subroutine gsi_fv3ncdf_writeuv_v1(grd_uv,ges_u,ges_v,add_saved,fv3filenamegin) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_nemsio_writeuv @@ -2050,305 +2119,196 @@ subroutine gsi_fv3ncdf_writeuv_v1(dynvars,varu,varv,mype_io,add_saved) !$$$ end documentation block use constants, only: half,zero - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,npe,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1,nsig, & - ijn,displs_g,itotsub,iglobal, & - nlon_regional,nlat_regional + use mpimod, only: mpi_rtype,mpi_comm_world,mype,mpi_info_null + use gridmod, only: nlon_regional,nlat_regional use mod_fv3_lola, only: fv3_ll_to_h,fv3_h_to_ll, & fv3uv2earth,earthuv2fv3 - use general_commvars_mod, only: ltosi,ltosj use netcdf, only: nf90_open,nf90_close,nf90_noerr use netcdf, only: nf90_write,nf90_inq_varid use netcdf, only: nf90_put_var,nf90_get_var - + use general_sub2grid_mod, only: sub2grid_info,general_sub2grid implicit none - character(len=*),intent(in) :: dynvars !='fv3_dynvars' - - real(r_kind) ,intent(in ) :: varu(lat2,lon2,nsig) - real(r_kind) ,intent(in ) :: varv(lat2,lon2,nsig) - integer(i_kind),intent(in ) :: mype_io + type(sub2grid_info), intent(in):: grd_uv + real(r_kind),dimension(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig),intent(inout)::ges_u + real(r_kind),dimension(grd_uv%lat2,grd_uv%lon2,grd_uv%nsig),intent(inout)::ges_v logical ,intent(in ) :: add_saved + type (type_fv3regfilenameg),intent (in) :: fv3filenamegin + real(r_kind),dimension(2,grd_uv%nlat,grd_uv%nlon,grd_uv%kbegin_loc:grd_uv%kend_alloc):: hwork + character(len=:),allocatable :: filenamein + character(len=max_varname_length) :: varname integer(i_kind) :: gfile_loc integer(i_kind) :: u_wgrd_VarId,v_wgrd_VarId integer(i_kind) :: u_sgrd_VarId,v_sgrd_VarId - integer(i_kind) i,j,mm1,n,k,ns,kr,m - integer(i_kind) ilev0 - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:,:):: work_sub,work_au,work_av - real(r_kind),allocatable,dimension(:,:,:):: work_bu_s,work_bv_s - real(r_kind),allocatable,dimension(:,:,:):: work_bu_w,work_bv_w - real(r_kind),allocatable,dimension(:,:):: u,v,workau2,workav2 + integer(i_kind) i,j,mm1,k,nzp1 + integer(i_kind) kbgn,kend + integer(i_kind) inative,ilev,ilevtot + real(r_kind),allocatable,dimension(:,:,:,:):: worksub + real(r_kind),allocatable,dimension(:,:):: work_au,work_av + real(r_kind),allocatable,dimension(:,:):: work_bu_s,work_bv_s + real(r_kind),allocatable,dimension(:,:):: work_bu_w,work_bv_w + real(r_kind),allocatable,dimension(:,:):: u2d,v2d,workau2,workav2 real(r_kind),allocatable,dimension(:,:):: workbu_s2,workbv_s2 real(r_kind),allocatable,dimension(:,:):: workbu_w2,workbv_w2 + integer(i_kind) nlatcase,nloncase,nxcase,nycase + integer(i_kind) uw_countloc(3),us_countloc(3),uw_startloc(3),us_startloc(3) + integer(i_kind) vw_countloc(3),vs_countloc(3),vw_startloc(3),vs_startloc(3) mm1=mype+1 - ilev0=1 - - allocate( work(max(iglobal,itotsub)*nsig),work_sub(lat1,lon1,nsig)) -!!!!!! gather analysis u !! revers k !!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=varu(j+1,i+1,k) - end do - end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - allocate( work_au(nlat,nlon,nsig),work_av(nlat,nlon,nsig)) - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_au(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - endif ! mype - -!!!!!! gather analysis v !! reverse k !!!!!!!!!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=varv(j+1,i+1,k) + nloncase=grd_uv%nlon + nlatcase=grd_uv%nlat + nxcase=nx + nycase=ny + kbgn=grd_uv%kbegin_loc + kend=grd_uv%kend_loc + allocate (worksub(2,grd_uv%lat2,grd_uv%lon2,grd_uv%nsig)) + do k=1,grd_uv%nsig + do j=1,grd_uv%lon2 + do i=1,grd_uv%lat2 + worksub(1,i,j,k)=ges_u(i,j,k) + worksub(2,i,j,k)=ges_v(i,j,k) end do end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_av(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - deallocate(work,work_sub) -! u and v would contain winds at either D-grid or A-grid -! do not diretly use them in between fv3uv2eath and fv3_h_to_ll unless paying -!attention to the actual storage layout - call check( nf90_open(trim(dynvars ),nf90_write,gfile_loc) ) + end do + call general_sub2grid(grd_uv,worksub,hwork) + + allocate( u2d(nlon_regional,nlat_regional)) + allocate( v2d(nlon_regional,nlat_regional)) + allocate( work_bu_s(nlon_regional,nlat_regional+1)) + allocate( work_bv_s(nlon_regional,nlat_regional+1)) + allocate( work_bu_w(nlon_regional+1,nlat_regional)) + allocate( work_bv_w(nlon_regional+1,nlat_regional)) + allocate( work_au(nlatcase,nloncase),work_av(nlatcase,nloncase)) + if(add_saved) allocate( workau2(nlatcase,nloncase),workav2(nlatcase,nloncase)) + allocate( workbu_w2(nlon_regional+1,nlat_regional)) + allocate( workbv_w2(nlon_regional+1,nlat_regional)) + allocate( workbu_s2(nlon_regional,nlat_regional+1)) + allocate( workbv_s2(nlon_regional,nlat_regional+1)) + filenamein=fv3filenamegin%dynvars + call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + do ilevtot=kbgn,kend + varname=grd_uv%names(1,ilevtot) + ilev=grd_uv%lnames(1,ilevtot) + nz=grd_uv%nsig + nzp1=nz+1 + inative=nzp1-ilev + + + + + uw_countloc= (/nlon_regional+1,nlat_regional,1/) + us_countloc= (/nlon_regional,nlat_regional+1,1/) + vw_countloc= (/nlon_regional+1,nlat_regional,1/) + vs_countloc= (/nlon_regional,nlat_regional+1,1/) + + uw_startloc=(/1,1,inative+1/) + us_startloc=(/1,1,inative+1/) + vw_startloc=(/1,1,inative+1/) + vs_startloc=(/1,1,inative+1/) - allocate( u(nlon_regional,nlat_regional)) - allocate( v(nlon_regional,nlat_regional)) - allocate( work_bu_s(nlon_regional,nlat_regional+1,nsig+1)) - allocate( work_bv_s(nlon_regional,nlat_regional+1,nsig+1)) - allocate( work_bu_w(nlon_regional+1,nlat_regional,nsig+1)) - allocate( work_bv_w(nlon_regional+1,nlat_regional,nsig+1)) + work_au=hwork(1,:,:,ilevtot) + work_av=hwork(2,:,:,ilevtot) - call check( nf90_inq_varid(gfile_loc,'u_s',u_sgrd_VarId) ) - call check( nf90_inq_varid(gfile_loc,'u_w',u_wgrd_VarId) ) - call check( nf90_inq_varid(gfile_loc,'v_s',v_sgrd_VarId) ) - call check( nf90_inq_varid(gfile_loc,'v_w',v_wgrd_VarId) ) + call check( nf90_inq_varid(gfile_loc,'u_s',u_sgrd_VarId) ) + call check( nf90_inq_varid(gfile_loc,'u_w',u_wgrd_VarId) ) + call check( nf90_inq_varid(gfile_loc,'v_s',v_sgrd_VarId) ) + call check( nf90_inq_varid(gfile_loc,'v_w',v_wgrd_VarId) ) - allocate( workbu_w2(nlon_regional+1,nlat_regional)) - allocate( workbv_w2(nlon_regional+1,nlat_regional)) - allocate( workbu_s2(nlon_regional,nlat_regional+1)) - allocate( workbv_s2(nlon_regional,nlat_regional+1)) !!!!!!!! readin work_b !!!!!!!!!!!!!!!! - call check( nf90_get_var(gfile_loc,u_sgrd_VarId,work_bu_s) ) - call check( nf90_get_var(gfile_loc,u_wgrd_VarId,work_bu_w) ) - call check( nf90_get_var(gfile_loc,v_sgrd_VarId,work_bv_s) ) - call check( nf90_get_var(gfile_loc,v_wgrd_VarId,work_bv_w) ) - - if(add_saved)then - allocate( workau2(nlat,nlon),workav2(nlat,nlon)) - do k=1,nsig - do j=1,nlat_regional - u(:,j)=half * (work_bu_s(:,j,ilev0+k)+ work_bu_s(:,j+1,ilev0+k)) - enddo - do i=1,nlon_regional - v(i,:)=half*(work_bv_w(i,:,ilev0+k)+work_bv_w(i+1,:,ilev0+k)) - enddo - call fv3_h_to_ll(u,workau2,nlon_regional,nlat_regional,nlon,nlat,grid_reverse_flag) - call fv3_h_to_ll(v,workav2,nlon_regional,nlat_regional,nlon,nlat,grid_reverse_flag) + call check( nf90_get_var(gfile_loc,u_sgrd_VarId,work_bu_s,start=us_startloc,count=us_countloc) ) + call check( nf90_get_var(gfile_loc,u_wgrd_VarId,work_bu_w,start=uw_startloc,count=uw_countloc) ) + call check( nf90_get_var(gfile_loc,v_sgrd_VarId,work_bv_s,start=vs_startloc,count=vs_countloc) ) + call check( nf90_get_var(gfile_loc,v_wgrd_VarId,work_bv_w,start=vw_startloc,count=vw_countloc) ) + + if(add_saved)then + do j=1,nlat_regional + u2d(:,j)=half * (work_bu_s(:,j)+ work_bu_s(:,j+1)) + enddo + do i=1,nlon_regional + v2d(i,:)=half*(work_bv_w(i,:)+work_bv_w(i+1,:)) + enddo + call fv3_h_to_ll(u2d,workau2,nlon_regional,nlat_regional,nloncase,nlatcase,grid_reverse_flag) + call fv3_h_to_ll(v2d,workav2,nlon_regional,nlat_regional,nloncase,nlatcase,grid_reverse_flag) !!!!!!!! find analysis_inc: work_a !!!!!!!!!!!!!!!! - work_au(:,:,k)=work_au(:,:,k)-workau2(:,:) - work_av(:,:,k)=work_av(:,:,k)-workav2(:,:) - call fv3_ll_to_h(work_au(:,:,k),u,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - call fv3_ll_to_h(work_av(:,:,k),v,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) + work_au(:,:)=work_au(:,:)-workau2(:,:) + work_av(:,:)=work_av(:,:)-workav2(:,:) + call fv3_ll_to_h(work_au(:,:),u2d,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + call fv3_ll_to_h(work_av(:,:),v2d,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) !!!!!!!! add analysis_inc to readin work_b !!!!!!!!!!!!!!!! - do i=2,nlon_regional - workbu_w2(i,:)=half*(u(i-1,:)+u(i,:)) - workbv_w2(i,:)=half*(v(i-1,:)+v(i,:)) - enddo - workbu_w2(1,:)=u(1,:) - workbv_w2(1,:)=v(1,:) - workbu_w2(nlon_regional+1,:)=u(nlon_regional,:) - workbv_w2(nlon_regional+1,:)=v(nlon_regional,:) - - do j=2,nlat_regional - workbu_s2(:,j)=half*(u(:,j-1)+u(:,j)) - workbv_s2(:,j)=half*(v(:,j-1)+v(:,j)) - enddo - workbu_s2(:,1)=u(:,1) - workbv_s2(:,1)=v(:,1) - workbu_s2(:,nlat_regional+1)=u(:,nlat_regional) - workbv_s2(:,nlat_regional+1)=v(:,nlat_regional) - - - - work_bu_w(:,:,ilev0+k)=work_bu_w(:,:,ilev0+k)+workbu_w2(:,:) - work_bu_s(:,:,ilev0+k)=work_bu_s(:,:,ilev0+k)+workbu_s2(:,:) - work_bv_w(:,:,ilev0+k)=work_bv_w(:,:,ilev0+k)+workbv_w2(:,:) - work_bv_s(:,:,ilev0+k)=work_bv_s(:,:,ilev0+k)+workbv_s2(:,:) - enddo - deallocate(workau2,workav2) - deallocate(workbu_w2,workbv_w2) - deallocate(workbu_s2,workbv_s2) - else - do k=1,nsig - call fv3_ll_to_h(work_au(:,:,k),u,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - call fv3_ll_to_h(work_av(:,:,k),v,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - - do i=2,nlon_regional - work_bu_w(i,:,k)=half*(u(i-1,:)+u(i,:)) - work_bv_w(i,:,k)=half*(v(i-1,:)+v(i,:)) - enddo - work_bu_w(1,:,ilev0+k)=u(1,:) - work_bv_w(1,:,ilev0+k)=v(1,:) - work_bu_w(nlon_regional+1,:,ilev0+k)=u(nlon_regional,:) - work_bv_w(nlon_regional+1,:,ilev0+k)=v(nlon_regional,:) - - do j=2,nlat_regional - work_bu_s(:,j,ilev0+k)=half*(u(:,j-1)+u(:,j)) - work_bv_s(:,j,ilev0+k)=half*(v(:,j-1)+v(:,j)) - enddo - work_bu_s(:,1,ilev0+k)=u(:,1) - work_bv_s(:,1,ilev0+k)=v(:,1) - work_bu_s(:,nlat_regional+1,ilev0+k)=u(:,nlat_regional) - work_bv_s(:,nlat_regional+1,ilev0+k)=v(:,nlat_regional) - - - enddo - endif - - deallocate(work_au,work_av,u,v) - print *,'write out u/v to ',trim(dynvars ) - call check( nf90_put_var(gfile_loc,u_wgrd_VarId,work_bu_w) ) - call check( nf90_put_var(gfile_loc,u_sgrd_VarId,work_bu_s) ) - call check( nf90_put_var(gfile_loc,v_wgrd_VarId,work_bv_w) ) - call check( nf90_put_var(gfile_loc,v_sgrd_VarId,work_bv_s) ) - call check( nf90_close(gfile_loc) ) - deallocate(work_bu_w,work_bv_w) - deallocate(work_bu_s,work_bv_s) - end if !mype_io + do i=2,nlon_regional + workbu_w2(i,:)=half*(u2d(i-1,:)+u2d(i,:)) + workbv_w2(i,:)=half*(v2d(i-1,:)+v2d(i,:)) + enddo + workbu_w2(1,:)=u2d(1,:) + workbv_w2(1,:)=v2d(1,:) + workbu_w2(nlon_regional+1,:)=u2d(nlon_regional,:) + workbv_w2(nlon_regional+1,:)=v2d(nlon_regional,:) + + do j=2,nlat_regional + workbu_s2(:,j)=half*(u2d(:,j-1)+u2d(:,j)) + workbv_s2(:,j)=half*(v2d(:,j-1)+v2d(:,j)) + enddo + workbu_s2(:,1)=u2d(:,1) + workbv_s2(:,1)=v2d(:,1) + workbu_s2(:,nlat_regional+1)=u2d(:,nlat_regional) + workbv_s2(:,nlat_regional+1)=v2d(:,nlat_regional) + + + + work_bu_w(:,:)=work_bu_w(:,:)+workbu_w2(:,:) + work_bu_s(:,:)=work_bu_s(:,:)+workbu_s2(:,:) + work_bv_w(:,:)=work_bv_w(:,:)+workbv_w2(:,:) + work_bv_s(:,:)=work_bv_s(:,:)+workbv_s2(:,:) + else + call fv3_ll_to_h(work_au(:,:),u2d,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + call fv3_ll_to_h(work_av(:,:),v2d,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + + do i=2,nlon_regional + work_bu_w(i,:)=half*(u2d(i-1,:)+u2d(i,:)) + work_bv_w(i,:)=half*(v2d(i-1,:)+v2d(i,:)) + enddo + work_bu_w(1,:)=u2d(1,:) + work_bv_w(1,:)=v2d(1,:) + work_bu_w(nlon_regional+1,:)=u2d(nlon_regional,:) + work_bv_w(nlon_regional+1,:)=v2d(nlon_regional,:) + + do j=2,nlat_regional + work_bu_s(:,j)=half*(u2d(:,j-1)+u2d(:,j)) + work_bv_s(:,j)=half*(v2d(:,j-1)+v2d(:,j)) + enddo + work_bu_s(:,1)=u2d(:,1) + work_bv_s(:,1)=v2d(:,1) + work_bu_s(:,nlat_regional+1)=u2d(:,nlat_regional) + work_bv_s(:,nlat_regional+1)=v2d(:,nlat_regional) + + + endif + + call check( nf90_put_var(gfile_loc,u_wgrd_VarId,work_bu_w,start=uw_startloc,count=uw_countloc) ) + call check( nf90_put_var(gfile_loc,u_sgrd_VarId,work_bu_s,start=us_startloc,count=us_countloc) ) + call check( nf90_put_var(gfile_loc,v_wgrd_VarId,work_bv_w,start=vw_startloc,count=vw_countloc) ) + call check( nf90_put_var(gfile_loc,v_sgrd_VarId,work_bv_s,start=vs_startloc,count=vs_countloc) ) + enddo ! + + call check( nf90_close(gfile_loc) ) + deallocate(work_bu_w,work_bv_w) + deallocate(work_bu_s,work_bv_s) + deallocate(work_au,work_av,u2d,v2d) + if(add_saved) deallocate(workau2,workav2) + if (allocated(workbu_w2)) then + deallocate(workbu_w2,workbv_w2) + deallocate(workbu_s2,workbv_s2) + endif - if(allocated(work))deallocate(work) - if(allocated(work_sub))deallocate(work_sub) + if(allocated(worksub))deallocate(worksub) end subroutine gsi_fv3ncdf_writeuv_v1 -subroutine gsi_fv3ncdf_writeps_v1(filename,varname,var,mype_io,add_saved) -!$$$ subprogram documentation block -! . . . . -! subprogram: gsi_nemsio_writeps -! pgrmmr: wu -! -! abstract: write out analyzed "delp" to fv_core.res.nest02.tile7.nc -! -! program history log: -! 2019-04 lei, modified from gsi_nemsio_writeps to deal with cold start files -! -! input argument list: -! varu,varv -! add_saved -! mype - mpi task id -! mype_io -! -! output argument list: -! -! attributes: -! language: f90 -! machine: -! -!$$$ end documentation block - - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1 - use gridmod, only: ijn,displs_g,itotsub,iglobal - use gridmod, only: nlon_regional,nlat_regional - use mod_fv3_lola, only: fv3_ll_to_h,fv3_h_to_ll - use general_commvars_mod, only: ltosi,ltosj - use netcdf, only: nf90_open,nf90_close - use netcdf, only: nf90_write,nf90_inq_varid - use netcdf, only: nf90_put_var,nf90_get_var - implicit none - - real(r_kind) ,intent(in ) :: var(lat2,lon2) - integer(i_kind),intent(in ) :: mype_io - logical ,intent(in ) :: add_saved - character(*) ,intent(in ) :: varname,filename - - integer(i_kind) :: VarId,gfile_loc - integer(i_kind) i,j,mm1 - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:):: work_sub,work_a - real(r_kind),allocatable,dimension(:,:):: work_b,work_bi - real(r_kind),allocatable,dimension(:,:):: workb2,worka2 - - mm1=mype+1 - allocate( work(max(iglobal,itotsub)),work_sub(lat1,lon1) ) - do i=1,lon1 - do j=1,lat1 - work_sub(j,i)=var(j+1,i+1) - end do - end do - call mpi_gatherv(work_sub,ijn(mm1),mpi_rtype, & - work,ijn,displs_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - allocate( work_a(nlat,nlon)) - do i=1,iglobal - work_a(ltosi(i),ltosj(i))=work(i) - end do - allocate( work_bi(nlon_regional,nlat_regional)) - allocate( work_b(nlon_regional,nlat_regional)) - call check( nf90_open(trim(filename),nf90_write,gfile_loc) ) - call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) - work_a=work_a*1000.0_r_kind - if(add_saved)then - allocate( workb2(nlon_regional,nlat_regional)) - allocate( worka2(nlat,nlon)) -!!!!!!!! read in guess delp !!!!!!!!!!!!!! - call check( nf90_get_var(gfile_loc,VarId,work_b) ) - call fv3_h_to_ll(work_b,worka2,nlon_regional,nlat_regional,nlon,nlat,grid_reverse_flag) -!!!!!!! analysis_inc Psfc: work_a - work_a(:,:)=work_a(:,:)-worka2(:,:) - call fv3_ll_to_h(work_a,workb2,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - work_b(:,:)=work_b(:,:)+workb2(:,:) - else - call fv3_ll_to_h(work_a,work_b,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - - endif - - call check( nf90_put_var(gfile_loc,VarId,work_b) ) - call check( nf90_close(gfile_loc) ) - if (allocated(worka2)) deallocate(worka2) - if ( allocated(workb2)) deallocate(workb2) - deallocate(work_b,work_a,work_bi) - - - end if !mype_io - - deallocate(work,work_sub) -end subroutine gsi_fv3ncdf_writeps_v1 - -subroutine gsi_fv3ncdf_write(filename,varname,var,mype_io,add_saved) +subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3filenamegin) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_nemsio_write @@ -2372,193 +2332,98 @@ subroutine gsi_fv3ncdf_write(filename,varname,var,mype_io,add_saved) ! !$$$ end documentation block - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,npe,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1,nsig - use gridmod, only: ijn,displs_g,itotsub,iglobal + use mpimod, only: mpi_rtype,mpi_comm_world,mype,mpi_info_null use mod_fv3_lola, only: fv3_ll_to_h use mod_fv3_lola, only: fv3_h_to_ll - use general_commvars_mod, only: ltosi,ltosj use netcdf, only: nf90_open,nf90_close use netcdf, only: nf90_write,nf90_inq_varid use netcdf, only: nf90_put_var,nf90_get_var + use gsi_bundlemod, only: gsi_bundle + use general_sub2grid_mod, only: sub2grid_info,general_sub2grid implicit none + type(sub2grid_info), intent(in):: grd_ionouv + type(gsi_bundle),intent(inout) :: cstate_nouv - real(r_kind) ,intent(in ) :: var(lat2,lon2,nsig) - integer(i_kind),intent(in ) :: mype_io logical ,intent(in ) :: add_saved - character(*) ,intent(in ) :: varname,filename + character(len=:), allocatable, intent(in) :: filenamein + type (type_fv3regfilenameg),intent (in) :: fv3filenamegin + real(r_kind),dimension(1,grd_ionouv%nlat,grd_ionouv%nlon,grd_ionouv%kbegin_loc:grd_ionouv%kend_alloc):: hwork + character(len=max_varname_length) :: filenamein2 + character(len=max_varname_length) :: varname,vgsiname + integer(i_kind) nlatcase,nloncase,nxcase,nycase,countloc(3),startloc(3) + integer(i_kind) kbgn,kend + integer(i_kind) inative,ilev,ilevtot integer(i_kind) :: VarId,gfile_loc - integer(i_kind) i,j,mm1,k,kr,ns,n,m - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:,:):: work_sub,work_a - real(r_kind),allocatable,dimension(:,:,:):: work_b + integer(i_kind) mm1,nzp1 + real(r_kind),allocatable,dimension(:,:):: work_a + real(r_kind),allocatable,dimension(:,:):: work_b real(r_kind),allocatable,dimension(:,:):: workb2,worka2 mm1=mype+1 + ! Convert from subdomain to full horizontal field distributed among + ! processors + call general_sub2grid(grd_ionouv,cstate_nouv%values,hwork) + nloncase=grd_ionouv%nlon + nlatcase=grd_ionouv%nlat + nxcase=nx + nycase=ny + kbgn=grd_ionouv%kbegin_loc + kend=grd_ionouv%kend_loc + allocate( work_a(nlatcase,nloncase)) + allocate( work_b(nlon_regional,nlat_regional)) + allocate( workb2(nlon_regional,nlat_regional)) + allocate( worka2(nlatcase,nloncase)) + call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + do ilevtot=kbgn,kend + vgsiname=grd_ionouv%names(1,ilevtot) + call getfv3lamfilevname(vgsiname,fv3filenamegin,filenamein2,varname) + if(trim(filenamein) /= trim(filenamein2)) then + write(6,*)'filenamein and filenamein2 are not the same as expected, stop' + call flush(6) + call stop2(333) + endif + ilev=grd_ionouv%lnames(1,ilevtot) + nz=grd_ionouv%nsig + nzp1=nz+1 + inative=nzp1-ilev + countloc=(/nxcase,nycase,1/) + startloc=(/1,1,inative/) + + work_a=hwork(1,:,:,ilevtot) + + + + call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) + + + if(index(vgsiname,"delzinc") > 0) then + call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + call fv3_ll_to_h(work_a(:,:),workb2,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + work_b(:,:)=work_b(:,:)+workb2(:,:) + else + if(add_saved)then + call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + - allocate( work(max(iglobal,itotsub)*nsig),work_sub(lat1,lon1,nsig)) -!!!!!!!! reverse z !!!!!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=var(j+1,i+1,k) - end do - end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - allocate( work_a(nlat,nlon,nsig)) - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_a(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - - allocate( work_b(nlon_regional,nlat_regional,nsig)) - - call check( nf90_open(trim(filename),nf90_write,gfile_loc) ) - call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) - - - if(add_saved)then - allocate( workb2(nlon_regional,nlat_regional)) - allocate( worka2(nlat,nlon)) - call check( nf90_get_var(gfile_loc,VarId,work_b) ) - - do k=1,nsig - call fv3_h_to_ll(work_b(:,:,k),worka2,nlon_regional,nlat_regional,nlon,nlat,grid_reverse_flag) + call fv3_h_to_ll(work_b(:,:),worka2,nlon_regional,nlat_regional,nloncase,nlatcase,grid_reverse_flag) !!!!!!!! analysis_inc: work_a !!!!!!!!!!!!!!!! - work_a(:,:,k)=work_a(:,:,k)-worka2(:,:) - call fv3_ll_to_h(work_a(1,1,k),workb2,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - work_b(:,:,k)=work_b(:,:,k)+workb2(:,:) - enddo - deallocate(worka2,workb2) - else - do k=1,nsig - call fv3_ll_to_h(work_a(1,1,k),work_b(1,1,k),nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - enddo - endif + work_a(:,:)=work_a(:,:)-worka2(:,:) + call fv3_ll_to_h(work_a(:,:),workb2,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + work_b(:,:)=work_b(:,:)+workb2(:,:) + else + call fv3_ll_to_h(work_a(:,:),work_b(:,:),nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + endif + endif + call check( nf90_put_var(gfile_loc,VarId,work_b, start = startloc, count = countloc) ) - print *,'write out ',trim(varname),' to ',trim(filename) - call check( nf90_put_var(gfile_loc,VarId,work_b) ) - call check( nf90_close(gfile_loc) ) - deallocate(work_b,work_a) - end if !mype_io + enddo !ilevtotl loop + call check(nf90_close(gfile_loc)) + deallocate(work_b,work_a) - deallocate(work,work_sub) end subroutine gsi_fv3ncdf_write -subroutine gsi_fv3ncdf_write_fv3_dz(filename,varname,varinc,mype_io,add_saved) -!$$$ subprogram documentation block -! . . . . -! subprogram: gsi_nemsio_write_fv3_dz from gsi_nemsio_write -! pgrmmr: lei -! -! abstract: -! -! program history log: -! -! input argument list: -! varin -! add_saved -! mype - mpi task id -! mype_io -! -! output argument list: -! -! attributes: -! language: f90 -! machine: -! -!$$$ end documentation block - - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,npe,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1,nsig - use gridmod, only: ijn,displs_g,itotsub,iglobal - use mod_fv3_lola, only: fv3_ll_to_h - use mod_fv3_lola, only: fv3_h_to_ll - use general_commvars_mod, only: ltosi,ltosj - use netcdf, only: nf90_open,nf90_close - use netcdf, only: nf90_write,nf90_inq_varid - use netcdf, only: nf90_put_var,nf90_get_var - implicit none - - real(r_kind) ,intent(in ) :: varinc(lat2,lon2,nsig) - integer(i_kind),intent(in ) :: mype_io - logical ,intent(in ) :: add_saved - character(*) ,intent(in ) :: varname,filename - - integer(i_kind) :: VarId,gfile_loc - integer(i_kind) i,j,mm1,k,kr,ns,n,m - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:,:):: work_sub,work_ainc - real(r_kind),allocatable,dimension(:,:,:):: work_b - real(r_kind),allocatable,dimension(:,:):: workb2 - - mm1=mype+1 - - allocate( work(max(iglobal,itotsub)*nsig),work_sub(lat1,lon1,nsig)) -!!!!!!!! reverse z !!!!!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=varinc(j+1,i+1,k) - end do - end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - allocate( work_ainc(nlat,nlon,nsig)) - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_ainc(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - - allocate( work_b(nlon_regional,nlat_regional,nsig)) - - call check( nf90_open(trim(filename),nf90_write,gfile_loc) ) - call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) - - if(.not. add_saved)then - write(6,*)'here the input is increments to be added to the read-in background, & - hence, add_saved has to be true' - endif - allocate( workb2(nlon_regional,nlat_regional)) - call check( nf90_get_var(gfile_loc,VarId,work_b) ) - - do k=1,nsig - call fv3_ll_to_h(work_ainc(1,1,k),workb2(:,:),nlon,nlat,nlon_regional,nlat_regional,.true.) -!!!!!!!! analysis_inc: work_a !!!!!!!!!!!!!!!! - work_b(:,:,k)=workb2(:,:)+work_b(:,:,k) - enddo - deallocate(workb2) - - print *,'write out ',trim(varname),' to ',trim(filename) - call check( nf90_put_var(gfile_loc,VarId,work_b) ) - call check( nf90_close(gfile_loc) ) - deallocate(work_b,work_ainc) - end if !mype_io - - deallocate(work,work_sub) - -end subroutine gsi_fv3ncdf_write_fv3_dz subroutine check(status) use kinds, only: i_kind use netcdf, only: nf90_noerr,nf90_strerror @@ -2569,7 +2434,7 @@ subroutine check(status) stop end if end subroutine check -subroutine gsi_fv3ncdf_write_v1(filename,varname,var,mype_io,add_saved) +subroutine gsi_fv3ncdf_write_v1(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3filenamegin) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_nemsio_write @@ -2593,91 +2458,90 @@ subroutine gsi_fv3ncdf_write_v1(filename,varname,var,mype_io,add_saved) ! !$$$ end documentation block - use mpimod, only: mpi_rtype,mpi_comm_world,ierror,npe,mype - use gridmod, only: lat2,lon2,nlon,nlat,lat1,lon1,nsig - use gridmod, only: ijn,displs_g,itotsub,iglobal + use mpimod, only: mpi_rtype,mpi_comm_world,mype,mpi_info_null use mod_fv3_lola, only: fv3_ll_to_h use mod_fv3_lola, only: fv3_h_to_ll - use general_commvars_mod, only: ltosi,ltosj use netcdf, only: nf90_open,nf90_close use netcdf, only: nf90_write,nf90_inq_varid use netcdf, only: nf90_put_var,nf90_get_var + use gsi_bundlemod, only: gsi_bundle + use general_sub2grid_mod, only: sub2grid_info,general_sub2grid implicit none - real(r_kind) ,intent(in ) :: var(lat2,lon2,nsig) - integer(i_kind),intent(in ) :: mype_io + type(sub2grid_info), intent(in):: grd_ionouv + type(gsi_bundle),intent(inout) :: cstate_nouv logical ,intent(in ) :: add_saved - character(*) ,intent(in ) :: varname,filename + character(*),intent(in):: filenamein + type (type_fv3regfilenameg),intent (in) :: fv3filenamegin + real(r_kind),dimension(1,grd_ionouv%nlat,grd_ionouv%nlon,grd_ionouv%kbegin_loc:grd_ionouv%kend_alloc):: hwork + character(len=max_varname_length) :: filenamein2 + integer(i_kind) kbgn,kend + integer(i_kind) inative,ilev,ilevtot integer(i_kind) :: VarId,gfile_loc - integer(i_kind) :: ilev0 - integer(i_kind) i,j,mm1,k,kr,ns,n,m - real(r_kind),allocatable,dimension(:):: work - real(r_kind),allocatable,dimension(:,:,:):: work_sub,work_a - real(r_kind),allocatable,dimension(:,:,:):: work_b + integer(i_kind) mm1,nzp1 + real(r_kind),allocatable,dimension(:,:):: work_a + real(r_kind),allocatable,dimension(:,:):: work_b real(r_kind),allocatable,dimension(:,:):: workb2,worka2 + character(len=max_varname_length) :: varname,vgsiname + integer(i_kind) nlatcase,nloncase,nxcase,nycase,countloc(3),startloc(3) mm1=mype+1 - - allocate( work(max(iglobal,itotsub)*nsig),work_sub(lat1,lon1,nsig)) -!!!!!!!! reverse z !!!!!!!!!!!!!! - do k=1,nsig - kr=nsig+1-k - do i=1,lon1 - do j=1,lat1 - work_sub(j,i,kr)=var(j+1,i+1,k) - end do - end do - enddo - call mpi_gatherv(work_sub,ijnz(mm1),mpi_rtype, & - work,ijnz,displsz_g,mpi_rtype,mype_io,mpi_comm_world,ierror) - - if(mype==mype_io) then - allocate( work_a(nlat,nlon,nsig)) - ns=0 - do m=1,npe - do k=1,nsig - do n=displs_g(m)+1,displs_g(m)+ijn(m) - ns=ns+1 - work_a(ltosi(n),ltosj(n),k)=work(ns) - end do - enddo - enddo - - allocate( work_b(nlon_regional,nlat_regional,nsig+1)) - - call check( nf90_open(trim(filename),nf90_write,gfile_loc) ) - call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) - call check( nf90_get_var(gfile_loc,VarId,work_b) ) - ilev0=1 - - if(add_saved)then - allocate( workb2(nlon_regional,nlat_regional)) - allocate( worka2(nlat,nlon)) + nloncase=grd_ionouv%nlon + nlatcase=grd_ionouv%nlat + + call general_sub2grid(grd_ionouv,cstate_nouv%values,hwork) + nxcase=nx + nycase=ny + kbgn=grd_ionouv%kbegin_loc + kend=grd_ionouv%kend_loc + allocate( work_a(nlatcase,nloncase)) + allocate( work_b(nlon_regional,nlat_regional)) + allocate( workb2(nlon_regional,nlat_regional)) + allocate( worka2(nlatcase,nloncase)) + call check ( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL)) !clt + do ilevtot=kbgn,kend + vgsiname=grd_ionouv%names(1,ilevtot) + call getfv3lamfilevname(vgsiname,fv3filenamegin,filenamein2,varname) + if(trim(filenamein) /= trim(filenamein2)) then + write(6,*)'filenamein and filenamein2 are not the same as expected, stop' + call flush(6) + call stop2(333) + endif + ilev=grd_ionouv%lnames(1,ilevtot) + nz=grd_ionouv%nsig + nzp1=nz+1 + inative=nzp1-ilev + startloc=(/1,1,inative+1/) + countloc=(/nxcase,nycase,1/) + + work_a=hwork(1,:,:,ilevtot) + + + call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) + call check( nf90_get_var(gfile_loc,VarId,work_b,start=startloc,count=countloc) ) + if(index(vgsiname,"delzinc") > 0) then + write(6,*)'delz is not in the cold start fiels with this option, incompatible setup , stop' + call stop2(333) + endif + + if(add_saved)then ! for being now only lev between (including ) 2 and nsig+1 of work_b (:,:,lev) ! are updated - do k=1,nsig - call fv3_h_to_ll(work_b(:,:,ilev0+k),worka2,nlon_regional,nlat_regional,nlon,nlat,grid_reverse_flag) + call fv3_h_to_ll(work_b(:,:),worka2,nlon_regional,nlat_regional,nloncase,nlatcase,grid_reverse_flag) !!!!!!!! analysis_inc: work_a !!!!!!!!!!!!!!!! - work_a(:,:,k)=work_a(:,:,k)-worka2(:,:) - call fv3_ll_to_h(work_a(1,1,k),workb2,nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - work_b(:,:,ilev0+k)=work_b(:,:,ilev0+k)+workb2(:,:) - enddo - deallocate(worka2,workb2) - else - do k=1,nsig - call fv3_ll_to_h(work_a(1,1,k),work_b(1,1,ilev0+k),nlon,nlat,nlon_regional,nlat_regional,grid_reverse_flag) - enddo - endif - - print *,'write out ',trim(varname),' to ',trim(filename) - call check( nf90_put_var(gfile_loc,VarId,work_b) ) - call check( nf90_close(gfile_loc) ) - deallocate(work_b,work_a) - end if !mype_io - - deallocate(work,work_sub) + work_a(:,:)=work_a(:,:)-worka2(:,:) + call fv3_ll_to_h(work_a(:,:),workb2,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + work_b(:,:)=work_b(:,:)+workb2(:,:) + else + call fv3_ll_to_h(work_a(:,:),work_b(:,:),nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + endif + call check( nf90_put_var(gfile_loc,VarId,work_b,start=startloc,count=countloc) ) + enddo !ilevtot + call check(nf90_close(gfile_loc)) + deallocate(work_b,work_a) + deallocate(worka2,workb2) end subroutine gsi_fv3ncdf_write_v1 @@ -3163,25 +3027,25 @@ subroutine convert_cvpnx_to_nx(qnx_arr,cvpnr,cvpnr_pvalue,cloud_nt_updt,q_arr,qr ! re-initialisation of QNRAIN with analyzed qr and N0r(which is single-moment parameter) ! equation is used in subroutine init_MM of initlib3d.f90 in arps package - qnr_tmp = zero - if ( cloud_nt_updt == 2 ) then - T1D=ges_tsen(j,i,k,it) ! sensible temperature (K) - P1D=r100*(aeta1_ll(k)*(r10*ps_arr(j,i)-pt_ll)+pt_ll) ! pressure hPa --> Pa - Q1D=q_arr(j,i,k)/(one-q_arr(j,i,k)) ! mixing ratio - RHO=P1D/(rd*T1D*(one+D608*Q1D)) ! air density in kg m^-3 - QR1D=qr_arr(j,i,k) - CALL init_mm_qnr(RHO,QR1D,qnr_tmp) - qnr_tmp = max(qnr_tmp, zero) + qnr_tmp = zero + if ( cloud_nt_updt == 2 ) then + T1D=ges_tsen(j,i,k,it) ! sensible temperature (K) + P1D=r100*(aeta1_ll(k)*(r10*ps_arr(j,i)-pt_ll)+pt_ll) ! pressure hPa --> Pa + Q1D=q_arr(j,i,k)/(one-q_arr(j,i,k)) ! mixing ratio + RHO=P1D/(rd*T1D*(one+D608*Q1D)) ! air density in kg m^-3 + QR1D=qr_arr(j,i,k) + CALL init_mm_qnr(RHO,QR1D,qnr_tmp) + qnr_tmp = max(qnr_tmp, zero) - else - if (cvpnr) then ! power transform - qnr_tmp=max((cvpnr_pvalue*qnx_arr(j,i,k)+1)**(1/cvpnr_pvalue)-1.0E-2_r_kind,0.0_r_kind) - else - qnr_tmp=qnx_arr(j,i,k) - end if + else + if (cvpnr) then ! power transform + qnr_tmp=max((cvpnr_pvalue*qnx_arr(j,i,k)+1)**(1/cvpnr_pvalue)-1.0E-2_r_kind,0.0_r_kind) + else + qnr_tmp=qnx_arr(j,i,k) + end if - end if - tmparr_qnr(j,i,k)=qnr_tmp + end if + tmparr_qnr(j,i,k)=qnr_tmp end do end do @@ -3190,5 +3054,99 @@ subroutine convert_cvpnx_to_nx(qnx_arr,cvpnr,cvpnr_pvalue,cloud_nt_updt,q_arr,qr qnx_arr=tmparr_qnr end subroutine convert_cvpnx_to_nx +subroutine gsi_copy_bundle(bundi,bundo) + use gsi_bundlemod, only:gsi_bundleinquire, gsi_bundlegetpointer,gsi_bundleputvar + implicit none + + ! copy the variables in the gsi_metguess_bundle_inout to gsi_bundle_inout or + ! vice versa, according to icopy_flag + ! !INPUT PARAMETERS: + + type(gsi_bundle), intent(in ) :: bundi + + ! !INPUT/OUTPUT PARAMETERS: + + type(gsi_bundle), intent(inout) :: bundo + character(len=max_varname_length),dimension(:),allocatable:: src_name_vars2d + character(len=max_varname_length),dimension(:),allocatable:: src_name_vars3d + character(len=max_varname_length),dimension(:),allocatable:: target_name_vars2d + character(len=max_varname_length),dimension(:),allocatable:: target_name_vars3d + character(len=max_varname_length) ::varname + real(r_kind),dimension(:,:,:),pointer:: pvar3d=>NULL() + real(r_kind),dimension(:,:,:),pointer:: pvar2d =>NULL() + integer(i_kind):: src_nc3d,src_nc2d,target_nc3d,target_nc2d + integer(i_kind):: ivar,jvar,istatus + src_nc3d=bundi%n3d + src_nc2d=bundi%n2d + target_nc3d=bundo%n3d + target_nc2d=bundo%n2d + allocate(src_name_vars3d(src_nc3d),src_name_vars2d(src_nc2d)) + allocate(target_name_vars3d(target_nc3d),target_name_vars2d(target_nc2d)) + call gsi_bundleinquire(bundi,'shortnames::3d',src_name_vars3d,istatus) + call gsi_bundleinquire(bundi,'shortnames::2d',src_name_vars2d,istatus) + call gsi_bundleinquire(bundo,'shortnames::3d',target_name_vars3d,istatus) + call gsi_bundleinquire(bundo,'shortnames::2d',target_name_vars2d,istatus) + do ivar=1,src_nc3d + varname=trim(src_name_vars3d(ivar)) + do jvar=1,target_nc3d + if(index(target_name_vars3d(jvar),varname) > 0) then + call GSI_BundleGetPointer (bundi,varname,pvar3d,istatus) + call gsi_bundleputvar (bundo,varname,pvar3d,istatus) + exit + endif + enddo + enddo + do ivar=1,src_nc2d + varname=trim(src_name_vars2d(ivar)) + do jvar=1,target_nc2d + if(index(target_name_vars2d(jvar),varname) > 0) then + call GSI_BundleGetPointer (bundi,varname,pvar2d,istatus) + call gsi_bundleputvar (bundo,varname,pvar2d,istatus) + exit + endif + enddo + enddo + deallocate(src_name_vars3d,src_name_vars2d) + deallocate(target_name_vars3d,target_name_vars2d) + return +end subroutine gsi_copy_bundle +subroutine getfv3lamfilevname(vgsinamein,fv3filenamegref,filenameout,vname) + type (type_fv3regfilenameg),intent (in) :: fv3filenamegref + character(len=*):: vgsinamein + character(len=*),intent(out):: vname + character(len=*),intent(out):: filenameout + if (ifindstrloc(vgsiname,vgsinamein)<= 0) then + write(6,*)'the name ',vgsinamein ,'cannot be treated correctly in getfv3lamfilevname,stop' + call stop2(333) + endif + if(ifindstrloc(vardynvars,vgsinamein)> 0) then + filenameout=fv3filenamegref%dynvars + else if(ifindstrloc(vartracers,vgsinamein)> 0 ) then + filenameout=fv3filenamegref%tracers + else + write(6,*)'the filename corresponding to var ',trim(vgsinamein),' is not found, stop ' + call stop2(333) + endif + vname=varfv3name(ifindstrloc(vgsiname,vgsinamein)) + if(trim(vname)=="T".and. fv3sar_bg_opt==1) then + vname="t" + endif + + return +end subroutine getfv3lamfilevname +function ifindstrloc(str_array,strin) + integer(i_kind) ifindstrloc + character(len=max_varname_length),dimension(:) :: str_array + character(len=*) :: strin + integer(i_kind) i + ifindstrloc=0 + do i=1,size(str_array) + if(trim(str_array(i)) == trim(strin)) then + ifindstrloc=i + exit + endif + enddo +end function ifindstrloc + end module gsi_rfv3io_mod diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index 1e12efdd39..1c8b73841f 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -1678,6 +1678,10 @@ subroutine gsimain_initialize end if end if if (fv3sar_bg_opt /= 0) l_reg_update_hydro_delz=.false. + if(regional_ensemble_option == 5 .and. (fv3sar_ensemble_opt /= fv3sar_bg_opt)) then + write(6,*)'this setup doesn"t work, stop' + call stop2(137) + endif if (anisotropic) then call init_fgrid2agrid(pf2aP1) call init_fgrid2agrid(pf2aP2) diff --git a/src/gsi/mod_fv3_lola.f90 b/src/gsi/mod_fv3_lola.f90 index f1726fdde8..84f8144968 100644 --- a/src/gsi/mod_fv3_lola.f90 +++ b/src/gsi/mod_fv3_lola.f90 @@ -361,6 +361,13 @@ subroutine generate_anl_grid(nx,ny,grid_lon,grid_lont,grid_lat,grid_latt) endif jb2=jb1 jb1=gya + if(ib1+1 > nx)then !this block( 6 lines) is copied from GSL gsi repository + ib1=ib1-1 + endif + if(jb1+1 > ny)then + jb1=jb1-1 + endif + if((ib1 == ib2) .and. (jb1 == jb2)) exit if(n==3 ) then From 3675384e3b5fa47e5f1ae063dffba108a306cfed Mon Sep 17 00:00:00 2001 From: David Huber Date: Mon, 13 Dec 2021 20:05:35 +0000 Subject: [PATCH 05/26] GitHub Issue #267 Corrected the OznMon and RadMon ports for S4 and Jet. --- util/Ozone_Monitor/data_xtrct/ush/find_cycle.pl | 5 ++++- util/Ozone_Monitor/image_gen/ush/mk_err_rpt.sh | 6 ++++++ util/Radiance_Monitor/build_RadMon_cmake.sh | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/util/Ozone_Monitor/data_xtrct/ush/find_cycle.pl b/util/Ozone_Monitor/data_xtrct/ush/find_cycle.pl index 069dae672c..df9acef77c 100755 --- a/util/Ozone_Monitor/data_xtrct/ush/find_cycle.pl +++ b/util/Ozone_Monitor/data_xtrct/ush/find_cycle.pl @@ -134,10 +134,13 @@ do { $hr_ctr = $hr_ctr - 1; - + $newdir = "${dirpath}/${sortmm[$ctr]}/${hrs[$hr_ctr]}/atmos/oznmon/time"; if( ! -d $newdir ) { $newdir = "${dirpath}/${sortmm[$ctr]}/${hrs[$hr_ctr]}/oznmon/time"; + if( ! -d $newdir ) { + $newdir = "${dirpath}/${sortmm[$ctr]}/time"; + } } if( -d $newdir ) { diff --git a/util/Ozone_Monitor/image_gen/ush/mk_err_rpt.sh b/util/Ozone_Monitor/image_gen/ush/mk_err_rpt.sh index 99039af677..fe0fa62804 100755 --- a/util/Ozone_Monitor/image_gen/ush/mk_err_rpt.sh +++ b/util/Ozone_Monitor/image_gen/ush/mk_err_rpt.sh @@ -116,6 +116,9 @@ fi OZN_TANKDIR_TIME=${TANKDIR}/${RUN}.${PDY}/${cyc}/oznmon/time +if [[ ! -d ${OZN_TANKDIR_TIME} ]]; then + OZN_TANKDIR_TIME=${TANKDIR}/${RUN}.${PDY}/time +fi echo "OZN_TANKDIR_TIME = $OZN_TANKDIR_TIME" @@ -132,6 +135,9 @@ prev_pdy=`echo $prev_cycle | cut -c1-8` prev_cyc=`echo $prev_cycle | cut -c9-10` OZN_TANKDIR_PREV=${TANKDIR}/${RUN}.${prev_pdy}/${prev_cyc}/oznmon/time +if [[ ! -d ${OZN_TANKDIR_PREV} ]]; then + OZN_TANKDIR_TIME=${TANKDIR}/${RUN}.${prev_pdy}/time +fi echo "OZN_TANKDIR_PREV = $OZN_TANKDIR_PREV" prev_bad_cnt=`ls $OZN_TANKDIR_PREV/bad_cnt.${prev_cycle}` diff --git a/util/Radiance_Monitor/build_RadMon_cmake.sh b/util/Radiance_Monitor/build_RadMon_cmake.sh index 29a39fa4d1..3e6e48d1d8 100755 --- a/util/Radiance_Monitor/build_RadMon_cmake.sh +++ b/util/Radiance_Monitor/build_RadMon_cmake.sh @@ -37,7 +37,7 @@ elif [[ -d /scratch1 ]] ; then . /apps/lmod/lmod/init/sh target=hera elif [[ -d /data ]] ; then - . /opt/apps/lmod/lmod/init/sh + . /usr/share/lmod/lmod/init/sh target=s4 elif [[ -d /work ]]; then . $MODULESHOME/init/sh From 66e3916f920b5e753944f3bf58f5d463fe100b9a Mon Sep 17 00:00:00 2001 From: "Xu.Li" Date: Fri, 3 Dec 2021 16:10:12 +0000 Subject: [PATCH 06/26] GitHub Issue NOAA-EMC/GSI#235. Commit an NSST update package for GFSv16.5. Branch feature/gsi_nsst_v16.5 --- scripts/exgdas_efsoi_update.sh | 4 + scripts/exgdas_enkf_update.sh | 2 + scripts/exglobal_atmos_analysis.sh | 14 +- src/gsi/gsi_obOperTypeManager.F90 | 1 + src/gsi/ncepnems_io.f90 | 151 +++++++ src/gsi/qcmod.f90 | 2 +- src/gsi/radiance_mod.f90 | 4 +- src/gsi/radinfo.f90 | 3 +- src/gsi/read_avhrr.f90 | 627 ++++++++++++++++------------- src/gsi/read_obs.F90 | 16 +- src/gsi/read_viirs.f90 | 527 ++++++++++++++++++++++++ src/gsi/satthin.F90 | 20 + src/gsi/setuprad.f90 | 26 +- 13 files changed, 1096 insertions(+), 301 deletions(-) create mode 100644 src/gsi/read_viirs.f90 diff --git a/scripts/exgdas_efsoi_update.sh b/scripts/exgdas_efsoi_update.sh index 73ece19b26..a69aa766a3 100755 --- a/scripts/exgdas_efsoi_update.sh +++ b/scripts/exgdas_efsoi_update.sh @@ -361,6 +361,10 @@ cat > enkf.nml << EOFnml sattypes_rad(68)= 'ahi_himawari8', dsis(68)= 'ahi_himawari8', sattypes_rad(69)= 'abi_g16', dsis(69)= 'abi_g16', sattypes_rad(70)= 'abi_g17', dsis(70)= 'abi_g17', + sattypes_rad(71)= 'iasi_metop-c', dsis(71)= 'iasi_metop-c', + sattypes_rad(72)= 'viirs-m_npp', dsis(72)= 'viirs-m_npp', + sattypes_rad(73)= 'viirs-m_j1', dsis(73)= 'viirs-m_j1', + $SATOBS_ENKF / &ozobs_enkf diff --git a/scripts/exgdas_enkf_update.sh b/scripts/exgdas_enkf_update.sh index 1690c180c3..cd78a7fe9a 100755 --- a/scripts/exgdas_enkf_update.sh +++ b/scripts/exgdas_enkf_update.sh @@ -350,6 +350,8 @@ cat > enkf.nml << EOFnml sattypes_rad(69)= 'abi_g16', dsis(69)= 'abi_g16', sattypes_rad(70)= 'abi_g17', dsis(70)= 'abi_g17', sattypes_rad(71)= 'iasi_metop-c', dsis(71)= 'iasi_metop-c', + sattypes_rad(72)= 'viirs-m_npp', dsis(72)= 'viirs-m_npp', + sattypes_rad(73)= 'viirs-m_j1', dsis(73)= 'viirs-m_j1', $SATOBS_ENKF / &ozobs_enkf diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh index 388fe9700d..0abc722c27 100755 --- a/scripts/exglobal_atmos_analysis.sh +++ b/scripts/exglobal_atmos_analysis.sh @@ -150,6 +150,7 @@ GMI1CRBF=${GMI1CRBF:-${COMIN_OBS}/${OPREFIX}gmi1cr.tm00.bufr_d${OSUFFIX}} SAPHIRBF=${SAPHIRBF:-${COMIN_OBS}/${OPREFIX}saphir.tm00.bufr_d${OSUFFIX}} SEVIRIBF=${SEVIRIBF:-${COMIN_OBS}/${OPREFIX}sevcsr.tm00.bufr_d${OSUFFIX}} AHIBF=${AHIBF:-${COMIN_OBS}/${OPREFIX}ahicsr.tm00.bufr_d${OSUFFIX}} +SSTVIIRS=${SSTVIIRS:-${COMIN_OBS}/${OPREFIX}sstvcw.tm00.bufr_d${OSUFFIX}} ABIBF=${ABIBF:-${COMIN_OBS}/${OPREFIX}gsrcsr.tm00.bufr_d${OSUFFIX}} CRISBF=${CRISBF:-${COMIN_OBS}/${OPREFIX}cris.tm00.bufr_d${OSUFFIX}} ESCRIS=${ESCRIS:-${COMIN_OBS}/${OPREFIX}escris.tm00.bufr_d${OSUFFIX}} @@ -533,6 +534,7 @@ $NLN $B1AVHPM avhpmbufr $NLN $AHIBF ahibufr $NLN $ABIBF abibufr $NLN $HDOB hdobbufr +$NLN $SSTVIIRS sstviirs [[ $DONST = "YES" ]] && $NLN $NSSTBF nsstbufr @@ -802,7 +804,7 @@ cat > gsiparm.anl << EOF $OBSQC / &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,time_window_max=3.0, + dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,dmesh(4)=70.0,time_window_max=3.0, $OBSINPUT / OBS_INPUT:: @@ -893,10 +895,10 @@ OBS_INPUT:: gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 oscatbufr uv null uv 0.0 0 0 mlsbufr mls30 aura mls30_aura 0.0 0 0 - avhambufr avhrr metop-a avhrr3_metop-a 0.0 1 0 - avhpmbufr avhrr n18 avhrr3_n18 0.0 1 0 - avhambufr avhrr metop-b avhrr3_metop-b 0.0 1 0 - avhpmbufr avhrr n19 avhrr3_n19 0.0 1 0 + avhambufr avhrr metop-a avhrr3_metop-a 0.0 4 0 + avhpmbufr avhrr n18 avhrr3_n18 0.0 4 0 + avhambufr avhrr metop-b avhrr3_metop-b 0.0 4 0 + avhpmbufr avhrr n19 avhrr3_n19 0.0 4 0 amsr2bufr amsr2 gcom-w1 amsr2_gcom-w1 0.0 3 0 gmibufr gmi gpm gmi_gpm 0.0 3 0 saphirbufr saphir meghat saphir_meghat 0.0 3 0 @@ -912,6 +914,8 @@ OBS_INPUT:: amsuabufr amsua metop-c amsua_metop-c 0.0 1 1 mhsbufr mhs metop-c mhs_metop-c 0.0 1 1 iasibufr iasi metop-c iasi_metop-c 0.0 1 1 + sstviirs viirs-m npp viirs-m_npp 0.0 4 0 + sstviirs viirs-m j1 viirs-m_j1 0.0 4 0 :: &SUPEROB_RADAR $SUPERRAD diff --git a/src/gsi/gsi_obOperTypeManager.F90 b/src/gsi/gsi_obOperTypeManager.F90 index 9af3a62a7f..48af6f716c 100644 --- a/src/gsi/gsi_obOperTypeManager.F90 +++ b/src/gsi/gsi_obOperTypeManager.F90 @@ -345,6 +345,7 @@ function dtype2index_(dtype) result(index_) ! case("avhrr_navy"); index_= iobOper_rad case("avhrr" ); index_= iobOper_rad + case("viirs-m" ); index_= iobOper_rad case("tcp" ,"[tcpoper]" ); index_= iobOper_tcp diff --git a/src/gsi/ncepnems_io.f90 b/src/gsi/ncepnems_io.f90 index b4c29087d7..73f06ffd07 100755 --- a/src/gsi/ncepnems_io.f90 +++ b/src/gsi/ncepnems_io.f90 @@ -132,6 +132,7 @@ module ncepnems_io public read_nemsatm public read_nemssfc public read_nemssfc_anl + public berror_read_hsst public write_fv3atm_nems public write_nemsatm public write_nemssfc @@ -168,6 +169,10 @@ module ncepnems_io module procedure read_nemssfc_anl_ end interface + interface berror_read_hsst + module procedure berror_read_hsst_ + end interface + interface read_nemsnst module procedure read_nemsnst_ end interface @@ -1788,6 +1793,152 @@ subroutine read_nemssfc_anl_(iope,isli_anl) end subroutine read_nemssfc_anl_ + subroutine read_hsst_(hsst,cwoption) +! +! abstract : read sst bg error correlation length from berror fix file +! +! 03/13/2020 - Xu Li (based on read_wgt) +! + use kinds, only : i_kind,r_single,r_kind + use gridmod, only : nlat,nlon,nsig + use mpeu_util, only : check_iostat + + implicit none + + integer(i_kind) , intent(in ) :: cwoption + real(r_single),dimension(nlat,nlon), intent(out ) :: hsst + + real(r_single),dimension(nlat,nlon) :: corsst + character(len=*),parameter :: myname_=myname//'::read_hsst' + + real(r_single),dimension(nlat,nsig,nsig):: agvin + real(r_single),dimension(nlat,nsig) :: wgvin,bvin + + integer(i_kind) :: inerr,istat,ier + integer(i_kind) :: nsigstat,nlatstat + integer(i_kind) :: isig + character(len=5) :: var + + real(r_single), allocatable, dimension(:,:) :: hwllin + real(r_single), allocatable, dimension(:,:) :: corzin + real(r_single), allocatable, dimension(:,:) :: corq2 + real(r_single), allocatable, dimension(:,:) :: vscalesin + + character(len=256) :: berror_stats = "berror_stats" ! filename + + ! Open background error statistics file + inerr = 22 + open(inerr,file=berror_stats,form='unformatted',status='old',iostat=ier) + call check_iostat(ier,myname_,'open('//trim(berror_stats)//')') + + ! Read header. Ensure that vertical resolution is consistent + ! with that specified via the user namelist + + rewind inerr + read(inerr,iostat=ier)nsigstat,nlatstat + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (nsigstat,nlatstat)') + + if ( nsigstat/=nsig .or. nlatstat/=nlat ) then + write(6,*)'PREBAL: **ERROR** resolution of berror_stats incompatiable with GSI' + + write(6,*)'PREBAL: berror nsigstat,nlatstat=', nsigstat,nlatstat, & + ' -vs- GSI nsig,nlat=',nsig,nlat + call stop2(101) + endif + + write(6,*) myname_,'(read_hsst): read error amplitudes ', & + '"',trim(berror_stats),'". ', & + 'nsigstat,nlatstat =',nsigstat,nlatstat + + read(inerr,iostat=ier) agvin,bvin,wgvin + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (agvin,bvin,wgvin)') + + write(*,*) 'in read_hsst_, cwoption = ',cwoption + + readloop: do + read(inerr,iostat=istat) var, isig + if ( istat/=0 ) exit + write(*,*) 'var, isig, istat : ',var, isig, istat + allocate(corzin(nlat,isig)) + if ( var=='q' .or. var=='cw' ) allocate(corq2(nlat,isig)) + allocate(hwllin(nlat,isig)) + if ( isig>1 ) allocate(vscalesin(nlat,isig)) + if ( var/='sst' ) then + if ( var=='q' .or. var=='Q' .or. (var=='cw' .and. cwoption==2) ) then + read(inerr,iostat=ier) corzin,corq2 + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (corzin,corq2)') + else + read(inerr,iostat=ier) corzin + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (corzin)') + endif + read(inerr,iostat=ier) hwllin + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (hwllin)') + if ( isig>1 ) then + read(inerr,iostat=ier) vscalesin + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (vscalein)') + endif + else + read(inerr,iostat=ier) corsst + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (corsst)') + read(inerr,iostat=ier) hsst + call check_iostat(ier,myname_,'read('//trim(berror_stats)//') for (hsst)') + endif + + + deallocate(corzin,hwllin) + if (isig>1) deallocate(vscalesin) + if ( var=='q' .or. var=='cw' ) deallocate(corq2) + + enddo readloop + close(inerr) + + return + end subroutine read_hsst_ + + subroutine berror_read_hsst_(iope,hsst) +!$$$ subprogram documentation block +! . . . . +! subprogram: berror_read_hsst_ read hsst from berror_stats file +! prgmmr: xuli org: np23 date: 2020-03-13 +! +! program history log: +! +! input argument list: +! iope - mpi task handling i/o +! +! output argument list: +! hsst - sst bg error correlation length (km) +! +! attributes: +! language: f90 +! machine: ibm RS/6000 SP +! +!$$$ + use kinds, only: r_kind,i_kind,r_single + use gridmod, only: nlat,nlon + use mpimod, only: mpi_itype,mpi_rtype4,mpi_comm_world,mype + use jfunc, only: cwoption + implicit none + +! Declare passed variables + integer(i_kind), intent(in) :: iope + real(r_single), dimension(nlat,nlon), intent(out) :: hsst + +! Declare local variables + integer(i_kind):: iret,npts + +!----------------------------------------------------------------------------- +! Read surface history file on processor iope + if(mype == iope)then + call read_hsst_(hsst,cwoption) + write(*,*) 'read hsst from berror_stats' + endif + +! Load onto all processors + npts=nlat*nlon + call mpi_bcast(hsst,npts,mpi_rtype4,iope,mpi_comm_world,iret) + end subroutine berror_read_hsst_ + subroutine read_nst_ (tref,dt_cool,z_c,dt_warm,z_w,c_0,c_d,w_0,w_d) !$$$ subprogram documentation block diff --git a/src/gsi/qcmod.f90 b/src/gsi/qcmod.f90 index 1b6b8b705a..525da81979 100644 --- a/src/gsi/qcmod.f90 +++ b/src/gsi/qcmod.f90 @@ -580,7 +580,7 @@ subroutine setup_tzr_qc(obstype) tzchk = 0.50_r_kind elseif ( obstype == 'amsua' .or. obstype == 'ssmis' .or. obstype == 'ssmi' ) then tzchk = 0.12_r_kind - elseif ( obstype == 'avhrr' .or. obstype == 'avhrr_navy' ) then + elseif ( obstype == 'avhrr' .or. obstype == 'avhrr_navy' .or. obstype == 'viirs') then tzchk = 0.85_r_kind elseif ( obstype == 'hirs2' .or. obstype == 'hirs3' .or. obstype == 'hirs4' .or. & obstype == 'sndr' .or. obstype == 'sndrd1' .or. obstype == 'sndrd2'.or. & diff --git a/src/gsi/radiance_mod.f90 b/src/gsi/radiance_mod.f90 index 527cc62bcf..f4f62dcee0 100644 --- a/src/gsi/radiance_mod.f90 +++ b/src/gsi/radiance_mod.f90 @@ -322,6 +322,7 @@ subroutine radiance_obstype_init ! 2018-04-04 zhu -- move rad_type_info(k)%cclr and rad_type_info(k)%ccld to this subroutine ! 2018-04-06 derber -- change rad_type_info(k)%cclr default value from zero to a large number ! 2019-03-21 Wei/Martin - fix capabilities for AOD assimilation +! 2021-03-05 X.Li - add viirs (viirs-m with sstviirs data set) ! ! input argument list: ! @@ -401,6 +402,7 @@ subroutine radiance_obstype_init if (index(dtype(i),'sndr') /= 0) rtype(i)='sndr' if (index(dtype(i),'hirs') /= 0) rtype(i)='hirs' if (index(dtype(i),'avhrr') /= 0) rtype(i)='avhrr' + if (index(dtype(i),'viirs-m') /= 0) rtype(i)='viirs' if (index(dtype(i),'modis') /= 0) rtype(i)='modis' if (index(dtype(i),'seviri') /= 0) rtype(i)='seviri' @@ -411,7 +413,7 @@ subroutine radiance_obstype_init rtype(i) == 'avhrr' .or. rtype(i) == 'amsre' .or. rtype(i) == 'ssmis' .or. & rtype(i) == 'ssmi' .or. rtype(i) == 'atms' .or. rtype(i) == 'cris' .or. & rtype(i) == 'amsr2' .or. rtype(i) == 'gmi' .or. rtype(i) == 'saphir' .or. & - rtype(i) == 'cris-fsr' .or. rtype(i) == 'abi' ) then + rtype(i) == 'cris-fsr' .or. rtype(i) == 'abi' .or. rtype(i) == 'viirs' ) then drtype(i)='rads' end if end do diff --git a/src/gsi/radinfo.f90 b/src/gsi/radinfo.f90 index 907db4643d..081d391db2 100644 --- a/src/gsi/radinfo.f90 +++ b/src/gsi/radinfo.f90 @@ -1690,7 +1690,7 @@ subroutine init_predx logical mean_only logical ssmi,ssmis,amsre,amsre_low,amsre_mid,amsre_hig,tmi,gmi,amsr2,saphir logical ssmis_las,ssmis_uas,ssmis_env,ssmis_img - logical avhrr,avhrr_navy,goessndr,goes_img,ahi,seviri,abi + logical avhrr,avhrr_navy,goessndr,goes_img,ahi,seviri,abi,viirs character(len=20):: obstype,platid character(len=20):: satsens,satsens_id @@ -1872,6 +1872,7 @@ subroutine init_predx ahi = obstype == 'ahi' abi = obstype == 'abi' avhrr = obstype == 'avhrr' + viirs = obstype == 'viirs-m' avhrr_navy = obstype == 'avhrr_navy' ssmi = obstype == 'ssmi' amsre_low = obstype == 'amsre_low' diff --git a/src/gsi/read_avhrr.f90 b/src/gsi/read_avhrr.f90 index 8730b8bf13..48c6200c44 100755 --- a/src/gsi/read_avhrr.f90 +++ b/src/gsi/read_avhrr.f90 @@ -47,6 +47,8 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& ! 2015-02-23 Rancic/Thomas - add thin4d to time window logical ! 2015-10-01 guo - consolidate use of ob location (in deg) ! 2018-05-21 j.jin - added time-thinning. Moved the checking of thin4d into satthin.F90. +! 2021-02-21 x.li - modifying thinning scheme +! ! ! input argument list: ! mype - mpi task id @@ -73,11 +75,12 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& ! machine: ibm RS/6000 SP ! !$$$ - use kinds, only: r_kind,r_double,i_kind + use kinds, only: r_kind,r_single,r_double,i_kind use satthin, only: super_val,itxmax,makegrids,map2tgrid,destroygrids, & checkob, finalcheck,score_crit use satthin, only: radthin_time_info,tdiff2crit use obsmod, only: time_window_max + use satthin, only: hsst use gridmod, only: diagnostic_reg,regional,nlat,nlon,tll2xy,txy2ll,rlats,rlons use constants, only: deg2rad, zero, one, two, half, rad2deg, r60inv ! use radinfo, only: cbias,predx,air_rad,ang_rad,newpc4pred @@ -89,6 +92,7 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& use gsi_nstcouplermod, only: nst_gsi,nstinfo use gsi_nstcouplermod, only: gsi_nstcoupler_skindepth, gsi_nstcoupler_deter use mpimod, only: npe + ! use radiance_mod, only: rad_obs_type implicit none @@ -126,6 +130,7 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& logical outside,iuse,assim character(len=8) :: subset + integer(i_kind) :: nmesh integer(i_kind) klon1,klatp1,klonp1,klat1 integer(i_kind) nchanl,iret,ifov, ich4, ich_offset ! integer(i_kind) ich_win @@ -152,7 +157,8 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& real(r_kind),dimension(mlat_sst):: rlats_sst real(r_kind),dimension(mlon_sst):: rlons_sst real(r_kind),allocatable,dimension(:,:):: sst_an - real(r_kind),allocatable,dimension(:,:):: data_all + real(r_kind), allocatable, dimension(:,:) :: data_mesh + real(r_kind), allocatable, dimension(:,:) :: data_all real(r_kind) :: tsavg,vty,vfr,sty,stp,sm,sn,zz,ff10 real(r_kind) :: zob,tref,dtw,dtc,tz_tr real(r_kind) :: scan_pos,scan_angle,dfov,r01 @@ -160,11 +166,14 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& real(r_double), dimension(13) :: hdr real(r_double), dimension(3,5) :: bufrf - integer(i_kind) lnbufr,ireadsb,ireadmg,iskip,irec,next - integer(i_kind),allocatable,dimension(:)::nrec + integer(i_kind) :: lnbufr,ireadsb,ireadmg,iskip,irec,next + integer(i_kind), allocatable, dimension(:) :: nrec + real(r_kind), allocatable, dimension(:) :: amesh + real(r_kind), allocatable, dimension(:) :: hsst_thd - real(r_kind) cdist,disterr,disterrmax,dlon00,dlat00 + real(r_kind) cdist,disterr,disterrmax,dlon00,dlat00,hsst_xy,dmsh integer(i_kind) ntest + integer(i_kind) :: imesh,ndata_mesh,iele ! real(r_kind), dimension(3,2) :: bandcor_a,bandcor_b ! data bandcor_a/-1.70686_r_kind,-0.27201_r_kind,-0.30949_r_kind,-1.70388_r_kind,-0.43725_r_kind,-0.25342_r_kind/ @@ -172,7 +181,6 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& real(r_kind) :: ptime,timeinflat,crit0 integer(i_kind) :: ithin_time,n_tbin,it_mesh - !************************************************************************** ! Start routine here. Set constants. Initialize variables @@ -186,9 +194,35 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& nchanl = 3 ich_offset = 2 ! avhrr, channels 1 & 2 are skipped ich4 = ich_offset + 2 -! ich_win = newchn(sis, 4) ! Set array index for Channel 4 r01 = 0.01_r_kind + if ( rmesh == 888.0_r_kind ) then + nmesh = 6 + allocate(amesh(nmesh),hsst_thd(0:nmesh)) +! +! assign thinning box sizes related berror correlation length thresholds +! + amesh(1) = max(two,minval(hsst)) + amesh(nmesh) = min(100.0_r_kind,maxval(hsst)) + dmsh = (amesh(nmesh) - amesh(1))/real(nmesh-1) + do imesh = 2, nmesh - 1 + amesh(imesh) = amesh(imesh-1) + dmsh + enddo + + hsst_thd(0) = max(two,half*amesh(1)) + hsst_thd(nmesh) = 2000.0_r_kind + do imesh = 1, nmesh - 1 + hsst_thd(imesh) = amesh(imesh) + half*dmsh + enddo + + else + nmesh = 1 + allocate(amesh(nmesh),hsst_thd(0:nmesh)) + amesh(nmesh) = rmesh + hsst_thd(0) = 2.0_r_kind + hsst_thd(1) = 2000.0_r_kind + endif + dfov = (ngac - two*cut_spot - one)/nfov ilon=3 @@ -204,13 +238,11 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& rlndsea(3) = 30._r_kind rlndsea(4) = 30._r_kind - ! 205,206,207,208 or 209 for NOAA-14,16,16,17 & 18 respectively + ! 205,206,207,208 or 209 for NOAA-14,15,16,17, 18 and 19 respectively if(jsatid == 'n14')bufsat = 205 if(jsatid == 'n15')bufsat = 206 if(jsatid == 'n16')bufsat = 207 if(jsatid == 'n17')bufsat = 208 -! if(jsatid == 'n17')bufsat = 4 - if(jsatid == 'n17')bufsat = 208 if(jsatid == 'n18')bufsat = 209 if(jsatid == 'n19')bufsat = 223 if(jsatid == 'metop-a')bufsat = 4 @@ -231,16 +263,12 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& end do search if (.not.assim) val_avhrr=zero - call radthin_time_info(obstype, jsatid, sis, ptime, ithin_time) if( ptime > 0.0_r_kind) then n_tbin=nint(2*time_window_max/ptime) else n_tbin=1 endif -! Make thinning grids - call makegrids(rmesh,ithin,n_tbin=n_tbin) - ! Read hi-res sst analysis if (retrieval) then @@ -249,133 +277,140 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& sst_an,rlats_sst,rlons_sst,nlat_sst,nlon_sst) endif - - ! Allocate arrays to hold all data for given satellite if(dval_use) maxinfo = maxinfo + 2 nreal = maxinfo + nstinfo nele = nreal + nchanl - allocate(data_all(nele,itxmax),nrec(itxmax)) - - open(lnbufr,file=trim(infile),form='unformatted') ! open bufr data file - -! Associate the tables file with the message file, and identify the -! latter to BUFRLIB software - call openbf (lnbufr,'IN',lnbufr) - - next=0 - nrec=999999 - irec=0 -! Read BUFR AVHRR GAC 1b data - read_msg: do while (ireadmg(lnbufr,subset,idate) >= 0) - irec=irec+1 - if(irec < nrec_start) cycle read_msg - next=next+1 - if(next == npe_sub)next=0 - if(next /= mype_sub)cycle - read_loop: do while (ireadsb(lnbufr) == 0) - call ufbint(lnbufr,hdr,13,1,iret,headr) - call ufbrep(lnbufr,bufrf, 3,5,iret,'INCN ALBD TMBR') - if(iret <= 0) cycle read_loop - ksatid = nint(hdr(9)) ! Extract satellite id from bufr file - if(ksatid /= bufsat) cycle read_loop ! If this sat is not the one we want, read next record - if (hdr(10) <= real(cut_spot) .or. hdr(10) > real(ngac-cut_spot)) cycle read_loop! drop starting and ending pixels -! if (hdr(13) /= zero ) cycle read_loop ! drop pixel with CLAVR partly cloud flag - - iskip = 0 - do k=1,nchanl - if(bufrf(3,ich_offset+k) < zero .or. bufrf(3,ich_offset+k) > tbmax) then - iskip=iskip+1 -! else -! nread=nread+1 - end if - end do - if(iskip >= nchanl)cycle read_loop - -! Extract date information. If time outside window, skip this obs - idate5(1) = nint(hdr(1)) !year - idate5(2) = nint(hdr(2)) !month - idate5(3) = nint(hdr(3)) !day - idate5(4) = nint(hdr(4)) !hour - idate5(5) = nint(hdr(5)) !minute - rsc = hdr(6) !second in real - call w3fs21(idate5,nmind) - t4dv=(real((nmind-iwinbgn),r_kind) + rsc*r60inv)*r60inv - sstime=real(nmind,r_kind) + rsc*r60inv - tdiff=(sstime-gstime)*r60inv - - if (l4dvar.or.l4densvar) then - if (t4dvwinlen) cycle read_loop - else - if (abs(tdiff) > twind) cycle read_loop - endif - -! Convert obs location to radians - if (abs(hdr(7))>90.0_r_double .or. abs(hdr(8))>r360) cycle read_loop - if (hdr(8)==r360) hdr(8)=hdr(8)-r360 - if (hdr(8)< zero) hdr(8)=hdr(8)+r360 - - dlon_earth_deg = hdr(8) - dlat_earth_deg = hdr(7) - - dlon_earth = hdr(8)*deg2rad !convert degrees to radians - dlat_earth = hdr(7)*deg2rad - -! Regional case - if(regional)then - call tll2xy(dlon_earth,dlat_earth,dlon,dlat,outside) - if(diagnostic_reg) then - call txy2ll(dlon,dlat,dlon00,dlat00) - ntest=ntest+1 - cdist=sin(dlat_earth)*sin(dlat00)+cos(dlat_earth)*cos(dlat00)* & - (sin(dlon_earth)*sin(dlon00)+cos(dlon_earth)*cos(dlon00)) - cdist=max(-one,min(cdist,one)) - disterr=acos(cdist)*rad2deg - disterrmax=max(disterrmax,disterr) - end if - if(outside) cycle read_loop - -! Global case - else - dlat = dlat_earth - dlon = dlon_earth - call grdcrd1(dlat,rlats,nlat,1) - call grdcrd1(dlon,rlons,nlon,1) - endif - - nread = nread + 1 - - crit0 = 0.01_r_kind - timeinflat=6.0_r_kind - call tdiff2crit(tdiff,ptime,ithin_time,timeinflat,crit0,crit1,it_mesh) - call map2tgrid(dlat_earth,dlon_earth,dist1,crit1,itx,ithin,itt,iuse,sis,it_mesh=it_mesh) - if(.not. iuse)cycle read_loop - -! Interpolate hi-res sst analysis to observation location - if (retrieval) then - dlat_sst = dlat_earth - dlon_sst = dlon_earth - call grdcrd1(dlat_sst,rlats_sst,nlat_sst,1) - call grdcrd1(dlon_sst,rlons_sst,nlon_sst,1) - - klon1=int(dlon_sst); klat1=int(dlat_sst) - dx =dlon_sst-klon1; dy =dlat_sst-klat1 - dx1 =one-dx; dy1 =one-dy - w00=dx1*dy1; w10=dx1*dy; w01=dx*dy1; w11=dx*dy - - klat1=min(max(1,klat1),nlat_sst); klon1=min(max(0,klon1),nlon_sst) - if(klon1==0) klon1=nlon_sst - klatp1=min(nlat_sst,klat1+1); klonp1=klon1+1 - if(klonp1==nlon_sst+1) klonp1=1 - - sst_hires=w00*sst_an(klat1,klon1 ) + w10*sst_an(klatp1,klon1 ) + & - w01*sst_an(klat1,klonp1) + w11*sst_an(klatp1,klonp1) - else - sst_hires = zero - end if -! if ( sst_hires < zero ) then -! print*,' sst_hires,klat1,klon1 : ',sst_hires,klat1,klon1 -! endif + + ndata = 0 + do imesh = 1, nmesh +! Make thinning grids, including determination of itxmax + call makegrids(amesh(imesh),ithin,n_tbin=n_tbin) + + allocate( data_mesh(nele,itxmax) ) + allocate( nrec(itxmax) ) + + if ( imesh == 1 ) then + allocate( data_all(nele,itxmax) ) + endif + + open(lnbufr,file=trim(infile),form='unformatted') ! open bufr data file + +! Associate the tables file with the message file, and identify the +! latter to BUFRLIB software + call openbf (lnbufr,'IN',lnbufr) + + next=0 + nrec=999999 + irec=0 +! Read BUFR AVHRR GAC 1b data + read_msg: do while (ireadmg(lnbufr,subset,idate) >= 0) + irec=irec+1 + if(irec < nrec_start) cycle read_msg + next=next+1 + if(next == npe_sub)next=0 + if(next /= mype_sub)cycle + read_loop: do while (ireadsb(lnbufr) == 0) + call ufbint(lnbufr,hdr,13,1,iret,headr) + call ufbrep(lnbufr,bufrf, 3,5,iret,'INCN ALBD TMBR') + if(iret <= 0) cycle read_loop + ksatid = nint(hdr(9)) ! Extract satellite id from bufr file + if(ksatid /= bufsat) cycle read_loop ! If this sat is not the one we want, read next record + if (hdr(10) <= real(cut_spot) .or. hdr(10) > real(ngac-cut_spot)) cycle read_loop! drop starting and ending pixels + if (hdr(13) /= zero ) cycle read_loop ! toss pixel with CLAVR partly cloud flag + + iskip = 0 + do k=1,nchanl + if(bufrf(3,ich_offset+k) < zero .or. bufrf(3,ich_offset+k) > tbmax) then + iskip=iskip+1 + end if + end do + if(iskip >= nchanl)cycle read_loop + +! Get lat/lon in degree + if (abs(hdr(7))>90.0_r_double .or. abs(hdr(8))>r360) cycle read_loop + + if (hdr(8)==r360) hdr(8)=hdr(8)-r360 + if (hdr(8)< zero) hdr(8)=hdr(8)+r360 + + dlon_earth_deg = hdr(8) + dlat_earth_deg = hdr(7) + +! Convert obs location to radians + dlon_earth = hdr(8)*deg2rad !convert degrees to radians + dlat_earth = hdr(7)*deg2rad + +! Regional case + if(regional)then + call tll2xy(dlon_earth,dlat_earth,dlon,dlat,outside) + if(diagnostic_reg) then + call txy2ll(dlon,dlat,dlon00,dlat00) + ntest=ntest+1 + cdist=sin(dlat_earth)*sin(dlat00)+cos(dlat_earth)*cos(dlat00)* & + (sin(dlon_earth)*sin(dlon00)+cos(dlon_earth)*cos(dlon00)) + cdist=max(-one,min(cdist,one)) + disterr=acos(cdist)*rad2deg + disterrmax=max(disterrmax,disterr) + end if + if(outside) cycle read_loop + +! Global casea: Get relative lat/lon in analysis grids + else + dlat = dlat_earth + dlon = dlon_earth + call grdcrd1(dlat,rlats,nlat,1) + call grdcrd1(dlon,rlons,nlon,1) + endif + +! Interpolate hsst(nlat,nlon) to obs.location + if ( rmesh == 888.0_r_kind ) then + klon1=int(dlon); klat1=int(dlat) + dx =dlon-klon1; dy =dlat-klat1 + dx1 =one-dx; dy1 =one-dy + w00=dx1*dy1; w10=dx1*dy; w01=dx*dy1; w11=dx*dy + + klat1=min(max(1,klat1),nlat); klon1=min(max(0,klon1),nlon) + if(klon1==0) klon1=nlon + klatp1=min(nlat,klat1+1); klonp1=klon1+1 + if(klonp1==nlon+1) klonp1=1 + + hsst_xy=w00*hsst(klat1,klon1 ) + w10*hsst(klatp1,klon1 ) + & + w01*hsst(klat1,klonp1) + w11*hsst(klatp1,klonp1) +! +! Only process the obs. at the location where hsst is in the current processed range +! + if ( hsst_xy < hsst_thd(imesh-1) .or. hsst_xy >= hsst_thd(imesh) ) cycle read_loop + + endif + +! Extract date information. If time outside window, skip this obs + idate5(1) = nint(hdr(1)) !year + idate5(2) = nint(hdr(2)) !month + idate5(3) = nint(hdr(3)) !day + idate5(4) = nint(hdr(4)) !hour + idate5(5) = nint(hdr(5)) !minute + rsc = hdr(6) !second in real + call w3fs21(idate5,nmind) + t4dv=(real((nmind-iwinbgn),r_kind) + rsc*r60inv)*r60inv + sstime=real(nmind,r_kind) + rsc*r60inv + tdiff=(sstime-gstime)*r60inv + + if (l4dvar.or.l4densvar) then + if (t4dvwinlen) cycle read_loop + else + if (abs(tdiff) > twind) cycle read_loop + endif + + nread = nread + 1 +! +! map observations to the thinning grid +! + crit0 = 0.01_r_kind + timeinflat=6.0_r_kind + call tdiff2crit(tdiff,ptime,ithin_time,timeinflat,crit0,crit1,it_mesh) + call map2tgrid(dlat_earth,dlon_earth,dist1,crit1,itx,ithin,itt,iuse,sis,it_mesh=it_mesh) + + if(.not. iuse)cycle read_loop ! "Score" observation. We use this information to id "best" obs. @@ -389,184 +424,194 @@ subroutine read_avhrr(mype,val_avhrr,ithin,rmesh,jsatid,& ! 3 snow ! 4 mixed + call deter_sfc(dlat,dlon,dlat_earth,dlon_earth,t4dv,isflg,idomsfc,sfcpct, & + ts,tsavg,vty,vfr,sty,stp,sm,sn,zz,ff10,sfcr) +! if(isflg /= zero) cycle read_loop + if(sfcpct(0) < 0.15_r_kind) cycle read_loop - call deter_sfc(dlat,dlon,dlat_earth,dlon_earth,t4dv,isflg,idomsfc,sfcpct, & - ts,tsavg,vty,vfr,sty,stp,sm,sn,zz,ff10,sfcr) - if(isflg /= zero) cycle read_loop - - call checkob(dist1,crit1,itx,iuse) - if(.not. iuse)cycle read_loop - + call checkob(dist1,crit1,itx,iuse) + if(.not. iuse)cycle read_loop ! ! Get scan position (1 - 90) based on (409 - 2*cut_spot - 1) = 386 here, GAC pixels ! avhrr gac scan has 409 positions. we drop tails: 1- 11 & 399- 409 [the two ends] ! here we linearly map pixels: 12- 398 to 1 - 90 scan positions - if ( mod(hdr(10)-cut_spot,dfov) < half*dfov ) then - scan_pos = real(nint((hdr(10)-cut_spot)/dfov) + 1) - else - scan_pos = real(nint((hdr(10)-cut_spot)/dfov)) - endif - - if ( scan_pos > nfov ) scan_pos = nfov - - ifov = nint(scan_pos) - scan_angle = (scan_start+real(ifov-1)*scan_inc)*deg2rad - -! Set common predictor parameters - -! Compute "score" for observation. All scores>=0.0. Lowest score is "best" - -! if (newpc4pred) then -! ch_win = bufrf(3,2+ich_win) -ang_rad(ich_win)*cbias(ifov,ich_win)- & -! predx(1,ich_win)*air_rad(ich_win) -! else -! ch_win = bufrf(3,2+ich_win) -ang_rad(ich_win)*cbias(ifov,ich_win)- & -! r01*predx(1,ich_win)*air_rad(ich_win) -! end if -! ch_win_flg = tsavg-ch_win -! pred = 10.0_r_kind*max(zero,ch_win_flg) - -! above commented calculation of pred uses tsavg (from bkg). There is no reason why -! 1. we should use bkg to SCORE an ob., 2. even if we do use bkg based tsavg, -! tsavg-ch_win could be misleading, if there are low clouds. -! instead we will TRY following simpler approach- so that ob with colder Tb gets a high score. - pred = (600.0_r_kind - bufrf(3,ich4)) * r01 - - crit1=crit1+rlndsea(isflg) - crit1 = crit1+pred - call finalcheck(dist1,crit1,itx,iuse) - - if(.not. iuse)cycle read_loop - - if (retrieval) then -! Interpolate hi-res sst analysis to observation location - dlat_sst = dlat_earth - dlon_sst = dlon_earth - call grdcrd1(dlat_sst,rlats_sst,nlat_sst,1) - call grdcrd1(dlon_sst,rlons_sst,nlon_sst,1) - - klon1=int(dlon_sst); klat1=int(dlat_sst) - dx =dlon_sst-klon1; dy =dlat_sst-klat1 - dx1 =one-dx; dy1 =one-dy - w00=dx1*dy1; w10=dx1*dy; w01=dx*dy1; w11=dx*dy - - klat1=min(max(1,klat1),nlat_sst); klon1=min(max(0,klon1),nlon_sst) - if(klon1==0) klon1=nlon_sst - klatp1=min(nlat_sst,klat1+1); klonp1=klon1+1 - if(klonp1==nlon_sst+1) klonp1=1 - - sst_hires=w00*sst_an(klat1,klon1 ) + w10*sst_an(klatp1,klon1 ) + & - w01*sst_an(klat1,klonp1) + w11*sst_an(klatp1,klonp1) - -! if ( sst_hires < zero ) then -! print*,' sst_hires,klat1,klon1 : ',sst_hires,klat1,klon1 -! endif - - endif ! if (retrieval) then + if ( mod(hdr(10)-cut_spot,dfov) < half*dfov ) then + scan_pos = real(nint((hdr(10)-cut_spot)/dfov) + 1) + else + scan_pos = real(nint((hdr(10)-cut_spot)/dfov)) + endif + + if ( scan_pos > nfov ) scan_pos = nfov + + ifov = nint(scan_pos) + scan_angle = (scan_start+real(ifov-1)*scan_inc)*deg2rad + +! Set common predictor parameters + +! Compute "score" for observation. All scores>=0.0. Lowest score is "best" + +! if (newpc4pred) then +! ch_win = bufrf(3,2+ich_win) -ang_rad(ich_win)*cbias(ifov,ich_win)- & +! predx(1,ich_win)*air_rad(ich_win) +! else +! ch_win = bufrf(3,2+ich_win) -ang_rad(ich_win)*cbias(ifov,ich_win)- & +! r01*predx(1,ich_win)*air_rad(ich_win) +! end if +! ch_win_flg = tsavg-ch_win +! pred = 10.0_r_kind*max(zero,ch_win_flg) + +! above commented calculation of pred uses tsavg (from bkg). There is no reason why +! 1. we should use bkg to SCORE an ob., 2. even if we do use bkg based tsavg, +! tsavg-ch_win could be misleading, if there are low clouds. +! instead we will TRY following simpler approach- so that ob with colder Tb gets a high score. + pred = (600.0_r_kind - bufrf(3,ich4)) * r01 + + crit1=crit1+rlndsea(isflg) + crit1 = crit1+pred + call finalcheck(dist1,crit1,itx,iuse) + + if(.not. iuse)cycle read_loop + + if (retrieval) then +! Interpolate hi-res sst analysis to observation location + dlat_sst = dlat_earth + dlon_sst = dlon_earth + call grdcrd1(dlat_sst,rlats_sst,nlat_sst,1) + call grdcrd1(dlon_sst,rlons_sst,nlon_sst,1) + + klon1=int(dlon_sst); klat1=int(dlat_sst) + dx =dlon_sst-klon1; dy =dlat_sst-klat1 + dx1 =one-dx; dy1 =one-dy + w00=dx1*dy1; w10=dx1*dy; w01=dx*dy1; w11=dx*dy + + klat1=min(max(1,klat1),nlat_sst); klon1=min(max(0,klon1),nlon_sst) + if(klon1==0) klon1=nlon_sst + klatp1=min(nlat_sst,klat1+1); klonp1=klon1+1 + if(klonp1==nlon_sst+1) klonp1=1 + + sst_hires=w00*sst_an(klat1,klon1 ) + w10*sst_an(klatp1,klon1 ) + & + w01*sst_an(klat1,klonp1) + w11*sst_an(klatp1,klonp1) + else + sst_hires=zero + endif ! if (retrieval) then ! ! interpolate NSST variables to Obs. location and get dtw, dtc, tz_tr ! - if(nst_gsi>0) then - tref = ts(0) - dtw = zero - dtc = zero - tz_tr = one - if(sfcpct(0)>zero) then - call gsi_nstcoupler_deter(dlat_earth,dlon_earth,t4dv,zob,tref,dtw,dtc,tz_tr) + if(nst_gsi>0) then + tref = ts(0) + dtw = zero + dtc = zero + tz_tr = one + if(sfcpct(0)>zero) then + call gsi_nstcoupler_deter(dlat_earth,dlon_earth,t4dv,zob,tref,dtw,dtc,tz_tr) + endif endif - endif -! Transfer information to work array - data_all(1, itx) = hdr(9) ! satellite id (207 = NOAA-16, 208 = NOAA-17, 209 = NOAA-18) - data_all(2, itx) = t4dv ! time (hours) - data_all(3, itx) = dlon ! grid relative longitude - data_all(4, itx) = dlat ! grid relative latitude - data_all(5, itx) = hdr(11)*deg2rad ! satellite zenith angle (radians) - data_all(6, itx) = bmiss ! satellite azimuth angle - data_all(7, itx) = scan_angle ! scan angle - data_all(8, itx) = scan_pos ! scan position - data_all(9, itx) = hdr(12) ! solar zenith angle (radians) - data_all(10,itx) = bmiss ! solar azimuth angle (radians) - data_all(11,itx) = sfcpct(0) ! sea percentage of - data_all(12,itx) = sfcpct(1) ! land percentage - data_all(13,itx) = sfcpct(2) ! sea ice percentage - data_all(14,itx) = sfcpct(3) ! snow percentage - data_all(15,itx) = ts(0) ! ocean skin temperature (from surface file: sst_full) - data_all(16,itx) = ts(1) ! land skin temperature (from surface file: sst_full) - data_all(17,itx) = ts(2) ! ice skin temperature (from surface file: sst_full) - data_all(18,itx) = ts(3) ! snow skin temperature (from surface file: sst_full) - data_all(19,itx) = tsavg ! average skin temperature - data_all(20,itx) = vty ! vegetation type - data_all(21,itx) = vfr ! vegetation fraction - data_all(22,itx) = sty ! soil type - data_all(23,itx) = stp ! soil temperature - data_all(24,itx) = sm ! soil moisture - data_all(25,itx) = sn ! snow depth - data_all(26,itx) = zz ! surface height - data_all(27,itx) = idomsfc + 0.001_r_kind ! dominate surface type - data_all(28,itx) = sfcr ! surface roughness - data_all(29,itx) = ff10 ! ten meter wind factor - data_all(30,itx) = dlon_earth_deg ! earth relative longitude (degrees) - data_all(31,itx) = dlat_earth_deg ! earth relative latitude (degrees) - data_all(32,itx) = hdr(13) ! CLAVR Cloud flag (only 0 = clear and 1 = probably clear included the data set used now) - data_all(33,itx) = sst_hires ! interpolated hires SST (deg K) - if(dval_use)then - data_all(34,itx) = val_avhrr ! weighting factor applied to super obs - data_all(35,itx) = itt ! - end if - - if(nst_gsi>0) then - data_all(maxinfo+1,itx) = tref ! foundation temperature - data_all(maxinfo+2,itx) = dtw ! dt_warm at zob - data_all(maxinfo+3,itx) = dtc ! dt_cool at zob - data_all(maxinfo+4,itx) = tz_tr ! d(Tz)/d(Tr) - endif +! Transfer information to work array + data_mesh(1, itx) = hdr(9) ! satellite id (207 = NOAA-16, 208 = NOAA-17, 209 = NOAA-18) + data_mesh(2, itx) = t4dv ! time (hours) + data_mesh(3, itx) = dlon ! grid relative longitude + data_mesh(4, itx) = dlat ! grid relative latitude + data_mesh(5, itx) = hdr(11)*deg2rad ! satellite zenith angle (radians) + data_mesh(6, itx) = bmiss ! satellite azimuth angle + data_mesh(7, itx) = scan_angle ! scan angle + data_mesh(8, itx) = scan_pos ! scan position + data_mesh(9, itx) = hdr(12) ! solar zenith angle (radians) + data_mesh(10,itx) = bmiss ! solar azimuth angle (radians) + data_mesh(11,itx) = sfcpct(0) ! sea percentage of + data_mesh(12,itx) = sfcpct(1) ! land percentage + data_mesh(13,itx) = sfcpct(2) ! sea ice percentage + data_mesh(14,itx) = sfcpct(3) ! snow percentage + data_mesh(15,itx) = ts(0) ! ocean skin temperature (from surface file: sst_full) + data_mesh(16,itx) = ts(1) ! land skin temperature (from surface file: sst_full) + data_mesh(17,itx) = ts(2) ! ice skin temperature (from surface file: sst_full) + data_mesh(18,itx) = ts(3) ! snow skin temperature (from surface file: sst_full) + data_mesh(19,itx) = tsavg ! average skin temperature + data_mesh(20,itx) = vty ! vegetation type + data_mesh(21,itx) = vfr ! vegetation fraction + data_mesh(22,itx) = sty ! soil type + data_mesh(23,itx) = stp ! soil temperature + data_mesh(24,itx) = sm ! soil moisture + data_mesh(25,itx) = sn ! snow depth + data_mesh(26,itx) = zz ! surface height + data_mesh(27,itx) = idomsfc + 0.001_r_kind ! dominate surface type + data_mesh(28,itx) = sfcr ! surface roughness + data_mesh(29,itx) = ff10 ! ten meter wind factor + data_mesh(30,itx) = dlon_earth_deg ! earth relative longitude (degrees) + data_mesh(31,itx) = dlat_earth_deg ! earth relative latitude (degrees) + data_mesh(32,itx) = hdr(13) ! CLAVR Cloud flag (only 0 = clear and 1 = probably clear included the data set used now) + data_mesh(33,itx) = sst_hires ! interpolated hires SST (deg K) + if(dval_use)then + data_mesh(34,itx) = val_avhrr ! weighting factor applied to super obs + data_mesh(35,itx) = itt ! + end if - do k=1,nchanl - data_all(k+nreal,itx)= bufrf(3,ich_offset+k) ! Tb for avhrr ch-3, ch-4 and ch-5; ich_offset is set to 2. - end do - nrec(itx)=irec + if(nst_gsi>0) then + data_mesh(maxinfo+1,itx) = tref ! foundation temperature + data_mesh(maxinfo+2,itx) = dtw ! dt_warm at zob + data_mesh(maxinfo+3,itx) = dtc ! dt_cool at zob + data_mesh(maxinfo+4,itx) = tz_tr ! d(Tz)/d(Tr) + endif + + do k=1,nchanl + data_mesh(k+nreal,itx)= bufrf(3,ich_offset+k) ! Tb for avhrr ch-3, ch-4 and ch-5; ich_offset is set to 2. + end do + nrec(itx)=irec -! End of satellite read block +! End of satellite read block - enddo read_loop - enddo read_msg - call closbf(lnbufr) - close(lnbufr) + enddo read_loop + enddo read_msg + call closbf(lnbufr) - call combine_radobs(mype_sub,mype_root,npe_sub,mpi_comm_sub,& - nele,itxmax,nread,ndata,data_all,score_crit,nrec) + call combine_radobs(mype_sub,mype_root,npe_sub,mpi_comm_sub,& + nele,itxmax,nread,ndata_mesh,data_mesh,score_crit,nrec) + + if ( nread > 0 ) then + write(*,'(a,a10,I3,F6.1,3I10)') 'read_avhrr,satid,imesh,amesh,itxmax,nread,ndata_mesh : ',jsatid,imesh,amesh(imesh),itxmax,nread,ndata_mesh + endif +! +! get data_all by combining data from all thinning box sizes +! + do n = 1, ndata_mesh + ndata = ndata + 1 + do iele = 1, nele + data_all(iele,ndata) = data_mesh(iele,n) + enddo + enddo + +! Deallocate arrays + call destroygrids + deallocate(data_mesh,nrec) + + enddo ! do imesh = 1, nmesh ! Allow single task to check for bad obs, update superobs sum, ! and write out data to scratch file for further processing. if (mype_sub==mype_root.and.ndata>0) then - do n=1,ndata - do k=1,nchanl - if(data_all(k+nreal,n) > tbmin .and. & - data_all(k+nreal,n) < tbmax) nodata=nodata+1 - end do - end do - if(dval_use .and. assim)then - do n=1,ndata - itt=nint(data_all(35,n)) - super_val(itt)=super_val(itt)+val_avhrr - end do - end if + do n=1,ndata + do k=1,nchanl + if(data_all(k+nreal,n) > tbmin .and. & + data_all(k+nreal,n) < tbmax) nodata=nodata+1 + end do + end do + if(dval_use .and. assim)then + do n=1,ndata + itt=nint(data_all(35,n)) + super_val(itt)=super_val(itt)+val_avhrr + end do + end if -! Write retained data to local file - call count_obs(ndata,nele,ilat,ilon,data_all,nobs) - write(lunout) obstype,sis,nreal,nchanl,ilat,ilon - write(lunout) ((data_all(k,n),k=1,nele),n=1,ndata) +! Write retained data to local file + call count_obs(ndata,nele,ilat,ilon,data_all,nobs) + write(lunout) obstype,sis,nreal,nchanl,ilat,ilon + write(lunout) ((data_all(k,n),k=1,nele),n=1,ndata) endif -! write(6,*) 'READ_AVHRR: mype, total number of obs info, nread,ndata : ',mype, nread,ndata ! Deallocate local arrays - deallocate(data_all,nrec) + deallocate(data_all) if(retrieval) deallocate(sst_an) -! Deallocate arrays - call destroygrids - if(diagnostic_reg.and.ntest>0 .and. mype_sub==mype_root) & write(6,*)'READ_AVHRR: ',& 'mype,ntest,disterrmax=',mype,ntest,disterrmax diff --git a/src/gsi/read_obs.F90 b/src/gsi/read_obs.F90 index 3ec98ce93a..b08ea7f094 100644 --- a/src/gsi/read_obs.F90 +++ b/src/gsi/read_obs.F90 @@ -140,6 +140,7 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) ! 2019-09-20 X.Su -add read new variational qc table ! 2019-08-21 H. Shao - add METOPC-C, COSMIC-2 and PAZ to the GPS check list ! 2020-05-21 H. Shao - add commercial GNSSRO (Spire, PlanetIQ, GeoOptics) and other existing missions to the check list +! 2021-02-20 X.Li - add viirs-m and get_hsst ! ! input argument list: ! lexist - file status @@ -718,6 +719,7 @@ subroutine read_obs(ndata,mype) use qcmod, only: njqc,vadwnd_l2rw_qc,nvqc use gsi_4dvar, only: l4dvar use satthin, only: super_val,super_val1,superp,makegvals,getsfc,destroy_sfc + use satthin, only: get_hsst use mpimod, only: ierror,mpi_comm_world,mpi_sum,mpi_max,mpi_rtype,mpi_integer,npe,& setcomm use constants, only: one,zero,izero @@ -753,6 +755,7 @@ subroutine read_obs(ndata,mype) use mrmsmod,only: l_mrms_sparse_netcdf use directDA_radaruse_mod, only: l_use_dbz_directDA + use gridmod, only: regional implicit none @@ -915,7 +918,7 @@ subroutine read_obs(ndata,mype) amsre .or. ssmis .or. obstype == 'ssmi' .or. & obstype == 'ssu' .or. obstype == 'atms' .or. & obstype == 'cris' .or. obstype == 'cris-fsr' .or. & - obstype == 'amsr2' .or. & + obstype == 'amsr2' .or. obstype == 'viirs-m' .or. & obstype == 'gmi' .or. obstype == 'saphir' ) then ditype(i) = 'rad' else if (is_extOzone(dfile(i),obstype,dplat(i))) then @@ -1019,6 +1022,8 @@ subroutine read_obs(ndata,mype) parallel_read(i)= .true. else if(avhrr)then parallel_read(i)= .true. + else if(obstype == 'viirs-m' )then + parallel_read(i)= .true. else if(amsre)then parallel_read(i)= .true. else if(obstype == 'goes_img' )then @@ -1305,6 +1310,8 @@ subroutine read_obs(ndata,mype) ! Create full horizontal surface fields from local fields in guess_grids call getsfc(mype,mype_io_sfc,use_sfc,use_sfc_any) + if ( .not. regional ) call get_hsst(mype_io_sfc) + if(mype == mype_io) call prt_guessfc2('sfcges2',use_sfc) @@ -1823,6 +1830,13 @@ subroutine read_obs(ndata,mype) mype_root,mype_sub(mm1,i),npe_sub(i),mpi_comm_sub(i), & nobs_sub1(1,i),read_rec(i),dval_use) string='READ_AVHRR' + ! Process SST VIIRS RADIANCE data + else if(obstype == 'viirs-m') then + call read_sst_viirs(mype,val_dat,ithin,rmesh,platid,gstime,& + infile,lunout,obstype,nread,npuse,nouse,twind,sis, & + mype_root,mype_sub(mm1,i),npe_sub(i),mpi_comm_sub(i), & + nobs_sub1(1,i),read_rec(i),dval_use) + string='READ_VIIRS' end if rad_obstype_select ! Process ozone data diff --git a/src/gsi/read_viirs.f90 b/src/gsi/read_viirs.f90 new file mode 100644 index 0000000000..6ffb351825 --- /dev/null +++ b/src/gsi/read_viirs.f90 @@ -0,0 +1,527 @@ +subroutine read_sst_viirs(mype,val_viirs,ithin,rmesh,jsatid,& + gstime,infile,lunout,obstype,nread,ndata,nodata,twind,sis, & + mype_root,mype_sub,npe_sub,mpi_comm_sub,nobs, & + nrec_start,dval_use) +!$$$ subprogram documentation block +! . . . . +! subprogram: read_sst_viirs, read M-Band (12, 15 and 16) VIIRS radiance data from the SST VIIRS data file +! +! prgmmr: li, xu org: np23 date: 2019-08-29 +! +! abstract: This routine reads BUFR format VIIRS 1b radiance (brightness +! temperature) from the SST VIIRS files +! +! When running the gsi in regional mode, the code only +! retains those observations that fall within the regional +! domain +! +! program history log: +! +! input argument list: +! mype - mpi task id +! val_viirs- weighting factor applied to super obs +! ithin - flag to thin data +! rmesh - thinning mesh size (km) +! jsatid - satellite to read +! gstime - analysis time in minutes from reference date +! infile - unit from which to read BUFR data +! lunout - unit to which to write data for further processing +! obstype - observation type to process +! twind - input group time window (hours) +! sis - satellite/instrument/sensor indicator +! nrec_start - first subset with useful information +! +! output argument list: +! nread - number of BUFR VIIRS observations read +! ndata - number of BUFR VIIRS profiles retained for further processing +! nodata - number of BUFR VIIRS observations retained for further processing +! nobs - array of observations on each subdomain for each processor +! +! attributes: +! language: f90 +! machine: ibm RS/6000 SP +! +!$$$ + use kinds, only: r_kind,r_single,r_double,i_kind + use satthin, only: super_val,itxmax,makegrids,map2tgrid,destroygrids, & + checkob, finalcheck,score_crit + use satthin, only: radthin_time_info,tdiff2crit + use obsmod, only: time_window_max,ianldate + use satthin, only: hsst + use gridmod, only: diagnostic_reg,regional,nlat,nlon,tll2xy,txy2ll,rlats,rlons + use constants, only: deg2rad, zero, one, two, half, rad2deg, r60inv + use radinfo, only: iuse_rad,jpch_rad,nusis + use gsi_4dvar, only: l4dvar,l4densvar,iwinbgn,winlen + use deter_sfc_mod, only: deter_sfc + use obsmod, only: bmiss + use gsi_nstcouplermod, only: nst_gsi,nstinfo + use gsi_nstcouplermod, only: gsi_nstcoupler_skindepth, gsi_nstcoupler_deter + use sfcobsqc, only: get_sunangle + use mpimod, only: npe + implicit none + + +! Declare passed variables + character(len=*), intent(in ) :: infile,obstype,jsatid + character(len=20), intent(in ) :: sis + integer(i_kind), intent(in ) :: mype,lunout,ithin,nrec_start + integer(i_kind), intent(inout) :: nread + integer(i_kind), dimension(npe), intent(inout) :: nobs + integer(i_kind), intent(inout) :: ndata,nodata + real(r_kind), intent(in ) :: rmesh,gstime,twind + real(r_kind), intent(inout) :: val_viirs + integer(i_kind), intent(in ) :: mype_root + integer(i_kind), intent(in ) :: mype_sub + integer(i_kind), intent(in ) :: npe_sub + integer(i_kind), intent(in ) :: mpi_comm_sub + logical, intent(in ) :: dval_use + +! Declare local parameters + real(r_kind),parameter:: r6=6.0_r_kind + real(r_kind),parameter:: scan_start=-56.28_r_kind, scan_inc=1.26472_r_kind + real(r_double),parameter:: r360=360.0_r_double + real(r_kind),parameter:: tbmin=50.0_r_kind + real(r_kind),parameter:: tbmax=550.0_r_kind + + real(r_kind),parameter :: r_earth=6370.0_r_kind, sat_hgt=829.0_r_kind + real(r_kind),parameter :: nviirs=6304.0_r_kind,nfov=90.0_r_kind + character(len=80),parameter :: & + headr='YEAR MNTH DAYS HOUR MINU SECO CLATH CLONH SAID SAZA' + +! Declare local variables + logical outside,iuse,assim + character(len=8) :: subset + integer(i_kind) :: nmesh + + integer(i_kind) klon1,klatp1,klonp1,klat1 + integer(i_kind) nchanl,iret,ich_m15 + integer(i_kind) idate,maxinfo + integer(i_kind) ilat,ilon + integer(i_kind),dimension(5):: idate5 + integer(i_kind) nmind,isflg,idomsfc + integer(i_kind) itx,k,i,bufsat,n + integer(i_kind) nreal,nele,itt + integer(i_kind) ksatid + + real(r_kind) dlon,dlat,rsc + real(r_kind) dlon_earth,dlat_earth,sfcr + real(r_kind) dlon_earth_deg,dlat_earth_deg + real(r_kind) w00,w01,w10,w11,dx1,dy1 + real(r_kind) pred,crit1,tdiff,sstime,dx,dy,dist1 + real(r_kind) t4dv + + real(r_kind),dimension(0:4):: rlndsea + real(r_kind),dimension(0:3):: sfcpct + real(r_kind),dimension(0:3):: ts + real(r_kind),allocatable,dimension(:,:):: data_mesh + real(r_kind),allocatable,dimension(:,:):: data_all + real(r_kind) :: tsavg,vty,vfr,sty,stp,sm,sn,zz,ff10 + real(r_kind) :: zob,tref,dtw,dtc,tz_tr + real(r_kind) :: scan_ang,sat_zen,dfov,r01 + real(r_single) :: sol_zen + integer(i_kind) :: scan_pos + + real(r_double), dimension(10) :: hdr + real(r_double), dimension(2,3) :: bufrf + integer(i_kind) lnbufr,ireadsb,ireadmg,iskip,irec,next + integer(i_kind),allocatable,dimension(:)::nrec + real(r_kind), allocatable, dimension(:) :: amesh + real(r_kind), allocatable, dimension(:) :: hsst_thd + + real(r_kind) cdist,disterr,disterrmax,dlon00,dlat00,hsst_xy,dmsh + integer(i_kind) ntest + integer(i_kind) :: imesh,ndata_mesh,iele + real(r_kind) :: ptime,timeinflat,crit0 + integer(i_kind) :: ithin_time,n_tbin,it_mesh + +!************************************************************************** + +! Start routine here. Set constants. Initialize variables + maxinfo = 31 + lnbufr = 10 + disterrmax=zero + ntest=0 + ndata = 0 + nodata = 0 + nread = 0 + nchanl = 5 + ich_m15 = 2 + r01 = 0.01_r_kind + + if ( rmesh == 888 ) then + nmesh = 6 + allocate(amesh(nmesh),hsst_thd(0:nmesh)) +! +! assign thinning box sizes related berror correlation length thresholds +! + amesh(1) = max(two,minval(hsst)) + amesh(nmesh) = min(100.0_r_kind,maxval(hsst)) + dmsh = (amesh(nmesh) - amesh(1))/real(nmesh-1) + do imesh = 2, nmesh - 1 + amesh(imesh) = amesh(imesh-1) + dmsh + enddo + + hsst_thd(0) = max(two,half*amesh(1)) + hsst_thd(nmesh) = 2000.0_r_kind + do imesh = 1, nmesh - 1 + hsst_thd(imesh) = amesh(imesh) + half*dmsh + enddo + + else + nmesh = 1 + allocate(amesh(nmesh),hsst_thd(0:nmesh)) + amesh(nmesh) = rmesh + hsst_thd(0) = 2.0_r_kind + hsst_thd(1) = 2000.0_r_kind + endif + + dfov = (nviirs - one)/nfov + + ilon=3 + ilat=4 + + if(nst_gsi>0) then + call gsi_nstcoupler_skindepth(obstype, zob) ! get penetration depth (zob) for the obstype + endif + + rlndsea(0) = zero + rlndsea(1) = 30._r_kind + rlndsea(2) = 20._r_kind + rlndsea(3) = 30._r_kind + rlndsea(4) = 30._r_kind + + if (jsatid == 'npp') then + bufsat = 224 + elseif (jsatid == 'j1') then + bufsat = 225 + elseif (jsatid == 'n21') then + bufsat = 226 + else + write(*,*) 'READ_SST_VIIRS: Unrecognized value for jsatid '//jsatid//':RETURNING' + return + end if + +! If all channels of a given sensor are set to monitor or not +! assimilate mode (iuse_rad<1), reset relative weight to zero. +! We do not want such observations affecting the relative +! weighting between observations within a given thinning group. + + assim=.false. + search: do i=1,jpch_rad + if ((nusis(i)==sis) .and. (iuse_rad(i)>0)) then + assim=.true. + exit search + endif + end do search + if (.not.assim) val_viirs=zero + + call radthin_time_info(obstype, jsatid, sis, ptime, ithin_time) + if( ptime > 0.0_r_kind) then + n_tbin=nint(two*time_window_max/ptime) + else + n_tbin=1 + endif + +! Allocate arrays to hold all data for given satellite + if(dval_use) maxinfo = maxinfo + 2 + nreal = maxinfo + nstinfo + nele = nreal + nchanl + + ndata = 0 + do imesh = 1, nmesh +! Make thinning grids, including determination of itxmax + call makegrids(amesh(imesh),ithin) + + allocate( data_mesh(nele,itxmax) ) + allocate( nrec(itxmax) ) + + if ( imesh == 1 ) then + allocate( data_all(nele,itxmax) ) + endif + + open(lnbufr,file=trim(infile),form='unformatted') ! open bufr data file + +! Associate the tables file with the message file, and identify the +! latter to BUFRLIB software + call openbf (lnbufr,'IN',lnbufr) + + next=0 + nrec=999999 + irec=0 +! Read BUFR VIIRS 1b data + read_msg: do while (ireadmg(lnbufr,subset,idate) >= 0) + + irec=irec+1 + if(irec < nrec_start) cycle read_msg + next=next+1 + if(next == npe_sub)next=0 + if(next /= mype_sub)cycle + read_loop: do while (ireadsb(lnbufr) == 0) + call ufbint(lnbufr,hdr,10,1,iret,headr) + call ufbrep(lnbufr,bufrf,2,3,iret,'CHNM TMBR') + if(iret <= 0) cycle read_loop + ksatid = nint(hdr(9)) ! Extract satellite id from bufr file + if(ksatid /= bufsat) cycle read_loop ! If this sat is not the one we want, read next record + + iskip = 0 + do k=1,nchanl-2 + if(bufrf(2,k) < zero .or. bufrf(2,k) > tbmax) then + iskip=iskip+1 + end if + end do + if(iskip >= nchanl)cycle read_loop + +! Convert obs location to radians + if (abs(hdr(7))>90.0_r_double .or. abs(hdr(8))>r360) cycle read_loop + if (hdr(8)==r360) hdr(8)=hdr(8)-r360 + if (hdr(8)< zero) hdr(8)=hdr(8)+r360 + + dlon_earth_deg = hdr(8) + dlat_earth_deg = hdr(7) + + dlon_earth = hdr(8)*deg2rad !convert degrees to radians + dlat_earth = hdr(7)*deg2rad + sat_zen = hdr(10) +! Regional case + if(regional)then + call tll2xy(dlon_earth,dlat_earth,dlon,dlat,outside) + if(diagnostic_reg) then + call txy2ll(dlon,dlat,dlon00,dlat00) + ntest=ntest+1 + cdist=sin(dlat_earth)*sin(dlat00)+cos(dlat_earth)*cos(dlat00)* & + (sin(dlon_earth)*sin(dlon00)+cos(dlon_earth)*cos(dlon00)) + cdist=max(-one,min(cdist,one)) + disterr=acos(cdist)*rad2deg + disterrmax=max(disterrmax,disterr) + end if + if(outside) cycle read_loop + +! Global case + else + dlat = dlat_earth + dlon = dlon_earth + call grdcrd1(dlat,rlats,nlat,1) + call grdcrd1(dlon,rlons,nlon,1) + endif + +! Interpolate hsst(nlat,nlon) to obs.location + klon1=int(dlon); klat1=int(dlat) + dx =dlon-klon1; dy =dlat-klat1 + dx1 =one-dx; dy1 =one-dy + w00=dx1*dy1; w10=dx1*dy; w01=dx*dy1; w11=dx*dy + + klat1=min(max(1,klat1),nlat); klon1=min(max(0,klon1),nlon) + if(klon1==0) klon1=nlon + klatp1=min(nlat,klat1+1); klonp1=klon1+1 + if(klonp1==nlon+1) klonp1=1 + + hsst_xy=w00*hsst(klat1,klon1 ) + w10*hsst(klatp1,klon1 ) + & + w01*hsst(klat1,klonp1) + w11*hsst(klatp1,klonp1) +! +! Only process the obs. at the location where hsst is in the current +! processed range +! + if ( hsst_xy < hsst_thd(imesh-1) .or. hsst_xy >= hsst_thd(imesh) ) cycle read_loop + +! Extract date information. If time outside window, skip this obs + idate5(1) = nint(hdr(1)) !year + idate5(2) = nint(hdr(2)) !month + idate5(3) = nint(hdr(3)) !day + idate5(4) = nint(hdr(4)) !hour + idate5(5) = nint(hdr(5)) !minute + rsc = hdr(6) !second in real + call w3fs21(idate5,nmind) + t4dv=(real((nmind-iwinbgn),r_kind) + rsc*r60inv)*r60inv + sstime=real(nmind,r_kind) + rsc*r60inv + tdiff=(sstime-gstime)*r60inv + + if (l4dvar.or.l4densvar) then + if (t4dvwinlen) cycle read_loop + else + if (abs(tdiff) > twind) cycle read_loop + endif + + nread = nread + 1 +! +! map observations to the thinning grid +! + crit0 = 0.01_r_kind + timeinflat=6.0_r_kind + call tdiff2crit(tdiff,ptime,ithin_time,timeinflat,crit0,crit1,it_mesh) + call map2tgrid(dlat_earth,dlon_earth,dist1,crit1,itx,ithin,itt,iuse,sis,it_mesh=it_mesh) + + if(.not. iuse)cycle read_loop + +! "Score" observation. We use this information to id "best" obs. + +! Locate the observation on the analysis grid. Get sst and land/sea/ice +! mask. + +! isflg - surface flag +! 0 sea +! 1 land +! 2 sea ice +! 3 snow +! 4 mixed + + + call deter_sfc(dlat,dlon,dlat_earth,dlon_earth,t4dv,isflg,idomsfc,sfcpct, & + ts,tsavg,vty,vfr,sty,stp,sm,sn,zz,ff10,sfcr) + if(sfcpct(0) < 0.15_r_kind) cycle read_loop + + call checkob(dist1,crit1,itx,iuse) + if(.not. iuse)cycle read_loop + + +! Set common predictor parameters + +! Compute "score" for observation. All scores>=0.0. Lowest score is "best" + + pred = (600.0_r_kind - bufrf(2,ich_m15)) * r01 + + crit1=crit1+rlndsea(isflg) + crit1 = crit1+pred + call finalcheck(dist1,crit1,itx,iuse) + + if(.not. iuse)cycle read_loop +! +! calculate scan angle +! + scan_ang = asin(r_earth/(r_earth+sat_hgt)*sin(sat_zen*deg2rad))/deg2rad +! +! get scan position (1 to 90) +! + scan_pos = 1+(scan_ang-scan_start)/scan_inc + if ( scan_pos > nfov ) scan_pos = nfov +! +! calculate solar zenith angle +! + call get_sunangle(ianldate,t4dv,dlon_earth,dlat_earth,sol_zen) +! +! interpolate NSST variables to Obs. location and get dtw, dtc, tz_tr +! + if(nst_gsi>0) then + tref = ts(0) + dtw = zero + dtc = zero + tz_tr = one + if(sfcpct(0)>zero) then + call gsi_nstcoupler_deter(dlat_earth,dlon_earth,t4dv,zob,tref,dtw,dtc,tz_tr) + endif + endif + +! Transfer information to work array + data_mesh(1, itx) = hdr(9) ! satellite id + data_mesh(2, itx) = t4dv ! time (hours) + data_mesh(3, itx) = dlon ! grid relative longitude + data_mesh(4, itx) = dlat ! grid relative latitude + data_mesh(5, itx) = sat_zen*deg2rad ! satellite zenith angle (radians) + data_mesh(6, itx) = bmiss ! satellite azimuth angle (degree) + data_mesh(7, itx) = scan_ang*deg2rad ! scan angle (radians) + data_mesh(8, itx) = real(scan_pos) ! scan position + data_mesh(9, itx) = 90.0_r_kind-sol_zen ! solar zenith angle (degree) + data_mesh(10,itx) = bmiss ! solar azimuth angle (degree) + data_mesh(11,itx) = sfcpct(0) ! sea percentage of + data_mesh(12,itx) = sfcpct(1) ! land percentage + data_mesh(13,itx) = sfcpct(2) ! sea ice percentage + data_mesh(14,itx) = sfcpct(3) ! snow percentage + data_mesh(15,itx) = ts(0) ! ocean skin temperature (from surface file: sst_full) + data_mesh(16,itx) = ts(1) ! land skin temperature (from surface file: sst_full) + data_mesh(17,itx) = ts(2) ! ice skin temperature (from surface file: sst_full) + data_mesh(18,itx) = ts(3) ! snow skin temperature (from surface file: sst_full) + data_mesh(19,itx) = tsavg ! average skin temperature + data_mesh(20,itx) = vty ! vegetation type + data_mesh(21,itx) = vfr ! vegetation fraction + data_mesh(22,itx) = sty ! soil type + data_mesh(23,itx) = stp ! soil temperature + data_mesh(24,itx) = sm ! soil moisture + data_mesh(25,itx) = sn ! snow depth + data_mesh(26,itx) = zz ! surface height + data_mesh(27,itx) = idomsfc + 0.001_r_kind ! dominate surface type + data_mesh(28,itx) = sfcr ! surface roughness + data_mesh(29,itx) = ff10 ! ten meter wind factor + data_mesh(30,itx) = dlon_earth_deg ! earth relative longitude (degrees) + data_mesh(31,itx) = dlat_earth_deg ! earth relative latitude (degrees) + if(dval_use)then + data_mesh(32,itx) = val_viirs ! weighting factor applied to super obs + data_mesh(33,itx) = itt ! + end if + + if(nst_gsi>0) then + data_mesh(maxinfo+1,itx) = tref ! foundation temperature + data_mesh(maxinfo+2,itx) = dtw ! dt_warm at zob + data_mesh(maxinfo+3,itx) = dtc ! dt_cool at zob + data_mesh(maxinfo+4,itx) = tz_tr ! d(Tz)/d(Tr) + endif + + data_mesh(1+nreal,itx) = bufrf(2,1) + data_mesh(2+nreal,itx) = bmiss + data_mesh(3+nreal,itx) = bmiss + data_mesh(4+nreal,itx) = bufrf(2,2) + data_mesh(5+nreal,itx) = bufrf(2,3) + + nrec(itx)=irec + +! End of satellite read block + + enddo read_loop + enddo read_msg + call closbf(lnbufr) + + + + call combine_radobs(mype_sub,mype_root,npe_sub,mpi_comm_sub,& + nele,itxmax,nread,ndata_mesh,data_mesh,score_crit,nrec) + + if ( nread > 0 ) then + write(*,'(a,a10,I3,F6.1,3I10)') 'read_viirs,jsatid,imesh,amesh,itxmax,nread,ndata_mesh :',jsatid,imesh,amesh(imesh),itxmax,nread,ndata_mesh + endif +! +! get data_all by combining data from all thinning box sizes +! + do n = 1, ndata_mesh + ndata = ndata + 1 + do iele = 1, nele + data_all(iele,ndata) = data_mesh(iele,n) + enddo + enddo + +! Deallocate arrays + call destroygrids + deallocate(data_mesh,nrec) + + enddo ! do imesh = 1, nmesh + + +! Allow single task to check for bad obs, update superobs sum, +! and write out data to scratch file for further processing. + if (mype_sub==mype_root.and.ndata>0) then + do n=1,ndata + do k=1,nchanl + if(data_all(k+nreal,n) > tbmin .and. & + data_all(k+nreal,n) < tbmax) nodata=nodata+1 + end do + end do + if(dval_use .and. assim)then + do n=1,ndata + itt=nint(data_all(33,n)) + super_val(itt)=super_val(itt)+val_viirs + end do + end if + +! Write retained data to local file + call count_obs(ndata,nele,ilat,ilon,data_all,nobs) + write(lunout) obstype,sis,nreal,nchanl,ilat,ilon + write(lunout) ((data_all(k,n),k=1,nele),n=1,ndata) + endif + +! Deallocate local arrays + deallocate(data_all) + + if(diagnostic_reg.and.ntest>0 .and. mype_sub==mype_root) & + write(6,*)'READ_VIIRS-M: ',& + 'mype,ntest,disterrmax=',mype,ntest,disterrmax + +! End of routine + return +end subroutine read_sst_viirs diff --git a/src/gsi/satthin.F90 b/src/gsi/satthin.F90 index e2c5da8be4..02d19b198c 100644 --- a/src/gsi/satthin.F90 +++ b/src/gsi/satthin.F90 @@ -142,6 +142,7 @@ module satthin public :: makegvals public :: makegrids public :: getsfc + public :: get_hsst public :: map2tgrid public :: destroygrids public :: destroy_sfc @@ -154,6 +155,7 @@ module satthin public :: fact10_full,isli_full,soil_moi_full,veg_frac_full,soil_temp_full public :: isli_anl,sno_anl public :: checkob,score_crit,itxmax,finalcheck,zs_full_gfs,zs_full + public :: hsst integer(i_kind) mlat,superp,maxthin,itxmax integer(i_kind) itxmax0 @@ -183,6 +185,8 @@ module satthin integer(i_kind),allocatable, dimension(:,:) :: isli_anl ! declare local array sno_anl real(r_single),allocatable, dimension(:,:,:) :: sno_anl +! declare the dummy variables of routine berror_read_hsst + real(r_single), allocatable, dimension(:,:) :: hsst logical use_all @@ -471,6 +475,22 @@ subroutine makegrids(rmesh,ithin,n_tbin) return end subroutine makegrids + subroutine get_hsst(mype_io) +!$$$ subprogram documentation block +! . . . . +! subprogram: get_hsst +! prgmmr: Xu org: np23 date: 2020-03-13 +! +! abstract: read hsst from berror_stats + use gridmod, only: nlat,nlon + use ncepnems_io, only: berror_read_hsst + integer(i_kind), intent(in) :: mype_io + + allocate(hsst(nlat,nlon)) + call berror_read_hsst(mype_io,hsst) + + end subroutine get_hsst + subroutine getsfc(mype,mype_io,use_sfc,use_sfc_any) !$$$ subprogram documentation block ! . . . . diff --git a/src/gsi/setuprad.f90 b/src/gsi/setuprad.f90 index a5b2a6b285..66774c605a 100644 --- a/src/gsi/setuprad.f90 +++ b/src/gsi/setuprad.f90 @@ -215,6 +215,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! 2019-03-13 eliu - add calculation of scattering index for MHS/ATMS ! 2019-03-27 h. liu - add ABI assimilation ! 2019-08-20 zhu - add flexibility to allow radiances being assimilated without bias correction +! 2021-02-20 x.li - add viirs ! ! input argument list: ! lunin - unit from which to read radiance (brightness temperature, tb) obs @@ -361,7 +362,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& logical cao_flag logical hirs2,msu,goessndr,hirs3,hirs4,hirs,amsua,amsub,airs,hsb,goes_img,ahi,mhs,abi type(sparr2) :: dhx_dx - logical avhrr,avhrr_navy,lextra,ssu,iasi,cris,seviri,atms + logical avhrr,avhrr_navy,viirs,lextra,ssu,iasi,cris,seviri,atms logical ssmi,ssmis,amsre,amsre_low,amsre_mid,amsre_hig,amsr2,gmi,saphir logical ssmis_las,ssmis_uas,ssmis_env,ssmis_img logical sea,mixed,land,ice,snow,toss,l_may_be_passive,eff_area @@ -497,6 +498,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& goes_img = obstype == 'goes_img' ahi = obstype == 'ahi' avhrr = obstype == 'avhrr' + viirs = obstype == 'viirs-m' avhrr_navy = obstype == 'avhrr_navy' ssmi = obstype == 'ssmi' amsre_low = obstype == 'amsre_low' @@ -1510,6 +1512,28 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& wavenumber,ptau5,prsltmp,tvp,temp,wmix,emissivity_k,ts, & id_qc,aivals,errf,varinv,varinv_use,cld,cldp) + else if (viirs) then + + frac_sea=data_s(ifrac_sea,n) + +! NOTE: use qc_avhrr for viirs qc + do i=1,nchanl + m=ich(i) + if (varinv(i) < tiny_r_kind) then + varinv_use(i) = zero + else + if ((icld_det(m)>0)) then + varinv_use(i) = varinv(i) + else + varinv_use(i) = zero + end if + end if + end do + + call qc_avhrr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse(n), & + zsges,cenlat,frac_sea,pangs,trop5,tzbgr,tsavg5,tbc,tb_obs,tnoise, & + wavenumber,ptau5,prsltmp,tvp,temp,wmix,emissivity_k,ts, & + id_qc,aivals,errf,varinv,varinv_use,cld,cldp) ! ---------- SSM/I , SSMIS, AMSRE ------------------- ! SSM/I, SSMIS, & AMSRE Q C From 2d0e4eff251da3ffdb568056760bdde0132e4191 Mon Sep 17 00:00:00 2001 From: David Huber Date: Wed, 29 Dec 2021 16:24:27 +0000 Subject: [PATCH 07/26] GitHub Issue NOAA-EMC#268 Ported the ConMon to Jet and S4 and fixed bugs. --- .../build_ConMon_cmake.sh | 8 +++- .../data_extract/ush/ConMon_DE.sh | 9 ++++- .../image_gen/gscripts/plot_hist.gs | 2 +- .../image_gen/gscripts/plot_tallev_horz.gs | 2 +- .../image_gen/gscripts/plot_uvallev_horz.gs | 2 +- .../image_gen/gscripts/plot_uvsatwind_horz.gs | 2 +- .../image_gen/ush/mk_horz_hist.sh | 16 ++++---- .../image_gen/ush/mk_time_vert.sh | 12 +++--- .../image_gen/ush/plot_horz.sh | 3 -- .../image_gen/ush/plot_horz_uv.sh | 8 ++-- util/Conventional_Monitor/parm/ConMon_config | 38 +++++++++++++++++++ 11 files changed, 74 insertions(+), 28 deletions(-) diff --git a/util/Conventional_Monitor/build_ConMon_cmake.sh b/util/Conventional_Monitor/build_ConMon_cmake.sh index 1ffe92a9ae..833a2b8d9e 100755 --- a/util/Conventional_Monitor/build_ConMon_cmake.sh +++ b/util/Conventional_Monitor/build_ConMon_cmake.sh @@ -39,6 +39,12 @@ elif [[ -d /scratch1 ]] ; then elif [[ -d /work ]]; then . $MODULESHOME/init/sh target=orion +elif [[ -d /data/prod ]]; then + . $MODULESHOME/init/sh + target=s4 +elif [[ -d /jetmon ]]; then + . /apps/lmod/lmod/init/sh + target=jet elif [[ -d /lfs && -d /dfs ]]; then . $MODULESHOME/init/bash target=wcoss2 @@ -83,7 +89,7 @@ if [ $target = wcoss_d -o $target = wcoss2 ]; then elif [ $target = wcoss -o $target = gaea ]; then module purge module load $dir_modules/modulefile.ProdGSI.$target -elif [ $target = hera -o $target = orion ]; then +elif [ $target = hera -o $target = orion -o $target = s4 -o $target = jet ]; then module purge module use $dir_modules module load modulefile.ProdGSI.$target diff --git a/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh b/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh index 8869f513cb..a93e595eb0 100755 --- a/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh +++ b/util/Conventional_Monitor/data_extract/ush/ConMon_DE.sh @@ -233,9 +233,14 @@ if [ -s $cnvstat -a -s $pgrbf00 -a -s $pgrbf06 ]; then -R affinity[core] -W 0:50 -J ${jobname} \ -cwd $PWD ${HOMEgdas_conmon}/jobs/JGDAS_ATMOS_CONMON - elif [[ $MY_MACHINE = "hera" ]]; then + elif [[ $MY_MACHINE = "hera" || $MY_MACHINE = "s4" ]]; then $SUB -A $ACCOUNT --ntasks=1 --time=00:30:00 \ - -p service -J ${jobname} -o $C_LOGDIR/DE.${PDY}.${CYC}.log \ + -p ${SERVICE_PARTITION} -J ${jobname} -o $C_LOGDIR/DE.${PDY}.${CYC}.log \ + ${HOMEgdas_conmon}/jobs/JGDAS_ATMOS_CONMON + + elif [[ $MY_MACHINE = "jet" ]]; then + $SUB -A $ACCOUNT -ntasks=1 --time=00:30:00 --mem=5000 \ + -p ${SERVICE_PARTITION} -J ${jobname} -o $C_LOGDIR/DE.${PDY}.${CYC}.log \ ${HOMEgdas_conmon}/jobs/JGDAS_ATMOS_CONMON elif [[ $MY_MACHINE = "wcoss2" ]]; then diff --git a/util/Conventional_Monitor/image_gen/gscripts/plot_hist.gs b/util/Conventional_Monitor/image_gen/gscripts/plot_hist.gs index 4162f64ec7..273246eb2e 100755 --- a/util/Conventional_Monitor/image_gen/gscripts/plot_hist.gs +++ b/util/Conventional_Monitor/image_gen/gscripts/plot_hist.gs @@ -135,7 +135,7 @@ while( i<=2) endwhile - 'printim 'plotfile'_hist.png 'xsize' 'ysize' white' + 'printim 'plotfile'_hist.png x'xsize' y'ysize' white' return diff --git a/util/Conventional_Monitor/image_gen/gscripts/plot_tallev_horz.gs b/util/Conventional_Monitor/image_gen/gscripts/plot_tallev_horz.gs index 0fdf3deb93..4c1ea39273 100644 --- a/util/Conventional_Monitor/image_gen/gscripts/plot_tallev_horz.gs +++ b/util/Conventional_Monitor/image_gen/gscripts/plot_tallev_horz.gs @@ -127,7 +127,7 @@ function plot_horz(plotfile,plotfile2,xsize,ysize,he,rdate,levx,levx1,hint) 'set gxout contour' 'set clevs' 'set ccolor 98' - 'set cint 0' +* 'set cint 0' 'd TMPprs.1-273.15' 'colorbar.gs' 'set ccolor 98' diff --git a/util/Conventional_Monitor/image_gen/gscripts/plot_uvallev_horz.gs b/util/Conventional_Monitor/image_gen/gscripts/plot_uvallev_horz.gs index 5ff288df1b..1ece1f0903 100644 --- a/util/Conventional_Monitor/image_gen/gscripts/plot_uvallev_horz.gs +++ b/util/Conventional_Monitor/image_gen/gscripts/plot_uvallev_horz.gs @@ -27,7 +27,7 @@ function uvallev (args) 'open guess.ctl' 'open 'plotfile2'.grads.anl.ctl' 'open 'plotfile2'.grads.ges.ctl' - say 'open the file:' plotfile2'_grads_anl.ctl' + say 'open the file:' plotfile2'.grads.anl.ctl' if(plotfile = uv220 | plotfile = uv223 | plotfile = uv224 | plotfile = uv228); hint=0;endif diff --git a/util/Conventional_Monitor/image_gen/gscripts/plot_uvsatwind_horz.gs b/util/Conventional_Monitor/image_gen/gscripts/plot_uvsatwind_horz.gs index d697e9bc16..eca9765d2e 100644 --- a/util/Conventional_Monitor/image_gen/gscripts/plot_uvsatwind_horz.gs +++ b/util/Conventional_Monitor/image_gen/gscripts/plot_uvsatwind_horz.gs @@ -28,7 +28,7 @@ function uvsatwind (args) 'open guess.ctl' 'open 'plotfile2'.grads.anl.ctl' 'open 'plotfile2'.grads.ges.ctl' - say 'open the file:' plotfile2'_grads_anl.ctl' + say 'open the file:' plotfile2'.grads.anl.ctl' if(plotfile = uv242 | plotfile = uv252);nhe=3;endif if(plotfile = uv253);nhe=5;endif diff --git a/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh b/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh index 8114fd1a54..cd18e1903b 100755 --- a/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh +++ b/util/Conventional_Monitor/image_gen/ush/mk_horz_hist.sh @@ -54,9 +54,9 @@ set -ax ${SUB} -q ${JOB_QUEUE} -P ${PROJECT} -o ${logfile} -M 100 \ -R affinity[core] -W 0:20 -J ${jobname} -cwd ${PWD} ${plot_hist} - elif [[ $MY_MACHINE = "hera" ]]; then + elif [[ $MY_MACHINE = "hera" || $MY_MACHINE = "s4" || $MY_MACHINE = "jet" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:20:00 \ - -p service -J ${jobname} -o ${logfile} ${plot_hist} + -p ${SERVICE_PARTITION} -J ${jobname} -o ${logfile} ${plot_hist} elif [[ $MY_MACHINE = "wcoss2" ]]; then $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ @@ -79,9 +79,9 @@ set -ax $SUB -q $JOB_QUEUE -P $PROJECT -o ${logfile} -M 300 \ -R affinity[core] -W 0:20 -J ${jobname} -cwd ${PWD} ${plot_horz} - elif [[ $MY_MACHINE = "hera" ]]; then + elif [[ $MY_MACHINE = "hera" || $MY_MACHINE = "s4" || $MY_MACHINE = "jet" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:20:00 \ - -p service -J ${jobname} -o ${logfile} ${plot_horz} + -p ${SERVICE_PARTITION} -J ${jobname} -o ${logfile} ${plot_horz} elif [[ $MY_MACHINE = "wcoss2" ]]; then $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ @@ -102,11 +102,11 @@ set -ax if [[ $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss_c" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -o ${logfile} -M 300 \ - -R affinity[core] -W 0:20 -J ${jobname} ${plot_horz_uv} + -R affinity[core] -W 1:00 -J ${jobname} ${plot_horz_uv} - elif [[ $MY_MACHINE = "hera" ]]; then - ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:20:00 \ - -p service -J ${jobname} -o ${logfile} ${plot_horz_uv} + elif [[ $MY_MACHINE = "hera" || $MY_MACHINE = "s4" || $MY_MACHINE = "jet" ]]; then + ${SUB} -A ${ACCOUNT} --ntasks=1 --time=01:30:00 \ + -p ${SERVICE_PARTITION} -J ${jobname} -o ${logfile} ${plot_horz_uv} elif [[ $MY_MACHINE = "wcoss2" ]]; then $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=30:00 -N ${jobname} \ diff --git a/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh b/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh index ed465aabb1..b4b6f361af 100755 --- a/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh +++ b/util/Conventional_Monitor/image_gen/ush/mk_time_vert.sh @@ -34,9 +34,9 @@ echo "--> mk_time_vert.sh" $SUB -q ${JOB_QUEUE} -P ${PROJECT} -o ${logfile} -R affinity[core] \ -M 100 -W 0:50 -J ${jobname} -cwd ${PWD} ${pltfile} - elif [[ $MY_MACHINE == "hera" ]]; then + elif [[ $MY_MACHINE == "hera" || $MY_MACHINE == "s4" || $MY_MACHINE == "jet" ]]; then ${SUB} -A ${ACCOUNT} --ntasks=1 --time=00:15:00 \ - -p service -J ${jobname} -o ${logfile} ${pltfile} + -p ${SERVICE_PARTITION} -J ${jobname} -o ${logfile} ${pltfile} elif [[ $MY_MACHINE = "wcoss2" ]]; then $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=50:00 -N ${jobname} \ @@ -66,7 +66,7 @@ echo "--> mk_time_vert.sh" $SUB -q ${JOB_QUEUE} -P ${PROJECT} -o ${logfile} -R affinity[core] \ -M 100 -W ${walltime} -J ${jobname} -cwd ${PWD} ${pltfile} - elif [[ $MY_MACHINE == "hera" ]]; then + elif [[ $MY_MACHINE == "hera" || $MY_MACHINE == "s4" || $MY_MACHINE == "jet" ]]; then if [[ ${type} == "uv" || ${type} == "u" || ${type} == "v" ]]; then walltime="02:30:00" else @@ -74,7 +74,7 @@ echo "--> mk_time_vert.sh" fi ${SUB} -A ${ACCOUNT} --ntasks=1 --time=${walltime} \ - -p service -J ${jobname} -o ${logfile} ${pltfile} + -p ${SERVICE_PARTITION} -J ${jobname} -o ${logfile} ${pltfile} elif [[ $MY_MACHINE = "wcoss2" ]]; then @@ -108,7 +108,7 @@ echo "--> mk_time_vert.sh" $SUB -q ${JOB_QUEUE} -P ${PROJECT} -o ${logfile} -R affinity[core] \ -M 100 -W 1:30 -J ${jobname} -cwd ${PWD} ${pltfile} - elif [[ $MY_MACHINE == "hera" ]]; then + elif [[ $MY_MACHINE == "hera" || $MY_MACHINE == "s4" || $MY_MACHINE == "jet" ]]; then if [[ ${type} == "uv" || ${type} == "u" || ${type} == "v" ]]; then walltime="00:50:00" else @@ -116,7 +116,7 @@ echo "--> mk_time_vert.sh" fi ${SUB} -A ${ACCOUNT} --ntasks=1 --time=${walltime} \ - -p service -J ${jobname} -o ${logfile} ${pltfile} + -p ${SERVICE_PARTITION} -J ${jobname} -o ${logfile} ${pltfile} elif [[ $MY_MACHINE == "wcoss2" ]]; then $SUB -V -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -e ${logfile} -l walltime=50:00 \ diff --git a/util/Conventional_Monitor/image_gen/ush/plot_horz.sh b/util/Conventional_Monitor/image_gen/ush/plot_horz.sh index f85dcd899a..ca890d1d12 100755 --- a/util/Conventional_Monitor/image_gen/ush/plot_horz.sh +++ b/util/Conventional_Monitor/image_gen/ush/plot_horz.sh @@ -196,9 +196,6 @@ done ### type loop - ${COMPRESS} ${hh_tankdir}/ges/* - ${COMPRESS} ${hh_tankdir}/anl/* - if [[ ${C_IG_SAVE_WORK} -eq 0 ]]; then cd $workdir diff --git a/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh b/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh index 7340bf2423..cbe0d89090 100755 --- a/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh +++ b/util/Conventional_Monitor/image_gen/ush/plot_horz_uv.sh @@ -126,14 +126,14 @@ set -ax sdir=" dset ${dtype}.grads.${cycle}.${PDATE}" title="title ${dtype} ${cycle}" sed -e "s/^title.*/${title}/" ${dtype}.ctl >tmp.ctl - echo $sdir >${dtype}_grads_${cycle}.ctl - cat tmp.ctl >>${dtype}_grads_${cycle}.ctl + echo $sdir >${dtype}.grads.${cycle}.ctl + cat tmp.ctl >>${dtype}.grads.${cycle}.ctl rm -f tmp.ctl rm -f ${dtype}.ctl #-------------------------------------------------------------- - # link in the ${dtype}_grads.${PDATE} data file from TANKDIR + # link in the ${dtype}.grads.${PDATE} data file from TANKDIR #-------------------------------------------------------------- grads_file=${hh_tankdir}/${cycle}/${dtype}.grads.${cycle}.${PDATE} @@ -149,7 +149,7 @@ set -ax continue fi - stnmap -1 -i ${dtype}_grads_${cycle}.ctl + stnmap -1 -i ${dtype}.grads.${cycle}.ctl done ## done with cycle diff --git a/util/Conventional_Monitor/parm/ConMon_config b/util/Conventional_Monitor/parm/ConMon_config index fa779dd208..120d0a261c 100644 --- a/util/Conventional_Monitor/parm/ConMon_config +++ b/util/Conventional_Monitor/parm/ConMon_config @@ -105,6 +105,43 @@ if [[ $CONMON_CONFIG -ne 1 ]]; then export COMPRESS=/usr/bin/gzip export UNCOMPRESS="/usr/bin/gunzip -f" + elif [[ $MY_MACHINE = "s4" ]]; then + module load license_intel + module use /data/prod/hpc-stack/modulefiles/stack + module load hpc/1.1.0 hpc-intel/18.0.4 hpc-impi/18.0.4 + module load wgrib2/2.0.8 + module load grads/2.2.1 + module load prod_util/1.2.2 + + export WGRIB2=`which wgrib2` + + export GRADS=`which grads` + export STNMAP=`which stnmap` + + export SUB=/usr/bin/sbatch + export NDATE=/data/prod/hpc-stack/intel-18.0.4/prod_util/1.2.2/bin/ndate + export COMPRESS=${COMPRESS:-gzip} + export UNCOMPRESS=${UNCOMPRESS:-"gunzip -f"} + export SERVICE_PARTITION="serial" + + elif [[ $MY_MACHINE = "jet" ]]; then + module use /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack + module load hpc/1.1.0 hpc-intel/18.0.5.274 hpc-impi/2018.4.274 + module load wgrib2/2.0.8 + module load grads/2.2.1 + module load prod_util/1.2.2 + + export WGRIB2=`which wgrib2` + + export GRADS=`which grads` + export STNMAP=`which stnmap` + + export SUB=/apps/slurm/default/bin/sbatch + export NDATE=/lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/intel-18.0.5.274/prod_util/1.2.2/bin/ndate + export COMPRESS=${COMPRESS:-gzip} + export UNCOMPRESS=${UNCOMPRESS:-"gunzip -f"} + export SERVICE_PARTITION="service" + elif [[ $MY_MACHINE = "hera" ]]; then module use -a /apps/modules/modulefamilies/intel module load wgrib2/2.0.8 @@ -119,6 +156,7 @@ if [[ $CONMON_CONFIG -ne 1 ]]; then export NDATE=/home/Edward.Safford/bin/ndate export COMPRESS=${COMPRESS:-gzip} export UNCOMPRESS=${UNCOMPRESS:-"gunzip -f"} + export SERVICE_PARTITION="service" elif [[ $MY_MACHINE = "wcoss2" ]]; then export COMPRESS=/usr/bin/gzip From b22fd90ddd0af648ee2435e33be34004b8abc1c2 Mon Sep 17 00:00:00 2001 From: Michael Lueken Date: Wed, 5 Jan 2022 14:54:28 +0000 Subject: [PATCH 08/26] GitHub Issue NOAA-EMC/GSI#235. Update global_scaninfo.txt, global_satinfo.txt, global_berror.l127y770.f77, and global_berror.l127y384.f77 in fix/rev2 from fix/fixfile_nsst. --- fix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fix b/fix index 13ad7b5abb..2ff80650bb 160000 --- a/fix +++ b/fix @@ -1 +1 @@ -Subproject commit 13ad7b5abb20567aacc52b8a5d2d487628e5b1c5 +Subproject commit 2ff80650bb769b9c883e758262a63025b99fe2ca From efdb87d3491e7e415314cf77c57ba06b7f826206 Mon Sep 17 00:00:00 2001 From: TingLei-NOAA Date: Tue, 21 Dec 2021 12:31:38 +0000 Subject: [PATCH 09/26] GitHub Issue NOAA-EMC/GSI#272 A fix for the corrupted final statistics written out in the GSI FV3-LAM parallel IO for cold start runs --- src/gsi/gsi_rfv3io_mod.f90 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gsi/gsi_rfv3io_mod.f90 b/src/gsi/gsi_rfv3io_mod.f90 index a61433d653..6bcfb7d4e2 100644 --- a/src/gsi/gsi_rfv3io_mod.f90 +++ b/src/gsi/gsi_rfv3io_mod.f90 @@ -1848,6 +1848,7 @@ subroutine wrfv3_netcdf(fv3filenamegin) real(r_kind),pointer,dimension(:,:,:):: ges_w =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_delzinc =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_delp =>NULL() + real(r_kind),dimension(:,: ),allocatable:: ges_ps_write real(r_kind), dimension(lat2,lon2,nsig) :: io_arr_qr, io_arr_qs @@ -1918,8 +1919,10 @@ subroutine wrfv3_netcdf(fv3filenamegin) deallocate(g_prsi,ges_ps_inc) else - ges_ps=ges_ps*1000.0_r_kind - call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'ps',ges_ps,istatus) + allocate(ges_ps_write(lat2,lon2)) + ges_ps_write=ges_ps*1000.0_r_kind + call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'ps',ges_ps_write,istatus) + deallocate(ges_ps_write) endif ! write out if (ier/=0) call die('get ges','cannot get pointers for fv3 met-fields, ier =',ier) From 9de5986aa0482beb9e9491078aa8a0d5f21c2d1b Mon Sep 17 00:00:00 2001 From: "andrew.eichmann" Date: Wed, 1 Dec 2021 18:22:56 +0000 Subject: [PATCH 10/26] GitHub Issue NOAA-EMC/GSI#259. Add assimilated flag to observations in osense file. --- src/enkf/enkf.f90 | 21 +++++++++++++++++++-- src/enkf/enkf_obs_sensitivity.f90 | 8 +++++++- src/enkf/enkf_obsmod.f90 | 4 ++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/enkf/enkf.f90 b/src/enkf/enkf.f90 index adf9921e9d..c117e4ba56 100644 --- a/src/enkf/enkf.f90 +++ b/src/enkf/enkf.f90 @@ -123,7 +123,7 @@ module enkf obtype, oberrvarmean, numobspersat, deltapredx, biaspreds,& oberrvar_orig, probgrosserr, prpgerr,& corrlengthsq,lnsigl,obtimel,obloclat,obloclon,obpress,stattype,& - anal_ob,anal_ob_post + anal_ob,anal_ob_post,assimltd_flag use constants, only: pi, one, zero use params, only: sprd_tol, paoverpb_thresh, datapath, nanals,& iassim_order,sortinc,deterministic,numiter,nlevs,& @@ -153,7 +153,8 @@ subroutine enkf_update() ! local variables. integer(i_kind) nob,nob1,nob2,nob3,npob,nf,nf2,ii,nobx,nskip,& - niter,i,nrej,npt,nuse,ncount,ncount_check,nb,np + niter,i,nrej,npt,nuse,ncount,ncount_check,nb,np,& + nuseconvoz,nusesat,nobs_convoz integer(i_kind) indxens1(nanals),indxens2(nanals) integer(i_kind) indxens1_modens(nanals*neigv),indxens2_modens(nanals*neigv) real(r_single) hxpost(nanals),hxprior(nanals),hxinc(nanals),& @@ -757,17 +758,31 @@ subroutine enkf_update() tend = mpi_wtime() if (nproc .eq. 0) then write(6,8003) niter,'timing on proc',nproc,' = ',tend-tbegin,t2,t3,t4,t5,t6,nrej + allocate(assimltd_flag(nobstot)) + assimltd_flag = 99999 if (iassim_order == 2) then ncount_check = ncount else ncount_check = nobstot endif nuse = 0; covl_fact = 0. + nuseconvoz=0; nusesat = 0 + nobs_convoz = nobs_conv + nobs_oz do nob1=1,ncount_check nob = indxassim(nob1) if (iskip(nob) .ne. 1) then covl_fact = covl_fact + sqrt(corrlengthsq(nob)/corrlengthsq_orig(nob)) nuse = nuse + 1 + assimltd_flag(nob) = 1 + if (nob .le. nobs_convoz) then + nuseconvoz = nuseconvoz +1 + else if (nob .gt. nobs_convoz) then + nusesat = nusesat + 1 + else + print *,'nob ', nob ,' falling through' + endif + else + assimltd_flag(nob) = 0 endif enddo nskip = nobstot-nuse @@ -776,6 +791,8 @@ subroutine enkf_update() if (covl_fact < 0.99) print *,'mean covl_fact = ',covl_fact if (nskip > 0) print *,nskip,' out of',nobstot,'obs skipped,',nuse,' used' if (nsame > 0) print *,nsame,' out of', nobstot-nskip,' same lat/long' + if (nuseconvoz > 0 ) print *,nuseconvoz,' out of',nobs_conv + nobs_oz ,'convobs used' + if (nusesat > 0 ) print *,nusesat ,' out of',nobs_sat ,'satobs used' if (nrej > 0) print *,nrej,' obs rejected by varqc' endif 8003 format(i2,1x,a14,1x,i5,1x,a3,6(f7.2,1x),i4) diff --git a/src/enkf/enkf_obs_sensitivity.f90 b/src/enkf/enkf_obs_sensitivity.f90 index afa2e242e8..6c37936f31 100644 --- a/src/enkf/enkf_obs_sensitivity.f90 +++ b/src/enkf/enkf_obs_sensitivity.f90 @@ -45,7 +45,7 @@ module enkf_obs_sensitivity obloclon,obpress,indxsat,oberrvar,stattype,obtime,ob, & ensmean_ob,ensmean_obnobc,obsprd_prior,obfit_prior, & oberrvar_orig,biaspreds,anal_ob_post,nobstot,lnsigl, & - corrlengthsq,obtimel,oblnp,obloc + corrlengthsq,obtimel,oblnp,obloc ,assimltd_flag use convinfo, only: convinfo_read,init_convinfo use ozinfo, only: ozinfo_read,init_oz use radinfo, only: radinfo_read,jpch_rad,nusis,nuchan,npred @@ -91,6 +91,7 @@ module enkf_obs_sensitivity integer(i_kind) :: stattype ! Observation type character(len=20) :: obtype ! Observation element / Satellite name integer(i_kind) :: indxsat ! Satellite index (channel) + integer(i_kind) :: assimltd_flag ! is assimilated? flag real(r_single) :: osense_kin ! Observation sensitivity (kinetic energy) [J/kg] real(r_single) :: osense_dry ! Observation sensitivity (Dry total energy) [J/kg] real(r_single) :: osense_moist ! Observation sensitivity (Moist total energy) [J/kg] @@ -215,6 +216,7 @@ subroutine read_ob_sens allocate(stattype(nobstot)) allocate(obtype(nobstot)) allocate(indxsat(nobs_sat)) + allocate(assimltd_flag(nobstot)) allocate(biaspreds(npred+1,nobs_sat)) allocate(tmpanal_ob(nanals)) allocate(tmpbiaspreds(npred+1)) @@ -235,6 +237,7 @@ subroutine read_ob_sens oberrvar_orig(nob) = real(indata%oberrvar_orig,r_kind) stattype(nob) = indata%stattype obtype(nob) = indata%obtype + assimltd_flag(nob) = indata%assimltd_flag if(nproc == 0) anal_ob_post(1:nanals,nob) = real(tmpanal_ob(1:nanals),r_kind) end do ! Read loop over satellite radiance observations @@ -256,6 +259,7 @@ subroutine read_ob_sens stattype(nob) = indata%stattype obtype(nob) = indata%obtype indxsat(nn) = indata%indxsat + assimltd_flag(nob) = indata%assimltd_flag if(nproc == 0) anal_ob_post(1:nanals,nob) = real(tmpanal_ob(1:nanals),r_kind) biaspreds(1:npred+1,nn) = real(tmpbiaspreds(1:npred+1),r_kind) end do @@ -430,6 +434,7 @@ subroutine print_ob_sens outdata%stattype = stattype(nob) outdata%obtype = obtype(nob) outdata%indxsat = 0 + outdata%assimltd_flag = assimltd_flag(nob) if(efsoi_flag) then outdata%osense_kin = real(obsense_kin(nob),r_single) outdata%osense_dry = real(obsense_dry(nob),r_single) @@ -500,6 +505,7 @@ subroutine print_ob_sens outdata%stattype = stattype(nob) outdata%obtype = obtype(nob) outdata%indxsat = nchan + outdata%assimltd_flag = assimltd_flag(nob) tmpbiaspreds(1:npred+1) = real(biaspreds(1:npred+1,nn),r_single) if(efsoi_flag) then outdata%osense_kin = real(obsense_kin(nob),r_single) diff --git a/src/enkf/enkf_obsmod.f90 b/src/enkf/enkf_obsmod.f90 index 72e196d61e..3a1bbe4363 100644 --- a/src/enkf/enkf_obsmod.f90 +++ b/src/enkf/enkf_obsmod.f90 @@ -152,6 +152,9 @@ module enkf_obsmod ! ob-space posterior ensemble, needed for EFSOI real(r_single),public,allocatable, dimension(:,:) :: anal_ob_post ! Fortran pointer +! is the observation assimilated? logical would be preferable, but that confuses +! Python +integer(i_kind),public,allocatable, dimension(:) :: assimltd_flag ! Fortran pointer contains @@ -466,6 +469,7 @@ subroutine obsmod_cleanup() if (allocated(prpgerr)) deallocate(prpgerr) if (allocated(diagused)) deallocate(diagused) if (allocated(anal_ob_post)) deallocate(anal_ob_post) +if (allocated(assimltd_flag)) deallocate(assimltd_flag) ! free shared memory segement, fortran pointer to that memory. nullify(anal_ob) call MPI_Barrier(mpi_comm_world,ierr) From 244d5dafa5aa26a4516ba655ce4110b77b3fa0ac Mon Sep 17 00:00:00 2001 From: jswhit2 Date: Fri, 7 Jan 2022 16:07:21 +0000 Subject: [PATCH 11/26] Github issue #277: merge recent updates and bug fixes in EnKF --- src/enkf/controlvec.f90 | 48 +++- src/enkf/enkf_obsmod.f90 | 9 +- src/enkf/gridio_gfs.f90 | 73 +++-- src/enkf/letkf.f90 | 123 +++++++-- src/enkf/loadbal.f90 | 2 +- src/enkf/mpi_readobs.f90 | 13 +- src/enkf/params.f90 | 18 +- src/enkf/readconvobs.f90 | 6 +- src/enkf/readozobs.f90 | 4 +- src/enkf/readsatobs.f90 | 4 +- src/gsi/gsi_4dvar.f90 | 5 +- src/gsi/gsimod.F90 | 7 +- src/gsi/hybrid_ensemble_isotropic.F90 | 8 +- src/gsi/hybrid_ensemble_parameters.f90 | 8 +- .../fv3_interface.f90 | 22 ++ .../gfs_ncio_interface.f90 | 6 + .../namelist_def.f90 | 8 +- .../calc_increment_ncio.f90 | 42 ++- .../getsigensmeanp_smooth.fd/CMakeLists.txt | 1 + .../src/recenterens_ncio.fd/CMakeLists.txt | 10 + .../recenterens_ncio.fd/recenterens_ncio.f90 | 183 +++++++++++++ .../recenterncio_hybgain.f90 | 251 +++++++++++++----- .../gfs/src/recentersigp.fd/recentersigp.f90 | 13 +- .../calc_analysis.fd/init_calc_analysis.f90 | 8 +- 24 files changed, 701 insertions(+), 171 deletions(-) create mode 100644 util/EnKF/gfs/src/recenterens_ncio.fd/CMakeLists.txt create mode 100644 util/EnKF/gfs/src/recenterens_ncio.fd/recenterens_ncio.f90 diff --git a/src/enkf/controlvec.f90 b/src/enkf/controlvec.f90 index ddd9ded945..b8b62e3b72 100644 --- a/src/enkf/controlvec.f90 +++ b/src/enkf/controlvec.f90 @@ -53,7 +53,7 @@ module controlvec use params, only: nlevs, nbackgrounds, fgfileprefixes, reducedgrid, & nanals, pseudo_rh, use_qsatensmean, nlons, nlats,& nanals_per_iotask, ntasks_io, nanal1, nanal2, & - fgsfcfileprefixes, paranc, write_fv3_incr + fgsfcfileprefixes, paranc, write_fv3_incr, write_ensmean use kinds, only: r_kind, i_kind, r_double, r_single use mpeu_util, only: gettablesize, gettable, getindex use constants, only: max_varname_length @@ -291,13 +291,14 @@ subroutine write_control(no_inflate_flag) real(r_double) :: t1,t2 integer(i_kind) :: nb, nvar, ne integer(i_kind) :: q_ind, ierr -real(r_single), allocatable, dimension(:,:) :: grdin_mean, grdin_mean_tmp +real(r_single), allocatable, dimension(:,:) :: grdin_mean_tmp +real(r_single), allocatable, dimension(:,:,:,:) :: grdin_mean if (nproc <= ntasks_io-1) then allocate(grdin_mean_tmp(npts,ncdim)) if (nproc == 0) then - allocate(grdin_mean(npts,ncdim)) + allocate(grdin_mean(npts,ncdim,nbackgrounds,1)) grdin_mean = 0_r_single t1 = mpi_wtime() endif @@ -311,27 +312,24 @@ subroutine write_control(no_inflate_flag) do ne=1,nanals_per_iotask call mpi_reduce(grdin(:,:,nb,ne), grdin_mean_tmp, npts*ncdim, mpi_real4,& mpi_sum,0,mpi_comm_io,ierr) - if (nproc == 0) grdin_mean = grdin_mean + grdin_mean_tmp + if (nproc == 0) grdin_mean(:,:,nb,1) = grdin_mean(:,:,nb,1) + grdin_mean_tmp enddo ! print out ens mean increment info if (nproc == 0) then - grdin_mean = grdin_mean/real(nanals) + grdin_mean(:,:,nb,1) = grdin_mean(:,:,nb,1)/real(nanals) do nvar=1,nc3d write(6,100) trim(cvars3d(nvar)), & - minval(grdin_mean(:,clevels(nvar-1)+1:clevels(nvar))), & - maxval(grdin_mean(:,clevels(nvar-1)+1:clevels(nvar))) + minval(grdin_mean(:,clevels(nvar-1)+1:clevels(nvar),nb,1)), & + maxval(grdin_mean(:,clevels(nvar-1)+1:clevels(nvar),nb,1)) enddo do nvar=1,nc2d write(6,100) trim(cvars2d(nvar)), & - minval(grdin_mean(:,clevels(nc3d) + nvar)), & - maxval(grdin_mean(:,clevels(nc3d) + nvar)) + minval(grdin_mean(:,clevels(nc3d) + nvar,nb,1)), & + maxval(grdin_mean(:,clevels(nc3d) + nvar,nb,1)) enddo endif enddo 100 format('ens. mean anal. increment min/max ',a,2x,g19.12,2x,g19.12) - if (nproc == 0) then - deallocate(grdin_mean) - endif deallocate(grdin_mean_tmp) q_ind = getindex(cvars3d, 'q') @@ -353,6 +351,14 @@ subroutine write_control(no_inflate_flag) enddo enddo endif + if (nproc == 0 .and. write_ensmean) then + ! write_ensmean implies use_qsatensmean + do nb=1,nbackgrounds + ! re-scale normalized spfh with sat. sphf of ensmean first guess + grdin_mean(:,(q_ind-1)*nlevs+1:q_ind*nlevs,nb,1) = & + grdin_mean(:,(q_ind-1)*nlevs+1:q_ind*nlevs,nb,1)*qsatmean(:,:,nb) + enddo + endif end if if (.not. paranc) then if (write_fv3_incr) then @@ -361,6 +367,15 @@ subroutine write_control(no_inflate_flag) call writegriddata(nanal1(nproc),nanal2(nproc),cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,grdin,no_inflate_flag) end if if (nproc == 0) then + if (write_ensmean) then + ! also write out ens mean on root task. + if (write_fv3_incr) then + call writeincrement(0,0,cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,grdin_mean,no_inflate_flag) + else + call writegriddata(0,0,cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,grdin_mean,no_inflate_flag) + end if + endif + deallocate(grdin_mean) t2 = mpi_wtime() print *,'time in write_control on root',t2-t1,'secs' endif @@ -375,6 +390,15 @@ subroutine write_control(no_inflate_flag) call writegriddata_pnc(cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,grdin,no_inflate_flag) end if if (nproc == 0) then + ! also write out ens mean on root task + if (write_ensmean) then ! FIXME use parallel IO to write ensmean + if (write_fv3_incr) then + call writeincrement(0,0,cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,grdin_mean,no_inflate_flag) + else + call writegriddata(0,0,cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,grdin_mean,no_inflate_flag) + end if + endif + deallocate(grdin_mean) t2 = mpi_wtime() print *,'time in write_control on root',t2-t1,'secs' endif diff --git a/src/enkf/enkf_obsmod.f90 b/src/enkf/enkf_obsmod.f90 index 72e196d61e..d9ab492e73 100644 --- a/src/enkf/enkf_obsmod.f90 +++ b/src/enkf/enkf_obsmod.f90 @@ -105,7 +105,7 @@ module enkf_obsmod use kinds, only : r_kind, r_double, i_kind, r_single use constants, only: zero, one, deg2rad, rad2deg, rd, cp, pi use params, only: & - datestring,datapath,sprd_tol,nanals,saterrfact, & + letkf_flag,nobsl_max,datestring,datapath,sprd_tol,nanals,saterrfact, & lnsigcutoffnh, lnsigcutoffsh, lnsigcutofftr, corrlengthnh,& corrlengthtr, corrlengthsh, obtimelnh, obtimeltr, obtimelsh,& lnsigcutoffsatnh, lnsigcutoffsatsh, lnsigcutoffsattr,& @@ -204,6 +204,13 @@ subroutine readobs() if (nproc == 0) then print *,'max time in mpireadobs = ',tdiffmax print *,'total number of obs ',nobstot + print *,'min/max obtime ',minval(obtime),maxval(obtime) +endif +! if nobsl_max set for LETKF, and the total number of obs < nobsl_max, +! reset nobsl_max to -1 +if (letkf_flag .and. nobsl_max > 0 .and. nobstot < nobsl_max) then + if (nproc == 0) print *,'resetting nobsl_max to -1' + nobsl_max=-1 endif allocate(obfit_prior(nobstot)) ! screen out some obs by setting ob error to a very large number diff --git a/src/enkf/gridio_gfs.f90 b/src/enkf/gridio_gfs.f90 index 58ceff78a6..8a6bd12507 100644 --- a/src/enkf/gridio_gfs.f90 +++ b/src/enkf/gridio_gfs.f90 @@ -333,14 +333,19 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & if (iope==0) then do k=1,nlevs - krev = nlevs-k+1 - ! layer pressure from phillips vertical interolation + ! pressure at bottom of layer interface (for gps jacobian, see prsltmp in setupbend.f90) + if (prse_ind > 0) then + ug(:) = pressi(:,k) + call copytogrdin(ug,pslg(:,k)) + ! Jacobian for gps in pressure is saved in different units in GSI; need to + ! multiply pressure by 0.1 + grdin(:,levels(prse_ind-1)+k,nb,ne) = 0.1*pslg(:,k) + endif + ! layer pressure from phillips vertical interolation (used for qsat + ! calculation) ug(:) = ((pressi(:,k)**kap1-pressi(:,k+1)**kap1)/& (kap1*(pressi(:,k)-pressi(:,k+1))))**kapr call copytogrdin(ug,pslg(:,k)) - ! Jacobian for gps in pressure is saved in different units in GSI; need to - ! multiply pressure by 0.1 - if (prse_ind > 0) grdin(:,levels(prse_ind-1)+k,nb,ne) = 0.1*pslg(:,k) end do if (pseudo_rh) then call genqsat1(q,qsat(:,:,nb,ne),pslg,tv,ice,npts,nlevs) @@ -952,15 +957,19 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, ! compute saturation q. do k=1,nlevs - ! layer pressure from phillips vertical interolation + ! pressure at bottom of layer interface (for gps jacobian, see prsltmp in setupbend.f90) + if (prse_ind > 0) then + ug(:) = pressi(:,k) + call copytogrdin(ug,pslg(:,k)) + ! Jacobian for gps in pressure is saved in different units in GSI; need to + ! multiply pressure by 0.1 + grdin(:,levels(prse_ind-1)+k,nb,ne) = 0.1*pslg(:,k) + endif + ! layer pressure from phillips vertical interolation (used for qsat + ! calculation) ug(:) = ((pressi(:,k)**kap1-pressi(:,k+1)**kap1)/& (kap1*(pressi(:,k)-pressi(:,k+1))))**kapr - call copytogrdin(ug,pslg(:,k)) - ! Jacobian for gps in pressure is saved in different units in GSI; need to - ! multiply pressure by 0.1 - if (prse_ind > 0) grdin(:,levels(prse_ind-1)+k,nb,ne) = 0.1*pslg(:,k) - end do if (pseudo_rh) then call genqsat1(q,qsat(:,:,nb,ne),pslg,tv,ice,npts,nlevs) @@ -1115,7 +1124,9 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate_ ! need to distribute grdin to all PEs in this subcommunicator ! bring all the subdomains back to the main PE call mpi_barrier(iocomms(mem_pe(nproc)), iret) - call mpi_bcast(grdin,npts*ndim*nbackgrounds, mpi_real4, 0, iocomms(mem_pe(nproc)), iret) + do nb=1,nbackgrounds + call mpi_bcast(grdin(1,1,nb,1),npts*ndim, mpi_real4, 0, iocomms(mem_pe(nproc)), iret) + enddo ! loop through times and do the read ne = 1 @@ -1838,7 +1849,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin,n write_attribute, quantize_data, has_var, has_attr use constants, only: grav use params, only: nbackgrounds,anlfileprefixes,fgfileprefixes,reducedgrid,& - nccompress + nccompress,write_ensmean implicit none integer, intent(in) :: nanal1,nanal2 @@ -1906,12 +1917,17 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin,n write(charnanal,'(i3.3)') nanal backgroundloop: do nb=1,nbackgrounds - if(no_inflate_flag) then - filenameout = trim(adjustl(datapath))//trim(adjustl(anlfileprefixes(nb)))//"nimem"//charnanal + if (nanal == 0 .and. write_ensmean) then + filenamein = trim(adjustl(datapath))//trim(adjustl(fgfileprefixes(nb)))//"ensmean" + filenameout = trim(adjustl(datapath))//trim(adjustl(anlfileprefixes(nb)))//"ensmean" else - filenameout = trim(adjustl(datapath))//trim(adjustl(anlfileprefixes(nb)))//"mem"//charnanal - end if - filenamein = trim(adjustl(datapath))//trim(adjustl(fgfileprefixes(nb)))//"mem"//charnanal + if(no_inflate_flag) then + filenameout = trim(adjustl(datapath))//trim(adjustl(anlfileprefixes(nb)))//"nimem"//charnanal + else + filenameout = trim(adjustl(datapath))//trim(adjustl(anlfileprefixes(nb)))//"mem"//charnanal + end if + filenamein = trim(adjustl(datapath))//trim(adjustl(fgfileprefixes(nb)))//"mem"//charnanal + endif if (use_gfs_nemsio) then clip = tiny(vg(1)) @@ -3289,7 +3305,7 @@ end subroutine writegriddata subroutine writeincrement(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate_flag) use netcdf use params, only: nbackgrounds,incfileprefixes,fgfileprefixes,reducedgrid,& - datestring,nhr_anal + datestring,nhr_anal,write_ensmean use constants, only: grav use mpi use module_fv3gfs_ncio, only: Dataset, Variable, Dimension, open_dataset,& @@ -3354,12 +3370,17 @@ subroutine writeincrement(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin, write(charnanal,'(i3.3)') nanal backgroundloop: do nb=1,nbackgrounds - if(no_inflate_flag) then - filenameout = trim(adjustl(datapath))//trim(adjustl(incfileprefixes(nb)))//"nimem"//charnanal + if (nanal == 0 .and. write_ensmean) then + filenameout = trim(adjustl(datapath))//trim(adjustl(incfileprefixes(nb)))//"ensmean" + filenamein = trim(adjustl(datapath))//trim(adjustl(fgfileprefixes(nb)))//"ensmean" else - filenameout = trim(adjustl(datapath))//trim(adjustl(incfileprefixes(nb)))//"mem"//charnanal - end if - filenamein = trim(adjustl(datapath))//trim(adjustl(fgfileprefixes(nb)))//"mem"//charnanal + if(no_inflate_flag) then + filenameout = trim(adjustl(datapath))//trim(adjustl(incfileprefixes(nb)))//"nimem"//charnanal + else + filenameout = trim(adjustl(datapath))//trim(adjustl(incfileprefixes(nb)))//"mem"//charnanal + end if + filenamein = trim(adjustl(datapath))//trim(adjustl(fgfileprefixes(nb)))//"mem"//charnanal + endif ! create the output netCDF increment file call nccheck_incr(nf90_create(path=trim(filenameout), cmode=nf90_netcdf4, ncid=ncid_out)) @@ -3773,7 +3794,9 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate ! need to distribute grdin to all PEs in this subcommunicator ! bring all the subdomains back to the main PE call mpi_barrier(iocomms(mem_pe(nproc)), iret) - call mpi_bcast(grdin,npts*ndim*nbackgrounds, mpi_real4, 0, iocomms(mem_pe(nproc)), iret) + do nb=1,nbackgrounds + call mpi_bcast(grdin(1,1,nb,1),npts*ndim, mpi_real4, 0, iocomms(mem_pe(nproc)), iret) + enddo ! loop through times and do the read ne = 1 diff --git a/src/enkf/letkf.f90 b/src/enkf/letkf.f90 index 0f04739392..9b74cecd75 100644 --- a/src/enkf/letkf.f90 +++ b/src/enkf/letkf.f90 @@ -107,13 +107,13 @@ module letkf numobspersat, biaspreds, corrlengthsq,& probgrosserr, prpgerr, obtype, obpress,& lnsigl, anal_ob, anal_ob_modens, obloclat, obloclon, stattype -use constants, only: pi, one, zero, rad2deg, deg2rad +use constants, only: pi, one, zero, rad2deg, deg2rad, rearth use params, only: sprd_tol, datapath, nanals, iseed_perturbed_obs,& iassim_order,sortinc,deterministic,nlevs,& zhuberleft,zhuberright,varqc,lupd_satbiasc,huber,letkf_novlocal,& lupd_obspace_serial,corrlengthnh,corrlengthtr,corrlengthsh,& getkf,getkf_inflation,denkf,nbackgrounds,nobsl_max,& - neigv,vlocal_evecs,dfs_sort + neigv,vlocal_evecs,dfs_sort,mincorrlength_fact use gridinfo, only: nlevs_pres,lonsgrd,latsgrd,logp,npts,gridloc use kdtree2_module, only: kdtree2, kdtree2_create, kdtree2_destroy, & kdtree2_result, kdtree2_n_nearest, kdtree2_r_nearest @@ -135,13 +135,16 @@ subroutine letkf_update() integer(i_kind) nob,nf,nanal,nens,& i,nlev,nrej,npt,nn,nnmax,ierr integer(i_kind) nobsl, ngrd1, nobsl2, nthreads, nb, & - nobslocal_min,nobslocal_max, & - nobslocal_minall,nobslocal_maxall + nobslocal_mean,nobslocal_min,nobslocal_max, & + nobslocal_meanall,nobslocal_minall,nobslocal_maxall +real(r_single) robslocal_mean,robslocal_min,robslocal_max,re, & + robslocal_meanall,robslocal_minall,robslocal_maxall,& + coslatslocal_meanall, coslatslocal_mean, coslat integer(i_kind),allocatable,dimension(:) :: oindex -real(r_single) :: deglat, dist, corrsq, oberrfact, trpa, trpa_raw +real(r_single) :: deglat, dist, corrsq, trpa, trpa_raw, maxdfs real(r_double) :: t1,t2,t3,t4,t5,tbegin,tend,tmin,tmax,tmean real(r_kind) r_nanals,r_nanalsm1 -real(r_kind) normdepart, pnge, width +real(r_kind) normdepart, pnge, width, mincorrlength_factsq real(r_kind),dimension(nobstot):: oberrvaruse real(r_kind) vdist real(r_kind) corrlength @@ -152,7 +155,7 @@ subroutine letkf_update() real(r_single),allocatable,dimension(:,:,:) :: ens_tmp real(r_single),allocatable,dimension(:,:) :: wts_ensperts,pa real(r_single),allocatable,dimension(:) :: dfs,wts_ensmean -real(r_kind),allocatable,dimension(:) :: rdiag,rloc +real(r_kind),allocatable,dimension(:) :: rdiag,rloc,robs_local,coslats_local real(r_single),allocatable,dimension(:) :: dep ! kdtree stuff type(kdtree2_result),dimension(:),allocatable :: sresults @@ -160,6 +163,7 @@ subroutine letkf_update() real(r_kind) eps eps = epsilon(0.0_r_single) ! real(4) machine precision +re = rearth/1.e3_r_single !$omp parallel nthreads = omp_get_num_threads() @@ -170,6 +174,7 @@ subroutine letkf_update() ! define a few frequently used parameters r_nanals=one/float(nanals) r_nanalsm1=one/float(nanals-1) +mincorrlength_factsq = mincorrlength_fact**2 kdobs=associated(kdtree_obs2) if (.not. kdobs .and. nproc .eq. 0) then @@ -258,17 +263,34 @@ subroutine letkf_update() t4 = zero t5 = zero tbegin = mpi_wtime() + nobslocal_max = -999 nobslocal_min = nobstot +nobslocal_mean = 0 +allocate(robs_local(npts_max)) +robs_local = 0 +if (nobsl_max > 0) then + allocate(coslats_local(npts_max)) + coslats_local = 0 +endif ! Update ensemble on model grid. ! Loop for each horizontal grid points on this task. -!$omp parallel do schedule(dynamic) private(npt,nob,nobsl, & -!$omp nobsl2,oberrfact,ngrd1,corrlength,ens_tmp, & -!$omp nf,vdist,obens,indxassim,indxob, & +!$omp parallel do schedule(dynamic) default(none) private(npt,nob,nobsl, & +!$omp nobsl2,ngrd1,corrlength,ens_tmp,coslat, & +!$omp nf,vdist,obens,indxassim,indxob,maxdfs, & !$omp nn,hxens,wts_ensmean,dfs,rdiag,dep,rloc,i, & -!$omp oindex,deglat,dist,corrsq,nb,sresults, & -!$omp wts_ensperts,pa,trpa,trpa_raw) & +!$omp oindex,deglat,dist,corrsq,nb,nlev,nanal,sresults, & +!$omp wts_ensperts,pa,trpa,trpa_raw) shared(anal_ob, & +!$omp anal_ob_modens,anal_chunk,obsprd_post,obsprd_prior, & +!$omp oberrvar,oberrvaruse,nobsl_max,grdloc_chunk, & +!$omp obloc,corrlengthnh,corrlengthsh,corrlengthtr,& +!$omp vlocal_evecs,vlocal,oblnp,lnp_chunk,lnsigl,corrlengthsq,& +!$omp getkf,denkf,getkf_inflation,ensmean_chunk,ob,ensmean_ob, & +!$omp nproc,numptsperproc,nnmax,r_nanalsm1,kdtree_obs2,kdobs, & +!$omp mincorrlength_factsq,robs_local,coslats_local, & +!$omp lupd_obspace_serial,eps,dfs_sort,nanals,index_pres,& +!$omp neigv,nlevs,lonsgrd,latsgrd,nobstot,nens,ncdim,nbackgrounds,indxproc,rad2deg) & !$omp reduction(+:t1,t2,t3,t4,t5) & !$omp reduction(max:nobslocal_max) & !$omp reduction(min:nobslocal_min) @@ -279,6 +301,7 @@ subroutine letkf_update() ! find obs close to this grid point (using kdtree) ngrd1=indxproc(nproc+1,npt) deglat = latsgrd(ngrd1)*rad2deg + coslat = cos(latsgrd(ngrd1)) corrlength=latval(deglat,corrlengthnh,corrlengthtr,corrlengthsh) corrsq = corrlength**2 allocate(sresults(nobstot)) @@ -304,29 +327,26 @@ subroutine letkf_update() allocate(indxob(nobstot)) ! calculate integrated 1-DFS for each ob in local volume nobsl = 0 + maxdfs = -9.9e31 do nob=1,nobstot rloc(nob) = sum((obloc(:,nob)-grdloc_chunk(:,npt))**2,1) - dist = sqrt(rloc(nob)/corrlengthsq(nob)) + dist = sqrt(rloc(nob)/corrsq) if (dist < 1.0 - eps .and. & oberrvaruse(nob) < 1.e10_r_single) then nobsl = nobsl + 1 indxob(nobsl) = nob - oberrfact = taper(dist) - if (lupd_obspace_serial) then - ! use updated ensemble in ob space to estimate DFS - !dfs(nobsl) = obsprd_post(nob)/obsprd_prior(nob) - ! weight by distance to analysis point - dfs(nobsl) = oberrfact*obsprd_post(nob)/obsprd_prior(nob) - else - ! estimate DFS assuming each ob assimilated independently, one - ! at a time. - ! 1-DFS = HP_aH^T/HP_bH^T = R/(HP_bH^T + R) - dfs(nobsl) = (oberrvaruse(nob)/oberrfact)/((oberrvar(nob)/oberrfact)+obsprd_prior(nob)) - endif + ! use updated ensemble in ob space to compute DFS + ! DFS = Tr(R**-1*HPaHT) = dy_a/dy_o see eqn 4 in Liu et al 2009 + ! https://rmets.onlinelibrary.wiley.com/doi/epdf/10.1002/qj.511 + dfs(nobsl) = obsprd_post(nob)/oberrvaruse(nob) + ! use spread reduction instead. + !dfs(nobsl) = obsprd_post(nob)/obsprd_prior(nob) + !if (dfs(nobsl) > maxdfs) maxdfs = dfs(nobsl) endif enddo - ! sort on 1-DFS + ! sort on max(DFS)-DFS allocate(indxassim(nobsl)) + dfs = maxdfs-dfs call quicksort(nobsl,dfs(1:nobsl),indxassim) nobsl2 = min(nobsl_max,nobsl) do nob=1,nobsl2 @@ -345,7 +365,6 @@ subroutine letkf_update() else ! brute force search call find_localobs(grdloc_chunk(:,npt),obloc,corrsq,nobstot,nobsl_max,sresults,nobsl) - nobsl_max = nobsl endif !if (nproc == 0 .and. npt == 1) then ! do nob=1,nobsl @@ -372,6 +391,12 @@ subroutine letkf_update() if (allocated(ens_tmp)) deallocate(ens_tmp) cycle grdloop endif + if (nobsl_max > 0) then + robs_local(npt) = sqrt(sresults(nobsl)%dis) + coslats_local(npt) = coslat + else + robs_local(npt) = nobsl + endif ! Loop through vertical levels (nnmax=1 if no vertical localization) verloop: do nn=1,nnmax @@ -390,7 +415,20 @@ subroutine letkf_update() else vdist = zero endif - dist = sqrt(sresults(nob)%dis/corrlengthsq(nf)+vdist*vdist) + if (nobsl_max > 0 .and. corrlength < 0) then + ! if corrlength<0, set R localization scale to be max distance to find nobsl_max obs + ! (unless max distance is > abs(corrlength) or < abs(corrlength)/10) + if (sresults(nobsl)%dis > corrsq) then + dist = sqrt(sresults(nob)%dis/corrsq+vdist*vdist) + else if (sresults(nobsl)%dis < corrsq*mincorrlength_factsq) then + dist = sqrt(sresults(nob)%dis/(corrsq/mincorrlength_factsq)+vdist*vdist) + else + dist = sqrt(sresults(nob)%dis/sresults(nobsl)%dis+vdist*vdist) + endif + else + ! set R localization scale to specificed distance + dist = sqrt(sresults(nob)%dis/corrsq+vdist*vdist) + endif if (dist >= one) cycle rloc(nobsl2)=taper(dist) oindex(nobsl2)=nf @@ -490,7 +528,9 @@ subroutine letkf_update() ! make sure posterior perturbations still have zero mean. ! (roundoff errors can accumulate) -!$omp parallel do schedule(dynamic) private(npt,nb,i) +!$omp parallel do schedule(dynamic) default(none) private(npt,nb,i) & +!$omp shared(anal_chunk,r_nanals,nanals,& +!$omp npts_max,nbackgrounds,ncdim) do npt=1,npts_max do nb=1,nbackgrounds do i=1,ncdim @@ -529,10 +569,35 @@ subroutine letkf_update() call mpi_reduce(t5,tmin,1,mpi_real8,mpi_min,0,mpi_comm_world,ierr) call mpi_reduce(t5,tmax,1,mpi_real8,mpi_max,0,mpi_comm_world,ierr) if (nproc .eq. 0) print *,',min/max/mean t5 = ',tmin,tmax,tmean + +if (nobsl_max > 0) then + ! compute and print min/max/mean search radius to find nobsl_max + robslocal_mean = sum(robs_local*coslats_local)/numptsperproc(nproc+1) + coslatslocal_mean = sum(coslats_local)/numptsperproc(nproc+1) + robslocal_min = minval(robs_local(1:numptsperproc(nproc+1))) + robslocal_max = maxval(robs_local(1:numptsperproc(nproc+1))) + call mpi_reduce(robslocal_max,robslocal_maxall,1,mpi_real4,mpi_max,0,mpi_comm_world,ierr) + call mpi_reduce(robslocal_min,robslocal_minall,1,mpi_real4,mpi_min,0,mpi_comm_world,ierr) + call mpi_reduce(robslocal_mean,robslocal_meanall,1,mpi_real4,mpi_sum,0,mpi_comm_world,ierr) + call mpi_reduce(coslatslocal_mean,coslatslocal_meanall,1,mpi_real4,mpi_sum,0,mpi_comm_world,ierr) + if (nproc == 0) print *,'min/max/mean distance searched for local obs',re*robslocal_minall,re*robslocal_maxall,re*robslocal_meanall/coslatslocal_meanall + deallocate(coslats_local) +else + ! compute and print min/max/mean number of obs found within search radius + nobslocal_mean = nint(sum(robs_local)/numptsperproc(nproc+1)) + nobslocal_min = minval(robs_local(1:numptsperproc(nproc+1))) + nobslocal_max = maxval(robs_local(1:numptsperproc(nproc+1))) + call mpi_reduce(nobslocal_max,nobslocal_maxall,1,mpi_integer,mpi_max,0,mpi_comm_world,ierr) + call mpi_reduce(nobslocal_min,nobslocal_minall,1,mpi_integer,mpi_min,0,mpi_comm_world,ierr) + call mpi_reduce(nobslocal_mean,nobslocal_meanall,1,mpi_integer,mpi_sum,0,mpi_comm_world,ierr) + if (nproc == 0) print *,'min/max/mean number of obs in local volume',nobslocal_minall,nobslocal_maxall,nint(nobslocal_meanall/float(numproc)) +endif call mpi_reduce(nobslocal_max,nobslocal_maxall,1,mpi_integer,mpi_max,0,mpi_comm_world,ierr) call mpi_reduce(nobslocal_min,nobslocal_minall,1,mpi_integer,mpi_max,0,mpi_comm_world,ierr) if (nproc == 0) print *,'min/max number of obs in local volume',nobslocal_minall,nobslocal_maxall + if (nrej > 0 .and. nproc == 0) print *, nrej,' obs rejected by varqc' +deallocate(robs_local) if (allocated(ens_tmp)) deallocate(ens_tmp) diff --git a/src/enkf/loadbal.f90 b/src/enkf/loadbal.f90 index 595ef20277..ff99bc0736 100644 --- a/src/enkf/loadbal.f90 +++ b/src/enkf/loadbal.f90 @@ -383,7 +383,7 @@ subroutine scatter_chunks ! allocate array to hold pieces of state vector on each proc. allocate(anal_chunk(nanals,npts_max,ncdim,nbackgrounds)) -if (nproc == 0) print *,'anal_chunk size = ',size(anal_chunk) +if (nproc == 0) print *,'anal_chunk size = ',size(anal_chunk,kind=8) allocate(anal_chunk_prior(nanals,npts_max,ncdim,nbackgrounds)) allocate(ensmean_chunk(npts_max,ncdim,nbackgrounds)) diff --git a/src/enkf/mpi_readobs.f90 b/src/enkf/mpi_readobs.f90 index bca5d7c715..e48f5a1804 100644 --- a/src/enkf/mpi_readobs.f90 +++ b/src/enkf/mpi_readobs.f90 @@ -250,7 +250,18 @@ subroutine mpi_getobs(obspath, datestring, nobs_conv, nobs_oz, nobs_sat, nobs_to ! exchange obs prior ensemble members across all tasks to fully populate shared ! memory array pointer on each node. if (nproc_shm == 0) then - call mpi_allreduce(mpi_in_place,anal_ob,nanals*nobs_tot,mpi_real4,mpi_sum,mpi_comm_shmemroot,ierr) + if (real(nanals)*real(nobs_tot) < 2**32/2. - 1) then + call mpi_allreduce(mpi_in_place,anal_ob,nanals*nobs_tot,mpi_real4,mpi_sum,mpi_comm_shmemroot,ierr) + else + ! count won't fit in 32-bit integer and mpi_allreduce doesn't handle + ! 64 bit counts. Split up into smaller chunks. + mem_ob = 0. + do na=1,nanals + mem_ob(:) = anal_ob(na,:) + call mpi_allreduce(mpi_in_place,mem_ob,nobs_tot,mpi_real4,mpi_sum,mpi_comm_shmemroot,ierr) + anal_ob(na,:) = mem_ob(:) + enddo + endif !print *,nproc,'min/max anal_ob',minval(anal_ob),maxval(anal_ob) if (neigv > 0) then mem_ob_modens = 0. diff --git a/src/enkf/params.f90 b/src/enkf/params.f90 index 6a3a977f56..e46bfa195b 100644 --- a/src/enkf/params.f90 +++ b/src/enkf/params.f90 @@ -115,6 +115,9 @@ module params real(r_single),public :: covinflatemax,covinflatemin,smoothparm,biasvar real(r_single),public :: corrlengthnh,corrlengthtr,corrlengthsh real(r_single),public :: obtimelnh,obtimeltr,obtimelsh +! factor for minimum allowed horiz cov length scale +! to apply for LETKF when corrlengthnh,tr,sh < 0 and nobsl_max > 0 +real(r_single),public :: mincorrlength_fact = 0.1 real(r_single),public :: zhuberleft,zhuberright real(r_single),public :: lnsigcutoffnh,lnsigcutofftr,lnsigcutoffsh,& lnsigcutoffsatnh,lnsigcutoffsattr,lnsigcutoffsatsh,& @@ -129,7 +132,10 @@ module params real(r_single),public :: tar_minlat,tar_maxlat,tar_minlon,tar_maxlon real(r_single),public :: covl_minfact, covl_efold -real(r_single),public :: covinflatenh,covinflatesh,covinflatetr,lnsigcovinfcutoff +real(r_single),public :: covinflatenh=0 +real(r_single),public :: covinflatetr=0 +real(r_single),public :: covinflatesh=0 +real(r_single),public :: lnsigcovinfcutoff ! if npefiles=0, diag files are read (concatenated pe* files written by gsi) ! if npefiles>0, npefiles+1 pe* files read directly ! the pe* files are assumed to be located in /gsitmp_mem### @@ -245,10 +251,12 @@ module params ! for writing increments logical,public :: write_fv3_incr = .false. character(len=12),dimension(10),public :: incvars_to_zero='NONE' !just picking 10 arbitrarily +! write ensemble mean analysis (or analysis increment) +logical,public :: write_ensmean = .false. namelist /nam_enkf/datestring,datapath,iassim_order,nvars,& covinflatemax,covinflatemin,deterministic,sortinc,& - corrlengthnh,corrlengthtr,corrlengthsh,& + mincorrlength_fact,corrlengthnh,corrlengthtr,corrlengthsh,& varqc,huber,nlons,nlats,smoothparm,use_qsatensmean,& readin_localization, zhuberleft,zhuberright,& obtimelnh,obtimeltr,obtimelsh,reducedgrid,& @@ -273,7 +281,7 @@ module params eft,wmoist,adrate,andataname,& gdatehr,datehr,& tar_minlat,tar_maxlat,tar_minlon,tar_maxlon,tar_minlev,tar_maxlev,& - fv3_native, paranc, nccompress, write_fv3_incr,incvars_to_zero, & + fv3_native, paranc, nccompress, write_fv3_incr,incvars_to_zero,write_ensmean, & corrlengthrdrnh,corrlengthrdrsh,corrlengthrdrtr,& lnsigcutoffrdrnh,lnsigcutoffrdrsh,lnsigcutoffrdrtr,& l_use_enkf_directZDA @@ -664,6 +672,10 @@ subroutine read_namelist() letkf_flag) then print *,'warning: no time localization in LETKF!' endif + if ((write_ensmean .and. pseudo_rh) .and. .not. use_qsatensmean) then + print *,'write_ensmean=T requires use_qsatensmean=T when pseudo_rh=T' + call stop2(19) + endif print *, trim(adjustl(datapath)) diff --git a/src/enkf/readconvobs.f90 b/src/enkf/readconvobs.f90 index 8c0f7ea958..e1977298a6 100644 --- a/src/enkf/readconvobs.f90 +++ b/src/enkf/readconvobs.f90 @@ -335,8 +335,8 @@ subroutine get_num_convobs_nc(obspath,datestring,num_obs_tot,num_obs_totdiag,id) errorlimit2=errorlimit2_obs - if (obtype == 'gps' ) then - if (GPS_Type(i)==1) errorlimit2=errorlimit2_bnd + if (obtype == 'gps') then + if (GPS_Type(i)==1) errorlimit2=errorlimit2_bnd endif ! for q, normalize by qsatges @@ -664,7 +664,7 @@ subroutine get_convobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & do i = 1, nobs nobdiag = nobdiag + 1 ! special handling for error limits for GPS bend angle - if (obtype == 'gps' ) then + if (obtype == 'gps') then if (GPS_Type(i)==1) errorlimit2=errorlimit2_bnd endif diff --git a/src/enkf/readozobs.f90 b/src/enkf/readozobs.f90 index efd79b1c8c..efebb00855 100644 --- a/src/enkf/readozobs.f90 +++ b/src/enkf/readozobs.f90 @@ -926,7 +926,7 @@ end subroutine write_ozobs_data_bin subroutine write_ozobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & x_fit, x_sprd, x_used, id, gesid) use netcdf, only: nf90_inq_dimid, nf90_open, nf90_close, NF90_NETCDF4, & - nf90_inquire_dimension, NF90_WRITE, nf90_create, nf90_def_dim + nf90_inquire_dimension, NF90_WRITE, NF90_NOWRITE, nf90_create, nf90_def_dim use ncdw_climsg, only: nclayer_check use constants, only: r_missing @@ -972,7 +972,7 @@ subroutine write_ozobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & inquire(file=obsfile,exist=fexist) if (.not. fexist) cycle peloop - call nclayer_check(nf90_open(obsfile, NF90_WRITE, iunit)) + call nclayer_check(nf90_open(obsfile, NF90_NOWRITE, iunit)) call nclayer_check(nf90_inq_dimid(iunit, "nobs", nobsid)) call nclayer_check(nf90_inquire_dimension(iunit, nobsid, len = nobs)) call nclayer_check(nf90_close(iunit)) diff --git a/src/enkf/readsatobs.f90 b/src/enkf/readsatobs.f90 index 44923d2c38..df0534fc90 100644 --- a/src/enkf/readsatobs.f90 +++ b/src/enkf/readsatobs.f90 @@ -1260,7 +1260,7 @@ end subroutine write_satobs_data_bin subroutine write_satobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & x_fit, x_sprd, x_used, id, gesid) use netcdf, only: nf90_inq_dimid, nf90_open, nf90_close, NF90_NETCDF4, & - nf90_inquire_dimension, NF90_WRITE, nf90_create, nf90_def_dim + nf90_inquire_dimension, NF90_WRITE, NF90_NOWRITE, nf90_create, nf90_def_dim use ncdw_climsg, only: nclayer_check use radinfo, only: iuse_rad,nusis,jpch_rad @@ -1326,7 +1326,7 @@ subroutine write_satobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & if (.not. fexist) cycle peloop - call nclayer_check(nf90_open(obsfile, NF90_WRITE, iunit)) + call nclayer_check(nf90_open(obsfile, NF90_NOWRITE, iunit)) call nclayer_check(nf90_inq_dimid(iunit, "nobs", nobsid)) call nclayer_check(nf90_inquire_dimension(iunit, nobsid, len = nobs)) call nclayer_check(nf90_close(iunit)) diff --git a/src/gsi/gsi_4dvar.f90 b/src/gsi/gsi_4dvar.f90 index d955bd57d1..e4038dc9ba 100644 --- a/src/gsi/gsi_4dvar.f90 +++ b/src/gsi/gsi_4dvar.f90 @@ -435,8 +435,9 @@ subroutine time_4dvar(idate,step4d) integer(i_kind),intent(in ) :: idate ! Date (yyyymmddhh) real(r_kind) ,intent( out) :: step4d ! Time since start of 4D-Var window (hours) -integer(i_kind) iyr,imo,idy,ihr,nmin_obs,nhrobs,nhrbgn,nhroff +integer(i_kind) iyr,imo,idy,ihr,nmin_obs integer(i_kind),dimension(5) :: idate5 +real(r_kind) nhroff,nhrbgn,nhrobs ihr=idate iyr=ihr/1000000 @@ -457,7 +458,7 @@ subroutine time_4dvar(idate,step4d) end if nhrobs=nmin_obs*r60inv -nhrbgn=NINT(real(iwinbgn,r_kind)*r60inv) +nhrbgn=real(iwinbgn,r_kind)*r60inv nhroff=nhrobs-nhrbgn step4d=real(nhroff,r_kind) diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index 1c8b73841f..0c39ffb04d 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -145,7 +145,7 @@ module gsimod n_ens,nlon_ens,nlat_ens,jcap_ens,jcap_ens_test,oz_univ_static,& regional_ensemble_option,fv3sar_ensemble_opt,merge_two_grid_ensperts, & full_ensemble,pseudo_hybens,pwgtflg,& - beta_s0,s_ens_h,s_ens_v,init_hybrid_ensemble_parameters,& + beta_s0,beta_e0,s_ens_h,s_ens_v,init_hybrid_ensemble_parameters,& readin_localization,write_ens_sprd,eqspace_ensgrid,grid_ratio_ens,& readin_beta,use_localization_grid,use_gfs_ens,q_hyb_ens,i_en_perts_io, & l_ens_in_diff_time,ensemble_path,ens_fast_read,sst_staticB @@ -1268,6 +1268,9 @@ module gsimod ! beta_s(:) = beta_s0 , vertically varying weights given to static B ; ! beta_e(:) = 1 - beta_s0 , vertically varying weights given ensemble derived covariance. ! If (readin_beta) then beta_s and beta_e are read from a file and beta_s0 is not used. +! beta_e0 - default weight given to ensemble background error covariance +! (if .not. readin_beta). if beta_e0<0, then it is set to +! 1.-beta_s0 (this is the default) ! s_ens_h - homogeneous isotropic horizontal ensemble localization scale (km) ! s_ens_v - vertical localization scale (grid units for now) ! s_ens_h, s_ens_v, and beta_s0 are tunable parameters. @@ -1312,7 +1315,7 @@ module gsimod ! namelist/hybrid_ensemble/l_hyb_ens,uv_hyb_ens,q_hyb_ens,aniso_a_en,generate_ens,n_ens,nlon_ens,nlat_ens,jcap_ens,& pseudo_hybens,merge_two_grid_ensperts,regional_ensemble_option,fv3sar_bg_opt,fv3sar_ensemble_opt,full_ensemble,pwgtflg,& - jcap_ens_test,beta_s0,s_ens_h,s_ens_v,readin_localization,eqspace_ensgrid,readin_beta,& + jcap_ens_test,beta_s0,beta_e0,s_ens_h,s_ens_v,readin_localization,eqspace_ensgrid,readin_beta,& grid_ratio_ens, & oz_univ_static,write_ens_sprd,use_localization_grid,use_gfs_ens, & i_en_perts_io,l_ens_in_diff_time,ensemble_path,ens_fast_read,sst_staticB diff --git a/src/gsi/hybrid_ensemble_isotropic.F90 b/src/gsi/hybrid_ensemble_isotropic.F90 index e0a6e3fd1f..23a21cd8e5 100644 --- a/src/gsi/hybrid_ensemble_isotropic.F90 +++ b/src/gsi/hybrid_ensemble_isotropic.F90 @@ -4001,7 +4001,7 @@ subroutine hybens_localization_setup use gfs_stratosphere, only: use_gfs_stratosphere,blend_rm use hybrid_ensemble_parameters, only: grd_ens,jcap_ens,n_ens,grd_loc,sp_loc,& nval_lenz_en,regional_ensemble_option - use hybrid_ensemble_parameters, only: readin_beta,beta_s,beta_e,beta_s0,sqrt_beta_s,sqrt_beta_e + use hybrid_ensemble_parameters, only: readin_beta,beta_s,beta_e,beta_s0,beta_e0,sqrt_beta_s,sqrt_beta_e use hybrid_ensemble_parameters, only: readin_localization,create_hybens_localization_parameters, & vvlocal,s_ens_h,s_ens_hv,s_ens_v,s_ens_vv use gsi_io, only: verbose @@ -4067,7 +4067,11 @@ subroutine hybens_localization_setup if ( .not. readin_beta ) then ! assign all levels to same value, sum = 1.0 beta_s = beta_s0 - beta_e = one - beta_s0 + if (beta_e0 < 0) then + beta_e = one - beta_s0 + else + beta_e = beta_e0 + endif endif if ( regional_ensemble_option == 2 .and. use_gfs_stratosphere .and. .not. readin_beta ) then diff --git a/src/gsi/hybrid_ensemble_parameters.f90 b/src/gsi/hybrid_ensemble_parameters.f90 index 9ea28c9ee8..61723bbc65 100644 --- a/src/gsi/hybrid_ensemble_parameters.f90 +++ b/src/gsi/hybrid_ensemble_parameters.f90 @@ -87,6 +87,9 @@ module hybrid_ensemble_parameters ! relative weight given to static background B when (readin_beta=.false.) ! when (readin_beta=.true.), the vertical weighting parameters are read from a file, ! instead of being defined based on beta_s0 namelist or default value. +! beta_e0 - default weight given to ensemble background error covariance +! (if .not. readin_beta). if beta_e0<0, then it is set to +! 1.-beta_s0 (this is the default) ! s_ens_h: horizontal localization correlation length (units of km), default = 2828.0 ! s_ens_v: vertical localization correlation length (grid units), default = 30.0 ! generate_ens: if .true., generate ensemble perturbations internally as random samples of background B. @@ -255,7 +258,7 @@ module hybrid_ensemble_parameters ! set passed variables to public public :: generate_ens,n_ens,nlon_ens,nlat_ens,jcap_ens,jcap_ens_test,l_hyb_ens,& s_ens_h,oz_univ_static,vvlocal - public :: uv_hyb_ens,q_hyb_ens,s_ens_v,beta_s0,aniso_a_en,s_ens_hv,s_ens_vv + public :: uv_hyb_ens,q_hyb_ens,s_ens_v,beta_s0,beta_e0,aniso_a_en,s_ens_hv,s_ens_vv public :: readin_beta,beta_s,beta_e public :: readin_localization public :: eqspace_ensgrid,grid_ratio_ens @@ -309,7 +312,7 @@ module hybrid_ensemble_parameters logical ens_fast_read integer(i_kind) i_en_perts_io integer(i_kind) n_ens,nlon_ens,nlat_ens,jcap_ens,jcap_ens_test - real(r_kind) beta_s0,s_ens_h,s_ens_v,grid_ratio_ens + real(r_kind) beta_s0,beta_e0,s_ens_h,s_ens_v,grid_ratio_ens type(sub2grid_info),save :: grd_ens,grd_loc,grd_sploc,grd_anl,grd_e1,grd_a1 type(spec_vars),save :: sp_ens,sp_loc type(egrid2agrid_parm),save :: p_e2a,p_sploc2ens @@ -401,6 +404,7 @@ subroutine init_hybrid_ensemble_parameters jcap_ens_test=0 nlon_ens=0 beta_s0=one + beta_e0=-one grid_ratio_ens=one s_ens_h = 2828._r_kind ! km (this was optimal value in ! Wang, X.,D. M. Barker, C. Snyder, and T. M. Hamill, 2008: A hybrid diff --git a/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/fv3_interface.f90 b/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/fv3_interface.f90 index 2eb31b836e..e4e4a466cd 100644 --- a/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/fv3_interface.f90 +++ b/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/fv3_interface.f90 @@ -133,6 +133,7 @@ subroutine fv3_calc_increment(mype) integer :: j, k ! loop indices within a variable integer :: ivar !! loop index over variables in input_vars & output_vars + real :: taper ! Formats for print statements: 100 format(A,': ',A) @@ -185,6 +186,9 @@ subroutine fv3_calc_increment(mype) an_grid%ilev(k) = real(k) an_grid%hyai(k) = real(k) an_grid%hybi(k) = real(k) + an_grid%ak(k) = meta_ncio%vcoord(k,1) + an_grid%bk(k) = meta_ncio%vcoord(k,2) + an_grid%ck(k) = 0 end do nzp1_init ! Deallocate entire grid. @@ -240,8 +244,26 @@ subroutine fv3_calc_increment(mype) ! Subtract and write an_grid%var3d = an_grid%var3d - fg_grid%var3d + if (mype == 0) print *,trim(input_vars(ivar)),minval(an_grid%var3d),maxval(an_grid%var3d) endif zero_or_read + ! taper humidity, microphysics increments in stratosphere + if (taper_strat .and. (trim(input_vars(ivar)) == 'spfh' .or. & + trim(input_vars(ivar)) == 'icmr' .or. & + trim(input_vars(ivar)) == 'clwmr')) then + if (mype == 0) print *,'k,ak,bk,taper,min/max increment for ',trim(input_vars(ivar)) + do k=1,an_grid%nz + taper = 1.0 + if (k < an_grid%nz/2 .and. (an_grid%ak(k) <= ak_bot .and. an_grid%ak(k) >= ak_top)) then + taper = (an_grid%ak(k) - ak_top)/(ak_bot - ak_top) + else if (an_grid%bk(k) .eq. 0. .and. an_grid%ak(k) < ak_top) then + taper = 0. + endif + an_grid%var3d(:,:,k) = an_grid%var3d(:,:,k)*taper + if (mype == 0) print *,k,an_grid%ak(k),an_grid%bk(k),taper,minval(an_grid%var3d(:,:,k)),maxval(an_grid%var3d(:,:,k)) + enddo + endif + call fv3_netcdf_write_var3d(ncdat,output_vars(ivar),an_grid%var3d) enddo var_loop diff --git a/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/gfs_ncio_interface.f90 b/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/gfs_ncio_interface.f90 index 4d3d07236b..ddabc66a40 100644 --- a/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/gfs_ncio_interface.f90 +++ b/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/gfs_ncio_interface.f90 @@ -137,6 +137,8 @@ subroutine gfs_ncio_initialize(meta_ncio,filename) allocate(meta_ncio%lon(meta_ncio%dimx*meta_ncio%dimy)) if (.not. allocated(meta_ncio%lat)) & allocate(meta_ncio%lat(meta_ncio%dimx*meta_ncio%dimy)) + if (.not. allocated(meta_ncio%vcoord)) & + allocate(meta_ncio%vcoord(meta_ncio%dimz+1,2)) call read_vardata(gfile,'lon', tmp2d) meta_ncio%lon = reshape(tmp2d, (/meta_ncio%dimx*meta_ncio%dimy/)) call read_vardata(gfile,'lat', tmp2d) @@ -148,6 +150,10 @@ subroutine gfs_ncio_initialize(meta_ncio,filename) meta_ncio%idvm=1 meta_ncio%ntrac = 8 meta_ncio%ncldt = 5 + call read_attribute(gfile,'ak',tmp1d) + meta_ncio%vcoord(:,1) = tmp1d(:) + call read_attribute(gfile,'bk',tmp1d) + meta_ncio%vcoord(:,2) = tmp1d(:) call read_vardata(gfile,'time',tmp1d) meta_ncio%fhour = nint(tmp1d(1)) diff --git a/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/namelist_def.f90 b/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/namelist_def.f90 index 4f20d219e9..c0ebc34e7e 100644 --- a/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/namelist_def.f90 +++ b/util/EnKF/gfs/src/calc_increment_ens_ncio.fd/namelist_def.f90 @@ -8,7 +8,7 @@ module namelist_def public :: analysis_filename, firstguess_filename, increment_filename public :: datapath public :: debug - public :: do_icmr + public :: do_icmr, taper_strat, ak_bot, ak_top public :: incvars_to_zero public :: read_namelist public :: write_namelist @@ -26,9 +26,13 @@ module namelist_def character(len=12) :: incvars_to_zero(max_vars) = 'NONE' logical :: do_icmr = .false. + logical :: taper_strat = .false. + ! damp humidity increments between these two levels if taper_strat=T + real :: ak_bot = 10000. ! units Pa + real :: ak_top = 5000. namelist /setup/ datapath, analysis_filename, firstguess_filename, increment_filename, & - nens, debug, imp_physics + nens, debug, imp_physics, ak_top, ak_bot, taper_strat namelist /zeroinc/ incvars_to_zero contains diff --git a/util/EnKF/gfs/src/calc_increment_ncio.fd/calc_increment_ncio.f90 b/util/EnKF/gfs/src/calc_increment_ncio.fd/calc_increment_ncio.f90 index dd14663ef5..4928a62e6c 100755 --- a/util/EnKF/gfs/src/calc_increment_ncio.fd/calc_increment_ncio.f90 +++ b/util/EnKF/gfs/src/calc_increment_ncio.fd/calc_increment_ncio.f90 @@ -21,6 +21,14 @@ PROGRAM calc_increment_ncio ! 4th command line arg is logical for controlling whether microphysics ! increment is computed. +! 5th command line arg is logical for controlling whether delz +! increment should be computed +! 6th command line arg is logical for controlling whether humidity +! and microphysics vars should be tapered to zero in stratosphere. +! The vertical profile of the taper is controlled by ak_top and ak_bot. + +! If delp and/or delz are not in the background history files, then +! their increments are inferred (from ps, T and humidity increments). ! ! attributes: ! language: f95 @@ -48,21 +56,24 @@ PROGRAM calc_increment_ncio real, allocatable, dimension(:,:) :: values_2d_fg,values_2d_anal,values_2d_inc,& ps_fg, ps_anal real, allocatable, dimension(:,:,:) :: values_3d_fg,values_3d_anal,values_3d_inc,& - q_fg, q_anal, tmp_fg, tmp_anal, delzb, delza + taper_vert,q_fg, q_anal, tmp_fg, tmp_anal, delzb, delza type(Dataset) :: dset_anal,dset_fg type(Dimension) :: londim,latdim,levdim integer, dimension(3) :: dimid_3d integer, dimension(1) :: dimid_1d integer varid_lon,varid_lat,varid_lev,varid_ilev,varid_hyai,varid_hybi,& dimid_lon,dimid_lat,dimid_lev,dimid_ilev,ncfileid,ncstatus - logical :: no_mpinc, no_delzinc, has_dpres, has_delz + logical :: no_mpinc, no_delzinc, has_dpres, has_delz, taper_strat character(len=10) :: bufchar - real rd,rv,fv,grav + real rd,rv,fv,grav,ak_bot,ak_top rd = 2.8705e+2 rv = 4.6150e+2 fv = rv/rd-1. ! used in virtual temperature equation grav = 9.80665 + ! damp humidity increments between these two levels if taper_strat=T + ak_bot = 10000. ! units Pa + ak_top = 5000. call getarg(1,filename_fg) ! first guess ncio file call getarg(2,filename_anal) ! analysis ncio file @@ -71,6 +82,8 @@ PROGRAM calc_increment_ncio read(bufchar,'(L)') no_mpinc ! if T, no microphysics increments computed call getarg(5, bufchar) read(bufchar,'(L)') no_delzinc ! if T, no delz increments computed + call getarg(6, bufchar) + read(bufchar,'(L)') taper_strat ! if T, taper sphum,liq_wat,ice_wat in strat write(6,*)'CALC_INCREMENT_NCIO:' write(6,*)'filename_fg=',trim(filename_fg) @@ -78,6 +91,7 @@ PROGRAM calc_increment_ncio write(6,*)'filename_inc=',trim(filename_inc) write(6,*)'no_mpinc',no_mpinc write(6,*)'no_delzinc',no_delzinc + write(6,*)'taper_strat',taper_strat dset_fg = open_dataset(trim(filename_fg),errcode=iret) if (iret .ne. 0) then @@ -259,6 +273,7 @@ PROGRAM calc_increment_ncio ! ps increment. allocate(values_2d_inc(nlons,nlats)) + allocate(taper_vert(nlons,nlats,nlevs)) allocate(values_3d_inc(nlons,nlats,nlevs)) do nvar=1,dset_fg%nvars ndims = dset_fg%variables(nvar)%ndims @@ -269,6 +284,19 @@ PROGRAM calc_increment_ncio values_2d_inc(:,nlats:1:-1) = values_2d_anal - values_2d_fg endif enddo + ! taper function for humidity, ice and liq water increments. + taper_vert=1. + if (taper_strat) print *,'profile to taper strat humid inc (k,ak,bk,taper):' + do k=1,nlevs + if (k < nlevs/2 .and. (ak(k) <= ak_bot .and. ak(k) >= ak_top)) then + taper_vert(:,:,k)= (ak(k) - ak_top)/(ak_bot - ak_top) + else if (bk(k) .eq. 0. .and. ak(k) < ak_top) then + taper_vert(:,:,k) = 0. + endif + if (taper_strat) then + print *,k,ak(k),bk(k),taper_vert(1,1,k) + endif + enddo do nvar=1,dset_fg%nvars ndims = dset_fg%variables(nvar)%ndims @@ -302,7 +330,13 @@ PROGRAM calc_increment_ncio call read_vardata(dset_fg,trim(dset_fg%variables(nvar)%name),values_3d_fg) call read_vardata(dset_anal,trim(dset_fg%variables(nvar)%name),values_3d_anal) ! increment (flip lats) - values_3d_inc(:,nlats:1:-1,:) = values_3d_anal - values_3d_fg + if (taper_strat .and. (trim(ncvarname) .eq. 'sphum_inc' .or. & + trim(ncvarname) .eq. 'liq_wat_inc' .or. & + trim(ncvarname) .eq. 'ice_wat_inc')) then + values_3d_inc(:,nlats:1:-1,:) = taper_vert*(values_3d_anal - values_3d_fg) + else + values_3d_inc(:,nlats:1:-1,:) = values_3d_anal - values_3d_fg + endif call write_ncdata3d(values_3d_inc,ncvarname,nlons,nlats,nlevs,ncfileid,dimid_3d) endif endif ! ndims == 4 diff --git a/util/EnKF/gfs/src/getsigensmeanp_smooth.fd/CMakeLists.txt b/util/EnKF/gfs/src/getsigensmeanp_smooth.fd/CMakeLists.txt index 08ab0defdf..ce102ee833 100644 --- a/util/EnKF/gfs/src/getsigensmeanp_smooth.fd/CMakeLists.txt +++ b/util/EnKF/gfs/src/getsigensmeanp_smooth.fd/CMakeLists.txt @@ -9,4 +9,5 @@ if(BUILD_UTIL) SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_Fortran_FLAGS}" ) include_directories( ${NEMSIOINC} ${SIGIOINC} ${NETCDF_INCLUDE_DIRS} ${FV3GFS_NCIO_INCS}) target_link_libraries( getsigensmeanp_smooth.x ${FV3GFS_NCIO_LIBRARIES} ${BACIO_LIBRARY} ${NEMSIO_LIBRARY} ${BACIO_LIBRARY} ${SIGIO_LIBRARY} ${W3NCO_4_LIBRARY} ${SP_4_LIBRARY} ${MPI_Fortran_LIBRARIES} ${NETCDF_Fortran_LIBRARIES} ${NETCDF_C_LIBRARIES}) + endif() diff --git a/util/EnKF/gfs/src/recenterens_ncio.fd/CMakeLists.txt b/util/EnKF/gfs/src/recenterens_ncio.fd/CMakeLists.txt new file mode 100644 index 0000000000..7e347146f2 --- /dev/null +++ b/util/EnKF/gfs/src/recenterens_ncio.fd/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.6) +if(BUILD_UTIL) + file(GLOB LOCAL_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.f90) + set_source_files_properties( ${LOCAL_SRC} PROPERTIES COMPILE_FLAGS ${UTIL_Fortran_FLAGS} ) + add_executable(recenterens_ncio.x ${LOCAL_SRC} ) + set_target_properties( recenterens_ncio.x PROPERTIES COMPILE_FLAGS ${UTIL_Fortran_FLAGS} ) + SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_Fortran_FLAGS}" ) + include_directories( ${NETCDF_INCLUDES} ${FV3GFS_NCIO_INCS}) + target_link_libraries( recenterens_ncio.x ${FV3GFS_NCIO_LIBRARIES} ${W3NCO_4_LIBRARY} ${MPI_Fortran_LIBRARIES} ${NETCDF_Fortran_LIBRARIES} ${NETCDF_LIBRARIES} ${HDF5_HL_LIBRARIES} ${HDF5_LIBRARIES}) +endif() diff --git a/util/EnKF/gfs/src/recenterens_ncio.fd/recenterens_ncio.f90 b/util/EnKF/gfs/src/recenterens_ncio.fd/recenterens_ncio.f90 new file mode 100644 index 0000000000..6afbb572eb --- /dev/null +++ b/util/EnKF/gfs/src/recenterens_ncio.fd/recenterens_ncio.f90 @@ -0,0 +1,183 @@ +program recenterens_ncio +!$$$ main program documentation block +! +! program: recenterens_ncio recenter +! +! prgmmr: whitaker org: esrl/psd date: 2009-02-23 +! +! abstract: Read ensemble from netcdf history files, +! remove mean specified from another file, add a +! new mean specified from a third file, and write +! out result to a fourth file. 'Partial' recentering +! by weighting old and new means. +! +! program history log: +! 2020-11-04 Initial version. +! +! usage: +! input files: +! +! output files: +! +! attributes: +! language: f95 +! +! +!$$$ + + use module_fv3gfs_ncio, only: open_dataset, create_dataset, read_attribute, & + Dataset, Dimension, close_dataset, has_attr, has_var, & + read_vardata, write_attribute, write_vardata, & + get_dim, quantize_data + + implicit none + + include "mpif.h" + + real,parameter:: zero=0.0_4 + + logical:: quantize + character(len=500) filename_meani,filename_meano,filenamein,filenameout + character(len=3) charnanal, charwgt_ensmean, charwgt_control + character(len=4) charnin + integer iret,mype,mype1,npe,nanals,ierr, iwgt_ensmean, iwgt_control + integer:: latb,lonb,levs,nbits,nvar,ndims + real(4),allocatable, dimension(:,:) :: values_2d, values_2d_i, values_2d_mi,& + values_2d_mo + real(4),allocatable, dimension(:,:,:) :: values_3d, values_3d_i, values_3d_mi,& + values_3d_mo + real(4) compress_err, rwgt_control, rwgt_ensmean + + type(Dataset) :: dseti,dseto,dsetmi,dsetmo + type(Dimension) :: londim,latdim,levdim + +! Initialize mpi + call MPI_Init(ierr) + +! mype is process number, npe is total number of processes. + call MPI_Comm_rank(MPI_COMM_WORLD,mype,ierr) + call MPI_Comm_size(MPI_COMM_WORLD,npe,ierr) + + if (mype==0) call w3tagb('RECENTERENS_NCIO',2011,0319,0055,'NP25') + +! read data from this file + call getarg(1,filenamein) ! increment or analysis + +! subtract this mean + call getarg(2,filename_meani) ! mean increment or analysis + +! then add to this mean + call getarg(3,filename_meano) ! new mean analysis + +! and put in this file. + call getarg(4,filenameout) ! new increment of analysis + +! how many ensemble members to process + call getarg(5,charnin) + read(charnin,'(i4)') nanals + +! weight given to original ens mean + call getarg(6,charwgt_ensmean) + read(charwgt_ensmean,'(i3)') iwgt_ensmean + rwgt_ensmean = iwgt_ensmean/100. + +! weight given to new ens mean + call getarg(7,charwgt_control) + read(charwgt_control,'(i3)') iwgt_control + rwgt_control = iwgt_control/100. + + if (mype==0) then + write(6,*)'RECENTERENS_NCIO: PROCESS ',nanals,' ENSEMBLE MEMBERS' + write(6,*)'filenamein=',trim(filenamein) + write(6,*)'filename_meani=',trim(filename_meani) + write(6,*)'filename_meano=',trim(filename_meano) + write(6,*)'filenameout=',trim(filenameout) + write(6,*)'rwgt_ensmean,rwgt_control=',rwgt_ensmean,rwgt_control + endif + + mype1 = mype+1 + if (mype1 <= nanals) then + + dsetmi = open_dataset(filename_meani,errcode=iret) + + londim = get_dim(dsetmi,'grid_xt'); lonb = londim%len + latdim = get_dim(dsetmi,'grid_yt'); latb = latdim%len + levdim = get_dim(dsetmi,'pfull'); levs = levdim%len + write(charnanal,'(i3.3)') mype1 + dsetmo = open_dataset(filename_meano) + dseti = open_dataset(trim(filenamein)//"_mem"//charnanal) + dseto = create_dataset(trim(filenameout)//"_mem"//charnanal, dseti, copy_vardata=.true.) + do nvar=1,dseti%nvars + ndims = dseti%variables(nvar)%ndims + if (ndims > 2) then + if (ndims == 3 .and. trim(dseti%variables(nvar)%name) /= 'hgtsfc') then + ! pressfc + if (mype == 0) print *,'recentering ',& + trim(dseti%variables(nvar)%name) + call read_vardata(dseti,trim(dseti%variables(nvar)%name),values_2d_i) + call read_vardata(dsetmi,trim(dseti%variables(nvar)%name),values_2d_mi) + call read_vardata(dsetmo,trim(dseti%variables(nvar)%name),values_2d_mo) + values_2d = values_2d_i - values_2d_mi + rwgt_ensmean*values_2d_mi + rwgt_control*values_2d_mo + if (has_attr(dseti, 'nbits', trim(dseti%variables(nvar)%name))) then + call read_attribute(dseti, 'nbits', nbits, & + trim(dseti%variables(nvar)%name)) + quantize = .true. + if (nbits < 1) quantize = .false. + else + quantize = .false. + endif + if (quantize) then + values_2d_mi = values_2d + call quantize_data(values_2d_mi, values_2d, nbits, compress_err) + call write_attribute(dseto,& + 'max_abs_compression_error',compress_err,trim(dseti%variables(nvar)%name)) + endif + call write_vardata(dseto,trim(dseti%variables(nvar)%name),values_2d) + else if (ndims == 4) then + if (mype == 0) print *,'recentering ',& + trim(dseti%variables(nvar)%name) + call read_vardata(dseti,trim(dseti%variables(nvar)%name),values_3d_i) + call read_vardata(dsetmi,trim(dseti%variables(nvar)%name),values_3d_mi) + call read_vardata(dsetmo,trim(dseti%variables(nvar)%name),values_3d_mo) + values_3d = values_3d_i - values_3d_mi + rwgt_ensmean*values_3d_mi + rwgt_control*values_3d_mo + if (has_attr(dseti, 'nbits', trim(dseti%variables(nvar)%name))) then + call read_attribute(dseti, 'nbits', nbits, & + trim(dseti%variables(nvar)%name)) + quantize = .true. + if (nbits < 1) quantize = .false. + else + quantize = .false. + endif + if (quantize) then + values_3d_mi = values_3d + call quantize_data(values_3d_mi, values_3d, nbits, compress_err) + call write_attribute(dseto,& + 'max_abs_compression_error',compress_err,trim(dseti%variables(nvar)%name)) + endif + call write_vardata(dseto,trim(dseti%variables(nvar)%name),values_3d) + endif + endif ! ndims > 2 + enddo ! nvars + + deallocate(values_2d,values_2d_i,values_2d_mi,values_2d_mo) + deallocate(values_3d,values_3d_i,values_3d_mi,values_3d_mo) + call close_dataset(dsetmi) + call close_dataset(dsetmo) + call close_dataset(dseti) + call close_dataset(dseto) + +! Jump here if more mpi processors than files to process + else + write (6,*) 'no files to process for mpi task = ',mype + end if ! end if mype + + call MPI_Barrier(MPI_COMM_WORLD,ierr) + + if (mype==0) call w3tage('RECENTERENS_NCIO') + + call MPI_Finalize(ierr) + if (mype .eq. 0 .and. ierr .ne. 0) then + print *, 'MPI_Finalize error status = ',ierr + end if + +END program recenterens_ncio diff --git a/util/EnKF/gfs/src/recenterncio_hybgain.fd/recenterncio_hybgain.f90 b/util/EnKF/gfs/src/recenterncio_hybgain.fd/recenterncio_hybgain.f90 index aa063b66d4..5ab94f071c 100644 --- a/util/EnKF/gfs/src/recenterncio_hybgain.fd/recenterncio_hybgain.f90 +++ b/util/EnKF/gfs/src/recenterncio_hybgain.fd/recenterncio_hybgain.f90 @@ -6,7 +6,8 @@ program recenterncio_hybgain ! prgmmr: whitaker org: esrl/psd date: 2009-02-23 ! ! abstract: Recenter ensemble analysis files about new -! mean, computed from blended 3DVar and EnKF increments. +! mean, computed from blended 3DVar and EnKF increments +! (optionally applying RTPS inflation). ! ! program history log: ! 2019-02-10 Initial version. @@ -35,20 +36,23 @@ program recenterncio_hybgain external :: MPI_Init, MPI_Comm_rank, MPI_Comm_size, w3tagb, MPI_Abort,& MPI_Barrier, w3tage, MPI_Finalize - character*500 filename_fg,filename_varanal,filename_enkfanal,filenamein,& - filenameout,filename_anal,filename + character*500 filename_varfg,filename_varanal,filename_enkfanal,filenamein,& + filename_enkffg,filenameout,filename_anal,filename,filename_fsprd,filename_asprd character*3 charnanal character(len=4) charnin - integer mype,mype1,npe,nanals,iret,ialpha,ibeta + integer mype,mype1,npe,nanals,iret,ialpha,ibeta,irtps,i,j,k integer:: nlats,nlons,nlevs,nvar,ndims,nbits - real alpha,beta - real(4),allocatable,dimension(:,:) :: values_2d_varanal,values_2d_enkfanal,values_2d_fg,values_2d_anal,& - values_2d_tmp, values_2d - real(4),allocatable,dimension(:,:,:) :: values_3d_varanal,values_3d_enkfanal,values_3d_fg,values_3d_anal,& - values_3d_tmp, values_3d + real alpha,beta,rtps,infmin,infmax,clip + real(4),allocatable,dimension(:,:) :: values_2d_varanal,values_2d_enkfanal,& + values_2d_varfg,values_2d_enkffg,values_2d_anal,& + values_2d,asprd_2d,fsprd_2d,inf_2d,values_2d_tmp + real(4),allocatable,dimension(:,:,:) :: values_3d_varanal,values_3d_enkfanal,& + values_3d_varfg,values_3d_enkffg,values_3d_anal,& + values_3d,asprd_3d,fsprd_3d,inf_3d,values_3d_tmp real(4) compress_err - type(Dataset) :: dseti,dseto,dset_anal,dset_fg,dset_varanal,dset_enkfanal + type(Dataset) :: dseti,dseto,dset_blendanal,dset_varfg,dset_varanal,dset_enkffg,dset_enkfanal,dset_asprd,dset_fsprd type(Dimension) :: londim,latdim,levdim + logical cliptracers,tracer ! Initialize mpi call MPI_Init(iret) @@ -59,66 +63,103 @@ program recenterncio_hybgain if (mype==0) call w3tagb('RECENTERNCIO_HYBGAIN',2011,0319,0055,'NP25') - call getarg(1,filename_fg) ! first guess ensmean background netcdf file + call getarg(1,filename_varfg) ! first guess 3dvar netcdf file call getarg(2,filename_varanal) ! 3dvar analysis - call getarg(3,filename_enkfanal) ! enkf mean analysis - call getarg(4,filename_anal) ! blended analysis (to recenter ensemble around) - call getarg(5,filenamein) ! prefix for input ens member files (append _mem###) - call getarg(6,filenameout) ! prefix for output ens member files (append _mem###) + call getarg(3,filename_enkffg) ! first guess enkf netcdf file + call getarg(4,filename_enkfanal) ! enkf mean analysis + call getarg(5,filename_anal) ! blended analysis (to recenter ensemble around) + call getarg(6,filenamein) ! prefix for input ens member files (append _mem###) + call getarg(7,filenameout) ! prefix for output ens member files (append _mem###) ! blending coefficients - call getarg(7,charnin) + call getarg(8,charnin) read(charnin,'(i4)') ialpha ! wt for varanal (3dvar) alpha = ialpha/1000. - call getarg(8,charnin) + call getarg(9,charnin) read(charnin,'(i4)') ibeta ! wt for enkfanal (enkf) beta = ibeta/1000. -! new_anal = fg + alpha*(varanal-fg) + beta(enkfanal-fg) -! = (1.-alpha-beta)*fg + alpha*varanal + beta*enkfanal + call getarg(10,charnin) + read(charnin,'(i4)') irtps ! rtps relaxation coeff + rtps = irtps/1000. +! new_anal = fg + alpha*(varanal-fg) + beta*(enkfanal-fg) ! how many ensemble members to process - call getarg(9,charnin) + call getarg(11,charnin) read(charnin,'(i4)') nanals + if (rtps > 0) then + call getarg(13,filename_fsprd) ! first guess ensemble spread + call getarg(14,filename_asprd) ! analysis ensemble spread + endif + + infmin=1.0; infmax=10. + clip = tiny(rtps) if (mype==0) then write(6,*)'RECENTERNCIO_HYBGAIN: PROCESS ',nanals,' ENSEMBLE MEMBERS' - write(6,*)'ens mean background in ',trim(filename_fg) + write(6,*)'3dvar background in ',trim(filename_varfg) + write(6,*)'EnKF background in ',trim(filename_enkffg) write(6,*)'3dvar analysis in ',trim(filename_varanal) write(6,*)'EnKF mean analysis in ',trim(filename_enkfanal) write(6,*)'Blended mean analysis to be written to ',trim(filename_anal) write(6,*)'Prefix for member input files ',trim(filenamein) write(6,*)'Prefix for member output files ',trim(filenameout) - write(6,*)'3dvar weight, EnKF weight =',alpha,beta + write(6,*)'3dvar weight, EnKF weight, RTPS relaxation =',alpha,beta,rtps + if (rtps > 0) then + write(6,*)'ens spread background in ',trim(filename_fsprd) + write(6,*)'ens spread posterior in ',trim(filename_asprd) + endif endif mype1 = mype+1 if (mype1 <= nanals) then - dset_fg = open_dataset(filename_fg,errcode=iret) + dset_varfg = open_dataset(filename_varfg,errcode=iret) if (iret == 0 ) then - if (mype == 0) write(6,*)'Read netcdf ',trim(filename_fg) - londim = get_dim(dset_fg,'grid_xt'); nlons = londim%len - latdim = get_dim(dset_fg,'grid_yt'); nlats = latdim%len - levdim = get_dim(dset_fg,'pfull'); nlevs = levdim%len + if (mype == 0) write(6,*)'Read netcdf ',trim(filename_varfg) + londim = get_dim(dset_varfg,'grid_xt'); nlons = londim%len + latdim = get_dim(dset_varfg,'grid_yt'); nlats = latdim%len + levdim = get_dim(dset_varfg,'pfull'); nlevs = levdim%len if (mype == 0) write(6,*)' nlons=',nlons,' nlats=',nlats,' nlevs=',nlevs else - write(6,*) 'error opening ',trim(filename_fg) + write(6,*) 'error opening ',trim(filename_varfg) call MPI_Abort(MPI_COMM_WORLD,98,iret) stop endif - ! readin in 3dvar, enkf analyses, plus ens mean background, blend + ! read in 3dvar, enkf analyses and backgrounds, blend increments + if (alpha > 0) then dset_varanal = open_dataset(filename_varanal,errcode=iret) if (iret /= 0) then print *,'error opening ',trim(filename_varanal) call MPI_Abort(MPI_COMM_WORLD,98,iret) stop endif + endif dset_enkfanal = open_dataset(filename_enkfanal,errcode=iret) if (iret /= 0) then print *,'error opening ',trim(filename_enkfanal) call MPI_Abort(MPI_COMM_WORLD,98,iret) stop endif - if (mype == 0) then - dset_anal = create_dataset(filename_anal, dset_enkfanal, & + dset_enkffg = open_dataset(filename_enkffg,errcode=iret) + if (iret /= 0) then + print *,'error opening ',trim(filename_enkffg) + call MPI_Abort(MPI_COMM_WORLD,98,iret) + stop + endif + if (rtps > 0) then + dset_fsprd = open_dataset(filename_fsprd,errcode=iret) + if (iret /= 0) then + print *,'error opening ',trim(filename_fsprd) + call MPI_Abort(MPI_COMM_WORLD,98,iret) + stop + endif + dset_asprd = open_dataset(filename_asprd,errcode=iret) + if (iret /= 0) then + print *,'error opening ',trim(filename_asprd) + call MPI_Abort(MPI_COMM_WORLD,98,iret) + stop + endif + endif + if (mype == 0 .and. alpha > 0) then + dset_blendanal = create_dataset(filename_anal, dset_enkfanal, & copy_vardata=.true., errcode=iret) if (iret /= 0) then print *,'error opening ',trim(filename_anal) @@ -142,88 +183,151 @@ program recenterncio_hybgain call MPI_Abort(MPI_COMM_WORLD,98,iret) stop endif + allocate(inf_2d(nlons,nlats),fsprd_2d(nlons,nlats),asprd_2d(nlons,nlats)) + allocate(inf_3d(nlons,nlats,nlevs),fsprd_3d(nlons,nlats,nlevs),asprd_3d(nlons,nlats,nlevs)) - do nvar=1,dset_fg%nvars - ndims = dset_fg%variables(nvar)%ndims + do nvar=1,dset_varfg%nvars + ndims = dset_varfg%variables(nvar)%ndims + if (trim(dset_varfg%variables(nvar)%name) == 'spfh' .or. & + trim(dset_varfg%variables(nvar)%name) == 'o3mr' .or. & + trim(dset_varfg%variables(nvar)%name) == 'clwmr' .or. & + trim(dset_varfg%variables(nvar)%name) == 'icmr') then + tracer = .true. + else + tracer = .false. + endif if (ndims > 2) then - if (ndims == 3 .and. trim(dset_fg%variables(nvar)%name) /= 'hgtsfc') then + if (ndims == 3 .and. trim(dset_varfg%variables(nvar)%name) /= 'hgtsfc') then ! pressfc - call read_vardata(dset_fg,trim(dset_fg%variables(nvar)%name),values_2d_fg) - call read_vardata(dset_varanal,trim(dset_fg%variables(nvar)%name),values_2d_varanal) - call read_vardata(dset_enkfanal,trim(dset_fg%variables(nvar)%name),values_2d_enkfanal) - call read_vardata(dseti,trim(dset_fg%variables(nvar)%name),values_2d) + call read_vardata(dset_varfg,trim(dset_varfg%variables(nvar)%name),values_2d_varfg) + call read_vardata(dset_enkffg,trim(dset_enkffg%variables(nvar)%name),values_2d_enkffg) + if (alpha>0) call read_vardata(dset_varanal,trim(dset_varfg%variables(nvar)%name),values_2d_varanal) + call read_vardata(dset_enkfanal,trim(dset_enkffg%variables(nvar)%name),values_2d_enkfanal) + call read_vardata(dseti,trim(dset_enkffg%variables(nvar)%name),values_2d) ! blended analysis - values_2d_anal = (1.-alpha-beta)*values_2d_fg + & - alpha*values_2d_varanal + & - beta*values_2d_enkfanal + values_2d_anal = values_2d_enkffg + beta*(values_2d_enkfanal-values_2d_enkffg) + if (alpha > 0) & + values_2d_anal = values_2d_anal + alpha*(values_2d_varanal-values_2d_varfg) ! recentered ensemble member - values_2d = values_2d - values_2d_enkfanal + values_2d_anal - if (has_attr(dset_fg, 'nbits', trim(dset_fg%variables(nvar)%name))) then - call read_attribute(dset_fg, 'nbits', nbits, & - trim(dset_fg%variables(nvar)%name),errcode=iret) + if (rtps > 0) then ! RTPS inflation + call read_vardata(dset_fsprd,trim(dset_enkffg%variables(nvar)%name),fsprd_2d) + call read_vardata(dset_asprd,trim(dset_enkffg%variables(nvar)%name),asprd_2d) + fsprd_2d = max(fsprd_2d,tiny(fsprd_2d)) + asprd_2d = max(asprd_2d,tiny(asprd_2d)) + inf_2d = rtps*((fsprd_2d-asprd_2d)/asprd_2d) + 1.0 + do j=1,nlats + do i=1,nlons + inf_2d(i,j) = max(infmin,min(inf_2d(i,j),infmax)) + enddo + enddo + values_2d = inf_2d*(values_2d - values_2d_enkfanal) + values_2d_anal + if (mype == 0) & + print *,'min/max ',trim(dset_enkffg%variables(nvar)%name),& + ' inflation = ',minval(inf_2d),maxval(inf_2d) + else + values_2d = values_2d - values_2d_enkfanal + values_2d_anal + endif + if (has_attr(dset_enkffg, 'nbits', trim(dset_enkffg%variables(nvar)%name))) then + call read_attribute(dset_enkffg, 'nbits', nbits, & + trim(dset_enkffg%variables(nvar)%name),errcode=iret) else iret = 1 endif - if (mype == 0) then ! write out blended analysis on root task + if (mype == 0 .and. alpha > 0) then ! write out blended analysis on root task if (iret == 0 .and. nbits > 0) then values_2d_tmp = values_2d_anal call quantize_data(values_2d_tmp, values_2d_anal, nbits, compress_err) - call write_attribute(dset_anal,& - 'max_abs_compression_error',compress_err,trim(dset_fg%variables(nvar)%name)) + call write_attribute(dset_blendanal,& + 'max_abs_compression_error',compress_err,trim(dset_enkffg%variables(nvar)%name)) endif - call write_vardata(dset_anal,trim(dset_fg%variables(nvar)%name),values_2d_anal) + call write_vardata(dset_blendanal,trim(dset_enkffg%variables(nvar)%name),values_2d_anal) endif if (iret == 0 .and. nbits > 0) then values_2d_tmp = values_2d call quantize_data(values_2d_tmp, values_2d, nbits, compress_err) call write_attribute(dseto,& - 'max_abs_compression_error',compress_err,trim(dset_fg%variables(nvar)%name)) + 'max_abs_compression_error',compress_err,trim(dset_enkffg%variables(nvar)%name)) endif - call write_vardata(dseto,trim(dset_fg%variables(nvar)%name),values_2d) + if (tracer) then + if (cliptracers) where (values_2d < clip) values_2d = clip + if (mype == 0) & + print *,'clipping ',trim(dset_enkffg%variables(nvar)%name) + endif + call write_vardata(dseto,trim(dset_enkffg%variables(nvar)%name),values_2d) else if (ndims == 4) then - call read_vardata(dset_fg,trim(dset_fg%variables(nvar)%name),values_3d_fg) - call read_vardata(dset_varanal,trim(dset_fg%variables(nvar)%name),values_3d_varanal) - call read_vardata(dset_enkfanal,trim(dset_fg%variables(nvar)%name),values_3d_enkfanal) - call read_vardata(dseti,trim(dset_fg%variables(nvar)%name),values_3d) + call read_vardata(dset_varfg,trim(dset_varfg%variables(nvar)%name),values_3d_varfg) + call read_vardata(dset_enkffg,trim(dset_enkffg%variables(nvar)%name),values_3d_enkffg) + if (alpha>0) call read_vardata(dset_varanal,trim(dset_varfg%variables(nvar)%name),values_3d_varanal) + call read_vardata(dset_enkfanal,trim(dset_enkffg%variables(nvar)%name),values_3d_enkfanal) + call read_vardata(dseti,trim(dset_enkffg%variables(nvar)%name),values_3d) ! blended analysis - values_3d_anal = (1.-alpha-beta)*values_3d_fg + & - alpha*values_3d_varanal + & - beta*values_3d_enkfanal + values_3d_anal = values_3d_enkffg + beta*(values_3d_enkfanal-values_3d_enkffg) + if (alpha > 0) & + values_3d_anal = values_3d_anal + alpha*(values_3d_varanal-values_3d_varfg) ! recentered ensemble member - values_3d = values_3d - values_3d_enkfanal + values_3d_anal - if (has_attr(dset_fg, 'nbits', trim(dset_fg%variables(nvar)%name))) then - call read_attribute(dset_fg, 'nbits', nbits, & - trim(dset_fg%variables(nvar)%name),errcode=iret) + if (rtps > 0) then ! RTPS inflation + call read_vardata(dset_fsprd,trim(dset_enkffg%variables(nvar)%name),fsprd_3d) + call read_vardata(dset_asprd,trim(dset_enkffg%variables(nvar)%name),asprd_3d) + fsprd_3d = max(fsprd_3d,tiny(fsprd_3d)) + asprd_3d = max(asprd_3d,tiny(asprd_3d)) + inf_3d = rtps*((fsprd_3d-asprd_3d)/asprd_3d) + 1.0 + do k=1,nlevs + do j=1,nlats + do i=1,nlons + inf_3d(i,j,k) = max(infmin,min(inf_3d(i,j,k),infmax)) + enddo + enddo + enddo + values_3d = inf_3d*(values_3d - values_3d_enkfanal) + values_3d_anal + if (mype == 0) & + print *,'min/max ',trim(dset_enkffg%variables(nvar)%name),& + ' inflation = ',minval(inf_3d),maxval(inf_3d) + else + values_3d = values_3d - values_3d_enkfanal + values_3d_anal + endif + if (has_attr(dset_enkffg, 'nbits', trim(dset_enkffg%variables(nvar)%name))) then + call read_attribute(dset_enkffg, 'nbits', nbits, & + trim(dset_enkffg%variables(nvar)%name),errcode=iret) else iret = 1 endif - if (mype == 0) then ! write out blended analysis on root task + if (mype == 0 .and. alpha > 0) then ! write out blended analysis on root task if (iret == 0 .and. nbits > 0) then values_3d_tmp = values_3d_anal call quantize_data(values_3d_tmp, values_3d_anal, nbits, compress_err) - call write_attribute(dset_anal,& - 'max_abs_compression_error',compress_err,trim(dset_fg%variables(nvar)%name)) + call write_attribute(dset_blendanal,& + 'max_abs_compression_error',compress_err,trim(dset_enkffg%variables(nvar)%name)) endif - call write_vardata(dset_anal,trim(dset_fg%variables(nvar)%name),values_3d_anal) + call write_vardata(dset_blendanal,trim(dset_enkffg%variables(nvar)%name),values_3d_anal) endif if (iret == 0 .and. nbits > 0) then values_3d_tmp = values_3d call quantize_data(values_3d_tmp, values_3d, nbits, compress_err) call write_attribute(dseto,& - 'max_abs_compression_error',compress_err,trim(dset_fg%variables(nvar)%name)) + 'max_abs_compression_error',compress_err,trim(dset_enkffg%variables(nvar)%name)) + endif + if (tracer) then + if (cliptracers) where (values_3d < clip) values_3d = clip + if (mype == 0) & + print *,'clipping ',trim(dset_enkffg%variables(nvar)%name) endif - call write_vardata(dseto,trim(dset_fg%variables(nvar)%name),values_3d) + call write_vardata(dseto,trim(dset_enkffg%variables(nvar)%name),values_3d) endif endif ! ndims > 2 enddo ! nvars - if (mype == 0) call close_dataset(dset_anal) + if (mype == 0 .and. alpha > 0) call close_dataset(dset_blendanal) call close_dataset(dseti) call close_dataset(dseto) - call close_dataset(dset_fg) - call close_dataset(dset_varanal) + call close_dataset(dset_enkffg) + call close_dataset(dset_varfg) + if (alpha > 0) call close_dataset(dset_varanal) call close_dataset(dset_enkfanal) + if (rtps > 0) then + call close_dataset(dset_fsprd) + call close_dataset(dset_asprd) + endif write(6,*)'task mype=',mype,' process ',trim(filenameout)//"_mem"//charnanal,' iret=',iret ! Jump here if more mpi processors than files to process @@ -232,9 +336,12 @@ program recenterncio_hybgain end if ! end if mype 100 continue + deallocate(asprd_2d,asprd_3d) + deallocate(fsprd_2d,fsprd_3d) + deallocate(inf_2d,inf_3d) call MPI_Barrier(MPI_COMM_WORLD,iret) - if (mype==0) call w3tage('RECENTERSIGP_HYBGAIN') + if (mype==0) call w3tage('RECENTERSIGP_HYBGAIN2') call MPI_Finalize(iret) if (mype == 0 .and. iret /= 0) then diff --git a/util/EnKF/gfs/src/recentersigp.fd/recentersigp.f90 b/util/EnKF/gfs/src/recentersigp.fd/recentersigp.f90 index bc01dbd984..321845bf35 100644 --- a/util/EnKF/gfs/src/recentersigp.fd/recentersigp.f90 +++ b/util/EnKF/gfs/src/recentersigp.fd/recentersigp.f90 @@ -82,23 +82,23 @@ program recentersigp NSIGO=61 ! read data from this file - call getarg(1,filenamein) + call getarg(1,filenamein) ! increment or analysis ! subtract this mean - call getarg(2,filename_meani) + call getarg(2,filename_meani) ! mean increment or analysis ! then add to this mean - call getarg(3,filename_meano) + call getarg(3,filename_meano) ! new mean analysis ! and put in this file. - call getarg(4,filenameout) + call getarg(4,filenameout) ! new increment of analysis ! how many ensemble members to process call getarg(5,charnin) read(charnin,'(i4)') nanals ! option for increment, read in ens mean guess - call getarg(6,filename_meang) + call getarg(6,filename_meang) ! background ens mean fcst if (mype==0) then @@ -294,6 +294,9 @@ program recentersigp end select values_3d(:,:,:) = zero do j=1,latb +! updated member increment = original member increment - background ens mean - original +! mean increment + gsi control analysis +! = original member increment + gsi control analysis - enkf mean analysis values_3d(:,j,:) = values_3d_i(:,j,:) - values_3d_mb(:,latb-j+1,:) - values_3d_mi(:,j,:) + values_3d_anl(:,latb-j+1,:) end do if (should_zero_increments_for(trim(dseti%variables(nvar)%name))) values_3d = zero diff --git a/util/netcdf_io/calc_analysis.fd/init_calc_analysis.f90 b/util/netcdf_io/calc_analysis.fd/init_calc_analysis.f90 index 2d7c922da7..bd65f08849 100644 --- a/util/netcdf_io/calc_analysis.fd/init_calc_analysis.f90 +++ b/util/netcdf_io/calc_analysis.fd/init_calc_analysis.f90 @@ -41,16 +41,22 @@ subroutine read_nml stop 99 end if + if (fhr > 0) then write(hrstr,'(I0.2)') fhr anal_file = trim(adjustl(datapath)) // '/' // trim(adjustl(analysis_filename)) // '.' // hrstr fcst_file = trim(adjustl(datapath)) // '/' // trim(adjustl(firstguess_filename)) // '.' // hrstr incr_file = trim(adjustl(datapath)) // '/' // trim(adjustl(increment_filename)) // '.' // hrstr + else + anal_file = trim(adjustl(datapath)) // '/' // trim(adjustl(analysis_filename)) + fcst_file = trim(adjustl(datapath)) // '/' // trim(adjustl(firstguess_filename)) + incr_file = trim(adjustl(datapath)) // '/' // trim(adjustl(increment_filename)) + endif if (mype == 0) then write(6,*) 'Analysis File = ', trim(anal_file) write(6,*) 'First Guess File = ', trim(fcst_file) write(6,*) 'Increment File = ', trim(incr_file) - write(6,*) 'Forecast Hour = ', fhr + if (fhr > 0) write(6,*) 'Forecast Hour = ', fhr write(6,*) 'Number of PEs = ', npes write(6,*) 'input guess file and increment file should be in netCDF format' if (use_nemsio_anl) then From 63963a9fc95670289f866c2ef11a6402ca591e17 Mon Sep 17 00:00:00 2001 From: "edward.safford" Date: Tue, 11 Jan 2022 13:19:44 +0000 Subject: [PATCH 12/26] Github issue #265, MinMon maintenance update. Completes #265. --- util/Minimization_Monitor/MinMon_install.pl | 31 +- .../data_xtrct/ush/MinMon_CP.sh | 128 +++++ .../data_xtrct/ush/MinMon_DE.sh | 177 +++---- .../data_xtrct/ush/RunMM_DE.sh | 209 -------- .../data_xtrct/ush/find_cycle.pl | 10 +- .../data_xtrct/ush/onprod.sh | 22 - .../data_xtrct/ush/run_cp_v16rt1.sh | 54 --- .../data_xtrct/ush/run_gdas_DE.sh | 37 -- .../data_xtrct/ush/run_gfs_DE.sh | 36 -- .../data_xtrct/ush/run_script.sh | 71 --- .../data_xtrct/ush/run_v16rt1.sh | 60 --- util/Minimization_Monitor/get_hostname.pl | 3 + .../image_gen/ush/MinMon_Plt.sh | 271 +++++------ .../image_gen/ush/nu_make_archive.sh | 204 -------- .../image_gen/ush/onprod.sh | 22 - .../image_gen/ush/pen_data_map.xml | 16 - .../image_gen/ush/query_data_map.pl | 73 --- .../image_gen/ush/run_gdas_IG.sh | 48 -- .../image_gen/ush/run_gfs_IG.sh | 48 -- .../image_gen/ush/run_script.sh | 70 --- .../image_gen/ush/run_v16rt1_IG.sh | 61 --- .../image_gen/ush/update_ctl_tdef.sh | 3 - .../image_gen/ush/update_ctl_xdef.sh | 93 ---- .../image_gen/ush/update_data_map.pl | 61 --- .../gdas.v1.0.0/driver/test_jgdas_vminmon.sh | 76 --- .../driver/test_jgdas_vminmon_hera.sh | 74 --- .../driver/test_jgdas_vminmon_theia.sh | 81 ---- .../nwprod/gdas.v1.0.0/parm/gdas_minmon.parm | 21 - .../gdas/driver/test_jgdas_vminmon_hera.sh | 54 +++ .../gdas/driver/test_jgdas_vminmon_wcoss2.sh | 62 +++ .../driver/test_jgdas_vminmon_wcoss_c.sh} | 33 +- .../driver/test_jgdas_vminmon_wcoss_d.sh | 21 +- .../fix/gdas_minmon_cost.txt | 0 .../fix/gdas_minmon_gnorm.txt | 0 .../jobs/JGDAS_ATMOS_VMINMON | 15 +- .../scripts/exgdas_atmos_vminmon.sh | 9 +- .../gfs.v1.0.0/driver/test_jgfs_vminmon.sh | 77 --- .../driver/test_jgfs_vminmon_theia.sh | 81 ---- .../nwprod/gfs.v1.0.0/parm/gfs_minmon.parm | 16 - .../driver/test_jgfs_vminmon_hera.sh | 47 +- .../gfs/driver/test_jgfs_vminmon_wcoss2.sh | 71 +++ .../driver/test_jgfs_vminmon_wcoss_c.sh} | 35 +- .../driver/test_jgfs_vminmon_wcoss_d.sh | 21 +- .../fix/gfs_minmon_cost.txt | 0 .../fix/gfs_minmon_gnorm.txt | 0 .../jobs/JGFS_ATMOS_VMINMON | 23 +- .../scripts/exgfs_atmos_vminmon.sh | 0 .../ush/minmon_xtrct_costs.pl | 233 --------- .../ush/minmon_xtrct_gnorms.pl | 446 ------------------ .../ush/minmon_xtrct_reduct.pl | 92 ---- .../ush/minmon_xtrct_costs.pl | 21 +- .../ush/minmon_xtrct_gnorms.pl | 31 +- .../ush/minmon_xtrct_reduct.pl | 24 +- .../driver/test_nam_minmon.sh | 0 .../fix/nam_minmon_cost.txt | 0 .../fix/nam_minmon_gnorm.txt | 0 .../jobs/JNAM_MINMON | 0 .../parm/nam_minmon.parm | 0 .../scripts/exnam_vrfminmon.sh.ecf | 0 util/Minimization_Monitor/parm/MinMon.ver | 15 - util/Minimization_Monitor/parm/MinMon_config | 65 ++- .../parm/MinMon_user_settings | 10 +- 62 files changed, 685 insertions(+), 2877 deletions(-) create mode 100755 util/Minimization_Monitor/data_xtrct/ush/MinMon_CP.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/RunMM_DE.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/onprod.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/run_cp_v16rt1.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/run_gdas_DE.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/run_gfs_DE.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/run_script.sh delete mode 100755 util/Minimization_Monitor/data_xtrct/ush/run_v16rt1.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/nu_make_archive.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/onprod.sh delete mode 100644 util/Minimization_Monitor/image_gen/ush/pen_data_map.xml delete mode 100755 util/Minimization_Monitor/image_gen/ush/query_data_map.pl delete mode 100755 util/Minimization_Monitor/image_gen/ush/run_gdas_IG.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/run_gfs_IG.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/run_script.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/run_v16rt1_IG.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/update_ctl_xdef.sh delete mode 100755 util/Minimization_Monitor/image_gen/ush/update_data_map.pl delete mode 100755 util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon.sh delete mode 100755 util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_hera.sh delete mode 100755 util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_theia.sh delete mode 100644 util/Minimization_Monitor/nwprod/gdas.v1.0.0/parm/gdas_minmon.parm create mode 100755 util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_hera.sh create mode 100755 util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss2.sh rename util/Minimization_Monitor/nwprod/{gdas.v1.0.0/driver/test_jgdas_vminmon_cray.sh => gdas/driver/test_jgdas_vminmon_wcoss_c.sh} (57%) rename util/Minimization_Monitor/nwprod/{gdas.v1.0.0 => gdas}/driver/test_jgdas_vminmon_wcoss_d.sh (80%) rename util/Minimization_Monitor/nwprod/{gdas.v1.0.0 => gdas}/fix/gdas_minmon_cost.txt (100%) rename util/Minimization_Monitor/nwprod/{gdas.v1.0.0 => gdas}/fix/gdas_minmon_gnorm.txt (100%) rename util/Minimization_Monitor/nwprod/{gdas.v1.0.0 => gdas}/jobs/JGDAS_ATMOS_VMINMON (84%) rename util/Minimization_Monitor/nwprod/{gdas.v1.0.0 => gdas}/scripts/exgdas_atmos_vminmon.sh (91%) delete mode 100755 util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon.sh delete mode 100755 util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_theia.sh delete mode 100644 util/Minimization_Monitor/nwprod/gfs.v1.0.0/parm/gfs_minmon.parm rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0 => gfs}/driver/test_jgfs_vminmon_hera.sh (60%) create mode 100755 util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss2.sh rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0/driver/test_jgfs_vminmon_cray.sh => gfs/driver/test_jgfs_vminmon_wcoss_c.sh} (57%) rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0 => gfs}/driver/test_jgfs_vminmon_wcoss_d.sh (79%) rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0 => gfs}/fix/gfs_minmon_cost.txt (100%) rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0 => gfs}/fix/gfs_minmon_gnorm.txt (100%) rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0 => gfs}/jobs/JGFS_ATMOS_VMINMON (78%) rename util/Minimization_Monitor/nwprod/{gfs.v1.0.0 => gfs}/scripts/exgfs_atmos_vminmon.sh (100%) delete mode 100755 util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_costs.pl delete mode 100755 util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_gnorms.pl delete mode 100755 util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_reduct.pl rename util/Minimization_Monitor/nwprod/{minmon_shared.v1.0.1 => minmon_shared}/ush/minmon_xtrct_costs.pl (92%) rename util/Minimization_Monitor/nwprod/{minmon_shared.v1.0.1 => minmon_shared}/ush/minmon_xtrct_gnorms.pl (95%) rename util/Minimization_Monitor/nwprod/{minmon_shared.v1.0.1 => minmon_shared}/ush/minmon_xtrct_reduct.pl (78%) rename util/Minimization_Monitor/nwprod/{nam_minmon.v1.0.0 => nam_minmon}/driver/test_nam_minmon.sh (100%) rename util/Minimization_Monitor/nwprod/{nam_minmon.v1.0.0 => nam_minmon}/fix/nam_minmon_cost.txt (100%) rename util/Minimization_Monitor/nwprod/{nam_minmon.v1.0.0 => nam_minmon}/fix/nam_minmon_gnorm.txt (100%) rename util/Minimization_Monitor/nwprod/{nam_minmon.v1.0.0 => nam_minmon}/jobs/JNAM_MINMON (100%) rename util/Minimization_Monitor/nwprod/{nam_minmon.v1.0.0 => nam_minmon}/parm/nam_minmon.parm (100%) rename util/Minimization_Monitor/nwprod/{nam_minmon.v1.0.0 => nam_minmon}/scripts/exnam_vrfminmon.sh.ecf (100%) delete mode 100644 util/Minimization_Monitor/parm/MinMon.ver diff --git a/util/Minimization_Monitor/MinMon_install.pl b/util/Minimization_Monitor/MinMon_install.pl index d4d35597b9..10ee6b200d 100755 --- a/util/Minimization_Monitor/MinMon_install.pl +++ b/util/Minimization_Monitor/MinMon_install.pl @@ -5,8 +5,8 @@ # # This script makes sets all configuration definitions # and calls the makeall.sh script to build all the necessary -# executables. This script works for wcoss, wcoss_d, cray, and -# hera. +# executables. This script works for wcoss, wcoss_d, cray, hera, +# and wcoss2. # #------------------------------------------------------------------- @@ -16,7 +16,7 @@ my $machine = `/usr/bin/perl get_hostname.pl`; my $my_machine="export MY_MACHINE=$machine"; - if( $machine ne "hera" && $machine ne "wcoss" && + if( $machine ne "hera" && $machine ne "wcoss" && $machine ne "wcoss2" && $machine ne "wcoss_d" && $machine ne "cray" ) { die( "ERROR --- Unrecognized machine hostname, $machine. Exiting now...\n" ); } @@ -61,6 +61,9 @@ elsif( $machine eq "wcoss_d" ){ $tankdir = "/gpfs/dell2/emc/modeling/noscrub/$user_name/nbns"; } + elsif( $machine eq "wcoss2" ){ + $tankdir = "/lfs/h2/emc/da/noscrub/$user_name/nbns"; + } else { $tankdir = "/global/save/$user_name/nbns"; } @@ -148,6 +151,10 @@ $my_ptmp="export MY_PTMP=\${MY_PTMP:-/gpfs/dell2/ptmp/$user_name}"; $my_stmp="export MY_STMP=\${MY_STMP:-/gpfs/dell2/stmp/$user_name}"; } + elsif( $machine eq "wcoss2" ) { + $my_ptmp="export MY_PTMP=\${MY_PTMP:-/lfs/h2/emc/ptmp/$user_name}"; + $my_stmp="export MY_STMP=\${MY_STMP:-/lfs/h2/emc/stmp/$user_name}"; + } elsif( $machine eq "hera" ) { $ptmp = "/scratch2/NCEPDEV/stmp3/${user_name}"; print "Please specify PTMP location. This is used for temporary work space.\n"; @@ -185,8 +192,6 @@ print "\n\n"; sleep( 1 ); -# $my_ptmp="export MY_PTMP=\${MY_PTMP:-/scratch2/NCEPDEV/stmp3/${user_name}}"; -# $my_stmp="export MY_STMP=\${MY_STMP:-/scratch2/NCEPDEV/stmp1/${user_name}}"; } # @@ -232,7 +237,7 @@ # # Web directory # - my $webdir = "/home/people/emc/www/htdocs/gmb/gdas/radiance/${webuser}/gsi_stat/pngs"; + my $webdir = "/home/people/emc/www/htdocs/gmb/gdas/gsi_stat/pngs"; print "Please specify the top level web site directory $server.\n"; print " Return to accept default directory location or enter new location.\n"; print " \n"; @@ -306,7 +311,13 @@ # # project definition # - my $project = "GDAS-T2O"; + my $project = "GDAS-DEV"; + if( $machine eq "wcoss_d" ) { + $project = "GFS-DEV"; + } elsif( $machine eq "cray" ){ + $project = "GDAS-T2O" + } + my $my_project = ""; if( $machine eq "hera" ) { @@ -333,6 +344,9 @@ # job queue definition # my $job_queue = "dev_shared"; + if( $machine eq "wcoss2" ) { + $job_queue = "dev"; + } my $my_job_queue = ""; if( $machine eq "hera" ) { @@ -348,6 +362,7 @@ if( length($new_queue ) > 0 ) { $job_queue = $new_queue; } + $my_job_queue="export JOB_QUEUE=\${JOB_QUEUE:-$job_queue}"; print "my_job_queue = $my_job_queue\n"; print "\n\n"; @@ -369,7 +384,7 @@ elsif( $_ =~ "export PROJECT" ){ print $out "$my_project\n"; } - elsif( $line =~ "export JOB_QUEUE" ){ + elsif( $_ =~ "export JOB_QUEUE" ){ print $out "$my_job_queue\n"; } else { diff --git a/util/Minimization_Monitor/data_xtrct/ush/MinMon_CP.sh b/util/Minimization_Monitor/data_xtrct/ush/MinMon_CP.sh new file mode 100755 index 0000000000..ef048e451b --- /dev/null +++ b/util/Minimization_Monitor/data_xtrct/ush/MinMon_CP.sh @@ -0,0 +1,128 @@ +#!/bin/bash + +# MinMon data copy script + +#-------------------------------------------------------------------- +# usage +#-------------------------------------------------------------------- +function usage { + echo "Usage: MinMon_CP.sh suffix [-p|--pdate pdate -r|--run gdas|gfs]" + echo " Suffix is the indentifier for this data source." + echo " -p | --pdate yyyymmddcc to specify the cycle to be processed" + echo " if unspecified the last available date will be processed" + echo " -r | --run the gdas|gfs run to be processed" + echo " use only if data in TANKdir stores both runs" + echo " -d | --data base location of minmon data without any" + echo " date-dependent subdirectories" + echo " " +} + +#-------------------------------------------------------------------- +# MinMon_DE.sh begins here +#-------------------------------------------------------------------- + +set -x + +nargs=$# +if [[ $nargs -lt 1 || $nargs -gt 7 ]]; then + usage + exit 1 +fi + +#----------------------------------------------- +# Process command line arguments +# +while [[ $# -ge 1 ]] +do + key="$1" + echo $key + + case $key in + -p|--pdate) + pdate="$2" + shift # past argument + ;; + -r|--run) + run="$2" + shift # past argument + ;; + -d|--data) # base location of minmon data + data="$2" + shift # past argument + ;; + *) + #any unspecified key is MINMON_SUFFIX + export MINMON_SUFFIX=$key + ;; + esac + + shift +done + +if [[ $data = "" ]]; then + data=/gpfs/dell1/nco/ops/com/gfs/prod +fi + +if [[ $run = "" ]]; then + run=gdas +fi + +#----------------------------------- +# source config and settings files +# +this_dir=`dirname $0` +top_parm=${this_dir}/../../parm + +minmon_config=${minmon_config:-${top_parm}/MinMon_config} +if [[ ! -e ${minmon_config} ]]; then + echo "Unable to locate ${minmon_config} file" + exit 3 +fi + +. ${minmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${minmon_config} file" + exit $? +fi + + +minmon_user_settings=${minmon_user_settings:-${top_parm}/MinMon_user_settings} +if [[ ! -e ${minmon_user_settings} ]]; then + echo "Unable to locate ${minmon_user_settings} file" + exit 4 +fi + +. ${minmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${minmon_user_settings} file" + exit $? +fi + + +tank=${M_TANKverf}/stats/${MINMON_SUFFIX} + +echo NDATE = $NDATE +if [[ $pdate = "" ]]; then + ldate=`${this_dir}/find_cycle.pl --cyc 1 --dir ${tank} --run ${run}` + echo ldate = $ldate + pdate=`${NDATE} +06 $ldate` +fi + +echo pdate = $pdate + +pdy=`echo $pdate|cut -c1-8` +cyc=`echo $pdate|cut -c9-10` + +data_loc=${data}/${run}.${pdy}/${cyc}/atmos/minmon +tank=${tank}/${run}.${pdy}/${cyc}/minmon +mkdir -p ${tank} + +if [[ ! -d ${data_loc} ]]; then + echo "Unable to copy, ${data_loc} not found" + exit 5 +fi + +cp ${data_loc}/*${pdate}* ${tank}/. +cp ${data_loc}/gnorm_data.txt ${tank}/. + + diff --git a/util/Minimization_Monitor/data_xtrct/ush/MinMon_DE.sh b/util/Minimization_Monitor/data_xtrct/ush/MinMon_DE.sh index fbf82bc5bb..51b3d3885e 100755 --- a/util/Minimization_Monitor/data_xtrct/ush/MinMon_DE.sh +++ b/util/Minimization_Monitor/data_xtrct/ush/MinMon_DE.sh @@ -1,4 +1,4 @@ -#!/bin/ksh +#!/bin/bash # MinMon data extraction script @@ -12,6 +12,8 @@ function usage { echo " if unspecified the last available date will be processed" echo " -r | --run the gdas|gfs run to be processed" echo " use only if data in TANKdir stores both runs" + echo " -c | --comin the base directory to the gsistat files" + echo " This does not include any date-derived subdirectories." echo " " } @@ -22,7 +24,7 @@ function usage { set -x nargs=$# -if [[ $nargs -lt 1 || $nargs -gt 5 ]]; then +if [[ $nargs -lt 1 || $nargs -gt 7 ]]; then usage exit 1 fi @@ -31,7 +33,6 @@ fi #----------------------------------------------- # Process command line arguments # -RUN=gdas while [[ $# -ge 1 ]] do @@ -47,6 +48,10 @@ do RUN="$2" shift # past argument ;; + -c|--comin) # comin is base location of dir with gsistat files + COMIN="$2" + shift # past argument + ;; *) #any unspecified key is MINMON_SUFFIX export MINMON_SUFFIX=$key @@ -56,62 +61,52 @@ do shift done +#---------------------------- +# set defaults for arguments +# +if [[ $RUN = "" ]]; then + RUN=gdas +fi export RUN=$RUN -this_dir=`dirname $0` - - -if [[ $COMOUT = "" ]]; then - export RUN_ENVIR="dev" -else - export RUN_ENVIR="para" +if [[ $COMIN = "" ]]; then + COMIN=/gpfs/dell1/nco/ops/com/gfs/prod fi echo MINMON_SUFFIX = $MINMON_SUFFIX -echo RUN_ENVIR = $RUN_ENVIR +echo RUN = $RUN +echo COMIN = $COMIN -top_parm=${this_dir}/../../parm -minmon_version_file=${minmon_version:-${top_parm}/MinMon.ver} -if [[ -s ${minmon_version_file} ]]; then - . ${minmon_version_file} - echo "able to source ${minmon_version_file}" -else - echo "Unable to source ${minmon_version_file} file" - exit 2 -fi +#----------------------------------- +# source config and settings files +# +this_dir=`dirname $0` +top_parm=${this_dir}/../../parm -echo "MINMON_CONFIG = $MINMON_CONFIG" minmon_config=${minmon_config:-${top_parm}/MinMon_config} -if [[ -s ${minmon_config} ]]; then - . ${minmon_config} - echo "able to source ${minmon_config}" -else - echo "Unable to source ${minmon_config} file" +if [[ ! -e ${minmon_config} ]]; then + echo "Unable to locate ${minmon_config} file" exit 3 fi +. ${minmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${minmon_config} file" + exit $? +fi + minmon_user_settings=${minmon_user_settings:-${top_parm}/MinMon_user_settings} -if [[ -s ${minmon_user_settings} ]]; then - . ${minmon_user_settings} - echo "able to source ${minmon_user_settings}" -else - echo "Unable to source ${minmon_user_settings} file" +if [[ ! -e ${minmon_user_settings} ]]; then + echo "Unable to locate ${minmon_user_settings} file" exit 4 fi - -#-------------------------------------------------------------------- -# Check setting of RUN_ONLY_ON_DEV and possible abort if on prod and -# not permitted to run there. -#-------------------------------------------------------------------- - -if [[ RUN_ONLY_ON_DEV -eq 1 ]]; then - is_prod=`${M_DE_SCRIPTS}/onprod.sh` - if [[ $is_prod = 1 ]]; then - exit 10 - fi +. ${minmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${minmon_user_settings} file" + exit $? fi @@ -119,29 +114,20 @@ if [[ ${RUN} = "gdas" ]]; then export HOMEgfs=${HOMEgdas} fi -########################################## -# expand M_TANKverf for this MINMON_SUFFIX -########################################## NEWtank=${M_TANKverf}/stats/${MINMON_SUFFIX} if [[ $GLB_AREA -eq 0 ]]; then NEWtank=${M_TANKverf}/stats/regional/${MINMON_SUFFIX} fi -export M_TANKverf=$NEWtank -echo "M_TANKverf = $M_TANKverf" - - -############################################################## +#--------------------------------------------------------- # Determine next cycle -# If PDATE wasn't an argument then call find_cycle.pl -# to determine the last processed cycle, and set PDATE to -# the next cycle +# If PDATE wasn't supplied as an argument then call +# find_cycle.pl to determine the last processed cycle, +# and set PDATE to the next cycle # -# NOTE: Need to make gdas the default value to $run -############################################################## if [[ ${#PDATE} -le 0 ]]; then echo "PDATE not specified: setting PDATE using last cycle" - date=`${M_DE_SCRIPTS}/find_cycle.pl --run gdas --cyc 1 --dir ${M_TANKverf}` + date=`${M_DE_SCRIPTS}/find_cycle.pl --run $RUN --cyc 1 --dir ${NEWtank}` export PDATE=`$NDATE +6 $date` else echo "PDATE was specified: $PDATE" @@ -149,7 +135,36 @@ fi export PDY=`echo $PDATE|cut -c1-8` export cyc=`echo $PDATE|cut -c9-10` -echo "PDY, cyc = $PDY, $cyc " + +prev_cycle=`$NDATE -6 $PDATE` +p_pdy=`echo $prev_cycle|cut -c1-8` +p_cyc=`echo $prev_cycle|cut -c9-10` + +#-------------------------------- +# expand M_TANKverf and define +# M_TANKverfM1 (previous cycle) +# +export M_TANKverf=${NEWtank}/${RUN}.${PDY}/${cyc}/minmon +export M_TANKverfM1=${NEWtank}/${RUN}.${p_pdy}/${p_cyc}/minmon + +#----------------------------------------- +# Expand COMIN with date specific subdirs +# +comin_base=${COMIN} +COMIN=${comin_base}/${RUN}.${PDY}/${cyc}/atmos +if [[ ! -d $COMIN ]]; then + COMIN=${comin_base}/${RUN}.${PDY}/${cyc} + if [[ ! -d $COMIN ]]; then + COMIN=${comin_base}/${RUN}.${PDY} + fi +fi +export COMIN=$COMIN + +export gsistat=${COMIN}/${RUN}.t${cyc}z.gsistat +if [[ ! -e $gsistat ]]; then + echo "Unable to locate $gsistat, exiting MinMon_DE.sh" + exit 5 +fi if [[ ! -d ${LOGdir} ]]; then @@ -157,53 +172,51 @@ if [[ ! -d ${LOGdir} ]]; then fi lfile=${LOGdir}/DE.${PDY}.${cyc} -export pid=${pid:-$$} -export jlogfile=${lfile}.o${pid} -export m_jlogfile="${lfile}.log" -echo "m_jlogfile = $m_jlogfile" - -############################################################# +export logfile="${lfile}.log" +echo "logfile = $logfile" +if [[ -e $logfile ]]; then + rm -f $logfile +fi export job=${job:-DE.${RUN}} -export jobid=${jobid:-${job}.${PDY}.${pid}} -export envir=prod export DATAROOT=${DATA_IN:-${WORKDIR}} export COMROOT=${COMROOT:-/com2} - -echo "MY_MACHINE = $MY_MACHINE" - +export jobid=${jobid:-${job}.${PDY}.${pid}} jobname=minmon_de_${MINMON_SUFFIX} -rm -f $m_jlogfile +if [[ $RUN = "gfs" ]]; then + jobfile=${jobfile:-${HOMEgfs}/jobs/JGFS_ATMOS_VMINMON} +else + jobfile=${jobfile:-${HOMEgdas}/jobs/JGDAS_ATMOS_VMINMON} +fi +echo "MY_MACHINE = $MY_MACHINE" echo "SUB = $SUB" echo "JOB_QUEUE = $JOB_QUEUE" echo "PROJECT = $PROJECT" echo "jobname = $jobname" +echo "jobfile = $jobfile" -if [[ $GLB_AREA -eq 0 ]]; then - jobfile=${jobfile:-${HOMEnam}/jobs/JNAM_VMINMON} -else - if [[ $RUN = "gfs" ]]; then - jobfile=${jobfile:-${HOMEgfs}/jobs/JGFS_VMINMON} - else - jobfile=${jobfile:-${HOMEgdas}/jobs/JGDAS_VMINMON} - fi -fi -if [[ $MY_MACHINE = "wcoss" || $MY_MACHINE = "wcoss_d" ]]; then - $SUB -P $PROJECT -q $JOB_QUEUE -o ${m_jlogfile} -M 50 -R affinity[core] -W 0:10 -J ${jobname} $jobfile +if [[ $MY_MACHINE = "wcoss_d" ]]; then + $SUB -P $PROJECT -q $JOB_QUEUE -o ${logfile} -M 50 \ + -R affinity[core] -W 0:10 -J ${jobname} $jobfile elif [[ $MY_MACHINE = "cray" ]]; then - $SUB -q $JOB_QUEUE -P $PROJECT -o ${m_jlogfile} -M 80 -R "select[mem>80] rusage[mem=80]" -W 0:10 -J ${jobname} $jobfile + $SUB -q $JOB_QUEUE -P $PROJECT -o ${logfile} -M 80 \ + -R "select[mem>80] rusage[mem=80]" -W 0:10 -J ${jobname} $jobfile elif [[ $MY_MACHINE = "hera" ]]; then $SUB --account=${ACCOUNT} --time=05 -J ${job} -D . \ - -o ${LOGdir}/DE.${PDY}.${cyc}.log \ + -o ${logfile} \ --ntasks=1 --mem=5g \ ${jobfile} +elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -e ${logfile} -N gdas_vminmon -q ${JOB_QUEUE} -V \ + -l select=1:mem=400M -l walltime=05:00 -A GFS-DEV \ + ${jobfile} fi diff --git a/util/Minimization_Monitor/data_xtrct/ush/RunMM_DE.sh b/util/Minimization_Monitor/data_xtrct/ush/RunMM_DE.sh deleted file mode 100755 index f043214cd4..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/RunMM_DE.sh +++ /dev/null @@ -1,209 +0,0 @@ -#!/bin/sh - -#-------------------------------------------------------------------- -# RunMM_DE.sh -# -# Run the MinMon_DE script in a loop from start to end date or -# from start to end of available data. -# -# This script will run the MinMOn data extraction for a given source -# in a loop. The loop can be: -# 1) from the last proceessed date until the available gsistat -# data is exhausted, -# 2) from the input start date until available data is exhausted, -# 3) from the start to the stop date. -# -# -# NOTE: for the moment the script only runs as 3) above. Start and -# end dates must both be specified. -#-------------------------------------------------------------------- - -function usage { - echo "Usage: RunMM_DE.sh suffix [start_date] [end_date]" - echo " File name for RunCopy.sh can be full or relative path" - echo " Suffix is the indentifier for this data source." - echo " Start_date is the optional starting cycle to process (YYYYMMDDHH format)." - echo " End_date is the optional ending cycle to process (YYYYMMDDHH format)." -} - -set -ax -echo start RunMM_DE.sh - - -nargs=$# -if [[ $nargs -lt 3 ]]; then - usage - exit 1 -fi - -this_file=`basename $0` -this_dir=`dirname $0` - -SUFFIX=$1 -START_DATE=$2 -END_DATE=$3 - -echo SUFFIX = $SUFFIX -echo START_DATE = $START_DATE -echo END_DATE = $END_DATE - -#-------------------------------------------------------------------- -# Set environment variables -#-------------------------------------------------------------------- -top_parm=${this_dir}/../../parm -export MINMON_VERSION=${MINMON_VERSION:-${top_parm}/MinMon.ver} -if [[ -s ${MINMON_VERSION} ]]; then - echo "sourcing $MINMON_VERSION" - . ${MINMON_VERSION} -else - echo "Unable to source ${MINMON_VERSION} file" - exit 2 -fi - -export MINMON_CONFIG=${MINMON_CONFIG:-${top_parm}/MinMon_config} -if [[ -s ${MINMON_CONFIG} ]]; then - echo "sourcing $MINMON_CONFIG" - . ${MINMON_CONFIG} -else - echo "Unable to source ${MINMON_CONFIG} file" - exit 3 -fi - -export MINMON_USER_SETTINGS=${MINMON_USER_SETTINGS:-${top_parm}/MinMon_user_settings} -if [[ -s ${MINMON_USER_SETTINGS} ]]; then - echo "sourcing $MINMON_USER_SETTINGS" - . ${MINMON_USER_SETTINGS} -else - echo "Unable to source ${MINMON_USER_SETTINGS} file" - exit 4 -fi - -#-------------------------------------------------------------------- -# Check setting of RUN_ONLY_ON_DEV and possible abort if on prod and -# not permitted to run there. -#-------------------------------------------------------------------- - -if [[ RUN_ONLY_ON_DEV -eq 1 ]]; then - is_prod=`${M_DE_SCRIPTS}/onprod.sh` - if [[ $is_prod = 1 ]]; then - exit 10 - fi -fi - - -#----------------------------------------------------------------------------- -# If start and end dates were specified, confirm the start is before end date. -# NOTE: Start date = end date will result in one cycle (start date) running. -#----------------------------------------------------------------------------- -start_len=`echo ${#START_DATE}` -end_len=`echo ${#END_DATE}` -echo "start, end len = $start_len, $end_len" - -if [[ ${start_len} -gt 0 && ${end_len} -gt 0 ]]; then - if [[ $START_DATE -gt $END_DATE ]]; then - echo ERROR -- start date is greater then end date : $START_DATE $END_DATE - exit 11 - fi -fi - - -#-------------------------------------------------------------------- -# If we have a START_DATE then use it, otherwise use the last entry -# in a ${SUFFIX}_minmon.YYYYMMDD/${SUFFIX}.gnorm_data.txt file to -# determine the last date processed. -#-------------------------------------------------------------------- -start_len=`echo ${#START_DATE}` -verf_dir="${TANKverf}/stats/${SUFFIX}" - -if [[ ${start_len} -le 0 ]]; then - pdate=`${M_DE_SCRIPTS}/find_cycle.pl --run gdas --cyc 1 --dir ${verf_dir}` - pdate_len=`echo ${#pdate}` - if [[ ${pdate_len} -ne 10 ]]; then - exit 12 - fi - START_DATE=`${NDATE} +06 $pdate` -fi - -cdate=$START_DATE -echo "start date = $START_DATE" - -mkdir -p $LOGdir -##-------------------------------------------------------------------- -## Run in a loop until END_DATE is processed, or an error occurs, or -## we run out of data. -##-------------------------------------------------------------------- -done=0 -ctr=0 -while [[ $done -eq 0 ]]; do - - #-------------------------------------------------------------------- - # Check for running jobs - #-------------------------------------------------------------------- - if [[ $MY_MACHINE = "wcoss" || $MY_MACHINE = "wcoss_d" ]]; then - running=`bjobs -l | grep minmon_de_${SUFFIX} | wc -l` - elif [[ $MY_MACHINE = "hera" ]]; then - running=`qstat -u $LOGNAME | grep minmon_de_${SUFFIX} | wc -l` - fi - - if [[ $running -ne 0 ]]; then - #---------------------------------------------------- - # sleep or time-out after 30 tries. - #---------------------------------------------------- - ctr=$(( $ctr + 1 )) - if [[ $ctr -le 30 ]]; then - echo sleeping..... - sleep 60 - else - done=1 - fi - else - - #----------------------------------------------------------------- - # Run the MinMon_DE.sh script - #----------------------------------------------------------------- - log_file=${LOGdir}/MinMon_DE_${SUFFIX}_${cdate}.log - err_file=${LOGdir}/MinMon_DE_${SUFFIX}_${cdate}.err - - echo Processing ${cdate} - # need a switch for glb and rgn - ${M_DE_SCRIPTS}/MinMon_DE.sh ${SUFFIX} dev ${cdate} 1>${log_file} 2>${err_file} - - #----------------------------------------------------------------- - # done is true (1) if the copy_script produced an error code, or - # we're at END_DATE - # - # NOTE: gonna have to do some work to get the correct $rc; this - # job gets submitted to the queue so I'm going to have to dig - # through the log file to find the RC. Alternately, if no END - # is specified, I could calculate that up front. - #----------------------------------------------------------------- -# sleep 60 -# PDY=`echo $cdate|cut -c1-8` -# cyc=`echo $cdate|cut -c9-10` -# logfile="${m_jlogfile}${SUFFIX}.${PDY}.${cyc}.log" -# rc=`grep "exit value" ${logfile} | tail -1 | gawk '{split($0,a," "); print a[6]}'` -# rc_len=`echo ${#rc}` - -# echo "rc = $rc" - -# if [[ $rc -ne 0 ]]; then -# done=1 - if [[ $cdate -eq $END_DATE ]]; then -# elif [[ $cdate -eq $END_DATE ]]; then - done=1 -# elif [[ $rc_len -eq 0 ]]; then -# done=1 - else - #-------------------------------------------------------------- - # If not done advance the cdate to the next cycle - #-------------------------------------------------------------- - cdate=`${NDATE} +06 $cdate` - ctr=0 - fi - fi - -done - - -echo "end RunMM_DE.sh" -exit diff --git a/util/Minimization_Monitor/data_xtrct/ush/find_cycle.pl b/util/Minimization_Monitor/data_xtrct/ush/find_cycle.pl index 46ace9315e..f146f1dbe9 100755 --- a/util/Minimization_Monitor/data_xtrct/ush/find_cycle.pl +++ b/util/Minimization_Monitor/data_xtrct/ush/find_cycle.pl @@ -1,4 +1,4 @@ -#! /usr/bin/perl +#!/usr/bin/env perl #----------------------------------------------------------------------- # find_cycle.pl @@ -148,8 +148,9 @@ $hr_ctr = $hr_ctr - 1; $newdir = "${dirpath}/${sortmm[$ctr]}/${hrs[$hr_ctr]}/${lcm}"; -# print " newdir = $newdir \n"; - + if( ! -d $newdir ){ + $newdir = "${dirpath}/${sortmm[$ctr]}"; + } if( -d $newdir ) { opendir DIR, $newdir or die "Cannot open the current directory: $!"; @@ -197,13 +198,10 @@ } while $hr_ctr > 0 && $found_cycle == 0; -# print " found_cycle, ctr, end_ctr = $found_cycle, $ctr, $end_ctr \n"; if( $cyc == 0 && $ctr >= $end_ctr ){ -# print " exiting from if\n"; $exit_flag = 1; } elsif( $cyc == 1 && $ctr <= $end_ctr ){ -# print " exiting from elsif\n"; $exit_flag = 1; } diff --git a/util/Minimization_Monitor/data_xtrct/ush/onprod.sh b/util/Minimization_Monitor/data_xtrct/ush/onprod.sh deleted file mode 100755 index b709651389..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/onprod.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# -# Check to determine if this maching is currently -# the production machine. -# -# Return values: -# 1 = prod -# 0 = dev -# - iamprod=0 - machine=`hostname | cut -c1` - if [[ -e /etc/prod ]]; then - prod=`cat /etc/prod | cut -c1` - - if [[ $machine = $prod ]]; then - iamprod=1 - fi - fi - - echo $iamprod - exit diff --git a/util/Minimization_Monitor/data_xtrct/ush/run_cp_v16rt1.sh b/util/Minimization_Monitor/data_xtrct/ush/run_cp_v16rt1.sh deleted file mode 100755 index ca5b2e0d72..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/run_cp_v16rt1.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -#package=MinMon -package=ProdGSI/util/Minimization_Monitor - -net=v16rt1 -run=gdas - -echo "user = $USER" - -export KEEPDATA=YES -export DO_ERROR_RPT=1 -export MAIL_TO="" -export MAIL_CC="" - -scripts=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/data_xtrct/ush -echo "scripts = $scripts" - -shell=bash -source /usrx/local/prod/lmod/lmod/init/${shell} - -MODULEPATH=/usrx/local/prod/lmod/lmod/modulefiles/Core:/usrx/local/prod/modulefiles/core_third:/usrx/local/prod/modulefiles/defs:/gpfs/dell1/nco/ops/nwprod/modulefiles/core_prod:/usrx/local/dev/modulefiles - -module purge -module load ips/18.0.1.163 -module load metplus/2.1 -module load prod_util/1.1.2 - -echo NDATE = $NDATE - - - -tank=~/nbns/stats/${net} - -ldate=`${scripts}/find_cycle.pl --cyc 1 --dir ${tank} --run ${run}` -echo ldate = $ldate -pdate=`${NDATE} +06 $ldate` -#pdate=2019070100 - -echo pdate = $pdate - -pdy=`echo $pdate|cut -c1-8` -cyc=`echo $pdate|cut -c9-10` - -data_loc=/gpfs/dell2/emc/modeling/noscrub/emc.glopara/monitor/minmon/stats/${net}/${run}.${pdy} -#echo data_loc = $data_loc - -tank=${tank}/${run}.${pdy}/${cyc}/minmon -mkdir -p ${tank} - -cp ${data_loc}/*${pdate}* ${tank}/. -cp ${data_loc}/gnorm_data.txt ${tank}/. - - diff --git a/util/Minimization_Monitor/data_xtrct/ush/run_gdas_DE.sh b/util/Minimization_Monitor/data_xtrct/ush/run_gdas_DE.sh deleted file mode 100755 index faf309c805..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/run_gdas_DE.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -ch=`hostname | cut -c1` - -#package=MinMon -package=ProdGSI/util/Minimization_Monitor - -suffix=GFS -net=gfs -export RUN=gdas - -scripts=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/data_xtrct/ush -export jobfile=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/nwprod/gdas.v1.0.0/jobs/JGDAS_VMINMON - - -NDATE=/gpfs/dell1/nco/ops/nwprod/prod_util.v1.1.0/exec/ips/ndate - -tank=~/nbns/stats/${suffix} -ldate=`${scripts}/find_cycle.pl ${suffix} --cyc 1 --dir ${tank} --run ${RUN}` - -export PDATE=`${NDATE} +06 $ldate` -#export PDATE=2019083018 - -export PDY=`echo $PDATE|cut -c1-8` -export cyc=`echo $PDATE|cut -c9-10` - - -export COMIN=/gpfs/dell1/nco/ops/com/${net}/prod/${RUN}.${PDY}/${cyc} -export gsistat=${COMIN}/${RUN}.t${cyc}z.gsistat - -tank=~/nbns/stats/${suffix} -logdir=/gpfs/dell2/ptmp/Edward.Safford/logs/${suffix}/${RUN}/minmon - -echo PDATE = $PDATE -echo gsistat = $gsistat - -${scripts}/MinMon_DE.sh ${suffix} --pdate ${PDATE} --run ${RUN} 1>$logdir/MinMon_DE.log 2>$logdir/MinMon_DE.err diff --git a/util/Minimization_Monitor/data_xtrct/ush/run_gfs_DE.sh b/util/Minimization_Monitor/data_xtrct/ush/run_gfs_DE.sh deleted file mode 100755 index dfe7fb6ea3..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/run_gfs_DE.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - - -#package=MinMon -package=ProdGSI/util/Minimization_Monitor - -suffix=GFS -net=gfs -export RUN=gfs - -scripts=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/data_xtrct/ush -export jobfile=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/nwprod/gfs.v1.0.0/jobs/JGFS_VMINMON - - -NDATE=/gpfs/dell1/nco/ops/nwprod/prod_util.v1.1.0/exec/ips/ndate - -tank=~/nbns/stats/${suffix} -ldate=`${scripts}/find_cycle.pl ${suffix} --cyc 1 --dir ${tank} --run ${RUN}` - -export PDATE=`${NDATE} +06 $ldate` -#export PDATE=2019083018 - -export PDY=`echo $PDATE|cut -c1-8` -export cyc=`echo $PDATE|cut -c9-10` - - -export COMIN=/gpfs/dell1/nco/ops/com/${net}/prod/${RUN}.${PDY}/${cyc} -export gsistat=${COMIN}/${RUN}.t${cyc}z.gsistat - -tank=~/nbns/stats/${suffix} -logdir=/gpfs/dell2/ptmp/Edward.Safford/logs/${suffix}/${RUN}/minmon - -echo PDATE = $PDATE -echo gsistat = $gsistat - -${scripts}/MinMon_DE.sh ${suffix} --pdate ${PDATE} --run ${RUN} 1>$logdir/MinMon_DE.log 2>$logdir/MinMon_DE.err diff --git a/util/Minimization_Monitor/data_xtrct/ush/run_script.sh b/util/Minimization_Monitor/data_xtrct/ush/run_script.sh deleted file mode 100755 index b794b57976..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/run_script.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/ksh - -#---------------------------------------------------------------------- -# -# This is a generic data extraction leader script. -# -# The MinMon_DE.sh script may be called directly, or this script, -# which calls MinMon_DE.sh can be used to overwrite specific -# values in MinMon_DE.sh and/or parm files. -# -# Set MINMON_SUFFIX, RUN to match your data source and run -# value. -# -# COMIN is the location of the gsistat file repository, which -# contains the specific $RUN.$PDATE subdirectories. -# -# Use pdate to run a specific cycle. If commented out then the -# M_TANKverf directory will be examined and the pdate will -# be the last cycle run + 6 hrs. -# -#---------------------------------------------------------------------- - -MINMON_SUFFIX=testmm -RUN=gfs -COMIN=/scratch1/NCEPDEV/da/Edward.Safford/noscrub/test_data - -#pdate=2016030700 - - -#---------------------------------------------------------------------- -# No changes should be necessary below this point. -#---------------------------------------------------------------------- - -. ../../parm/MinMon.ver -. ../../parm/MinMon_config - -if [[ $RUN == "gfs" ]]; then - export jobfile=${HOMEgfs}/jobs/JGFS_VMINMON -else - export jobfile=${HOMEgdas}/jobs/JGDAS_VMINMON -fi - -echo NDATE = $NDATE - -echo "LOGdir = ${LOGdir}" -if [[ ! -e ${LOGdir} ]]; then - mkdir -p ${LOGdir} -fi - -if [[ $pdate == "" ]]; then - ldate=`${M_DE_SCRIPTS}/find_cycle.pl --dir ${M_TANKverf}/stats/${MINMON_SUFFIX} --cyc 1 --run ${RUN}` - pdate=`${NDATE} +06 $ldate` -fi - -pdy=`echo $pdate|cut -c1-8` -cyc=`echo $pdate|cut -c9-10` - -export gsistat=${COMIN}/${RUN}.${pdy}/${cyc}/${RUN}.t${cyc}z.gsistat - -if [[ ! -e $gsistat ]]; then - echo " unable to locate $gsistat" -fi - -echo pdate = $pdate -echo gsistat = $gsistat - - -${M_DE_SCRIPTS}/MinMon_DE.sh ${MINMON_SUFFIX} -p ${pdate} -r ${RUN} \ - 1>$LOGdir/MinMon_DE.log 2>$LOGdir/MinMon_DE.err - - diff --git a/util/Minimization_Monitor/data_xtrct/ush/run_v16rt1.sh b/util/Minimization_Monitor/data_xtrct/ush/run_v16rt1.sh deleted file mode 100755 index 842f150d01..0000000000 --- a/util/Minimization_Monitor/data_xtrct/ush/run_v16rt1.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh - -idev=`cat /etc/dev | cut -c1` -iprod=`cat /etc/prod | cut -c1` - -package=MinMon -#package=ProdGSI/util/Minimization_Monitor -suffix=v16rt1 -export run=gdas - -echo "user = $USER" - -export KEEPDATA=YES -export DO_ERROR_RPT=1 -export MAIL_TO="" -export MAIL_CC="" - -scripts=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/data_xtrct/ush -echo "scripts = $scripts" - -export jobfile=/gpfs/dell2/emc/modeling/noscrub/${USER}/${package}/nwprod/gdas.v1.0.0/jobs/JGDAS_VMINMON -echo "jobfile = $jobfile" - -shell=sh -source /usrx/local/prod/lmod/lmod/init/${shell} - -MODULEPATH=/usrx/local/prod/lmod/lmod/modulefiles/Core:/usrx/local/prod/modulefiles/core_third:/usrx/local/prod/modulefiles/defs:/gpfs/dell1/nco/ops/nwprod/modulefiles/core_prod:/usrx/local/dev/modulefiles - -module purge -module load ips/18.0.1.163 -module load metplus/2.1 -module load lsf -module load prod_util/1.1.2 - -echo NDATE = $NDATE - -#export COMIN=/gpfs/hps3/emc/global/noscrub/emc.glopara/archive/prfv3rt1 -export COMIN=/gpfs/dell2/emc/modeling/noscrub/emc.glopara/archive/v16rt1 - -tank=~/nbns/stats/${suffix} -logdir=/gpfs/dell2/ptmp/Edward.Safford/logs/${suffix}/${run}/minmon - -ldate=`${scripts}/find_cycle.pl --cyc 1 --dir ${tank} --run ${run}` -echo ldate = $ldate -export PDATE=`${NDATE} +06 $ldate` -#PDATE=2019082806 - -export PDY=`echo $PDATE|cut -c1-8` -export cyc=`echo $PDATE|cut -c9-10` - -#module unload prod_util - -export gsistat=${COMIN}/gsistat.${run}.${PDATE} - -echo PDATE = $PDATE -echo gsistat = $gsistat - -${scripts}/MinMon_DE.sh ${suffix} --pdate ${PDATE} 1>$logdir/MinMon_DE.log 2>$logdir/MinMon_DE.err - - diff --git a/util/Minimization_Monitor/get_hostname.pl b/util/Minimization_Monitor/get_hostname.pl index 47f782d675..56df214223 100755 --- a/util/Minimization_Monitor/get_hostname.pl +++ b/util/Minimization_Monitor/get_hostname.pl @@ -28,6 +28,9 @@ if( $host =~ /hfe/ ) { $machine = "hera"; } + elsif( $host =~ /clogin0/ || $host =~ /dlogin0/ ) { + $machine = "wcoss2"; + } elsif( $host =~ /login/ ) { $machine = "cray"; } diff --git a/util/Minimization_Monitor/image_gen/ush/MinMon_Plt.sh b/util/Minimization_Monitor/image_gen/ush/MinMon_Plt.sh index aa942e65d3..e08edc8c70 100755 --- a/util/Minimization_Monitor/image_gen/ush/MinMon_Plt.sh +++ b/util/Minimization_Monitor/image_gen/ush/MinMon_Plt.sh @@ -13,6 +13,7 @@ function usage { echo " " } + echo start MinMonPlt.sh nargs=$# @@ -21,7 +22,6 @@ if [[ $nargs -lt 1 || $nargs -gt 5 ]]; then exit 1 fi -RUN=gdas while [[ $# -ge 1 ]] do key="$1" @@ -45,56 +45,52 @@ do shift done +if [[ ${#MINMON_SUFFIX} -le 0 ]]; then + echo "No suffix supplied, unable to proceed" + exit 2 +fi + if [[ ${#RUN} -le 0 ]]; then export RUN=gdas fi +run_suffix=${MINMON_SUFFIX}_${RUN} echo "MINMON_SUFFIX = $MINMON_SUFFIX" echo "PDATE = $PDATE" echo "RUN = $RUN" - -if [[ ${#RUN} -gt 0 ]]; then - run_suffix=${MINMON_SUFFIX}_${RUN} -else - run_suffix=${MINMON_SUFFIX} -fi - +#---------------------------------------- +# source config, and user_settings files +#---------------------------------------- this_dir=`dirname $0` - -#-------------------------------------------------- -# source verison, config, and user_settings files -#-------------------------------------------------- top_parm=${this_dir}/../../parm -minmon_version_file=${minmon_version:-${top_parm}/MinMon.ver} -if [[ -s ${minmon_version_file} ]]; then - . ${minmon_version_file} - echo "able to source ${minmon_version_file}" -else - echo "Unable to source ${minmon_version_file} file" - exit 2 -fi - minmon_config=${minmon_config:-${top_parm}/MinMon_config} -if [[ -s ${minmon_config} ]]; then - . ${minmon_config} - echo "able to source ${minmon_config}" -else - echo "Unable to source ${minmon_config} file" +if [[ ! -e ${minmon_config} ]]; then + echo "Unable to locate ${minmon_config} file" exit 3 fi +. ${minmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${minmon_config} file" + exit $? +fi + + minmon_user_settings=${minmon_user_settings:-${top_parm}/MinMon_user_settings} -if [[ -s ${minmon_user_settings} ]]; then - . ${minmon_user_settings} - echo "able to source ${minmon_user_settings}" -else - echo "Unable to source ${minmon_user_settings} file" +if [[ ! -e ${minmon_user_settings} ]]; then + echo "Unable to locate ${minmon_user_settings} file" exit 4 fi +. ${minmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${minmon_user_settings} file" + exit $? +fi + #-------------------------------------------------------------------- # Specify TANKDIR for this suffix @@ -106,14 +102,44 @@ else fi #-------------------------------------------------------------------- -# If PDATE wasn't specified as an argument then plot the last -# available cycle. +# Determine cycle to plot. Exit if cycle is > last available +# data. +# +# PDATE can be set one of 3 ways. This is the order of priority: +# +# 1. Specified via command line argument +# 2. Read from ${TANKimg}/last_plot_time file and advanced +# one cycle. +# 3. Using the last available cycle for which there is +# data in ${TANKDIR}. +# +# If option 2 has been used the ${IMGNDIR}/last_plot_time file +# will be updated with ${PDATE} if the plot is able to run. #-------------------------------------------------------------------- -if [[ ${#PDATE} -le 0 ]]; then - echo "PDATE not specified: setting PDATE using last cycle" - export PDATE=`${M_IG_SCRIPTS}/find_cycle.pl --cyc 1 --dir ${TANKDIR}` + +echo "MIN_IMGN_TANKDIR = ${MIN_IMGN_TANKDIR}" +last_plot_time=${MIN_IMGN_TANKDIR}/${RUN}/minmon/last_plot_time +echo "last_plot_time file = ${last_plot_time}" + +latest_data=`${M_IG_SCRIPTS}/find_cycle.pl --cyc 1 --dir ${TANKDIR} --run ${RUN}` + +if [[ ${PDATE} = "" ]]; then + if [[ -e ${last_plot_time} ]]; then + echo " USING last_plot_time file" + last_plot=`cat ${last_plot_time}` + PDATE=`$NDATE +6 ${last_plot}` + else + echo " USING find_cycle file" + PDATE=${latest_data} + fi +fi + + +if [[ ${PDATE} -gt ${latest_data} ]]; then + echo " Unable to plot, pdate is > latest_data, ${PDATE}, ${latest_data}" + exit 5 else - echo "PDATE was specified: $PDATE" + echo " OK to plot" fi @@ -133,6 +159,7 @@ if [[ ! -d $WORKDIR ]]; then fi cd $WORKDIR + #-------------------------------------------------------------------- # Copy gnorm_data.txt file to WORKDIR. #-------------------------------------------------------------------- @@ -215,70 +242,49 @@ while [[ $cdate -le $edate ]]; do cdate=$adate done -#-------------------------------------------------------------------- -# Main processing loop. -# Run extract_all_gnorms.pl script and generate single cycle plot. -# -# RM this loop or add an optional end date to the args list and -# process each date in turn. -# -# And alternate plot method might be to simply plot the last -# available cycle if no PDATE is included. Could use find_cycle.pl -# to find the last one and done. -# -# Also should an attempt to plot a date for which there is no data -# produce an error exit? I think so. -#-------------------------------------------------------------------- -not_done=1 -ctr=0 + area=glb if [[ $GLB_AREA -eq 0 ]]; then area=rgn fi -while [ $not_done -eq 1 ] && [ $ctr -le 20 ]; do - - #----------------------------------------------------------------- - # copy over the control files and update the tdef lines - # according to the $suffix - #----------------------------------------------------------------- - if [[ ! -e ${WORKDIR}/allgnorm.ctl ]]; then - cp ${M_IG_GRDS}/${area}_allgnorm.ctl ${WORKDIR}/orig_allgnorm.ctl - cp ${WORKDIR}/orig_allgnorm.ctl ${WORKDIR}/allgnorm.ctl - fi +#----------------------------------------------------------------- +# copy over the control files and update the tdef lines +# according to the $suffix +#----------------------------------------------------------------- +if [[ ! -e ${WORKDIR}/allgnorm.ctl ]]; then + cp ${M_IG_GRDS}/${area}_allgnorm.ctl ${WORKDIR}/orig_allgnorm.ctl + cp ${WORKDIR}/orig_allgnorm.ctl ${WORKDIR}/allgnorm.ctl +fi - if [[ ! -e ${WORKDIR}/reduction.ctl ]]; then - cp ${M_IG_GRDS}/${area}_reduction.ctl ${WORKDIR}/reduction.ctl +if [[ ! -e ${WORKDIR}/reduction.ctl ]]; then + cp ${M_IG_GRDS}/${area}_reduction.ctl ${WORKDIR}/reduction.ctl + if [[ ${RUN} = "gfs" ]]; then + gfs_xdef="xdef 152 linear 1.0 1.0" + sed -i "/xdef/c ${gfs_xdef}" reduction.ctl fi +fi - # - # update the tdef line in the ctl files - # - bdate=`$NDATE -168 $PDATE` - ${M_IG_SCRIPTS}/update_ctl_tdef.sh ${WORKDIR}/allgnorm.ctl ${bdate} - ${M_IG_SCRIPTS}/update_ctl_tdef.sh ${WORKDIR}/reduction.ctl ${bdate} +#--------------------------------------- +# update the tdef line in the ctl files +#--------------------------------------- +bdate=`$NDATE -168 $PDATE` +${M_IG_SCRIPTS}/update_ctl_tdef.sh ${WORKDIR}/allgnorm.ctl ${bdate} +${M_IG_SCRIPTS}/update_ctl_tdef.sh ${WORKDIR}/reduction.ctl ${bdate} - ####################### - # Q: does NDAS really use 101 instead of 102? That can't be somehow.... - ####################### - -# if [[ $MINMON_SUFFIX = "RAP" ]]; then -# ${M_IG_SCRIPTS}/update_ctl_xdef.sh ${WORKDIR}/allgnorm.ctl 102 -# fi - - #----------------------------------------------------------------- - # Copy the plot script and build the plot driver script - #----------------------------------------------------------------- - if [[ ! -e ${WORKDIR}/plot_gnorms.gs ]]; then - cp ${M_IG_GRDS}/plot_gnorms.gs ${WORKDIR}/. - fi - if [[ ! -e ${WORKDIR}/plot_reduction.gs ]]; then - cp ${M_IG_GRDS}/plot_reduction.gs ${WORKDIR}/. - fi - if [[ ! -e ${WORKDIR}/plot_4_gnorms.gs ]]; then - cp ${M_IG_GRDS}/plot_4_gnorms.gs ${WORKDIR}/. - fi +#----------------------------------------------------------------- +# Copy the plot script and build the plot driver script +#----------------------------------------------------------------- +if [[ ! -e ${WORKDIR}/plot_gnorms.gs ]]; then + cp ${M_IG_GRDS}/plot_gnorms.gs ${WORKDIR}/. +fi +if [[ ! -e ${WORKDIR}/plot_reduction.gs ]]; then + cp ${M_IG_GRDS}/plot_reduction.gs ${WORKDIR}/. +fi +if [[ ! -e ${WORKDIR}/plot_4_gnorms.gs ]]; then + cp ${M_IG_GRDS}/plot_4_gnorms.gs ${WORKDIR}/. +fi cat << EOF >${PDATE}_plot_gnorms.gs @@ -299,33 +305,24 @@ cat << EOF >${PDATE}_plot_4_gnorms.gs 'quit' EOF +#----------------------------------------------------------------- +# Run the plot driver script and move the image into ./tmp +#----------------------------------------------------------------- +GRADS=`which grads` - #----------------------------------------------------------------- - # Run the plot driver script and move the image into ./tmp - #----------------------------------------------------------------- - GRADS=`which grads` - - $TIMEX $GRADS -blc "run ${PDATE}_plot_gnorms.gs" - $TIMEX $GRADS -blc "run ${PDATE}_plot_reduction.gs" - $TIMEX $GRADS -blc "run ${PDATE}_plot_4_gnorms.gs" - - if [[ ! -d ${WORKDIR}/tmp ]]; then - mkdir ${WORKDIR}/tmp - fi - mv *.png tmp/. - - #----------------------------------------------------------------- - # copy the modified gnorm_data.txt file to tmp - #----------------------------------------------------------------- - cp gnorm_data.txt tmp/${run_suffix}.gnorm_data.txt +$TIMEX $GRADS -blc "run ${PDATE}_plot_gnorms.gs" +$TIMEX $GRADS -blc "run ${PDATE}_plot_reduction.gs" +$TIMEX $GRADS -blc "run ${PDATE}_plot_4_gnorms.gs" - - ctr=`expr $ctr + 1` -done +if [[ ! -d ${WORKDIR}/tmp ]]; then + mkdir ${WORKDIR}/tmp +fi +mv *.png tmp/. #----------------------------------------------------------------- -# copy all cost files to tmp +# copy the modified gnorm_data.txt and cost files to tmp #----------------------------------------------------------------- +cp gnorm_data.txt tmp/${run_suffix}.gnorm_data.txt cp *cost*.txt tmp/. #-------------------------------------------------------------------- @@ -337,6 +334,12 @@ if [[ ${DO_ERROR_RPT} -eq 1 ]]; then err_msg=${TANKDIR}/${RUN}.${pdy}/${cyc}/minmon/${PDATE}.errmsg.txt + if [[ $MAIL_CC == "" ]]; then + if [[ -e /u/Edward.Safford/bin/get_cc_list.pl ]]; then + MAIL_CC=`/u/Edward.Safford/bin/get_cc_list.pl --nr ${run_suffix} --mon MinMon` + fi + fi + if [[ -e $err_msg ]]; then err_rpt="./err_rpt.txt" `cat $err_msg > $err_rpt` @@ -358,33 +361,33 @@ if [[ ${DO_ERROR_RPT} -eq 1 ]]; then fi #-------------------------------------------------------------------- -# Push the image & txt files over to the server +# Push the image & txt files over to the server +# or move files to $MIN_IMGN_TANKDIR #-------------------------------------------------------------------- - if [[ ${MY_MACHINE} = "wcoss" || ${MY_MACHINE} = "cray" || \ - ${MY_MACHINE} = "wcoss_d" ]]; then - cd ./tmp - $RSYNC -ave ssh --exclude *.ctl* ./ \ - ${WEBUSER}@${WEBSERVER}:${WEBDIR}/$run_suffix/ - fi - - if [[ ! -d ${MIN_IMGN_TANKDIR} ]]; then - mkdir -p ${MIN_IMGN_TANKDIR} +cd ./tmp +if [[ ${MY_MACHINE} = "wcoss" || ${MY_MACHINE} = "cray" || \ + ${MY_MACHINE} = "wcoss_d" || ${MY_MACHINE} = "wcoss2" ]]; then + $RSYNC -ave ssh --exclude *.ctl* ./ \ + ${WEBUSER}@${WEBSERVER}:${WEBDIR}/$run_suffix/ +else + img_dir=${MIN_IMGN_TANKDIR}/${RUN}/minmon + if [[ ! -d ${img_dir} ]]; then + mkdir -p ${img_dir} fi - - cd ./tmp - cp *.png ${MIN_IMGN_TANKDIR} + mv * ${img_dir}/. +fi #-------------------------------------------------------------------- -# Call nu_make_archive.sh to write archive files to hpss and -# update the prod machine with any missing M_TANKDIR directories. +# Update the last_plot_time file if found #-------------------------------------------------------------------- -# if [[ ${DO_ARCHIVE} -eq 1 ]]; then -# ${M_IG_SCRIPTS}/nu_make_archive.sh -# fi +if [[ -e ${last_plot_time} ]]; then + echo "update last_plot_time file" + echo ${PDATE} > ${last_plot_time} +fi -#cd ${WORKDIR} -#cd .. -#rm -rf ${WORKDIR} +cd ${WORKDIR} +cd .. +rm -rf ${WORKDIR} echo "end MinMonPlt.sh" exit diff --git a/util/Minimization_Monitor/image_gen/ush/nu_make_archive.sh b/util/Minimization_Monitor/image_gen/ush/nu_make_archive.sh deleted file mode 100755 index d136a2c47b..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/nu_make_archive.sh +++ /dev/null @@ -1,204 +0,0 @@ -#! /bin/ksh - -#------------------------------------------------------------------ -# -# nu_make_archive.sh -# -# Archive the data files (*.ieee_d) to HPSS. -# -# Note that only full days are archived, so if running for the -# 00, 06, or 12z cycles the previous day will be archived. If -# PDATE = yyyymmdd18 then today (PDATE) will be last day archived. -#------------------------------------------------------------------ -set -ax -export list=$listvar - -#-------------------------------------------------------------------- -# Run config files to load environment variables, -# set default plot conditions -#-------------------------------------------------------------------- -##TESTING BRACKET BEGIN -#PDATE=2015101412 -#SUFFIX=GDAS - -#this_dir=`pwd` -#top_parm=${this_dir}/../../parm -# -#export MINMON_VERSION=${MINMON_VERSION:-${top_parm}/MinMon.ver} -#if [[ -s ${MINMON_VERSION} ]]; then -# . ${MINMON_VERSION} -#else -# echo "Unable to source ${MINMON_VERSION} file" -# exit 2 -#fi - -#export MINMON_CONFIG=${MINMON_CONFIG:-${top_parm}/MinMon_config} -# -#if [[ -s ${MINMON_CONFIG} ]]; then -# . ${MINMON_CONFIG} -#else -# echo "Unable to source ${MINMON_CONFIG}" -# exit -#fi -# -#MINMON_USER_SETTINGS=${MINMON_USER_SETTINGS:-${top_parm}/MinMon_user_settings} -#if [[ -s ${MINMON_USER_SETTINGS} ]]; then -# . ${MINMON_USER_SETTINGS} -#else -# echo "Unable to source ${MINMON_USER_SETTINGS}" -# exit -#fi -##TESTING BRACKET END - - -#------------------------------------------------------------------ -# Determine last full day capable of archiving. -#------------------------------------------------------------------ -CYCLE=`echo $PDATE|cut -c9-10` -if [[ ${CYCLE} = "18" ]]; then - LASTARCH=$PDATE -else - LASTARCH=`$NDATE -24 $PDATE` -fi - -LAST_DAY=`echo $LASTARCH|cut -c1-8` -echo LAST_DAY = $LAST_DAY - -#------------------------------------------------------------------ -# Determine the last archived date for this source. -#------------------------------------------------------------------ -shell=ksh -. /usrx/local/Modules/default/init/${shell} -`module load hpss` - -## -## Need better reference here! -hpss2yr="/NCEPDEV/emc-da/2year" -if [[ $MINMON_SUFFIX = "GDAS" ]]; then - HPSSDIR="${hpss2yr}/${LOGNAME}/nbns/stats/GDAS" -elif [[ $MINMON_SUFFIX = "GFS" ]]; then - HPSSDIR="${hpss2yr}/${LOGNAME}/nbns/stats/GFS" -elif [[ $MINMON_SUFFIX = "4devb" ]]; then - HPSSDIR="${hpss2yr}/${LOGNAME}/nbns/stats/4devb" -elif [[ $MINMON_SUFFIX = "NDAS" ]]; then - HPSSDIR="${hpss2yr}/${LOGNAME}/nbns/stats/regional/NDAS" -elif [[ $MINMON_SUFFIX = "RAP" ]]; then - HPSSDIR="${hpss2yr}/${LOGNAME}/nbns/stats/regional/RAP" -fi - -HTAR="/usrx/local/hpss/htar" -M_TANKDIR=${M_TANKverf}/stats/${MINMON_SUFFIX} -TDATE=$LASTARCH -TDAY=`echo $TDATE|cut -c1-8` -tar_cnt=0 -cntr=0 -max_list=0 -while [[ -d ${M_TANKDIR}/minmon.$TDAY && $max_list -lt 5 && $cntr -lt 31 ]]; do - - tar_cnt=$( $HTAR -tf ${HPSSDIR}/minmon.${TDAY}.tar | wc -l ) - echo "tar_cnt = $tar_cnt" - - if [[ $tar_cnt -lt 5 ]] then - echo "adding $TDAY to list" - tar_list="$tar_list $TDAY" - ((max_list=max_list+1)) - fi - - TDATE=`$NDATE -24 $TDATE` - TDAY=`echo $TDATE|cut -c1-8` - - ((cntr=cntr+1)) -done - -echo "tar_list = $tar_list" - -#------------------------------------------------------------------ -# Archive tar_list to hpss and the $ARCHIVE_DIR -#------------------------------------------------------------------ - -for tar_date in ${tar_list}; do - - $HTAR -cvf ${HPSSDIR}/minmon.${tar_date}.tar ${M_TANKDIR}/minmon.${tar_date} - -done - - - -#------------------------------------------------------------------ -#------------------------------------------------------------------ -# Add new directories to the prod machine -#------------------------------------------------------------------ -#------------------------------------------------------------------ -if [[ $MY_MACHINE = "wcoss" ]]; then - - #------------------------------------------------------------------ - # Generate lists of directories locally and on the prod machine - #------------------------------------------------------------------ - PROD=`cat /etc/prod` - dev_dirs=`ls -d1 $M_TANKDIR/minmon*` - prod_dirs=`ssh $LOGNAME@$PROD "ls -d1 $M_TANKDIR/minmon*"` - - #------------------------------------------------------------------ - # Throw out anything later than LASTARCH in dev_dirs so we don't - # end up with a partial directory on the prod machine. - #------------------------------------------------------------------ - nu_devdirs="" - for tdir in ${dev_dirs}; do - if [[ $tdir != "info" ]]; then - test_date=`echo $tdir | gawk -F. '{print $NF}'` - echo test_date=$test_date - if [[ $test_date -le $LAST_DAY ]]; then - nu_devdirs="$nu_devdirs $tdir" - fi - fi - done - echo nu_devdirs = $nu_devdirs - dev_dirs=$nu_devdirs - - #------------------------------------------------------------------ - # Compare dev_dirs and prod_dirs. Generate a list of any missing - # directories in prod_dirs. - #------------------------------------------------------------------ - xfer_list="" - for tdir in ${dev_dirs}; do - test=`echo $prod_dirs | grep $tdir` - if [[ $test = "" ]]; then - xfer_list="$xfer_list $tdir" - fi - done - echo "xfer_list = $xfer_list" - - #------------------------------------------------------------------ - # For all entries in the xfer_list tar the directory, copy it to - # the prod machine, unpack it, rm both copies of the tar file - #------------------------------------------------------------------ - home=`pwd` - cd $M_TANKDIR - - for tdir in ${xfer_list}; do -# tarfile="$tdir.tar" - mmdir=`echo $tdir | gawk -F/ '{print $NF}'` - tarfile=${mmdir}.tar - - tar -cvf ${tarfile} ${mmdir} - scp ./$tarfile ${LOGNAME}@${PROD}:${M_TANKDIR}/$tarfile - - ssh ${LOGNAME}@${PROD} "cd $M_TANKDIR && tar -xvf ./$tarfile && rm -f ./$tarfile" - rm ./$tarfile - done - cd $home - - #------------------------------------------------------------------ - # Remove any directories in $M_TANKDIR in excess of 120 - #------------------------------------------------------------------ - total=`ls -d1 ${M_TANKDIR}/minmon.* | wc -l` - ((extra=total-121)) - - if [[ $extra -gt 0 ]]; then - `ls -d1 ${M_TANKDIR}/minmon.* | head -n $extra | xargs rm -rf` - fi - -fi - -exit - diff --git a/util/Minimization_Monitor/image_gen/ush/onprod.sh b/util/Minimization_Monitor/image_gen/ush/onprod.sh deleted file mode 100755 index b709651389..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/onprod.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# -# Check to determine if this maching is currently -# the production machine. -# -# Return values: -# 1 = prod -# 0 = dev -# - iamprod=0 - machine=`hostname | cut -c1` - if [[ -e /etc/prod ]]; then - prod=`cat /etc/prod | cut -c1` - - if [[ $machine = $prod ]]; then - iamprod=1 - fi - fi - - echo $iamprod - exit diff --git a/util/Minimization_Monitor/image_gen/ush/pen_data_map.xml b/util/Minimization_Monitor/image_gen/ush/pen_data_map.xml deleted file mode 100644 index 501ea916ea..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/pen_data_map.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - glb - /com/gfs/prod - - - /u/${LOGNAME}/nbns/stats - 1 - - - glb - 1 - 2016030706 - - diff --git a/util/Minimization_Monitor/image_gen/ush/query_data_map.pl b/util/Minimization_Monitor/image_gen/ush/query_data_map.pl deleted file mode 100755 index 8800eccbae..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/query_data_map.pl +++ /dev/null @@ -1,73 +0,0 @@ -#! /usr/bin/perl - -#------------------------------------------------------------------- -# query_data_map.pl -# -# This script returns a requested field from the data_map.xml file. -# It takes three items as input: -# 1. data_map.xml file name (full or relative path) -# 2. suffix identifying the data source (an element in the -# data_map.xml file) -# 3. requested field, one of the xml child elements of the -# suffix element. -# -# If the xml element associated with the suffix does not have the -# requested field defined, then the default_global or -# default_regional element's corresponding field will be used. The -# default is default_global, but if the suffix contains an area of -# "rgn" then the regional_default element will be used. -# -# The contents of that field are echoed to stdout for the calling -# script to access. If the field is empty or missing nothing -# will be returned. The calling script should verify a value has -# been returned before use. -# -#------------------------------------------------------------------- - use strict; - use warnings; - use XML::LibXML; - - if( $#ARGV < 2 ) { - exit - } - - my $dmfile = $ARGV[0]; - my $source = $ARGV[1]; - my $field = $ARGV[2]; - my $default="global_default"; - use XML::LibXML; - - my $parser = XML::LibXML->new(); - my $doc = $parser->parse_file($dmfile); - -# Print the contents of the field if it's found in source. -# If the field is not found in source then use the default element -# and output it's value for the requested field. - - my @srcs = $doc->findnodes("/opt/$source"); - if( @srcs <= 0 ) { - @srcs = $doc->findnodes("/opt/$default"); - } - - if ( @srcs > 0 ) { - - my $src = $srcs[0]; - my($answer) = $src->findnodes("./$field"); - my($area) = $src->findnodes("./area"); - my $src_area = $area->to_literal; - - if( $answer ) { - print $answer->to_literal; - } - else { - if( $src_area eq "rgn" ) { - $default = "regional_default"; - } - my($def_src) = $src->findnodes("/opt/$default"); - my($def_answer) = $def_src->findnodes("./$field"); - if( $def_answer ) { - print $def_answer->to_literal; - } - } - } - diff --git a/util/Minimization_Monitor/image_gen/ush/run_gdas_IG.sh b/util/Minimization_Monitor/image_gen/ush/run_gdas_IG.sh deleted file mode 100755 index 51f2da85c0..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/run_gdas_IG.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -set -ax - -#package=MinMon -package=ProdGSI/util/Minimization_Monitor - -suffix=GFS -run=gdas - -NDATE=/gpfs/dell1/nco/ops/nwprod/prod_util.v1.1.0/exec/ips/ndate -echo NDATE = $NDATE -ch=`hostname | cut -c1` - -scripts=/gpfs/dell2/emc/modeling/noscrub/${LOGNAME}/${package}/image_gen/ush -ptmp=/gpfs/dell2/ptmp/Edward.Safford - -export DO_ARCHIVE=0 -export JOB_QUEUE=dev_shared -export DO_ERROR_RPT=1 - -export MAIL_CC="russ.treadon@noaa.gov, andrew.collard@noaa.gov" -export MAIL_TO="edward.safford@noaa.gov" - -data_map=${scripts}/pen_data_map.xml - -tankdir=/u/Edward.Safford/nbns/stats/${suffix} - -imgdate=`${scripts}/query_data_map.pl ${data_map} ${suffix}_${run} imgdate` -idate=`$NDATE +6 $imgdate` -PDY=`echo $idate | cut -c1-8` -cyc=`echo $idate | cut -c9-10` - -prodate=`${scripts}/find_cycle.pl --run $run --cyc 1 --dir ${tankdir}` -echo "imgdate, prodate = $imgdate, $prodate" -if [[ $idate -le $prodate ]]; then - - echo " firing MinMon_Plt.sh" - ${scripts}/MinMon_Plt.sh ${suffix} -p $idate -r $run \ - 1>${ptmp}/logs/${suffix}/${run}/minmon/IG.${run}.${PDY}.${cyc}.log \ - 2>${ptmp}/logs/${suffix}/${run}/minmon/IG.${run}.${PDY}.${cyc}.err - - rc=`${scripts}/update_data_map.pl ${data_map} ${suffix}_${run} imgdate ${idate}` - -fi - - -exit diff --git a/util/Minimization_Monitor/image_gen/ush/run_gfs_IG.sh b/util/Minimization_Monitor/image_gen/ush/run_gfs_IG.sh deleted file mode 100755 index 70b90b2335..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/run_gfs_IG.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -set -ax - -#package=MinMon -package=ProdGSI/util/Minimization_Monitor - -suffix=GFS -run=gfs - -NDATE=/gpfs/dell1/nco/ops/nwprod/prod_util.v1.1.0/exec/ips/ndate -echo NDATE = $NDATE -ch=`hostname | cut -c1` - -scripts=/gpfs/dell2/emc/modeling/noscrub/${LOGNAME}/${package}/image_gen/ush -ptmp=/gpfs/dell2/ptmp/Edward.Safford - -export DO_ARCHIVE=0 -export JOB_QUEUE=dev_shared -export DO_ERROR_RPT=1 - -export MAIL_CC="russ.treadon@noaa.gov, andrew.collard@noaa.gov" -export MAIL_TO="edward.safford@noaa.gov" - -data_map=${scripts}/pen_data_map.xml - -tankdir=/u/Edward.Safford/nbns/stats/${suffix} - -imgdate=`${scripts}/query_data_map.pl ${data_map} ${suffix}_${run} imgdate` -idate=`$NDATE +6 $imgdate` -PDY=`echo $idate | cut -c1-8` -cyc=`echo $idate | cut -c9-10` - -prodate=`${scripts}/find_cycle.pl --run $run --cyc 1 --dir ${tankdir}` -echo "imgdate, prodate = $imgdate, $prodate" -if [[ $idate -le $prodate ]]; then - - echo " firing MinMon_Plt.sh" - ${scripts}/MinMon_Plt.sh ${suffix} -p $idate -r $run \ - 1>${ptmp}/logs/${suffix}/${run}/minmon/IG.${run}.${PDY}.${cyc}.log \ - 2>${ptmp}/logs/${suffix}/${run}/minmon/IG.${run}.${PDY}.${cyc}.err - - rc=`${scripts}/update_data_map.pl ${data_map} ${suffix}_${run} imgdate ${idate}` - -fi - - -exit diff --git a/util/Minimization_Monitor/image_gen/ush/run_script.sh b/util/Minimization_Monitor/image_gen/ush/run_script.sh deleted file mode 100755 index d55bd586c8..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/run_script.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/sh - -#---------------------------------------------------------------------- -# -# This is a generic image generation leader script. -# The MinMon_Plt.sh script may be called directly or this script -# may be used to override specific default values in the parm files -# and/or MinMon_Plt.sh script. -# -# MINMON_SUFFIX corresponds to the $NET value -# -# RUN is either gfs or gdas -# -# MAIL_CC list is used if warnings messages are set to on. -# -# idate, if set, will override the next value in the local -# pen_data_map.xml file. -#---------------------------------------------------------------------- - -MINMON_SUFFIX=testmm -RUN=gfs - -#export MAIL_CC= -#idate= - - -#---------------------------------------------------------------------- -# no changes should be necessary below this point. -#---------------------------------------------------------------------- -. ../../parm/MinMon.ver -. ../../parm/MinMon_config - -if [[ $idate == "" ]]; then - data_map=${M_IG_SCRIPTS}/pen_data_map.xml - - imgdate=`${M_IG_SCRIPTS}/query_data_map.pl \ - ${data_map} ${MINMON_SUFFIX}_${RUN} imgdate` - echo "imgdate = $imgdate" - - - idate=`$NDATE +6 $imgdate` -fi - -pdy=`echo $idate | cut -c1-8` -cyc=`echo $idate | cut -c9-10` -echo "idate = $idate" - -echo "tank = ${M_TANKverf}/stats/${MINMON_SUFFIX}" - -prodate=`${M_IG_SCRIPTS}/find_cycle.pl \ - --dir ${M_TANKverf}/stats/${MINMON_SUFFIX} \ - --cyc 1 --run ${RUN}` - -echo "imgdate, prodate = $imgdate, $prodate" - - -if [[ $idate -le $prodate ]]; then - - echo " firing MinMon_Plt.sh" - ${M_IG_SCRIPTS}/MinMon_Plt.sh ${MINMON_SUFFIX} -p $idate -r $RUN \ - 1>${LOGdir}/IG.${run}.${PDY}.${cyc}.log \ - 2>${LOGdir}/IG.${run}.${PDY}.${cyc}.err - - rc=`${M_IG_SCRIPTS}/update_data_map.pl ${data_map} \ - ${MINMON_SUFFIX}_${RUN} imgdate ${idate}` - -fi - - -exit diff --git a/util/Minimization_Monitor/image_gen/ush/run_v16rt1_IG.sh b/util/Minimization_Monitor/image_gen/ush/run_v16rt1_IG.sh deleted file mode 100755 index 5df811a0e1..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/run_v16rt1_IG.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh - -package=MinMon -#package=ProdGSI/util/Minimization_Monitor - -suffix=v16rt1 -run=gdas - -idev=`cat /etc/dev | cut -c1` -iprod=`cat /etc/prod | cut -c1` - - shell=sh - source /usrx/local/prod/lmod/lmod/init/${shell} - - export MODULEPATH=/usrx/local/prod/lmod/lmod/modulefiles/Core:/usrx/local/prod/modulefiles/core_third:/usrx/local/prod/modulefiles/defs:/gpfs/dell1/nco/ops/nwprod/modulefiles/core_prod:/usrx/local/dev/modulefiles - module load ips/18.0.1.163 - module load metplus/2.1 - module load lsf/10.1 - module load prod_util/1.1.2 - module load GrADS/2.2.0 - -echo NDATE = $NDATE -ch=`hostname | cut -c1` - -#scripts=/gpfs/${ch}d2/emc/da/noscrub/${LOGNAME}/${package}/image_gen/ush -scripts=/gpfs/dell2/emc/modeling/noscrub/${LOGNAME}/${package}/image_gen/ush - -#export NDATE=/gpfs/hps/nco/ops/nwprod/prod_util.v1.0.14/exec/ndate -export DO_ARCHIVE=0 -export JOB_QUEUE=dev_shared -export DO_ERROR_RPT=1 - -export MAIL_CC="russ.treadon@noaa.gov, andrew.collard@noaa.gov" -export MAIL_TO="edward.safford@noaa.gov" - -data_map=${scripts}/pen_data_map.xml - -tankdir=/u/Edward.Safford/nbns/stats/${suffix} - -imgdate=`${scripts}/query_data_map.pl ${data_map} ${suffix}_${run} imgdate` -idate=`$NDATE +6 $imgdate` -PDY=`echo $idate | cut -c1-8` -cyc=`echo $idate | cut -c9-10` - -ptmp=/gpfs/dell2/ptmp/Edward.Safford - -prodate=`${scripts}/find_cycle.pl --run gdas --cyc 1 --dir ${tankdir}` -echo "imgdate, prodate = $imgdate, $prodate" -if [[ $idate -le $prodate ]]; then - - echo " firing MinMon_Plt.sh" - ${scripts}/MinMon_Plt.sh ${suffix} -p $idate -r $run \ - 1>${ptmp}/logs/${suffix}/${run}/minmon/IG.${run}.${PDY}.${cyc}.log \ - 2>${ptmp}/logs/${suffix}/${run}/minmon/IG.${run}.${PDY}.${cyc}.err - - rc=`${scripts}/update_data_map.pl ${data_map} ${suffix}_${run} imgdate ${idate}` - -fi - - -exit diff --git a/util/Minimization_Monitor/image_gen/ush/update_ctl_tdef.sh b/util/Minimization_Monitor/image_gen/ush/update_ctl_tdef.sh index 2355d13f51..76216cf7cf 100755 --- a/util/Minimization_Monitor/image_gen/ush/update_ctl_tdef.sh +++ b/util/Minimization_Monitor/image_gen/ush/update_ctl_tdef.sh @@ -109,15 +109,12 @@ function usage { tdef=`echo $line | gawk '{print $1}'` if [[ $tdef == "tdef" ]]; then -# echo "found tdef" -# echo "$line" v2=`echo $line | gawk '{print $2}'` v3=`echo $line | gawk '{print $3}'` v5=`echo $line | gawk '{print $5}'` ndate="${ihh}Z${idd}${smon}${iyy}" newline="${tdef} ${v2} ${v3} ${ndate} ${v5}" -# echo "$newline" echo "$newline" >> $tmp_file found_tdef=1 else diff --git a/util/Minimization_Monitor/image_gen/ush/update_ctl_xdef.sh b/util/Minimization_Monitor/image_gen/ush/update_ctl_xdef.sh deleted file mode 100755 index ce9a8efc91..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/update_ctl_xdef.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/ksh - -#------------------------------------------------------------- -# -# update_ctl_xdef.sh -# -# Update the xdef line (iteration definition) in a given control -# file. -# -#------------------------------------------------------------- - -function usage { - echo "Usage: update_ctl_xdef.sh control_file_path_and_name num_iters" -} - - -#------------------------------------------------------------- -# check for correct usage and assign cmd line vars -# - echo "enter update_ctl_xdef.sh" - - if [[ $# -lt 2 ]]; then - usage - exit 1 - fi - - ctl_file=$1 - num_iters=$2 - -# iyy=`echo $datestr | cut -c1-4` -# imm=`echo $datestr | cut -c5-6` -# idd=`echo $datestr | cut -c7-8` -# ihh=`echo $datestr | cut -c9-10` -# -# echo year = $iyy -# echo month= $imm -# echo day = $idd -# echo hour = $ihh - -#------------------------------------------------------------- -# validate ctr_file -# - if [[ ! -s $ctl_file ]]; then - echo $ctl_file not found - exit -1 - fi - -#------------------------------------------------------------- -# Construct tmp_file from ctl_file name (minus any full or -# relative path) -# - - ctl_base=`basename ${ctl_file}` - ctl_dir=`dirname ${ctl_file}` - - tmp_file="${ctl_dir}/tmp_${ctl_base}" - echo "tmp_file = ${tmp_file}" - - if [[ -s $tmp_file ]]; then - rm -f $tmp_file - fi - - found_xdef=0 - while read line; do - - xdef=`echo $line | gawk '{print $1}'` - - if [[ $xdef == "xdef" ]]; then -# echo "found xdef" -# echo "$line" - v3=`echo $line | gawk '{print $3}'` - v4=`echo $line | gawk '{print $4}'` - v5=`echo $line | gawk '{print $5}'` - - newline="${xdef} ${num_iters} ${v3} ${v4} ${v5}" -# echo "$newline" - echo "$newline" >> $tmp_file - found_xdef=1 - else - echo "$line" >> $tmp_file - fi - - done < "$ctl_file" - - if [[ $found_xdef -eq 1 ]]; then - cp -f $tmp_file $ctl_file - rm -f $tmp_file - else - echo "ERROR tdef not found, no update to $ctl_base done" - fi - - echo "exit update_ctl_xdef.sh" -exit diff --git a/util/Minimization_Monitor/image_gen/ush/update_data_map.pl b/util/Minimization_Monitor/image_gen/ush/update_data_map.pl deleted file mode 100755 index 57225465fd..0000000000 --- a/util/Minimization_Monitor/image_gen/ush/update_data_map.pl +++ /dev/null @@ -1,61 +0,0 @@ -#! /usr/bin/perl - -#------------------------------------------------------------------- -# update_data_map.pl -# -# This script updates a requested field in the data_map.xml file. If -# the requested field does not exist in but the parent node (suffix) -# is found then the requested field and value are added to the -# data_map.xml file. -# -# Calling sequence: -# >> update_data_map.pl ./path/to/data_map.xml suffix req_field new_val -# -# 1. data_map.xml file (full or relative path) -# 2. suffix identifying the data source (an element in the -# data_map.xml file) -# 3. requested field, one of the xml child elements of the -# suffix element. -# 4. new value for the requested field -# -# Return codes (sent to stdout): -# 0 update was successful -# 1 the suffix and/or field was not found. -# -# Note: Calling scripts generally assign a variable value to -# output from this script. If diagnostic print messages -# are left uncommented then results will become undefined. -#------------------------------------------------------------------- - use strict; - use warnings; - use XML::LibXML; - - my $dmfile = $ARGV[0]; - my $source = $ARGV[1]; - my $field = $ARGV[2]; - my $value = $ARGV[3]; - my $rc = "1"; - - my $parser = XML::LibXML->new(); - my $doc = $parser->parse_file($dmfile); - - my $query = "//$source/$field/text()"; - - my($node) = $doc->findnodes($query); - - if( $node ) { - $node->setData("$value" ); - $doc->toFile( $dmfile ); - $rc = "0"; - } - else { - my $new_query = "//$source"; - my ($src_node) = $doc->findnodes($new_query); - $src_node->appendTextChild( "$field", "$value" ); - $doc->toFile( $dmfile ); - $rc = "0"; - } - - print "$rc"; - - diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon.sh b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon.sh deleted file mode 100755 index 916c57d0ee..0000000000 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_vminmon.o%J -#BSUB -e gdas_vminmon.o%J -#BSUB -J gdas_vminmon -#BSUB -q dev_shared -#BSUB -n 1 -#BSUB -R affinity[core] -#BSUB -M 80 -#BSUB -W 00:05 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export PDATE=${PDATE:-2018011112} - -############################################################# -# Specify whether the run is production or development -############################################################# -export PDY=`echo $PDATE | cut -c1-8` -export cyc=`echo $PDATE | cut -c9-10` -export job=gdas_vminmon.${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -id=`hostname | cut -c1` -export DATAROOT=${DATAROOT:-/gpfs/${id}d2/emc/da/noscrub/Edward.Safford/test_data} -export COMROOT=${COMROOT:-/ptmpp1/$LOGNAME/com} - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v14.1.0 -export global_shared_ver=v14.1.0 -export gdas_minmon_ver=v1.0.0 -export minmon_shared_ver=v1.0.1 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/modulefiles -module load prod_util -#module load util_shared - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export POE=YES - - -############################################################# -# Set user specific variables -############################################################# -export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gdas} -export NWTEST=${NWTEST:-/da/noscrub/${LOGNAME}/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgdas=${NWTEST}/gdas.${gdas_minmon_ver} -export JOBGLOBAL=${HOMEgdas}/jobs -export HOMEminmon=${NWTEST}/minmon_shared.${minmon_shared_ver} -export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_VMINMON - -exit - diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_hera.sh b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_hera.sh deleted file mode 100755 index 39c8127199..0000000000 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_hera.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/ksh - -#SBATCH -o gdas_verfrad.o%j -#SBATCH -J gdas_verfrad -#SBATCH --ntasks=1 --mem=5g -#SBATCH --time=20 -#SBATCH --account=fv3-cpu -#SBATCH -D . - -set -x - -export PDATE=${PDATE:-2018070418} - - -############################################################# -# Specify whether the run is production or development -############################################################# -export PDY=`echo $PDATE | cut -c1-8` -export cyc=`echo $PDATE | cut -c9-10` -export job=gdas_vminmon.${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=${DATAROOT:-/scratch1/NCEPDEV/da/Edward.Safford/noscrub/test_data} -export COMROOT=${COMROOT:-/scratch2/NCEPDEV/stmp3/$LOGNAME/com} -export STMP_USER=${STMP_USER:-/scratch2/NCEPDEV/stmp3/$LOGNAME} - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v1.0.0 -export global_shared_ver=v1.0.1 - -############################################################# -# Add nwpara tools to path -############################################################# -#NWPROD=${NWPROD:-/scratch4/NCEPDEV/global/save/glopara/nwpara/util} -#NWPRODush=${NWPRODush:=${NWPROD}/ush} -#NWPRODexec=${NWPRODexec:=${NWPROD}/exec} -#export PATH=${PATH}:${NWPRODush}:${NWPRODexec} - - -############################################################# -# Set user specific variables -############################################################# -export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon} - -export NWTEST=${NWTEST:-/scratch1/NCEPDEV/da/${LOGNAME}/noscrub/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgdas=${HOMEgdas:-${NWTEST}/gdas.${gdas_ver}} -export HOMEgfs=${HOMEgfs:-${HOMEgdas}} -export JOBGLOBAL=${HOMEgdas}/jobs -export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared.${global_shared_ver}} -export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} -export M_FIXgdas=${M_FIXgdas:-${HOMEgdas}/fix} - -####################################################################### -# theia specific hacks for no prod_utils module (ndate) -####################################################################### -export MY_MACHINE=hera -export NDATE=/home/Edward.Safford/bin/ndate - -export PERL5LIB="/usr/lib64/perl5:/usr/share/perl5" -export VERBOSE=YES -export KEEPDATA=YES - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_VMINMON - -exit - diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_theia.sh b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_theia.sh deleted file mode 100755 index 118ad3656f..0000000000 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_theia.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/ksh - -#PBS -o gdas_vminmon.log -#PBS -e gdas_vminmon.err -#PBS -N gdas_vminmon -#PBS -A glbss -#PBS -l procs=1,walltime=0:05:00 -#PBS -V - -set -x - -export PDATE=${PDATE:-2016030712} - - -############################################################# -# Specify whether the run is production or development -############################################################# -export PDY=`echo $PDATE | cut -c1-8` -export cyc=`echo $PDATE | cut -c9-10` -export job=gdas_vminmon.${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=${DATAROOT:-/scratch4/NCEPDEV/da/noscrub/Edward.Safford/test_data} -export COMROOT=${COMROOT:-/scratch4/NCEPDEV/stmp3/$LOGNAME/com} -export STMP_USER=${STMP_USER:-/scratch4/NCEPDEV/stmp3/$LOGNAME} - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v1.0.0 -export global_shared_ver=v1.0.1 - -############################################################# -# Add nwpara tools to path -############################################################# -NWPROD=${NWPROD:-/scratch4/NCEPDEV/global/save/glopara/nwpara/util} -NWPRODush=${NWPRODush:=${NWPROD}/ush} -NWPRODexec=${NWPRODexec:=${NWPROD}/exec} -export PATH=${PATH}:${NWPRODush}:${NWPRODexec} - - -############################################################# -# Set user specific variables -############################################################# -export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon} -#export NWTEST=${NWTEST:-/scratch4/NCEPDEV/da/noscrub/${LOGNAME}/gfs_q3fy17} -export NWTEST=${NWTEST:-/scratch4/NCEPDEV/da/noscrub/${LOGNAME}/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgdas=${HOMEgdas:-${NWTEST}/gdas.${gdas_ver}} -export JOBGLOBAL=${HOMEgdas}/jobs -export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared.${global_shared_ver}} -export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} - -####################################################################### -# theia specific hacks for no prod_utils module & no setpdy.sh script -####################################################################### -export MY_MACHINE=theia -NDATE=~/bin/ndate -prevday=`$NDATE -24 $PDATE` -export PDYm1=`echo $prevday | cut -c1-8` -ln -s ${NWPRODush}/startmsg.sh ${STMP_USER}/startmsg -ln -s ${NWPRODush}/postmsg.sh ${STMP_USER}/postmsg -ln -s ${NWPRODush}/prep_step.sh ${STMP_USER}/prep_step -ln -s ${NWPRODush}/err_chk.sh ${STMP_USER}/err_chk -export PATH=$PATH:${STMP_USER} -export utilscript=${utilscript:-${NWPRODush}} # err_chk calls postmsg.sh - # directly so need to override - # utilscript location - -export PERL5LIB="/usr/lib64/perl5:/usr/share/perl5" - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_VMINMON - -exit - diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/parm/gdas_minmon.parm b/util/Minimization_Monitor/nwprod/gdas.v1.0.0/parm/gdas_minmon.parm deleted file mode 100644 index eabeea8030..0000000000 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/parm/gdas_minmon.parm +++ /dev/null @@ -1,21 +0,0 @@ -##################################### -# specify minmon shared version -##################################### - - - -##################################### -# specify minmon_shared location -##################################### - - - - - - -##################################### -# utilities -##################################### -export COMPRESS=${COMPRESS:-gzip} -export UNCOMPRESS=${UNCOMPRESS:-gunzip} - diff --git a/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_hera.sh b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_hera.sh new file mode 100755 index 0000000000..995647490e --- /dev/null +++ b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_hera.sh @@ -0,0 +1,54 @@ +#!/bin/ksh + +#SBATCH -o gdas_verfrad.o%j +#SBATCH -J gdas_verfrad +#SBATCH --ntasks=1 --mem=5g +#SBATCH --time=20 +#SBATCH --account=fv3-cpu +#SBATCH -D . + +set -x + +export PDATE=${PDATE:-2021122818} + +####################################################################### +# hera specific hacks for no prod_utils module (ndate) +####################################################################### +export MY_MACHINE=hera +export NDATE=/home/Edward.Safford/bin/ndate + +export PERL5LIB="/usr/lib64/perl5:/usr/share/perl5" +export VERBOSE=YES +export KEEPDATA=YES + + +####################################################################### +# set necessary vars for data extraction J-job +####################################################################### +export PDY=`echo $PDATE | cut -c1-8` +export cyc=`echo $PDATE | cut -c9-10` +export job=gdas_vminmon.${cyc} +export pid=${pid:-$$} +export jobid=${job}.${pid} +export envir=para +export DATAROOT=${DATAROOT:-/scratch1/NCEPDEV/da/Edward.Safford/noscrub/test_data} +export COMROOT=${COMROOT:-/scratch2/NCEPDEV/stmp3/$LOGNAME/com} +export STMP_USER=${STMP_USER:-/scratch2/NCEPDEV/stmp3/$LOGNAME} + +export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon} + +export NWTEST=${NWTEST:-/scratch1/NCEPDEV/da/Edward.Safford/noscrub/GSI/util/Minimization_Monitor/nwprod} +export HOMEgdas=${HOMEgdas:-${NWTEST}/gdas} +export HOMEgfs=${HOMEgfs:-${HOMEgdas}} +export JOBGLOBAL=${HOMEgdas}/jobs +export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared} +export COM_IN=${COM_IN:-${DATAROOT}} +export M_FIXgdas=${M_FIXgdas:-${HOMEgdas}/fix} + +############################################################# +# Execute job +############################################################# +$JOBGLOBAL/JGDAS_ATMOS_VMINMON + +exit + diff --git a/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss2.sh b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss2.sh new file mode 100755 index 0000000000..19dc94c540 --- /dev/null +++ b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss2.sh @@ -0,0 +1,62 @@ +#!/bin/ksh -l + +#PBS -o gdas_vminmon.out +#PBS -e gdas_vminmon.err +#PBS -N gdas_vminmon +#PBS -q dev +#PBS -l select=1:mem=400M +#PBS -l walltime=05:00 +#PBS -A GFS-DEV + + +set -ax + +export PDATE=${PDATE:-2021082306} + +############################################################# +# Specify whether the run is production or development +############################################################# +export PDY=`echo $PDATE | cut -c1-8` +export cyc=`echo $PDATE | cut -c9-10` +export job=gdas_vminmon.${cyc} +export pid=${pid:-$$} +export jobid=${job}.${pid} +export envir=para + +export DATAROOT=${DATAROOT:-/lfs/h1/ops/canned/com/gfs/v16.2} +export DATA=${DATA:-/lfs/h2/emc/stmp/Edward.Safford} +export COMROOT=${COMROOT:-/lfs/h2/emc/ptmp/Edward.Safford/com} + + +############################################################# +# Load modules +############################################################# +module load prod_util/2.0.10 +module load util_shared/1.4.0 +module load perl/5.32.0 + +module list + + +############################################################# +# Set user specific variables +############################################################# +export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gdas} +export NWTEST=${NWTEST:-/lfs/h2/emc/da/noscrub/Edward.Safford/git/gsi/GSI/util/Minimization_Monitor/nwprod} +export HOMEgdas=${NWTEST}/gdas +export HOMEgfs=${HOMEgfs:-${HOMEgdas}} + +export JOBGLOBAL=${HOMEgdas}/jobs +export HOMEminmon=${NWTEST}/minmon_shared + +export COM_IN=${COM_IN:-${DATAROOT}} +export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} +export M_FIXgdas=${HOMEgdas}/fix + +############################################################# +# Execute job +############################################################# +$JOBGLOBAL/JGDAS_ATMOS_VMINMON + +exit + diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_cray.sh b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss_c.sh similarity index 57% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_cray.sh rename to util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss_c.sh index f9c1b46b35..d958184fa6 100755 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_cray.sh +++ b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss_c.sh @@ -11,7 +11,7 @@ set -x -export PDATE=${PDATE:-2017111312} +export PDATE=${PDATE:-2022010406} ############################################################# # Specify whether the run is production or development @@ -24,15 +24,6 @@ export jobid=${job}.${pid} export envir=para -############################################################# -# Specify versions -############################################################# -#export gdas_ver=v14.1.0 -#export global_shared_ver=v14.1.0 -export gdas_ver=v1.0.0 -export minmon_shared_ver=v1.0.1 - - ############################################################# # Load modules ############################################################# @@ -44,30 +35,26 @@ module load pm5 module list -############################################################# -# WCOSS environment settings -############################################################# -export POE=YES - - ############################################################# # Set user specific variables ############################################################# -export DATAROOT=${DATAROOT:-/gpfs/hps3/emc/da/noscrub/$LOGNAME/test_data} -export COMROOT=${COMROOT:-/gpfs/hps2/ptmp/$LOGNAME/com} +export DATAROOT=/gpfs/hps3/emc/da/noscrub/$LOGNAME/test_data +export COMROOT=/gpfs/hps2/ptmp/$LOGNAME/com export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gdas} -export NWTEST=${NWTEST:-/gpfs/hps3/emc/da/noscrub/${LOGNAME}/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgdas=${NWTEST}/gdas.${gdas_ver} +export NWTEST=/gpfs/hps3/emc/da/noscrub/Edward.Safford/GSI/util/Minimization_Monitor/nwprod +export HOMEgdas=${NWTEST}/gdas +export M_FIXgdas=${M_FIXgdas:-${HOMEgdas}/fix} export JOBGLOBAL=${HOMEgdas}/jobs -export HOMEminmon=${NWTEST}/minmon_shared.${minmon_shared_ver} +export HOMEgfs=${HOMEgfs:-${HOMEgdas}} +export HOMEminmon=${NWTEST}/minmon_shared export COM_IN=${DATAROOT} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} +export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} export CYCLE_INTERVAL=${CYCLE_INTERVAL:-6} ############################################################# # Execute job ############################################################# -$JOBGLOBAL/JGDAS_VMINMON +$JOBGLOBAL/JGDAS_ATMOS_VMINMON exit diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_wcoss_d.sh b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss_d.sh similarity index 80% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_wcoss_d.sh rename to util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss_d.sh index 0d6943d976..f3aef842a4 100755 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/driver/test_jgdas_vminmon_wcoss_d.sh +++ b/util/Minimization_Monitor/nwprod/gdas/driver/test_jgdas_vminmon_wcoss_d.sh @@ -8,11 +8,11 @@ #BSUB -R affinity[core] #BSUB -M 80 #BSUB -W 00:05 -#BSUB -P GFS-T2O +#BSUB -P GFS-DEV set -ax -export PDATE=${PDATE:-2018011118} +export PDATE=${PDATE:-2018011112} ############################################################# # Specify whether the run is production or development @@ -28,15 +28,6 @@ export DATAROOT=${DATAROOT:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/test export COMROOT=${COMROOT:-/gpfs/dell2/ptmp/Edward.Safford/com} -############################################################# -# Specify versions -############################################################# -export gdas_ver=v14.1.0 -export global_shared_ver=v14.1.0 -export gdas_minmon_ver=v1.0.0 -export minmon_shared_ver=v1.0.1 - - ############################################################# # Load modules ############################################################# @@ -63,12 +54,12 @@ export minmon_shared_ver=v1.0.1 # Set user specific variables ############################################################# export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gdas} -export NWTEST=${NWTEST:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgdas=${NWTEST}/gdas.${gdas_minmon_ver} +export NWTEST=${NWTEST:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/GSI/util/Minimization_Monitor/nwprod} +export HOMEgdas=${NWTEST}/gdas export HOMEgfs=${HOMEgfs:-${HOMEgdas}} export JOBGLOBAL=${HOMEgdas}/jobs -export HOMEminmon=${NWTEST}/minmon_shared.${minmon_shared_ver} +export HOMEminmon=${NWTEST}/minmon_shared export COM_IN=${COM_IN:-${DATAROOT}} export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} @@ -77,7 +68,7 @@ export M_FIXgdas=${HOMEgdas}/fix ############################################################# # Execute job ############################################################# -$JOBGLOBAL/JGDAS_VMINMON +$JOBGLOBAL/JGDAS_ATMOS_VMINMON exit diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/fix/gdas_minmon_cost.txt b/util/Minimization_Monitor/nwprod/gdas/fix/gdas_minmon_cost.txt similarity index 100% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/fix/gdas_minmon_cost.txt rename to util/Minimization_Monitor/nwprod/gdas/fix/gdas_minmon_cost.txt diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/fix/gdas_minmon_gnorm.txt b/util/Minimization_Monitor/nwprod/gdas/fix/gdas_minmon_gnorm.txt similarity index 100% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/fix/gdas_minmon_gnorm.txt rename to util/Minimization_Monitor/nwprod/gdas/fix/gdas_minmon_gnorm.txt diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_ATMOS_VMINMON b/util/Minimization_Monitor/nwprod/gdas/jobs/JGDAS_ATMOS_VMINMON similarity index 84% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_ATMOS_VMINMON rename to util/Minimization_Monitor/nwprod/gdas/jobs/JGDAS_ATMOS_VMINMON index 2e0ffac0fd..407ddb5826 100755 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/jobs/JGDAS_ATMOS_VMINMON +++ b/util/Minimization_Monitor/nwprod/gdas/jobs/JGDAS_ATMOS_VMINMON @@ -44,15 +44,6 @@ export EXECminmon=${EXECminmon:-$HOMEminmon/exec} export USHminmon=${USHminmon:-$HOMEminmon/ush} -############################################# -# Run setpdy and initialize PDY variables -############################################# -if [[ $MY_MACHINE != "hera" ]]; then - export cycle=t${cyc}z - setpdy.sh - . ./PDY -fi - ############################################# # determine PDY and cyc for previous cycle ############################################# @@ -69,10 +60,8 @@ export p_cyc=`echo ${cdate} | cut -c9-10` ############################################# export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} -M_TANKverf=${M_TANKverf:-${COM_IN}} -M_TANKverfM0=${M_TANKverfM0:-${M_TANKverf}/${RUN}.${PDY}/${cyc}/$COMPONENT/minmon} -export M_TANKverfM1=${M_TANKverfM1:-${M_TANKverf}/${RUN}.${P_PDY}/${p_cyc}/$COMPONENT/minmon} -export M_TANKverf=$M_TANKverfM0 +export M_TANKverf=${M_TANKverf:-${COM_IN}/${RUN}.${PDY}/${cyc}/${COMPONENT}/minmon} +export M_TANKverfM1=${M_TANKverfM1:-${COM_IN}/${RUN}.${P_PDY}/${p_cyc}/${COMPONENT}/minmon} export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}/$COMPONENT} diff --git a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_atmos_vminmon.sh b/util/Minimization_Monitor/nwprod/gdas/scripts/exgdas_atmos_vminmon.sh similarity index 91% rename from util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_atmos_vminmon.sh rename to util/Minimization_Monitor/nwprod/gdas/scripts/exgdas_atmos_vminmon.sh index 1fa612cbfe..f5087e41d5 100755 --- a/util/Minimization_Monitor/nwprod/gdas.v1.0.0/scripts/exgdas_atmos_vminmon.sh +++ b/util/Minimization_Monitor/nwprod/gdas/scripts/exgdas_atmos_vminmon.sh @@ -74,10 +74,15 @@ if [[ -s ${gsistat} ]]; then data_available=1 - #------------------------------------------------------------------ + #----------------------------------------------------------------------- # Copy the $MINMON_SUFFIX.gnorm_data.txt file to the working directory # It's ok if it doesn't exist; we'll create a new one if needed. - #------------------------------------------------------------------ + # + # Note: The logic below is to accomodate two different data storage + # methods. Some parallels (and formerly ops) dump all MinMon data for + # a given day in the same directory (if condition). Ops now separates + # data into ${cyc} subdirectories (elif condition). + #----------------------------------------------------------------------- if [[ -s ${M_TANKverf}/gnorm_data.txt ]]; then $NCP ${M_TANKverf}/gnorm_data.txt gnorm_data.txt elif [[ -s ${M_TANKverfM1}/gnorm_data.txt ]]; then diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon.sh b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon.sh deleted file mode 100755 index 384e25cee3..0000000000 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/ksh - -#BSUB -o gfs_vminmon.o%J -#BSUB -e gfs_vminmon.o%J -#BSUB -J gfs_vminmon -#BSUB -q dev_shared -#BSUB -n 1 -#BSUB -R affinity[core] -#BSUB -M 80 -#BSUB -W 00:05 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export PDATE=${PDATE:-2016030812} - -############################################################# -# Specify whether the run is production or development -############################################################# -export PDY=`echo $PDATE | cut -c1-8` -export cyc=`echo $PDATE | cut -c9-10` -export job=gfs_vminmon.${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export Z=${Z:-gz} -me=`hostname | cut -c1` -export DATAROOT=${DATAROOT:-/gpfs/${me}d2/emc/da/noscrub/$LOGNAME/test_data} -export COMROOT=${COMROOT:-/ptmpp1/$LOGNAME/com} - - -############################################################# -# Specify versions -############################################################# -export gfs_ver=v14.1.0 -export global_shared_ver=v14.1.0 -export gfs_minmon_ver=v1.0.0 -export minmon_shared_ver=v1.0.1 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/modulefiles -module load prod_util -#module load util_shared - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export POE=YES - - -############################################################# -# Set user specific variables -############################################################# -export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gfs} -export NWTEST=${NWTEST:-/da/noscrub/${LOGNAME}/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgfs=${HOMEgfs:-${NWTEST}/gfs.${gfs_minmon_ver}} -export JOBGLOBAL=${JOBGLOBAL:-${HOMEgfs}/jobs} -export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared.${minmon_shared_ver}} -export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGFS_VMINMON - -exit - diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_theia.sh b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_theia.sh deleted file mode 100755 index 4ff005ceaf..0000000000 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_theia.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/ksh - -#PBS -o gfs_vminmon.log -#PBS -e gfs_vminmon.err -#PBS -N gfs_vminmon -#PBS -A glbss -#PBS -l procs=1,walltime=0:05:00 -#PBS -V - -set -x - -export PDATE=${PDATE:-2016030706} - - -############################################################# -# Specify whether the run is production or development -############################################################# -export PDY=`echo $PDATE | cut -c1-8` -export cyc=`echo $PDATE | cut -c9-10` -export job=gfs_vminmon.${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=${DATAROOT:-/scratch4/NCEPDEV/da/noscrub/Edward.Safford/test_data} -export COMROOT=${COMROOT:-/scratch4/NCEPDEV/stmp3/$LOGNAME/com} -export STMP_USER=${STMP_USER:-/scratch4/NCEPDEV/stmp3/$LOGNAME} - - -############################################################# -# Specify versions -############################################################# -export gfs_ver=v1.0.0 -export global_shared_ver=v1.0.1 - -############################################################# -# Add nwpara tools to path -############################################################# -NWPROD=${NWPROD:-/scratch4/NCEPDEV/global/save/glopara/nwpara/util} -NWPRODush=${NWPRODush:=${NWPROD}/ush} -NWPRODexec=${NWPRODexec:=${NWPROD}/exec} -export PATH=${PATH}:${NWPRODush}:${NWPRODexec} - - -############################################################# -# Set user specific variables -############################################################# -export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gfs} -#export NWTEST=${NWTEST:-/scratch4/NCEPDEV/da/noscrub/${LOGNAME}/gfs_q3fy17} -export NWTEST=${NWTEST:-/scratch4/NCEPDEV/da/noscrub/${LOGNAME}/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgfs=${HOMEgfs:-${NWTEST}/gfs.${gfs_ver}} -export JOBGLOBAL=${HOMEgfs}/jobs -export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared.${global_shared_ver}} -export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} - -####################################################################### -# theia specific hacks for no prod_utils module & no setpdy.sh script -####################################################################### -export MY_MACHINE=theia -NDATE=~/bin/ndate -prevday=`$NDATE -24 $PDATE` -export PDYm1=`echo $prevday | cut -c1-8` -ln -s ${NWPRODush}/startmsg.sh ${STMP_USER}/startmsg -ln -s ${NWPRODush}/postmsg.sh ${STMP_USER}/postmsg -ln -s ${NWPRODush}/prep_step.sh ${STMP_USER}/prep_step -ln -s ${NWPRODush}/err_chk.sh ${STMP_USER}/err_chk -export PATH=$PATH:${STMP_USER} -export utilscript=${utilscript:-${NWPRODush}} # err_chk calls postmsg.sh - # directly so need to override - # utilscript location - -export PERL5LIB="/usr/lib64/perl5:/usr/share/perl5" - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGFS_VMINMON - -exit - diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/parm/gfs_minmon.parm b/util/Minimization_Monitor/nwprod/gfs.v1.0.0/parm/gfs_minmon.parm deleted file mode 100644 index f65e1cdb83..0000000000 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/parm/gfs_minmon.parm +++ /dev/null @@ -1,16 +0,0 @@ -##################################### -# specify minmon shared version -##################################### - - -##################################### -# specify minmon_shared location -##################################### - - -##################################### -# utilities -##################################### -export COMPRESS=${COMPRESS:-gzip} -export UNCOMPRESS=${UNCOMPRESS:-gunzip} - diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_hera.sh b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_hera.sh similarity index 60% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_hera.sh rename to util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_hera.sh index 0ffa2810a2..8a7f5f75c7 100755 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_hera.sh +++ b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_hera.sh @@ -9,57 +9,46 @@ set -x -export PDATE=${PDATE:-2016030706} +export PDATE=${PDATE:-2021122806} + +####################################################################### +# hera specific hacks for no prod_utils module (ndate) +####################################################################### +export MY_MACHINE=hera +export NDATE=/home/Edward.Safford/bin/ndate + +export PERL5LIB="/usr/lib64/perl5:/usr/share/perl5" +export VERBOSE=YES +export KEEPDATA=YES ############################################################# -# Specify whether the run is production or development +# Set necssary vars for j-job ############################################################# export PDY=`echo $PDATE | cut -c1-8` export cyc=`echo $PDATE | cut -c9-10` export job=gfs_vminmon.${cyc} export pid=${pid:-$$} export jobid=${job}.${pid} -export envir=para + export DATAROOT=${DATAROOT:-/scratch1/NCEPDEV/da/Edward.Safford/noscrub/test_data} export COMROOT=${COMROOT:-/scratch2/NCEPDEV/stmp3/$LOGNAME/com} export STMP_USER=${STMP_USER:-/scratch2/NCEPDEV/stmp3/$LOGNAME} - -############################################################# -# Specify versions -############################################################# -export gfs_ver=v1.0.0 -export global_shared_ver=v1.0.1 - - -############################################################# -# Set user specific variables -############################################################# export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon} -export NWTEST=${NWTEST:-/scratch1/NCEPDEV/da/${LOGNAME}/noscrub/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgfs=${HOMEgfs:-${NWTEST}/gfs.${gfs_ver}} +export NWTEST=${NWTEST:-/scratch1/NCEPDEV/da/Edward.Safford/noscrub/GSI/util/Minimization_Monitor/nwprod} +export HOMEgfs=${HOMEgfs:-${NWTEST}/gfs} export JOBGLOBAL=${HOMEgfs}/jobs -export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared.${global_shared_ver}} +export HOMEminmon=${HOMEminmon:-${NWTEST}/minmon_shared} export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} +#export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} export M_FIXgfs=${M_FIXgfs:-${HOMEgfs}/fix} -####################################################################### -# theia specific hacks for no prod_utils module (ndate) -####################################################################### -export MY_MACHINE=hera -export NDATE=/home/Edward.Safford/bin/ndate - -export PERL5LIB="/usr/lib64/perl5:/usr/share/perl5" -export VERBOSE=YES -export KEEPDATA=YES - ############################################################# # Execute job ############################################################# -$JOBGLOBAL/JGFS_VMINMON +$JOBGLOBAL/JGFS_ATMOS_VMINMON exit diff --git a/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss2.sh b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss2.sh new file mode 100755 index 0000000000..9046d80dd3 --- /dev/null +++ b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss2.sh @@ -0,0 +1,71 @@ +#!/bin/ksh -l + +#PBS -o gfs_vminmon.out +#PBS -e gfs_vminmon.err +#PBS -N gfs_vminmon +#PBS -q dev +#PBS -l select=1:mem=400M +#PBS -l walltime=05:00 +#PBS -A GFS-DEV + + +set -ax + +export PDATE=${PDATE:-2021082306} + +############################################################# +# Specify whether the run is production or development +############################################################# +export PDY=`echo $PDATE | cut -c1-8` +export cyc=`echo $PDATE | cut -c9-10` +export job=gfs_vminmon.${cyc} +export pid=${pid:-$$} +export jobid=${job}.${pid} +export envir=para + +export DATAROOT=${DATAROOT:-/lfs/h1/ops/canned/com/gfs/v16.2} +export DATA=${DATA:-/lfs/h2/emc/stmp/Edward.Safford} +export COMROOT=${COMROOT:-/lfs/h2/emc/ptmp/Edward.Safford/com} + + +############################################################# +# Specify versions +############################################################# +#export gfs_ver=v16.2.0 +#export global_shared_ver=v16.2.0 +#export gfs_minmon_ver=v1.0.0 +#export minmon_shared_ver=v1.0.1 + + +############################################################# +# Load modules +############################################################# +module load prod_util/2.0.10 +module load util_shared/1.4.0 +module load perl/5.32.0 + +module list + + +############################################################# +# Set user specific variables +############################################################# +export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gfs} +export NWTEST=${NWTEST:-/lfs/h2/emc/da/noscrub/Edward.Safford/git/gsi/GSI/util/Minimization_Monitor/nwprod} +export HOMEgfs=${NWTEST}/gfs +#export HOMEgfs=${HOMEgfs:-${HOMEgdas}} + +export JOBGLOBAL=${HOMEgfs}/jobs +export HOMEminmon=${NWTEST}/minmon_shared + +export COM_IN=${COM_IN:-${DATAROOT}} +export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} +export M_FIXgfs=${HOMEgfs}/fix + +############################################################# +# Execute job +############################################################# +$JOBGLOBAL/JGFS_ATMOS_VMINMON + +exit + diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_cray.sh b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss_c.sh similarity index 57% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_cray.sh rename to util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss_c.sh index 35f48f3b1b..d8eb4723de 100755 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_cray.sh +++ b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss_c.sh @@ -11,7 +11,7 @@ set -x -export PDATE=${PDATE:-2016030712} +export PDATE=${PDATE:-2022010406} ############################################################# # Specify whether the run is production or development @@ -21,54 +21,37 @@ export cyc=`echo $PDATE | cut -c9-10` export job=gfs_vminmon.${cyc} export pid=${pid:-$$} export jobid=${job}.${pid} -export envir=para - - -############################################################# -# Specify versions -############################################################# -export gfs_ver=v14.1.0 -export global_shared_ver=v14.1.0 -export gfs_minmon_ver=v1.0.0 -export minmon_shared_ver=v1.0.1 ############################################################# # Load modules ############################################################# . $MODULESHOME/init/ksh - module load prod_util -#module load prod_envir module load pm5 module list -############################################################# -# WCOSS environment settings -############################################################# -export POE=YES - - ############################################################# # Set user specific variables ############################################################# export DATAROOT=${DATAROOT:-/gpfs/hps3/emc/da/noscrub/$LOGNAME/test_data} -export COMROOT=${COMROOT:-/gpfs/hps2/ptmp/$LOGNAME/com} +export COMROOT=/gpfs/hps2/ptmp/$LOGNAME/com export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gfs} -export NWTEST=${NWTEST:-/gpfs/hps3/emc/da/noscrub/${LOGNAME}/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgfs=${NWTEST}/gfs.${gfs_minmon_ver} +export NWTEST=${NWTEST:-/gpfs/hps3/emc/da/noscrub/Edward.Safford/GSI/util/Minimization_Monitor/nwprod} +export HOMEgfs=${NWTEST}/gfs +export M_FIXgfs=${HOMEgfs}/fix export JOBGLOBAL=${HOMEgfs}/jobs -export HOMEminmon=${NWTEST}/minmon_shared.${minmon_shared_ver} -export COM_IN=${COM_IN:-${DATAROOT}} -export M_TANKverf=${M_TANKverf:-${COMROOT}/${MINMON_SUFFIX}} +export HOMEminmon=${NWTEST}/minmon_shared +export COM_IN=${DATAROOT} +export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} ############################################################# # Execute job ############################################################# -$JOBGLOBAL/JGFS_VMINMON +$JOBGLOBAL/JGFS_ATMOS_VMINMON exit diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_wcoss_d.sh b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss_d.sh similarity index 79% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_wcoss_d.sh rename to util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss_d.sh index 52dbc0cf14..101cf62548 100755 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/driver/test_jgfs_vminmon_wcoss_d.sh +++ b/util/Minimization_Monitor/nwprod/gfs/driver/test_jgfs_vminmon_wcoss_d.sh @@ -8,11 +8,11 @@ #BSUB -R affinity[core] #BSUB -M 80 #BSUB -W 00:05 -#BSUB -P GFS-T2O +#BSUB -P GFS-DEV set -ax -export PDATE=${PDATE:-2018011118} +export PDATE=${PDATE:-2018011112} ############################################################# # Specify whether the run is production or development @@ -28,15 +28,6 @@ export DATAROOT=${DATAROOT:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/test export COMROOT=${COMROOT:-/gpfs/dell2/ptmp/Edward.Safford/com} -############################################################# -# Specify versions -############################################################# -export gdas_ver=v14.1.0 -export global_shared_ver=v14.1.0 -export gfs_minmon_ver=v1.0.0 -export minmon_shared_ver=v1.0.1 - - ############################################################# # Load modules ############################################################# @@ -63,11 +54,11 @@ export minmon_shared_ver=v1.0.1 # Set user specific variables ############################################################# export MINMON_SUFFIX=${MINMON_SUFFIX:-testminmon_gfs} -export NWTEST=${NWTEST:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/ProdGSI/util/Minimization_Monitor/nwprod} -export HOMEgfs=${NWTEST}/gfs.${gfs_minmon_ver} +export NWTEST=${NWTEST:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/GSI/util/Minimization_Monitor/nwprod} +export HOMEgfs=${NWTEST}/gfs export JOBGLOBAL=${HOMEgfs}/jobs -export HOMEminmon=${NWTEST}/minmon_shared.${minmon_shared_ver} +export HOMEminmon=${NWTEST}/minmon_shared export COM_IN=${COM_IN:-${DATAROOT}} export M_TANKverf=${COMROOT}/${MINMON_SUFFIX} @@ -76,7 +67,7 @@ export M_FIXgfs=${HOMEgfs}/fix ############################################################# # Execute job ############################################################# -$JOBGLOBAL/JGFS_VMINMON +$JOBGLOBAL/JGFS_ATMOS_VMINMON exit diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/fix/gfs_minmon_cost.txt b/util/Minimization_Monitor/nwprod/gfs/fix/gfs_minmon_cost.txt similarity index 100% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/fix/gfs_minmon_cost.txt rename to util/Minimization_Monitor/nwprod/gfs/fix/gfs_minmon_cost.txt diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/fix/gfs_minmon_gnorm.txt b/util/Minimization_Monitor/nwprod/gfs/fix/gfs_minmon_gnorm.txt similarity index 100% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/fix/gfs_minmon_gnorm.txt rename to util/Minimization_Monitor/nwprod/gfs/fix/gfs_minmon_gnorm.txt diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_ATMOS_VMINMON b/util/Minimization_Monitor/nwprod/gfs/jobs/JGFS_ATMOS_VMINMON similarity index 78% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_ATMOS_VMINMON rename to util/Minimization_Monitor/nwprod/gfs/jobs/JGFS_ATMOS_VMINMON index a0d3503ef3..df0485b208 100755 --- a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/jobs/JGFS_ATMOS_VMINMON +++ b/util/Minimization_Monitor/nwprod/gfs/jobs/JGFS_ATMOS_VMINMON @@ -35,7 +35,6 @@ export m_job=${m_job:-${MINMON_SUFFIX}_mmDE} # Specify Package Areas ############################################## export HOMEgfs=${HOMEgfs:-${NWROOT}/gfs.${gfs_ver}} -#export PARMmon=${PARMmon:-$HOMEgfs/parm/mon} export SCRgfs=${SCRgfs:-$HOMEgfs/scripts} export M_FIXgfs=${M_FIXgfs:-$HOMEgfs/fix/product} @@ -43,20 +42,6 @@ export HOMEminmon=${HOMEminmon:-${HOMEgfs}} export EXECminmon=${EXECminmon:-$HOMEminmon/exec} export USHminmon=${USHminmon:-$HOMEminmon/ush} -################################### -# source the parm file -################################### -#. ${PARMmon}/da_mon.parm - - -############################################# -# Run setpdy and initialize PDY variables -############################################# -if [[ $MY_MACHINE != "hera" ]]; then - export cycle=t${cyc}z - setpdy.sh - . ./PDY -fi ############################################# # determine PDY and cyc for previous cycle @@ -72,14 +57,10 @@ export p_cyc=`echo ${cdate} | cut -c9-10` ############################################# # TANKverf - WHERE OUTPUT DATA WILL RESIDE ############################################# -TANK_USE_RUN=${TANK_USE_RUN:-1} - export COM_IN=${COM_IN:-${COMROOT}/${NET}/${envir}} -M_TANKverf=${M_TANKverf:-${COM_IN}} -M_TANKverfM0=${M_TANKverfM0:-${M_TANKverf}/${RUN}.${PDY}/${cyc}/$COMPONENT/minmon} -export M_TANKverfM1=${M_TANKverfM1:-${M_TANKverf}/${RUN}.${P_PDY}/${p_cyc}/$COMPONENT/minmon} -export M_TANKverf=$M_TANKverfM0 +M_TANKverf=${M_TANKverf:-${COM_IN}/${RUN}.${PDY}/${cyc}/${COMPONENT}/minmon} +export M_TANKverfM1=${M_TANKverfM1:-${COM_IN}/${RUN}.${P_PDY}/${p_cyc}/${COMPONENT}/minmon} export COMIN=${COMIN:-$COM_IN/${RUN}.${PDY}/${cyc}/$COMPONENT} diff --git a/util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_atmos_vminmon.sh b/util/Minimization_Monitor/nwprod/gfs/scripts/exgfs_atmos_vminmon.sh similarity index 100% rename from util/Minimization_Monitor/nwprod/gfs.v1.0.0/scripts/exgfs_atmos_vminmon.sh rename to util/Minimization_Monitor/nwprod/gfs/scripts/exgfs_atmos_vminmon.sh diff --git a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_costs.pl b/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_costs.pl deleted file mode 100755 index 10ebf67979..0000000000 --- a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_costs.pl +++ /dev/null @@ -1,233 +0,0 @@ -#! /usr/bin/perl - -#--------------------------------------------------------------------------- -# minmon_xtrct_costs.pl -# -# Extract cost data from gsistat file and load into cost -# and cost term files. -#--------------------------------------------------------------------------- - -use strict; -use warnings; - -#---------------------------------------------- -# subroutine to trim white space from strings -#---------------------------------------------- -sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s }; - - -#--------------------------- -# -# Main routine begins here -# -#--------------------------- - -if ($#ARGV != 4 ) { - print "usage: minmon_xtrct_costs.pl SUFFIX PDY cyc infile jlogfile\n"; - exit; -} -my $suffix = $ARGV[0]; - -my $pdy = $ARGV[1]; -my $cyc = $ARGV[2]; -my $infile = $ARGV[3]; -my $jlogfile = $ARGV[4]; - -#-------------------------------------------------- -my $scr = "minmon_xtrct_costs.pl"; -my $msg = $scr . " HAS STARTED"; - -my @msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -my $rc = 0; -my $cdate = sprintf '%s%s', $pdy, $cyc; - -if( (-e $infile) ) { - - my $found_cost = 0; - my $found_costterms = 0; - my @cost_array; - my @jb_array; - my @jo_array; - my @jc_array; - my @jl_array; - my @term_array; - my @all_cost_terms; - - my $cost_target; - my $cost_number; - my $costterms_target; - my $jb_number = 5; - my $jo_number = 6; - my $jc_number = 7; - my $jl_number = 8; - -# my $FIXminmon = $ENV{"FIXminmon"}; - my $costfile = $ENV{"mm_costfile"}; -# my $costfile = sprintf '%s', "./minmon_cost.txt"; - - if( (-e $costfile) ) { - open( COSTFILE, "<${costfile}" ) or die "Can't open ${costfile}: $!\n"; - my $line; - - while( $line = ) { - if( $line =~ /cost_target/ ) { - my @termsline = split( /:/, $line ); - $cost_target = $termsline[1]; - } elsif( $line =~ /cost_number/ ) { - my @termsline = split( /:/, $line ); - $cost_number = $termsline[1]; - } elsif( $line =~ /costterms_target/ ){ - my @termsline = split( /:/, $line ); - $costterms_target = $termsline[1]; - } - } - close( COSTFILE ); - } else { - $rc = 2; - } - - #------------------------------------------------------------------------ - # Open the infile and search for the $costterms_target and $cost_target - # strings. If found, parse out the cost information and push into - # holding arrays. - #------------------------------------------------------------------------ - if( $rc == 0 ) { - open( INFILE, "<${infile}" ) or die "Can't open ${infile}: $!\n"; - - my $line; - my $term_ctr=0; - - while( $line = ) { - if( $line =~ /$costterms_target/ ) { - my @termsline = split( / +/, $line ); - push( @jb_array, $termsline[$jb_number] ); - push( @jo_array, $termsline[$jo_number] ); - push( @jc_array, $termsline[$jc_number] ); - push( @jl_array, $termsline[$jl_number] ); - } - - if( $line =~ /$cost_target/ ) { - my @costline = split( / +/, $line ); - push( @cost_array, $costline[$cost_number] ); - } - - if( $term_ctr > 0 ) { - my @termline = split( / +/, $line ); - - if ( $term_ctr < 10 ) { - push( @term_array, trim($termline[1]) ); - push( @term_array, trim($termline[2]) ); - push( @term_array, trim($termline[3]) ); - $term_ctr++; - } else { - push( @term_array, trim($termline[1]) ); - push( @term_array, trim($termline[2]) ); - $term_ctr = 0; - } - - }elsif ( $line =~ "J=" && $line !~ "EJ=" ) { - my @termline = split( / +/, $line ); - push( @term_array, trim($termline[2]) ); - push( @term_array, trim($termline[3]) ); - push( @term_array, trim($termline[4]) ); - $term_ctr = 1; - } - } - - close( INFILE ); - - - #---------------------------------------------- - # move cost_array into all_costs by iteration - #---------------------------------------------- - my @all_costs; - for my $i (0 .. $#cost_array) { - my $iterline = sprintf ' %d,%e,%e,%e,%e,%e%s', - $i, $cost_array[$i], $jb_array[$i], $jo_array[$i], - $jc_array[$i], $jl_array[$i], "\n"; - - push( @all_costs, $iterline ); - } - - #--------------------------------------------------- - # move term_array into all_cost_terms by iteration - #--------------------------------------------------- - if( @term_array > 0 ) { - my $nterms = 32; - my $max_iter = ($#term_array+1)/$nterms; - my $niter = $max_iter -1; - - for my $iter (0 .. $niter ) { - my $step = $iter * $nterms; - my $iterline = sprintf '%d, %e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e,%e%s', - $iter, $term_array[$step], $term_array[$step+1], $term_array[$step+2], - $term_array[$step+3], $term_array[$step+4], $term_array[$step+5], - $term_array[$step+6], $term_array[$step+7], $term_array[$step+8], - $term_array[$step+9], $term_array[$step+10], $term_array[$step+11], - $term_array[$step+12], $term_array[$step+13], $term_array[$step+14], - $term_array[$step+15], $term_array[$step+16], $term_array[$step+17], - $term_array[$step+18], $term_array[$step+19], $term_array[$step+20], - $term_array[$step+21], $term_array[$step+22], $term_array[$step+23], - $term_array[$step+24], $term_array[$step+25], $term_array[$step+26], - $term_array[$step+27], $term_array[$step+28], $term_array[$step+29], - $term_array[$step+30], $term_array[$step+31], "\n"; - push( @all_cost_terms, $iterline ); - } - } - - #------------------------------------------ - # write all_costs array to costs.txt file - #------------------------------------------ - my $filename2 = "${cdate}.costs.txt"; - if( @all_costs > 0 ) { - open( OUTFILE, ">$filename2" ) or die "Can't open ${filename2}: $!\n"; - print OUTFILE @all_costs; - close( OUTFILE ); - } - - #----------------------------------------------------- - # write all_cost_terms array to costs_terms.txt file - #----------------------------------------------------- - my $filename3 = "${cdate}.cost_terms.txt"; - if( @all_cost_terms > 0 ) { - open( OUTFILE, ">$filename3" ) or die "Can't open ${filename3}: $!\n"; - print OUTFILE @all_cost_terms; - close( OUTFILE ); - } - - #-------------------------- - # move files to $M_TANKverf - #-------------------------- - my $tankdir = $ENV{"M_TANKverf"}; - if(! -d $tankdir) { - system( "mkdir -p $tankdir" ); - } - - if( -e $filename2 ) { - my $newfile2 = "${tankdir}/${filename2}"; - system("cp -f $filename2 $newfile2"); - } - if( -e $filename3 ) { - my $newfile3 = "${tankdir}/${filename3}"; - system("cp -f $filename3 $newfile3"); - } - - } # $rc still == 0 after reading gmon_cost.txt -} -else { # $infile does not exist - $rc = 1; -} - -#-------------------------------------------------- -$msg = $scr . " HAS ENDED"; -@msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -print "$rc \n" - diff --git a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_gnorms.pl b/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_gnorms.pl deleted file mode 100755 index 0f4d5deb2d..0000000000 --- a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_gnorms.pl +++ /dev/null @@ -1,446 +0,0 @@ -#! /usr/bin/perl - -use strict; -use warnings; -use List::MoreUtils 'true'; -use List::MoreUtils 'first_index'; -use List::MoreUtils 'last_index'; - -#--------------------------------------------------------------------------- -# minmon_xtrct_gnorms.pl -# -# Update the gnorm_data.txt file with data from a new cycle. Add -# this new data to the last line of the gnorm_data.txt file. -# -# Note: If the gnorm_data.txt file does not exist, it will be created. -# -# The gnorm_data.txt file is used plotted directly by the javascript on -# the GSI stats page. -#--------------------------------------------------------------------------- -sub updateGnormData { - my $cycle = $_[0]; - my $igrad = $_[1]; - my $fgnorm = $_[2]; - my $avg_gnorm = $_[3]; - my $min_gnorm = $_[4]; - my $max_gnorm = $_[5]; - my $suffix = $_[6]; - - my $rc = 0; - my @filearray; - - my $gdfile = "gnorm_data.txt"; - - my $outfile = "new_gnorm_data.txt"; - my $yr = substr( $cycle, 0, 4); - my $mon = substr( $cycle, 4, 2); - my $day = substr( $cycle, 6, 2); - my $hr = substr( $cycle, 8, 2); - - my $newln = sprintf ' %04d,%02d,%02d,%02d,%e,%e,%e,%e,%e%s', - $yr, $mon, $day, $hr, $igrad, $fgnorm, - $avg_gnorm, $min_gnorm, $max_gnorm, "\n"; - - # - # attempt to locate the latest $gdfile and copy it locally - # - - #if( ! -e $gdfile ) { - # if( $hr -eq "00" ) - #} - - if( -e $gdfile ) { - open( INFILE, "<${gdfile}" ) or die "Can't open ${gdfile}: $!\n"; - - @filearray = ; - -# This is the mechanism that limits the data to 30 days worth. Should I -# keep it or let the transfer script(s) truncate? 6/12/16 -- I'm going to keep -# it. I can add this as a later change once I add a user mechanism to vary the -# amount of data plotted (on the fly). - - while( $#filearray > 119 ) { # 30 days worth of data = 120 cycles - shift( @filearray ); - } - close( INFILE ); - } - - # Here is the problem Russ encountered after re-running the MinMon: - # If the cycle time in $newln is the same as an existing record in - # *.gnorm_data.txt then we end up with 2+ rows for the same cycle time. - # In that case $newln should replace the first existing line - # in @filearray and all other lines that might match should be deleted. - # Else when the cycle time doesn't already exist (the expected condition) - # it should be pushed into @filearray. - - # algorithm: - # ========= - # Establish $count of matches on "$yr,$mon,$day,$hr" - # if $count > 0 - # while $count > 1 - # get last_index and remove with splice - # replace first_index with $newln - # else - # push $newln - # - my $srch_strng = "$yr,$mon,$day,$hr"; - my $count = true { /$srch_strng/ } @filearray; - - if( $count > 0 ) { - while( $count > 1 ) { - my $l_index = last_index { /$srch_strng/ } @filearray; - splice @filearray, $l_index, 1; - $count = true { /$srch_strng/ } @filearray; - } - my $f_index = first_index { /$srch_strng/ } @filearray; - splice @filearray, $f_index, 1, $newln; - } - else { - push( @filearray, $newln ); - } - - open( OUTFILE, ">$outfile" ) or die "Can't open ${$outfile}: $!\n"; - print OUTFILE @filearray; - close( OUTFILE ); - - system("cp -f $outfile $gdfile"); - -} - -#--------------------------------------------------------------------------- -# makeErrMsg -# -# Apply a gross check on the final value of the gnorm for a specific -# cycle. If the final_gnorm value is greater than the gross_check value -# then put that in the error message file. Also check for resets or a -# premature halt, and journal those events to the error message file too. -# -# Note to self: reset_iter array is passed by reference -#--------------------------------------------------------------------------- -sub makeErrMsg { - my $suffix = $_[0]; - my $cycle = $_[1]; - my $final_gnorm = $_[2]; - my $stop_flag = $_[3]; - my $stop_iter = $_[4]; - my $reset_flag = $_[5]; - my $reset_iter = $_[6]; #reset iteration array - my $infile = $_[7]; - my $gross_check = $_[8]; - - my $mail_msg =""; - my $out_file = "${suffix}.${cycle}.errmsg.txt"; - - - if( $stop_flag > 0 ) { - my $stop_msg = " Gnorm check detected premature iteration stop: suffix = $suffix, cycle = $cycle, iteration = $stop_iter"; - $mail_msg .= $stop_msg; - } - - if( $reset_flag > 0 ) { - my $ctr=0; - my $reset_msg = "\n Gnorm check detected $reset_flag reset(s): suffix = $suffix, cycle = $cycle"; - $mail_msg .= $reset_msg; - $mail_msg .= "\n"; - $mail_msg .= " Reset(s) detected in iteration(s): @{$reset_iter}[$ctr] \n"; - - my $arr_size = @{$reset_iter}; - for( $ctr=1; $ctr < $arr_size; $ctr++ ) { - $mail_msg .= " @{$reset_iter}[$ctr]\n"; - } - } - - if( $final_gnorm >= $gross_check ){ - my $gnorm_msg = " Final gnorm gross check failure: suffix = $suffix, cycle = $cycle, final gnorm = $final_gnorm "; - - $mail_msg .= $gnorm_msg; - } - - if( length $mail_msg > 0 ){ - my $file_msg = " File source for report is: $infile"; - $mail_msg .= $file_msg; - } - - if( length $mail_msg > 0 ){ - my $mail_link = "http://www.emc.ncep.noaa.gov/gmb/gdas/radiance/esafford/gsi_stat/index.html?src=$suffix&typ=gnorm&cyc=$cycle"; - open( OUTFILE, ">$out_file" ) or die "Can't open ${$out_file}: $!\n"; - print OUTFILE $mail_msg; - print OUTFILE "\n\n $mail_link"; - close( OUTFILE ); - } -} - - -#--------------------------------------------------------------------------- -# -# Main routine begins here -# -#--------------------------------------------------------------------------- - -if ($#ARGV != 4 ) { - print "usage: minmon_xtrct_gnorms.pl SUFFIX pdy cyc infile jlogfile\n"; - exit; -} - - -my $suffix = $ARGV[0]; -my $pdy = $ARGV[1]; -my $cyc = $ARGV[2]; -my $infile = $ARGV[3]; -my $jlogfile = $ARGV[4]; - -#-------------------------------------------------- -my $scr = "minmon_xtrct_gnorms.pl"; -my $msg = $scr . " HAS STARTED"; - -my @msgcmd = ("postmsg", $jlogfile, $msg); -#system( @msgcmd ) == 0 -# or die "system @msgcmd failed: $?"; - -#-------------------------------------------------- - - -my $igrad_target; -my $igrad_number; -my $gnorm_target; -my $gnorm_number; -my $expected_gnorms; -my $gross_check_val; - -my $rc = 0; -my $cdate = sprintf '%s%s', $pdy, $cyc; - -#my $FIXminmon = $ENV{"FIXminmon"}; -my $gnormfile = $ENV{"mm_gnormfile"}; -#my $gnormfile = sprintf '%s', "./minmon_gnorm.txt"; - - -if( (-e $gnormfile) ) { - open( GNORMFILE, "<${gnormfile}" ) or die "Can't open ${gnormfile}: $!\n"; - my $line; - - while( $line = ) { - if( $line =~ /igrad_target/ ) { - my @termsline = split( /:/, $line ); - $igrad_target = $termsline[1]; - } elsif( $line =~ /igrad_number/ ) { - my @termsline = split( /:/, $line ); - $igrad_number = $termsline[1]; - } elsif( $line =~ /gnorm_target/ ){ - my @termsline = split( /:/, $line ); - $gnorm_target = $termsline[1]; - } elsif( $line =~ /gnorm_number/ ){ - my @termsline = split( /:/, $line ); - $gnorm_number = $termsline[1]; - } elsif( $line =~ /expected_gnorms/ ){ - my @termsline = split( /:/, $line ); - $expected_gnorms = $termsline[1]; - } elsif( $line =~ /gross_check_val/ ){ - my @termsline = split( /:/, $line ); - $gross_check_val = $termsline[1]; - } - } - close( GNORMFILE ); -} else { - $rc = 4; -} - -if( $rc == 0 ) { - if( (-e $infile) ) { - open( INFILE, "<${infile}" ) or die "Can't open ${infile}: $!\n"; - - my $found_grad = 0; - my $final_gnorm = 0.0; - my $igrad = 0.0; - my $header = 4; - my $header2 = 0; - my @gnorm_array; - my @last_10_gnorm; - - my $reset_flag = 0; - my $stop_flag = 0; - my $warn_str = "WARNING"; - my $stop_str = "Stopping"; - my $stop_iter = ""; - my $reset_str = "Reset"; - my @reset_iter; # reset iteration array - - my $stop_iter_flag = 0; - my $reset_iter_flag = 0; - my $line; - while( $line = ) { - - ############################################## - # if the reset_iter_flag is 1 then record the - # current outer & inner iteration number - ############################################## - if( $reset_iter_flag == 1 ) { - if( $line =~ /${gnorm_target}/ ){ - my @iterline = split( / +/, $line ); - my $iter_str = $iterline[9] . "," . $iterline[10]; - push( @reset_iter, $iter_str); - $reset_iter_flag = 0; - } - } - - - if( $found_grad == 0 ) { - if( $line =~ /${igrad_target}/ ) { - my @gradline = split( / +/, $line ); - - $igrad = $gradline[$igrad_number]; - $found_grad = 1; - } - } - - if( $line =~ /$gnorm_target/ ) { - my @gnormline = split( / +/, $line ); - push( @gnorm_array, $gnormline[$gnorm_number] ); - } - - if( $line =~ /${warn_str}/ ) { - if( $line =~ /${stop_str}/ ) { - $stop_flag++; - $stop_iter_flag=1; - } - elsif( $line =~ /${reset_str}/ ){ - $reset_flag++; - $reset_iter_flag = 1; - } - } - - } - close( INFILE ); - - ######################################################################## - # If the stop_flag is >0 then record the last outer & inner - # iteration number. The trick is that it's the last iteration in the - # log file and we just passed it when we hit the stop warning message, - # so we have to reopen the file and get the last iteration number. - ######################################################################## - if( $stop_flag > 0 ) { - open( INFILE, "<${infile}" ) or die "Can't open ${infile}: $!\n"; - - my @lines = reverse ; - foreach $line (@lines) { - if( $line =~ /${gnorm_target}/ ){ - my @iterline = split( / +/, $line ); - $stop_iter = $iterline[9] . "," . $iterline[10]; - last; - } - } - close( INFILE ); - } - - - my @all_gnorm = @gnorm_array; - - ############################################################################## - ## - ## If the iterations were halted due to error then the @all_gnorm array won't - ## be the expected size. In that case we need to pad the array out with - ## RMISS values so GrADS won't choke when it tries to read the data file. - ## - ## Note that we're padding @all_gnorm. The @gnorm_array is examined below - ## and we don't want to pad that and mess up the min/max calculation. - ## - ############################################################################### - my $arr_size = @all_gnorm; - - if( $arr_size < $expected_gnorms ) { - for( my $ctr = $arr_size; $ctr < $expected_gnorms; $ctr++ ) { - push( @all_gnorm, -999.0 ); - } - } - - my $sum_10_gnorm = 0.0; - my $min_gnorm = 9999999.0; - my $max_gnorm = -9999999.0; - my $avg_gnorm = 0.0; - - for( my $ctr = 9; $ctr >= 0; $ctr-- ) { - my $new_gnorm = pop( @gnorm_array ); - $sum_10_gnorm = $sum_10_gnorm + $new_gnorm; - if( $new_gnorm > $max_gnorm ) { - $max_gnorm = $new_gnorm; - } - if( $new_gnorm < $min_gnorm ) { - $min_gnorm = $new_gnorm; - } - if( $ctr == 9 ) { - $final_gnorm = $new_gnorm; - } - } - - $avg_gnorm = $sum_10_gnorm / 10; - - - ##################################################################### - # Update the gnorm_data.txt file with information on the - # initial gradient, final gnorm, and avg/min/max for the last 10 - # iterations. - ##################################################################### - updateGnormData( $cdate,$igrad,$final_gnorm,$avg_gnorm,$min_gnorm,$max_gnorm,$suffix ); - - - ##################################################################### - # Call makeErrMsg to build the error message file to record any - # abnormalities in the minimization. This file can be mailed by - # a calling script. - ##################################################################### - makeErrMsg( $suffix, $cdate, $final_gnorm, $stop_flag, $stop_iter, $reset_flag, \@reset_iter, $infile, $gross_check_val ); - - - ######################################################### - # write to GrADS ready output data file - # - # Note: this uses pack to achieve the same results as - # an unformatted binary Fortran file. - ######################################################### - my $filename2 = "${cdate}.gnorms.ieee_d"; - - open( OUTFILE, ">$filename2" ) or die "Can't open ${filename2}: $!\n"; - binmode OUTFILE; - - print OUTFILE pack( 'f*', @all_gnorm); - - close( OUTFILE ); - - #-------------------------- - # move files to $M_TANKverf - #-------------------------- - my $tankdir = $ENV{"M_TANKverf"}; - print "M_TANKverf = $tankdir \n"; - if(! -d $tankdir) { - system( "mkdir -p $tankdir" ); - } - - if( -e $filename2 ) { - system("cp -f $filename2 ${tankdir}/."); - } - - my $gdfile = "gnorm_data.txt"; - if( -e $gdfile ) { - system("cp -f $gdfile ${tankdir}/."); - } - - my $errmsg = "${cdate}.errmsg.txt"; - if( -e $errmsg ) { - system("cp -f $errmsg ${tankdir}/."); - } - - } # $rc still == 0 after reading gmon_gnorm.txt - -}else { # $infile does not exist - $rc = 3; -} - -#-------------------------------------------------- -$msg = $scr . " HAS ENDED"; -@msgcmd = ("postmsg", $jlogfile, $msg); -#system( @msgcmd ) == 0 -# or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -print "$rc \n" - diff --git a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_reduct.pl b/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_reduct.pl deleted file mode 100755 index 4dd6b118a1..0000000000 --- a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.0/ush/minmon_xtrct_reduct.pl +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/perl -use strict; - -#--------------------------------------------------------------------------- -# minmon_xtrct_reduct.pl -# -# Extract the reduction stats for a GSI minimization run and store in -# reduction.ieee_d files ready for GrADS use. -#--------------------------------------------------------------------------- - -if ($#ARGV != 4 ) { - print "usage: minmon_xtrct_reduct.pl SUFFIX pdy cyc infile jlogfile\n"; - print " suffix is data source identifier\n"; - print " pdy is YYYYMMDD of the cycle to be processed\n"; - print " cyc is HH of the cycle to be processed\n"; - print " infile is the data file containing the reduction stats\n"; - print " jlogfile is the job log file\n"; - exit; -} -my $suffix = $ARGV[0]; -my $pdy = $ARGV[1]; -my $cyc = $ARGV[2]; -my $infile = $ARGV[3]; -my $jlogfile = $ARGV[4]; - -#-------------------------------------------------- -my $scr = "minmon_xtrct_reduct.pl"; -my $msg = $scr . " HAS STARTED"; - -my @msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -my $rc = 0; -my $cdate = sprintf '%s%s', $pdy, $cyc; - -if( (-e $infile) ) { - - my $reduct_target = "penalty and grad reduction"; - my $reduct_num = 12; - - open( INFILE, "<${infile}" ) or die "Can't open ${infile}: $!\n"; - - my @reduct_array; - - while( my $line = ) { - if( $line =~ /$reduct_target/ ) { - my @reduct_ln = split( / +/, $line ); - push( @reduct_array, $reduct_ln[$reduct_num] ); - } - } - - close( INFILE ); - - - ################################# - # write reduct_array to outfile - ################################# - my $outfile = "${cdate}.reduction.ieee_d"; - open( OUTFILE, ">$outfile" ) or die "Can't open ${outfile}: $!\n"; - binmode OUTFILE; - - print OUTFILE pack( 'f*', @reduct_array); - close( OUTFILE ); - - #---------------------------- - # copy outfile to $M_TANKverf - #---------------------------- - my $tankdir = $ENV{"M_TANKverf"}; - if(! -d $tankdir) { - system( "mkdir -p $tankdir" ); - } - - if( -e $outfile ) { - my $newfile = "${tankdir}/${outfile}"; - system("cp -f $outfile $newfile"); - } - -} else { # $infile does not exist - $rc = 5; -} - -#-------------------------------------------------- -$msg = $scr . " HAS ENDED"; -@msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -print "$rc \n" - diff --git a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_costs.pl b/util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_costs.pl similarity index 92% rename from util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_costs.pl rename to util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_costs.pl index ca866fbd02..502032da80 100755 --- a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_costs.pl +++ b/util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_costs.pl @@ -1,4 +1,4 @@ -#! /usr/bin/perl +#!/usr/bin/env perl #--------------------------------------------------------------------------- # minmon_xtrct_costs.pl @@ -36,14 +36,9 @@ my $use_costterms = 0; my $no_data = 0.00; -#-------------------------------------------------- my $scr = "minmon_xtrct_costs.pl"; -my $msg = $scr . " HAS STARTED"; +print "$scr has started\n"; -my @msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- my $rc = 0; my $cdate = sprintf '%s%s', $pdy, $cyc; @@ -68,9 +63,7 @@ my $jc_number = 7; my $jl_number = 8; -# my $FIXminmon = $ENV{"FIXminmon"}; my $costfile = $ENV{"mm_costfile"}; -# my $costfile = sprintf '%s', "./minmon_cost.txt"; if( (-e $costfile) ) { open( COSTFILE, "<${costfile}" ) or die "Can't open ${costfile}: $!\n"; @@ -235,12 +228,4 @@ $rc = 1; } -#-------------------------------------------------- -$msg = $scr . " HAS ENDED"; -@msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -print "$rc \n" - +print "$scr has ended, return code = $rc \n" diff --git a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_gnorms.pl b/util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_gnorms.pl similarity index 95% rename from util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_gnorms.pl rename to util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_gnorms.pl index b921fb7fa1..61da749a1d 100755 --- a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_gnorms.pl +++ b/util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_gnorms.pl @@ -1,4 +1,4 @@ -#! /usr/bin/perl +#!/usr/bin/env perl use strict; use warnings; @@ -41,14 +41,9 @@ sub updateGnormData { $yr, $mon, $day, $hr, $igrad, $fgnorm, $avg_gnorm, $min_gnorm, $max_gnorm, "\n"; - # + #------------------------------------------------------------- # attempt to locate the latest $gdfile and copy it locally # - - #if( ! -e $gdfile ) { - # if( $hr -eq "00" ) - #} - if( -e $gdfile ) { open( INFILE, "<${gdfile}" ) or die "Can't open ${gdfile}: $!\n"; @@ -202,15 +197,9 @@ sub updateGnormData { my $infile = $ARGV[3]; my $jlogfile = $ARGV[4]; -#-------------------------------------------------- -my $scr = "minmon_xtrct_gnorms.pl"; -my $msg = $scr . " HAS STARTED"; - -my @msgcmd = ("postmsg", $jlogfile, $msg); -#system( @msgcmd ) == 0 -# or die "system @msgcmd failed: $?"; -#-------------------------------------------------- +my $scr = "minmon_xtrct_gnorms.pl"; +print "$scr Has Started\n"; # # This needs to be redesigned to get the gnorm value from the gsistat file @@ -310,8 +299,6 @@ sub updateGnormData { my $grad_sqr = $grad**2; my $gnorm = $grad_sqr/$igrad_sqr; -# print "grad_sqr, igrad_sqr, gnorm = $grad_sqr, $igrad_sqr, $gnorm\n"; - push( @gnorm_array, $gnorm ); } @@ -454,12 +441,4 @@ sub updateGnormData { $rc = 3; } -#-------------------------------------------------- -$msg = $scr . " HAS ENDED"; -@msgcmd = ("postmsg", $jlogfile, $msg); -#system( @msgcmd ) == 0 -# or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -print "$rc \n" - +print "$scr has ended, return code = $rc \n" diff --git a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_reduct.pl b/util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_reduct.pl similarity index 78% rename from util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_reduct.pl rename to util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_reduct.pl index 38152ed299..1b8186b6ad 100755 --- a/util/Minimization_Monitor/nwprod/minmon_shared.v1.0.1/ush/minmon_xtrct_reduct.pl +++ b/util/Minimization_Monitor/nwprod/minmon_shared/ush/minmon_xtrct_reduct.pl @@ -1,4 +1,5 @@ -#! /usr/bin/perl +#!/usr/bin/env perl + use strict; #--------------------------------------------------------------------------- @@ -23,14 +24,8 @@ my $infile = $ARGV[3]; my $jlogfile = $ARGV[4]; -#-------------------------------------------------- my $scr = "minmon_xtrct_reduct.pl"; -my $msg = $scr . " HAS STARTED"; - -my @msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- +print "$scr has started\n"; my $rc = 0; my $cdate = sprintf '%s%s', $pdy, $cyc; @@ -39,9 +34,7 @@ if( (-e $infile) ) { -# my $reduct_target = "penalty and grad reduction"; my $reduct_target = "cost,grad,step,b,step?"; -# my $reduct_num = 12; my $gradient_num = 5; my $reduct; @@ -59,7 +52,6 @@ $reduct = $iter_gradient / $initial_gradient; -# push( @reduct_array, $reduct_ln[$reduct_num] ); push( @reduct_array, $reduct ); } } @@ -94,12 +86,4 @@ $rc = 5; } -#-------------------------------------------------- -$msg = $scr . " HAS ENDED"; -@msgcmd = ("postmsg", $jlogfile, $msg); -system( @msgcmd ) == 0 - or die "system @msgcmd failed: $?"; -#-------------------------------------------------- - -print "$rc \n" - +print "$scr has ended, return code = $rc \n" diff --git a/util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/driver/test_nam_minmon.sh b/util/Minimization_Monitor/nwprod/nam_minmon/driver/test_nam_minmon.sh similarity index 100% rename from util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/driver/test_nam_minmon.sh rename to util/Minimization_Monitor/nwprod/nam_minmon/driver/test_nam_minmon.sh diff --git a/util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/fix/nam_minmon_cost.txt b/util/Minimization_Monitor/nwprod/nam_minmon/fix/nam_minmon_cost.txt similarity index 100% rename from util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/fix/nam_minmon_cost.txt rename to util/Minimization_Monitor/nwprod/nam_minmon/fix/nam_minmon_cost.txt diff --git a/util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/fix/nam_minmon_gnorm.txt b/util/Minimization_Monitor/nwprod/nam_minmon/fix/nam_minmon_gnorm.txt similarity index 100% rename from util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/fix/nam_minmon_gnorm.txt rename to util/Minimization_Monitor/nwprod/nam_minmon/fix/nam_minmon_gnorm.txt diff --git a/util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/jobs/JNAM_MINMON b/util/Minimization_Monitor/nwprod/nam_minmon/jobs/JNAM_MINMON similarity index 100% rename from util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/jobs/JNAM_MINMON rename to util/Minimization_Monitor/nwprod/nam_minmon/jobs/JNAM_MINMON diff --git a/util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/parm/nam_minmon.parm b/util/Minimization_Monitor/nwprod/nam_minmon/parm/nam_minmon.parm similarity index 100% rename from util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/parm/nam_minmon.parm rename to util/Minimization_Monitor/nwprod/nam_minmon/parm/nam_minmon.parm diff --git a/util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/scripts/exnam_vrfminmon.sh.ecf b/util/Minimization_Monitor/nwprod/nam_minmon/scripts/exnam_vrfminmon.sh.ecf similarity index 100% rename from util/Minimization_Monitor/nwprod/nam_minmon.v1.0.0/scripts/exnam_vrfminmon.sh.ecf rename to util/Minimization_Monitor/nwprod/nam_minmon/scripts/exnam_vrfminmon.sh.ecf diff --git a/util/Minimization_Monitor/parm/MinMon.ver b/util/Minimization_Monitor/parm/MinMon.ver deleted file mode 100644 index 9de5a047c4..0000000000 --- a/util/Minimization_Monitor/parm/MinMon.ver +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -if [[ $MINMON_VER -ne 1 ]]; then - - export MINMON_VER=1 - - export gdas_minmon_ver=v1.0.0 - export gfs_minmon_ver=v1.0.0 - export nam_minmon_ver=v1.0.0 - export minmon_shared_ver=v1.0.1 - -else - echo "MinMon.ver is already loaded" -fi - diff --git a/util/Minimization_Monitor/parm/MinMon_config b/util/Minimization_Monitor/parm/MinMon_config index c24af7aa8a..adc9293f0f 100644 --- a/util/Minimization_Monitor/parm/MinMon_config +++ b/util/Minimization_Monitor/parm/MinMon_config @@ -1,26 +1,22 @@ #!/bin/sh -################################################################### -# Note: MinMon/parm/MinMon.ver file must be sourced before this file -################################################################### - if [[ $MINMON_CONFIG -ne 1 ]]; then export MINMON_CONFIG=1 - export MY_MACHINE=hera + export MY_MACHINE=wcoss2 - export MY_MINMON=${MY_MINMON:-/scratch1/NCEPDEV/da/Edward.Safford/noscrub/ProdGSI/util/Minimization_Monitor} + export MY_MINMON=${MY_MINMON:-/lfs/h2/emc/da/noscrub/Edward.Safford/git/gsi/GSI/util/Minimization_Monitor} - export HOMEgdas=${MY_MINMON}/nwprod/gdas.${gdas_minmon_ver} - export HOMEgfs=${MY_MINMON}/nwprod/gfs.${gfs_minmon_ver} + export HOMEgdas=${MY_MINMON}/nwprod/gdas + export HOMEgfs=${MY_MINMON}/nwprod/gfs export M_FIXgdas=${M_FIXgdas:-${HOMEgdas}/fix} export M_FIXgfs=${M_FIXgfs:-${HOMEgfs}/fix} - export HOMEnam=${MY_MINMON}/nwprod/nam_minmon.${nam_minmon_ver} - export HOMEminmon=${MY_MINMON}/nwprod/minmon_shared.${minmon_shared_ver} + export HOMEnam=${MY_MINMON}/nwprod/nam_minmon + export HOMEminmon=${MY_MINMON}/nwprod/minmon_shared export MINMON_DE=${MINMON_DE:-${MY_MINMON}/data_xtrct} export M_DE_SCRIPTS=${M_DE_SCRIPTS:-${MINMON_DE}/ush} @@ -30,18 +26,18 @@ if [[ $MINMON_CONFIG -ne 1 ]]; then export M_IG_GRDS=${M_IG_GRDS:-${MINMON_IG}/grds} export M_IG_PARM=${M_IG_PARM:-${MINMON_IG}/parm} - export MY_STMP=${MY_STMP:-/scratch2/NCEPDEV/stmp3/Edward.Safford} - export MY_PTMP=${MY_PTMP:-/scratch2/NCEPDEV/stmp3/Edward.Safford} + export MY_STMP=${MY_STMP:-/lfs/h2/emc/stmp/Edward.Safford} + export MY_PTMP=${MY_PTMP:-/lfs/h2/emc/ptmp/Edward.Safford} export envir=${RUN_ENVIR:-prod} # # working directory # - export DATA_IN=${DATA_IN:-${MY_STMP}/${MINMON_SUFFIX}/${RUN}/minmon} + export DATA_IN=${DATA_IN:-${MY_STMP}/${MINMON_SUFFIX}/${RUN}/minmon} #rename to WORK_DIR export LOGdir=${LOGdir:-${MY_PTMP}/logs/${MINMON_SUFFIX}/${RUN}/minmon} - export MY_TANKDIR=${MY_TANKDIR:-/scratch1/NCEPDEV/da/Edward.Safford/nbns} + export MY_TANKDIR=${MY_TANKDIR:-/lfs/h2/emc/da/noscrub/Edward.Safford/nbns} export M_TANKverf=${M_TANKverf:-${MY_TANKDIR}} export MIN_IMGN_TANKDIR=${MY_TANKDIR}/imgn/${MINMON_SUFFIX} @@ -49,38 +45,23 @@ if [[ $MINMON_CONFIG -ne 1 ]]; then export WEBSERVER=${WEBSERVER:-emcrzdm} export WEBDIR=${WEBDIR:-/home/people/emc/www/htdocs/gmb/gdas/radiance/esafford/gsi_stat/pngs} - # # Utilities used by the MinMon package # export NCP=${NCP:-"/bin/cp -f"} export Z=${Z:-"gz"} - if [[ $MY_MACHINE = "wcoss" ]]; then - shell=sh - . /usrx/local/Modules/default/init/${shell} - module load lsf - module load GrADS/2.0.2 - - export SUB="bsub" - export NWPROD=/nwprod - export COMPRESS=/usrx/local/bin/pigz - export UNCOMPRESS="/usrx/local/bin/unpigz -f" - export RSYNC=/usr/bin/rsync - export PERL5LIB="/usrx/local/pm5/lib64/perl5:/usrx/local/pm5/share/perl5" - - - elif [[ $MY_MACHINE = "wcoss_d" ]]; then + if [[ $MY_MACHINE = "wcoss_d" ]]; then shell=sh source /usrx/local/prod/lmod/lmod/init/${shell} - MODULEPATH=/usrx/local/prod/lmod/lmod/modulefiles/Core:/usrx/local/prod/modulefiles/core_third:/usrx/local/prod/modulefiles/defs:/gpfs/dell1/nco/ops/nwprod/modulefiles/core_prod:/usrx/local/dev/modulefiles - + export MODULEPATH=/usrx/local/prod/lmod/lmod/modulefile/sCore:/usrx/local/prod/modulefiles/core_third:/usrx/local/prod/modulefiles/defs:/gpfs/dell1/nco/ops/nwprod/modulefiles/core_prod:/usrx/local/dev/modulefiles module purge + module load ips/18.0.1.163 module load metplus/2.1 module load lsf/10.1 - module load prod_util/1.1.2 + module load prod_util/1.1.6 module load pm5/1.0 module load GrADS/2.2.0 @@ -89,9 +70,24 @@ if [[ $MINMON_CONFIG -ne 1 ]]; then export UNCOMPRESS="gunzip -f" export RSYNC=/usr/bin/rsync + elif [[ $MY_MACHINE = "wcoss2" ]]; then + module load prod_util/2.0.10 + module load util_shared/1.4.0 + module load perl/5.32.0 - elif [[ $MY_MACHINE = "cray" ]]; then + # + # Note this GrADS mod is a temporary solution. NCO is to + # provide a more permanent fix on wcoss2 at some point. + # + module use /apps/test/modules + module load GrADS/2.2.1-cce-11.0.4 + + export SUB=`which qsub` + export COMPRESS=gzip + export UNCOMPRESS="gunzip -f" + export RSYNC=`which rsync` + elif [[ $MY_MACHINE = "cray" ]]; then sys=`hostname` sys1=`echo $sys | cut -c1` echo $sys1 @@ -136,6 +132,7 @@ if [[ $MINMON_CONFIG -ne 1 ]]; then export NDATE=${NWPROD}/ndate export COMPRESS=gzip export UNCOMPRESS="gunzip -f" + elif [[ $MY_MACHINE = "s4" ]]; then shell=sh . $MODULESHOME/init/$shell diff --git a/util/Minimization_Monitor/parm/MinMon_user_settings b/util/Minimization_Monitor/parm/MinMon_user_settings index 40357a3fa0..939d299c7e 100644 --- a/util/Minimization_Monitor/parm/MinMon_user_settings +++ b/util/Minimization_Monitor/parm/MinMon_user_settings @@ -14,19 +14,19 @@ if [[ $MINMON_USER_SETTINGS -ne 1 ]]; then # ACCOUNT is used on zeus only for use with the qsub -a flag. It is # empty on other platforms. # - export ACCOUNT=${ACCOUNT:-fv3-cpu} + export ACCOUNT=${ACCOUNT:-} # # PROJECT is used on wcoss only with the bjob -P flag. It is # empty on other platforms. # - export PROJECT=${PROJECT:-} + export PROJECT=${PROJECT:-GDAS-DEV} # - # JOB_QUEUE is used on wcoss only with the bjob -q flag. It is + # JOB_QUEUE is used on wcoss and wcoss2 bjob/qsub -q flag. It is # empty on other platforms. # - export JOB_QUEUE=${JOB_QUEUE:-dev_shared} + export JOB_QUEUE=${JOB_QUEUE:-dev} # # RUN_ONLY_ON_DEV 1 = dev machine only, 0 = run anywhere @@ -64,7 +64,7 @@ if [[ $MINMON_USER_SETTINGS -ne 1 ]]; then # # MAIL_TO is the mail recpient list for error reporting # - export MAIL_TO=${MAIL_TO:-""} + export MAIL_TO=${MAIL_TO:-"edward.safford@noaa.gov"} # # MAIL_CC is the mail recpient cc list for error reporting From 6256452b0511334ff57c0414bbc35a89613a2c2c Mon Sep 17 00:00:00 2001 From: "edward.safford" Date: Wed, 19 Jan 2022 20:42:57 +0000 Subject: [PATCH 13/26] GSI issue #288. Update ConMon and OznMon fix files. Completes #288 --- .../gdas_conmon/fix/gdas_conmon_base.txt | 8 +- .../gdas_conmon/fix/global_convinfo.txt | 76 +++++++++---------- .../gdas_oznmon/fix/gdas_oznmon_satype.txt | 2 +- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/util/Conventional_Monitor/nwprod/gdas_conmon/fix/gdas_conmon_base.txt b/util/Conventional_Monitor/nwprod/gdas_conmon/fix/gdas_conmon_base.txt index 90d3e137dc..4095598284 100644 --- a/util/Conventional_Monitor/nwprod/gdas_conmon/fix/gdas_conmon_base.txt +++ b/util/Conventional_Monitor/nwprod/gdas_conmon/fix/gdas_conmon_base.txt @@ -10,7 +10,7 @@ 00, gps43_00, 882.53 00, gps440_00, 0.00 00, gps44_00, 9291.65 -00, gps4_00, 37071.76 +00, gps4_00, 0.00 00, gps5_00, 36483.18 00, gps722_00, 0.00 00, gps723_00, 0.00 @@ -112,7 +112,7 @@ 06, gps43_00, 1597.53 06, gps440_00, 0.00 06, gps44_00, 1592.58 -06, gps4_00, 34857.95 +06, gps4_00, 0.00 06, gps5_00, 34323.47 06, gps722_00, 0.00 06, gps723_00, 0.00 @@ -214,7 +214,7 @@ 12, gps43_00, 2185.16 12, gps440_00, 0.00 12, gps44_00, 8037.16 -12, gps4_00, 36665.89 +12, gps4_00, 0.00 12, gps5_00, 35531.68 12, gps722_00, 0.00 12, gps723_00, 0.00 @@ -316,7 +316,7 @@ 18, gps43_00, 1547.95 18, gps440_00, 0.00 18, gps44_00, 6163.37 -18, gps4_00, 35486.47 +18, gps4_00, 0.00 18, gps5_00, 34518.58 18, gps722_00, 0.00 18, gps723_00, 0.00 diff --git a/util/Conventional_Monitor/nwprod/gdas_conmon/fix/global_convinfo.txt b/util/Conventional_Monitor/nwprod/gdas_conmon/fix/global_convinfo.txt index 2a363e6529..47a951d4b1 100755 --- a/util/Conventional_Monitor/nwprod/gdas_conmon/fix/global_convinfo.txt +++ b/util/Conventional_Monitor/nwprod/gdas_conmon/fix/global_convinfo.txt @@ -202,43 +202,43 @@ dw 101 0 -1 3.0 0 0 0 4.0 5.0 2.0 8.0 0.000001 0 0. 0. 0 0. 0. 0 0 srw 999 0 -1 2.5 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 rw 999 0 -1 2.5 0 0 0 10.0 10.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 004 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 041 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 722 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 723 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 740 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 741 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 742 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 743 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 744 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 745 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 820 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 042 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 043 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 786 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 421 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 003 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 821 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 825 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 440 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 004 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 041 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 722 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 723 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 740 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 741 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 742 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 743 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 744 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 745 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 820 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 042 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 043 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 786 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 421 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 003 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 821 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 825 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 440 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 pm2_5 102 0 -1 1.0 0 0 0 100.0 1.5 0.75 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 pm10 102 0 -1 1.0 0 0 0 150.0 1.5 0.75 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 750 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 751 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 752 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 753 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 754 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 755 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 724 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 725 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 726 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 727 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 728 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 729 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 044 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 005 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 265 0 1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 266 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 267 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 268 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 - gps 269 0 -1 3.0 0 0 0 0.024 0.024 0.01 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 750 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 751 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 752 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 753 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 754 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 755 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 724 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 725 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 726 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 727 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 728 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 729 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 044 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 005 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 265 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 266 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 267 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 268 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 + gps 269 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. 0 0 diff --git a/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt b/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt index dc89e86f5d..661296163e 100644 --- a/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt +++ b/util/Ozone_Monitor/nwprod/gdas_oznmon/fix/gdas_oznmon_satype.txt @@ -1 +1 @@ -gome_metop-b omi_aura sbuv2_n19 ompsnp_npp ompstc8_npp +gome_metop-b omi_aura sbuv2_n19 ompsnp_npp ompstc8_npp ompsnp_n20 ompstc8_n20 ompslp_npp From 4028fc7c62a6cfc16bde1624d2a84230e89057ae Mon Sep 17 00:00:00 2001 From: "Ming.Hu" Date: Sat, 8 Jan 2022 20:09:27 +0000 Subject: [PATCH 14/26] GitHub Issue NOAA-EMC/GSI#280: Add code to GSI IO interface with fv3lam to handle subdomain restart files. --- src/gsi/gridmod.F90 | 5 +- src/gsi/gsi_rfv3io_mod.f90 | 460 ++++++++++++++++++++++++++++++++----- src/gsi/gsimod.F90 | 10 +- src/gsi/guess_grids.F90 | 26 ++- ush/build.comgsi | 6 +- 5 files changed, 430 insertions(+), 77 deletions(-) diff --git a/src/gsi/gridmod.F90 b/src/gsi/gridmod.F90 index e89250ff8e..acc460e9c9 100644 --- a/src/gsi/gridmod.F90 +++ b/src/gsi/gridmod.F90 @@ -92,6 +92,7 @@ module gridmod ! 2019-09-04 martin - add write_fv3_incr to write netCDF increment rather than analysis in NEMSIO format ! 2019-09-23 martin - add use_gfs_ncio to read global first guess from netCDF file ! 2020-12-18 Hu - add grid_type_fv3_regional +! 2021-12-30 Hu - add fv3_io_layout_y ! ! ! @@ -146,7 +147,7 @@ module gridmod public :: nlat_regional,nlon_regional,update_regsfc,half_grid,gencode public :: diagnostic_reg,nmmb_reference_grid,filled_grid public :: grid_ratio_nmmb,isd_g,isc_g,dx_gfs,lpl_gfs,nsig5,nmmb_verttype - public :: grid_ratio_fv3_regional,fv3_regional,grid_type_fv3_regional + public :: grid_ratio_fv3_regional,fv3_io_layout_y,fv3_regional,grid_type_fv3_regional public :: l_reg_update_hydro_delz public :: nsig3,nsig4,grid_ratio_wrfmass public :: use_gfs_ozone,check_gfs_ozone_date,regional_ozone,nvege_type @@ -205,6 +206,7 @@ module gridmod character(1) nmmb_reference_grid ! ='H': use nmmb H grid as reference for analysis grid ! ='V': use nmmb V grid as reference for analysis grid real(r_kind) grid_ratio_fv3_regional ! ratio of analysis grid to fv3 model grid in fv3 grid units. + integer(i_kind) fv3_io_layout_y ! = io_layout(2) of fv3 regional model (subdomain y direction). integer(i_kind) grid_type_fv3_regional! type of fv3 model grid (grid orientation). real(r_kind) grid_ratio_nmmb ! ratio of analysis grid to nmmb model grid in nmmb model grid units. real(r_kind) grid_ratio_wrfmass ! ratio of analysis grid to wrf model grid in wrf mass grid units. @@ -463,6 +465,7 @@ subroutine init_grid filled_grid = .false. half_grid = .false. grid_ratio_fv3_regional = one + fv3_io_layout_y = 1 grid_type_fv3_regional = 0 grid_ratio_nmmb = sqrt(two) grid_ratio_wrfmass = one diff --git a/src/gsi/gsi_rfv3io_mod.f90 b/src/gsi/gsi_rfv3io_mod.f90 index a61433d653..51624c7ba7 100644 --- a/src/gsi/gsi_rfv3io_mod.f90 +++ b/src/gsi/gsi_rfv3io_mod.f90 @@ -14,6 +14,9 @@ module gsi_rfv3io_mod ! 2019 ting - modifications for use for ensemble IO and cold start files ! 2019-03-13 CAPS(C. Tong) - Port direct radar DA capabilities. ! 2021-11-01 lei - modify for fv3-lam parallel IO +! 2022-01-07 Hu - add code to readi/write subdomain restart files. +! This function is needed when fv3 model sets +! io_layout(2)>1 ! subroutines included: ! sub gsi_rfv3io_get_grid_specs ! sub read_fv3_files @@ -41,6 +44,7 @@ module gsi_rfv3io_mod use constants, only:max_varname_length use gsi_bundlemod, only : gsi_bundle use general_sub2grid_mod, only: sub2grid_info + use gridmod, only: fv3_io_layout_y implicit none public type_fv3regfilenameg public bg_fv3regfilenameg @@ -62,6 +66,7 @@ module gsi_rfv3io_mod type(type_fv3regfilenameg):: bg_fv3regfilenameg integer(i_kind) nx,ny,nz + integer(i_kind),dimension(:),allocatable :: ny_layout_len,ny_layout_b,ny_layout_e real(r_kind),allocatable:: grid_lon(:,:),grid_lont(:,:),grid_lat(:,:),grid_latt(:,:) real(r_kind),allocatable:: ak(:),bk(:) integer(i_kind),allocatable:: ijns2d(:),displss2d(:),ijns(:),displss(:) @@ -242,6 +247,10 @@ subroutine gsi_rfv3io_get_grid_specs(fv3filenamegin,ierr) integer(i_kind) myear,mmonth,mday,mhour,mminute,msecond real(r_kind),allocatable:: abk_fv3(:) integer(i_kind) imiddle,jmiddle +! if fv3_io_layout_y > 1 + integer(i_kind) :: nio,nylen + integer(i_kind),allocatable :: gfile_loc_layout(:) + character(len=180) :: filename_layout coupler_res_filenam=fv3filenamegin%couplerres grid_spec=fv3filenamegin%grid_spec @@ -281,7 +290,43 @@ subroutine gsi_rfv3io_get_grid_specs(fv3filenamegin,ierr) enddo nlon_regional=nx nlat_regional=ny + + allocate(ny_layout_len(0:fv3_io_layout_y-1)) + allocate(ny_layout_b(0:fv3_io_layout_y-1)) + allocate(ny_layout_e(0:fv3_io_layout_y-1)) + ny_layout_len=ny + ny_layout_b=0 + ny_layout_e=0 + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(grid_spec),'.',nio + iret=nf90_open(filename_layout,nf90_nowrite,gfile_loc_layout(nio)) + if(iret/=nf90_noerr) then + write(6,*)' problem opening ',trim(filename_layout),', Status =',iret + ierr=1 + return + endif + iret=nf90_inquire(gfile_loc_layout(nio),ndimensions,nvariables,nattributes,unlimiteddimid) + do k=1,ndimensions + iret=nf90_inquire_dimension(gfile_loc_layout(nio),k,name,len) + if(trim(name)=='grid_yt') ny_layout_len(nio)=len + enddo + iret=nf90_close(gfile_loc_layout(nio)) + enddo + deallocate(gfile_loc_layout) +! figure out begin and end of each subdomain restart file + nylen=0 + do nio=0,fv3_io_layout_y-1 + ny_layout_b(nio)=nylen + 1 + nylen=nylen+ny_layout_len(nio) + ny_layout_e(nio)=nylen + enddo + endif if(mype==0)write(6,*),'nx,ny=',nx,ny + if(mype==0)write(6,*),'ny_layout_len=',ny_layout_len + if(mype==0)write(6,*),'ny_layout_b=',ny_layout_b + if(mype==0)write(6,*),'ny_layout_e=',ny_layout_e !!! get nx,ny,grid_lon,grid_lont,grid_lat,grid_latt,nz,ak,bk @@ -1094,6 +1139,12 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) character(len=:),allocatable :: sfcdata !='fv3_sfcdata' character(len=:),allocatable :: dynvars !='fv3_dynvars' +! for io_layout > 1 + real(r_kind),allocatable,dimension(:,:):: sfc_fulldomain + integer(i_kind) :: nio + integer(i_kind),allocatable :: gfile_loc_layout(:) + character(len=180) :: filename_layout + sfcdata= fv3filenamegin%sfcdata dynvars= fv3filenamegin%dynvars @@ -1103,10 +1154,25 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) allocate( sfcn2d(lat2,lon2,n2d)) if(mype==mype_2d ) then - iret=nf90_open(sfcdata,nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' problem opening3 ',trim(sfcdata),', Status = ',iret - return + allocate(sfc_fulldomain(nx,ny)) + + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(sfcdata),'.',nio + iret=nf90_open(filename_layout,nf90_nowrite,gfile_loc_layout(nio)) + if(iret/=nf90_noerr) then + write(6,*)' problem opening3 ',trim(filename_layout),', Status = ',iret + return + endif + enddo + gfile_loc=gfile_loc_layout(0) + else + iret=nf90_open(sfcdata,nf90_nowrite,gfile_loc) + if(iret/=nf90_noerr) then + write(6,*)' problem opening3 ',trim(sfcdata),', Status = ',iret + return + endif endif iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) allocate(dim(ndimensions)) @@ -1141,22 +1207,48 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) cycle endif iret=nf90_inquire_variable(gfile_loc,i,ndims=ndim) + if(ndim < 2) then + write(*,*) "wrong dimension number ndim =",ndim + call stop2(119) + endif if(allocated(dim_id )) deallocate(dim_id ) allocate(dim_id(ndim)) - iret=nf90_inquire_variable(gfile_loc,i,dimids=dim_id) - if(allocated(sfc )) deallocate(sfc ) - if(ndim >=3) then !the block of 10 lines is compied from GSL gsi. - allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) - iret=nf90_get_var(gfile_loc,i,sfc) - else if (ndim == 2) then - allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),1)) - iret=nf90_get_var(gfile_loc,i,sfc(:,:,1)) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + iret=nf90_inquire_variable(gfile_loc_layout(nio),i,dimids=dim_id) + if(allocated(sfc )) deallocate(sfc ) + if(dim(dim_id(1)) == nx .and. dim(dim_id(2))==ny_layout_len(nio)) then + if(ndim >=3) then + allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) + iret=nf90_get_var(gfile_loc_layout(nio),i,sfc) + else if (ndim == 2) then + allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),1)) + iret=nf90_get_var(gfile_loc_layout(nio),i,sfc(:,:,1)) + endif + else + write(*,*) "Mismatch dimension in surfacei reading:",nx,ny_layout_len(nio),dim(dim_id(1)),dim(dim_id(2)) + call stop2(119) + endif + sfc_fulldomain(:,ny_layout_b(nio):ny_layout_e(nio))=sfc(:,:,1) + enddo else - write(*,*) "wrong dimension number ndim =",ndim - call stop2(119) + iret=nf90_inquire_variable(gfile_loc,i,dimids=dim_id) + if(allocated(sfc )) deallocate(sfc ) + if(dim(dim_id(1)) == nx .and. dim(dim_id(2))==ny) then + if(ndim >=3) then !the block of 10 lines is compied from GSL gsi. + allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),dim(dim_id(3)))) + iret=nf90_get_var(gfile_loc,i,sfc) + else if (ndim == 2) then + allocate(sfc(dim(dim_id(1)),dim(dim_id(2)),1)) + iret=nf90_get_var(gfile_loc,i,sfc(:,:,1)) + endif + else + write(*,*) "Mismatch dimension in surfacei reading:",nx,ny,dim(dim_id(1)),dim(dim_id(2)) + call stop2(119) + endif + sfc_fulldomain(:,:)=sfc(:,:,1) endif - - call fv3_h_to_ll(sfc(:,:,1),a,nx,ny,nxa,nya,grid_reverse_flag) + call fv3_h_to_ll(sfc_fulldomain,a,nx,ny,nxa,nya,grid_reverse_flag) kk=0 do n=1,npe @@ -1170,13 +1262,33 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) end do end do enddo ! i - iret=nf90_close(gfile_loc) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + iret=nf90_close(gfile_loc_layout(nio)) + enddo + deallocate (gfile_loc_layout) + else + iret=nf90_close(gfile_loc) + endif !!!! read in orog from dynam !!!!!!!!!!!! - iret=nf90_open(dynvars,nf90_nowrite,gfile_loc) - if(iret/=nf90_noerr) then - write(6,*)' problem opening4 ',trim(dynvars ),gfile_loc,', Status = ',iret - return + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(dynvars),'.',nio + iret=nf90_open(filename_layout,nf90_nowrite,gfile_loc_layout(nio)) + if(iret/=nf90_noerr) then + write(6,*)' problem opening4 ',trim(filename_layout),', Status =',iret + return + endif + enddo + gfile_loc=gfile_loc_layout(0) + else + iret=nf90_open(dynvars,nf90_nowrite,gfile_loc) + if(iret/=nf90_noerr) then + write(6,*)' problem opening4 ',trim(dynvars ),gfile_loc,', Status = ',iret + return + endif endif iret=nf90_inquire(gfile_loc,ndimensions,nvariables,nattributes,unlimiteddimid) @@ -1195,16 +1307,34 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) iret=nf90_inquire_variable(gfile_loc,k,ndims=ndim) if(allocated(dim_id )) deallocate(dim_id ) allocate(dim_id(ndim)) - iret=nf90_inquire_variable(gfile_loc,k,dimids=dim_id) - allocate(sfc1(dim(dim_id(1)),dim(dim_id(2))) ) - iret=nf90_get_var(gfile_loc,k,sfc1) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + iret=nf90_inquire_variable(gfile_loc_layout(nio),k,dimids=dim_id) + if(allocated(sfc1 )) deallocate(sfc1 ) + allocate(sfc1(dim(dim_id(1)),dim(dim_id(2))) ) + iret=nf90_get_var(gfile_loc_layout(nio),k,sfc1) + sfc_fulldomain(:,ny_layout_b(nio):ny_layout_e(nio))=sfc1 + enddo + else + iret=nf90_inquire_variable(gfile_loc,k,dimids=dim_id) + allocate(sfc1(dim(dim_id(1)),dim(dim_id(2))) ) + iret=nf90_get_var(gfile_loc,k,sfc1) + sfc_fulldomain=sfc1 + endif exit endif enddo ! k - iret=nf90_close(gfile_loc) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + iret=nf90_close(gfile_loc_layout(nio)) + enddo + deallocate(gfile_loc_layout) + else + iret=nf90_close(gfile_loc) + endif k=k_orog - call fv3_h_to_ll(sfc1,a,nx,ny,nxa,nya,grid_reverse_flag) + call fv3_h_to_ll(sfc_fulldomain,a,nx,ny,nxa,nya,grid_reverse_flag) kk=0 do n=1,npe @@ -1219,6 +1349,7 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z) end do deallocate (dim_id,sfc,sfc1,dim) + deallocate (sfc_fulldomain) endif ! mype @@ -1396,6 +1527,11 @@ subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) integer(i_kind) kbgn,kend integer(i_kind) gfile_loc,iret,var_id integer(i_kind) nz,nzp1,mm1 +! for io_layout > 1 + real(r_kind),allocatable,dimension(:,:):: uu2d_layout + integer(i_kind) :: nio + integer(i_kind),allocatable :: gfile_loc_layout(:) + character(len=180) :: filename_layout mm1=mype+1 nloncase=grd_ionouv%nlon @@ -1405,11 +1541,25 @@ subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) kbgn=grd_ionouv%kbegin_loc kend=grd_ionouv%kend_loc allocate(uu2d(nxcase,nycase)) - iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt - if(iret/=nf90_noerr) then - write(6,*)' gsi_fv3ncdf_read: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret - call flush(6) - call stop2(333) + + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(filenamein),'.',nio + iret=nf90_open(filename_layout,nf90_nowrite,gfile_loc_layout(nio),comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' gsi_fv3ncdf_read: problem opening ',trim(filename_layout),gfile_loc_layout(nio),', Status = ',iret + call flush(6) + call stop2(333) + endif + enddo + else + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' gsi_fv3ncdf_read: problem opening ',trim(filenamein),gfile_loc,', Status = ',iret + call flush(6) + call stop2(333) + endif endif do ilevtot=kbgn,kend vgsiname=grd_ionouv%names(1,ilevtot) @@ -1428,15 +1578,34 @@ subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) startloc=(/1,1,inative/) countloc=(/nxcase,nycase,1/) - iret=nf90_inq_varid(gfile_loc,trim(adjustl(varname)),var_id) - iret=nf90_get_var(gfile_loc,var_id,uu2d,start=startloc,count=countloc) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + countloc=(/nxcase,ny_layout_len(nio),1/) + allocate(uu2d_layout(nxcase,ny_layout_len(nio))) + iret=nf90_inq_varid(gfile_loc_layout(nio),trim(adjustl(varname)),var_id) + iret=nf90_get_var(gfile_loc_layout(nio),var_id,uu2d_layout,start=startloc,count=countloc) + uu2d(:,ny_layout_b(nio):ny_layout_e(nio))=uu2d_layout + deallocate(uu2d_layout) + enddo + else + iret=nf90_inq_varid(gfile_loc,trim(adjustl(varname)),var_id) + iret=nf90_get_var(gfile_loc,var_id,uu2d,start=startloc,count=countloc) + endif + call fv3_h_to_ll(uu2d,hwork(1,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) enddo ! ilevtot - call general_grid2sub(grd_ionouv,hwork,cstate_nouv%values) - iret=nf90_close(gfile_loc) - deallocate (uu2d) - + if(fv3_io_layout_y > 1) then + do nio=1,fv3_io_layout_y-1 + iret=nf90_close(gfile_loc_layout(nio)) + enddo + deallocate(gfile_loc_layout) + else + iret=nf90_close(gfile_loc) + endif + + deallocate (uu2d) + call general_grid2sub(grd_ionouv,hwork,cstate_nouv%values) return end subroutine gsi_fv3ncdf_read @@ -1601,6 +1770,12 @@ subroutine gsi_fv3ncdf_readuv(grd_uv,ges_u,ges_v,fv3filenamegin) integer(i_kind) gfile_loc,iret integer(i_kind) nz,nzp1,mm1 +! for fv3_io_layout_y > 1 + real(r_kind),allocatable,dimension(:,:):: u2d_layout,v2d_layout + integer(i_kind) :: nio + integer(i_kind),allocatable :: gfile_loc_layout(:) + character(len=180) :: filename_layout + mm1=mype+1 nloncase=grd_uv%nlon nlatcase=grd_uv%nlat @@ -1614,9 +1789,25 @@ subroutine gsi_fv3ncdf_readuv(grd_uv,ges_u,ges_v,fv3filenamegin) allocate(vc2d(nxcase,nycase)) allocate (worksub(2,grd_uv%lat2,grd_uv%lon2,grd_uv%nsig)) filenamein=fv3filenamegin%dynvars - iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt - if(iret/=nf90_noerr) then - write(6,*)' problem opening6 ',trim(filenamein),', Status = ',iret + + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(filenamein),".",nio + iret=nf90_open(filename_layout,nf90_nowrite,gfile_loc_layout(nio),comm=mpi_comm_world,info=MPI_INFO_NULL) + if(iret/=nf90_noerr) then + write(6,*)'problem opening6 ',trim(filename_layout),gfile_loc_layout(nio),', Status = ',iret + call flush(6) + call stop2(333) + endif + enddo + else + iret=nf90_open(filenamein,nf90_nowrite,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) !clt + if(iret/=nf90_noerr) then + write(6,*)' problem opening6 ',trim(filenamein),', Status = ',iret + call flush(6) + call stop2(333) + endif endif do ilevtot=kbgn,kend vgsiname=grd_uv%names(1,ilevtot) @@ -1635,10 +1826,30 @@ subroutine gsi_fv3ncdf_readuv(grd_uv,ges_u,ges_v,fv3filenamegin) u_startloc=(/1,1,inative/) v_startloc=(/1,1,inative/) - call check( nf90_inq_varid(gfile_loc,'u',u_grd_VarId) ) - iret=nf90_get_var(gfile_loc,u_grd_VarId,u2d,start=u_startloc,count=u_countloc) - call check( nf90_inq_varid(gfile_loc,'v',v_grd_VarId) ) - iret=nf90_get_var(gfile_loc,v_grd_VarId,v2d,start=v_startloc,count=v_countloc) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + u_countloc=(/nxcase,ny_layout_len(nio)+1,1/) + allocate(u2d_layout(nxcase,ny_layout_len(nio)+1)) + call check( nf90_inq_varid(gfile_loc_layout(nio),'u',u_grd_VarId) ) + iret=nf90_get_var(gfile_loc_layout(nio),u_grd_VarId,u2d_layout,start=u_startloc,count=u_countloc) + u2d(:,ny_layout_b(nio):ny_layout_e(nio))=u2d_layout(:,1:ny_layout_len(nio)) + if(nio==fv3_io_layout_y-1) u2d(:,ny_layout_e(nio)+1)=u2d_layout(:,ny_layout_len(nio)+1) + deallocate(u2d_layout) + + v_countloc=(/nxcase+1,ny_layout_len(nio),1/) + allocate(v2d_layout(nxcase+1,ny_layout_len(nio))) + call check( nf90_inq_varid(gfile_loc_layout(nio),'v',v_grd_VarId) ) + iret=nf90_get_var(gfile_loc_layout(nio),v_grd_VarId,v2d_layout,start=v_startloc,count=v_countloc) + v2d(:,ny_layout_b(nio):ny_layout_e(nio))=v2d_layout + deallocate(v2d_layout) + enddo + else + call check( nf90_inq_varid(gfile_loc,'u',u_grd_VarId) ) + iret=nf90_get_var(gfile_loc,u_grd_VarId,u2d,start=u_startloc,count=u_countloc) + call check( nf90_inq_varid(gfile_loc,'v',v_grd_VarId) ) + iret=nf90_get_var(gfile_loc,v_grd_VarId,v2d,start=v_startloc,count=v_countloc) + endif + if(.not.grid_reverse_flag) then call reverse_grid_r_uv (u2d,nxcase,nycase+1,1) call reverse_grid_r_uv (v2d,nxcase+1,nycase,1) @@ -1665,12 +1876,21 @@ subroutine gsi_fv3ncdf_readuv(grd_uv,ges_u,ges_v,fv3filenamegin) call fv3_h_to_ll(vc2d,hwork(2,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,.true.) enddo ! i + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + iret=nf90_close(gfile_loc_layout(nio)) + enddo + deallocate(gfile_loc_layout) + else + iret=nf90_close(gfile_loc) + endif + deallocate(u2d,v2d,uc2d,vc2d) + call general_grid2sub(grd_uv,hwork,worksub) ges_u=worksub(1,:,:,:) ges_v=worksub(2,:,:,:) - iret=nf90_close(gfile_loc) + deallocate(worksub) - deallocate(u2d,v2d,uc2d,vc2d,worksub) end subroutine gsi_fv3ncdf_readuv subroutine gsi_fv3ncdf_readuv_v1(grd_uv,ges_u,ges_v,fv3filenamegin) !$$$ subprogram documentation block @@ -1854,6 +2074,7 @@ subroutine wrfv3_netcdf(fv3filenamegin) real(r_kind), dimension(lat2,lon2,nsig) :: io_arr_qg, io_arr_qnr real(r_kind), dimension(:,:,:),allocatable ::g_prsi + real(r_kind), dimension(:,:),allocatable ::ges_ps_write it=ntguessig ier=0 @@ -1918,8 +2139,10 @@ subroutine wrfv3_netcdf(fv3filenamegin) deallocate(g_prsi,ges_ps_inc) else - ges_ps=ges_ps*1000.0_r_kind - call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'ps',ges_ps,istatus) + allocate(ges_ps_write(lat2,lon2)) + ges_ps_write=ges_ps*1000.0_r_kind + call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'ps',ges_ps_write,istatus) + deallocate(ges_ps_write) endif ! write out if (ier/=0) call die('get ges','cannot get pointers for fv3 met-fields, ier =',ier) @@ -1944,6 +2167,9 @@ subroutine wrfv3_netcdf(fv3filenamegin) endif if(allocated(g_prsi)) deallocate(g_prsi) + deallocate(ny_layout_len) + deallocate(ny_layout_b) + deallocate(ny_layout_e) ! additional I/O for direct reflectivity DA capabilities end subroutine wrfv3_netcdf @@ -2006,6 +2232,12 @@ subroutine gsi_fv3ncdf_writeuv(grd_uv,ges_u,ges_v,add_saved,fv3filenamegin) real(r_kind),allocatable,dimension(:,:):: u2d,v2d,workau2,workav2 real(r_kind),allocatable,dimension(:,:):: workbu2,workbv2 +! for fv3_io_layout_y > 1 + real(r_kind),allocatable,dimension(:,:):: u2d_layout,v2d_layout + integer(i_kind) :: nio + integer(i_kind),allocatable :: gfile_loc_layout(:) + character(len=180) :: filename_layout + mm1=mype+1 nloncase=grd_uv%nlon @@ -2030,7 +2262,18 @@ subroutine gsi_fv3ncdf_writeuv(grd_uv,ges_u,ges_v,add_saved,fv3filenamegin) end do call general_sub2grid(grd_uv,worksub,hwork) filenamein=fv3filenamegin%dynvars - call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(filenamein),".",nio + call check( nf90_open(filename_layout,nf90_write,gfile_loc_layout(nio),comm=mpi_comm_world,info=MPI_INFO_NULL) ) + enddo + gfile_loc=gfile_loc_layout(0) + else + call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + endif + do ilevtot=kbgn,kend varname=grd_uv%names(1,ilevtot) ilev=grd_uv%lnames(1,ilevtot) @@ -2053,8 +2296,25 @@ subroutine gsi_fv3ncdf_writeuv(grd_uv,ges_u,ges_v,add_saved,fv3filenamegin) allocate( workbu2(nlon_regional,nlat_regional+1)) allocate( workbv2(nlon_regional+1,nlat_regional)) !!!!!!!! readin work_b !!!!!!!!!!!!!!!! - call check( nf90_get_var(gfile_loc,ugrd_VarId,work_bu,start=u_startloc,count=u_countloc) ) - call check( nf90_get_var(gfile_loc,vgrd_VarId,work_bv,start=v_startloc,count=v_countloc) ) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + allocate(u2d_layout(nxcase,ny_layout_len(nio)+1)) + u_countloc=(/nxcase,ny_layout_len(nio)+1,1/) + call check( nf90_get_var(gfile_loc_layout(nio),ugrd_VarId,u2d_layout,start=u_startloc,count=u_countloc) ) + work_bu(:,ny_layout_b(nio):ny_layout_e(nio))=u2d_layout(:,1:ny_layout_len(nio)) + if(nio==fv3_io_layout_y-1) work_bu(:,ny_layout_e(nio)+1)=u2d_layout(:,ny_layout_len(nio)+1) + deallocate(u2d_layout) + + allocate(v2d_layout(nxcase+1,ny_layout_len(nio))) + v_countloc=(/nxcase+1,ny_layout_len(nio),1/) + call check( nf90_get_var(gfile_loc_layout(nio),vgrd_VarId,v2d_layout,start=v_startloc,count=v_countloc) ) + work_bv(:,ny_layout_b(nio):ny_layout_e(nio))=v2d_layout + deallocate(v2d_layout) + enddo + else + call check( nf90_get_var(gfile_loc,ugrd_VarId,work_bu,start=u_startloc,count=u_countloc) ) + call check( nf90_get_var(gfile_loc,vgrd_VarId,work_bv,start=v_startloc,count=v_countloc) ) + endif if(.not.grid_reverse_flag) then call reverse_grid_r_uv(work_bu,nlon_regional,nlat_regional+1,1) call reverse_grid_r_uv(work_bv,nlon_regional+1,nlat_regional,1) @@ -2082,10 +2342,34 @@ subroutine gsi_fv3ncdf_writeuv(grd_uv,ges_u,ges_v,add_saved,fv3filenamegin) call reverse_grid_r_uv(work_bv,nlon_regional+1,nlat_regional,1) endif - call check( nf90_put_var(gfile_loc,ugrd_VarId,work_bu,start=u_startloc,count=u_countloc) ) - call check( nf90_put_var(gfile_loc,vgrd_VarId,work_bv,start=v_startloc,count=v_countloc) ) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + allocate(u2d_layout(nxcase,ny_layout_len(nio)+1)) + u_countloc=(/nxcase,ny_layout_len(nio)+1,1/) + u2d_layout=work_bu(:,ny_layout_b(nio):ny_layout_e(nio)+1) + call check( nf90_put_var(gfile_loc_layout(nio),ugrd_VarId,u2d_layout,start=u_startloc,count=u_countloc) ) + deallocate(u2d_layout) + + allocate(v2d_layout(nxcase+1,ny_layout_len(nio))) + v_countloc=(/nxcase+1,ny_layout_len(nio),1/) + v2d_layout=work_bv(:,ny_layout_b(nio):ny_layout_e(nio)) + call check( nf90_put_var(gfile_loc_layout(nio),vgrd_VarId,v2d_layout,start=v_startloc,count=v_countloc) ) + deallocate(v2d_layout) + enddo + else + call check( nf90_put_var(gfile_loc,ugrd_VarId,work_bu,start=u_startloc,count=u_countloc) ) + call check( nf90_put_var(gfile_loc,vgrd_VarId,work_bv,start=v_startloc,count=v_countloc) ) + endif enddo !ilevltot - call check( nf90_close(gfile_loc) ) + + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + call check( nf90_close(gfile_loc_layout(nio)) ) + enddo + deallocate(gfile_loc_layout) + else + call check( nf90_close(gfile_loc) ) + endif deallocate(work_bu,work_bv,u2d,v2d) deallocate(work_au,work_av) @@ -2360,6 +2644,11 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file real(r_kind),allocatable,dimension(:,:):: work_b real(r_kind),allocatable,dimension(:,:):: workb2,worka2 +! for io_layout > 1 + real(r_kind),allocatable,dimension(:,:):: work_b_layout + integer(i_kind) :: nio + integer(i_kind),allocatable :: gfile_loc_layout(:) + character(len=180) :: filename_layout mm1=mype+1 ! Convert from subdomain to full horizontal field distributed among @@ -2375,7 +2664,18 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file allocate( work_b(nlon_regional,nlat_regional)) allocate( workb2(nlon_regional,nlat_regional)) allocate( worka2(nlatcase,nloncase)) - call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + + if(fv3_io_layout_y > 1) then + allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) + do nio=0,fv3_io_layout_y-1 + write(filename_layout,'(a,a,I4.4)') trim(filenamein),'.',nio + call check( nf90_open(filename_layout,nf90_write,gfile_loc_layout(nio),comm=mpi_comm_world,info=MPI_INFO_NULL) ) + enddo + gfile_loc=gfile_loc_layout(0) + else + call check( nf90_open(filenamein,nf90_write,gfile_loc,comm=mpi_comm_world,info=MPI_INFO_NULL) ) + endif + do ilevtot=kbgn,kend vgsiname=grd_ionouv%names(1,ilevtot) call getfv3lamfilevname(vgsiname,fv3filenamegin,filenamein2,varname) @@ -2399,28 +2699,64 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file if(index(vgsiname,"delzinc") > 0) then - call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + countloc=(/nxcase,ny_layout_len(nio),1/) + allocate(work_b_layout(nxcase,ny_layout_len(nio))) + call check( nf90_get_var(gfile_loc_layout(nio),VarId,work_b_layout,start = startloc, count = countloc) ) + work_b(:,ny_layout_b(nio):ny_layout_e(nio))=work_b_layout + deallocate(work_b_layout) + enddo + else + call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + endif call fv3_ll_to_h(work_a(:,:),workb2,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) work_b(:,:)=work_b(:,:)+workb2(:,:) else if(add_saved)then - call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) - - + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + countloc=(/nxcase,ny_layout_len(nio),1/) + allocate(work_b_layout(nxcase,ny_layout_len(nio))) + call check( nf90_get_var(gfile_loc_layout(nio),VarId,work_b_layout,start = startloc, count = countloc) ) + work_b(:,ny_layout_b(nio):ny_layout_e(nio))=work_b_layout + deallocate(work_b_layout) + enddo + else + call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + endif call fv3_h_to_ll(work_b(:,:),worka2,nlon_regional,nlat_regional,nloncase,nlatcase,grid_reverse_flag) !!!!!!!! analysis_inc: work_a !!!!!!!!!!!!!!!! work_a(:,:)=work_a(:,:)-worka2(:,:) call fv3_ll_to_h(work_a(:,:),workb2,nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) work_b(:,:)=work_b(:,:)+workb2(:,:) else - call fv3_ll_to_h(work_a(:,:),work_b(:,:),nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) + call fv3_ll_to_h(work_a(:,:),work_b(:,:),nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) endif + endif + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + countloc=(/nxcase,ny_layout_len(nio),1/) + allocate(work_b_layout(nxcase,ny_layout_len(nio))) + work_b_layout=work_b(:,ny_layout_b(nio):ny_layout_e(nio)) + call check( nf90_put_var(gfile_loc_layout(nio),VarId,work_b_layout, start = startloc, count = countloc) ) + deallocate(work_b_layout) + enddo + else + call check( nf90_put_var(gfile_loc,VarId,work_b, start = startloc, count = countloc) ) endif - call check( nf90_put_var(gfile_loc,VarId,work_b, start = startloc, count = countloc) ) enddo !ilevtotl loop - call check(nf90_close(gfile_loc)) + if(fv3_io_layout_y > 1) then + do nio=0,fv3_io_layout_y-1 + call check(nf90_close(gfile_loc_layout(nio))) + enddo + deallocate(gfile_loc_layout) + else + call check(nf90_close(gfile_loc)) + endif deallocate(work_b,work_a) + deallocate(workb2,worka2) end subroutine gsi_fv3ncdf_write diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index 1c8b73841f..76abbc22a2 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -118,7 +118,7 @@ module gsimod use mod_strong, only: l_tlnmc,reg_tlnmc_type,nstrong,tlnmc_option,& period_max,period_width,init_strongvars,baldiag_full,baldiag_inc use gridmod, only: nlat,nlon,nsig,wrf_nmm_regional,nems_nmmb_regional,fv3_regional,cmaq_regional,& - nmmb_reference_grid,grid_ratio_nmmb,grid_ratio_wrfmass,grid_ratio_fv3_regional,& + nmmb_reference_grid,grid_ratio_nmmb,grid_ratio_wrfmass,grid_ratio_fv3_regional,fv3_io_layout_y,& filled_grid,half_grid,wrf_mass_regional,nsig1o,nnnn1o,update_regsfc,& diagnostic_reg,gencode,nlon_regional,nlat_regional,nvege_type,& twodvar_regional,regional,init_grid,init_reg_glob_ll,init_grid_vars,netcdf,& @@ -468,7 +468,10 @@ module gsimod ! 2021-01-05 x.zhang/lei - add code for updating delz analysis in regional da ! 09-07-2020 CAPS Add options for directDA_radaruse_mod to use direct radar DA capabilities ! 02-09-2021 CAPS(J. Park) Add vad_near_analtime flag (obsqc) to assimilate newvad obs around analysis time only -! +! 01-07-2022 Hu Add fv3_io_layout_y to let fv3lam interface read/write subdomain restart +! files. The fv3_io_layout_y needs to match fv3lam model +! option io_layout(2). +! !EOP !------------------------------------------------------------------------- @@ -754,6 +757,7 @@ module gsimod ! = 'V', then analysis grid covers V grid domain ! grid_ratio_nmmb - ratio of analysis grid to nmmb model grid in nmmb model grid units. ! grid_ratio_fv3_regional - ratio of analysis grid to fv3 grid in fv3 grid units. +! fv3_io_layout_y - set to the same number as io_layout of fv3 regional model in y direction. ! grid_ratio_wrfmass - ratio of analysis grid to wrf mass grid in wrf grid units. ! grid_type_fv3_regional - type of fv3 model grid (grid orientation). ! twodvar_regional - logical for regional 2d-var analysis @@ -774,7 +778,7 @@ module gsimod diagnostic_reg,update_regsfc,netcdf,regional,wrf_nmm_regional,nems_nmmb_regional,fv3_regional,& wrf_mass_regional,twodvar_regional,filled_grid,half_grid,nvege_type,nlayers,cmaq_regional,& nmmb_reference_grid,grid_ratio_nmmb,grid_ratio_fv3_regional,grid_ratio_wrfmass,jcap_gfs,jcap_cut,& - wrf_mass_hybridcord,grid_type_fv3_regional + wrf_mass_hybridcord,grid_type_fv3_regional,fv3_io_layout_y ! BKGERR (background error related variables): ! vs - scale factor for vertical correlation lengths for background error diff --git a/src/gsi/guess_grids.F90 b/src/gsi/guess_grids.F90 index 27d9c7a466..e19ce93638 100644 --- a/src/gsi/guess_grids.F90 +++ b/src/gsi/guess_grids.F90 @@ -1704,6 +1704,7 @@ subroutine load_gsdpbl_hgt(mype) ! !REVISION HISTORY: ! 2011-06-06 Ming Hu ! 2013-02-22 Jacob Carley - Added NMMB +! 2022-01-07 Ming Hu - added fv3_regional ! ! !REMARKS: ! language: f90 @@ -1724,9 +1725,8 @@ subroutine load_gsdpbl_hgt(mype) real(r_kind),dimension(:,: ),pointer::ges_ps=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_tv=>NULL() - if (twodvar_regional) return - if (fv3_regional) then - if(mype==0)write(6,*)'not setup for fv3_regional in load_gsdpbl_hgt' + if (twodvar_regional) then + if(mype==0) write(6,*)'not setup for twodvar_regional in load_gsdpbl_hgt' return endif @@ -1745,13 +1745,19 @@ subroutine load_gsdpbl_hgt(mype) do k=1,nsig - if (wrf_mass_regional) pbk(k) = aeta1_ll(k)*(ges_ps_01(i,j)*ten-pt_ll)+aeta2_ll(k)+pt_ll - if (nems_nmmb_regional) then - pbk(k) = aeta1_ll(k)*pdtop_ll + aeta2_ll(k)*(ten*ges_ps(i,j) & - -pdtop_ll-pt_ll) + pt_ll - end if - - thetav(k) = ges_tv(i,j,k)*(r1000/pbk(k))**rd_over_cp_mass + if (wrf_mass_regional) then + pbk(k) = aeta1_ll(k)*(ges_ps_01(i,j)*ten-pt_ll)+aeta2_ll(k)+pt_ll + elseif (nems_nmmb_regional) then + pbk(k) = aeta1_ll(k)*pdtop_ll + aeta2_ll(k)*(ten*ges_ps(i,j) & + -pdtop_ll-pt_ll) + pt_ll + elseif (fv3_regional) then + pbk(k) = ges_prsl(i,j,k,1) * ten + else + write(*,*) "Error: not an model option in load_gsdpbl_hgt" + call stop2(1234) + end if + + thetav(k) = ges_tv(i,j,k)*(r1000/pbk(k))**rd_over_cp_mass end do pbl_height(i,j,jj) = zero diff --git a/ush/build.comgsi b/ush/build.comgsi index 889e17885f..319d0121f7 100755 --- a/ush/build.comgsi +++ b/ush/build.comgsi @@ -45,7 +45,11 @@ elif [[ -d /jetmon ]] ; then module load cmake/3.16.1 module load intel/18.0.5.274 module load impi/2018.4.274 - module load netcdf/4.7.0 #don't load netcdf/4.7.4 from hpc-stack, GSI does not compile with it. + module load szip/2.1 + module load hdf5parallel/1.10.6 + module load netcdf-hdf5parallel/4.7.4 + module load pnetcdf/1.11.2 + module load nco/4.9.1 module use /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack module load hpc/1.1.0 From 2c4f6204b091ebd0ce6386022e4bf659732f5573 Mon Sep 17 00:00:00 2001 From: "michael.lueken" Date: Fri, 4 Feb 2022 17:55:34 +0000 Subject: [PATCH 15/26] Master: Remove extra declaration of variable, ges_ps_write, in src/gsi/gsi_rfv3io_mod.f90, to allow the code to compile. --- src/gsi/gsi_rfv3io_mod.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gsi/gsi_rfv3io_mod.f90 b/src/gsi/gsi_rfv3io_mod.f90 index 5bd6f18470..496370e7c5 100644 --- a/src/gsi/gsi_rfv3io_mod.f90 +++ b/src/gsi/gsi_rfv3io_mod.f90 @@ -2075,7 +2075,6 @@ subroutine wrfv3_netcdf(fv3filenamegin) real(r_kind), dimension(lat2,lon2,nsig) :: io_arr_qg, io_arr_qnr real(r_kind), dimension(:,:,:),allocatable ::g_prsi - real(r_kind), dimension(:,:),allocatable ::ges_ps_write it=ntguessig ier=0 From 8d002d3299b7687fff640c263b472a37b2e3f064 Mon Sep 17 00:00:00 2001 From: "Ming.Hu" Date: Sun, 9 Jan 2022 05:39:43 +0000 Subject: [PATCH 16/26] NOAA-EMC/GSI#282: GSL enhancements to the non-var cloud analysis. Update the code generating psuedo moisture observations from cloud observations. --- src/GSD/gsdcloud/cloudCover_Surface.f90 | 4 +- src/gsi/gsdcloudanalysis.F90 | 187 +++++++++++++++++++++--- src/gsi/gsdcloudanalysis4gfs.F90 | 9 +- src/gsi/gsdcloudlib_pseudoq_mod.f90 | 32 +++- src/gsi/gsi_cldtotOper.F90 | 2 +- src/gsi/gsimod.F90 | 54 ++++++- src/gsi/rapidrefresh_cldsurf_mod.f90 | 70 ++++++++- src/gsi/read_Lightning.f90 | 11 +- src/gsi/read_obs.F90 | 2 +- src/gsi/reorg_metar_cloud.f90 | 73 +++++++-- src/gsi/setupcldtot.F90 | 18 ++- 11 files changed, 400 insertions(+), 62 deletions(-) diff --git a/src/GSD/gsdcloud/cloudCover_Surface.f90 b/src/GSD/gsdcloud/cloudCover_Surface.f90 index 40554e9e4c..f56e43590d 100644 --- a/src/GSD/gsdcloud/cloudCover_Surface.f90 +++ b/src/GSD/gsdcloud/cloudCover_Surface.f90 @@ -1,4 +1,4 @@ -SUBROUTINE cloudCover_Surface(mype,nlat,nlon,nsig,r_radius,thunderRadius,& +SUBROUTINE cloudCover_Surface(mype,nlat,nlon,nsig,thunderRadius,& cld_bld_hgt,t_bk,p_bk,q,h_bk,zh, & mxst_p,NVARCLD_P,numsao,OI,OJ,OCLD,OWX,Oelvtn,Odist,& cld_cover_3d,cld_type_3d,wthr_type,pcp_type_3d, & @@ -23,7 +23,6 @@ SUBROUTINE cloudCover_Surface(mype,nlat,nlon,nsig,r_radius,thunderRadius,& ! nlon - no. of lons on subdomain (buffer points on ends) ! nlat - no. of lats on subdomain (buffer points on ends) ! nsig - no. of levels -! r_radius - influence radius of the cloud observation ! thunderRadius - ! cld_bld_hgt - Height below which cloud building is done ! @@ -71,7 +70,6 @@ SUBROUTINE cloudCover_Surface(mype,nlat,nlon,nsig,r_radius,thunderRadius,& implicit none integer(i_kind),intent(in) :: mype - REAL(r_single), intent(in) :: r_radius integer(i_kind),intent(in) :: nlat,nlon,nsig real(r_single), intent(in) :: thunderRadius real(r_kind), intent(in) :: cld_bld_hgt diff --git a/src/gsi/gsdcloudanalysis.F90 b/src/gsi/gsdcloudanalysis.F90 index 599208ed8c..21fc21b8a2 100644 --- a/src/gsi/gsdcloudanalysis.F90 +++ b/src/gsi/gsdcloudanalysis.F90 @@ -23,7 +23,21 @@ subroutine gsdcloudanalysis(mype) ! 2015-01-13 ladwig - add code for Qni and Qnc (cloud ice and water number concentration) ! 2017-03-23 Hu - add code to use hybrid vertical coodinate in WRF MASS ! core -! +! 2019-10-10 Zhao - add code to check and adjust Qr/qs/qg and Qnr for +! each vertical profile to reduce the background +! reflectivity ghost in final analysis. (for RTMA3D +! only now, option l_precip_vertical_check) +! 2020-04-16 Zhao - modifications to the code which checks and adjusts the vertical +! profile of Qg/Qr/Qs/Qnr retrieved through cloud analysis to +! alleviate the background ghost reflectivity in analysis. +! Modifications includes: +! 1. change option l_precip_vertical_check to i_precip_vertical_check +! 2. i_precip_vertical_check: +! = 0(no adjustment, default) +! = 1(Clean off Qg only, where dbz_obs_max<=35dbz in the profile) +! = 2(clean Qg as in 1, and adjustment to the retrieved Qr/Qs/Qnr throughout the whole profile) +! = 3(similar to 2, but adjustment to Qr/Qs/Qnr only below maximum reflectivity level +! and where the dbz_obs is missing); ! ! input argument list: ! mype - processor ID that does this IO @@ -66,7 +80,6 @@ subroutine gsdcloudanalysis(mype) use mpimod, only: mpi_comm_world,ierror,mpi_real4 use rapidrefresh_cldsurf_mod, only: dfi_radar_latent_heat_time_period, & metar_impact_radius, & - metar_impact_radius_lowCloud, & l_cleanSnow_WarmTs,l_conserve_thetaV,& r_cleanSnow_WarmTs_threshold, & i_conserve_thetaV_iternum, & @@ -76,16 +89,18 @@ subroutine gsdcloudanalysis(mype) iclean_hydro_withRef, iclean_hydro_withRef_allcol, & l_use_hydroretrieval_all, & i_lightpcp, l_numconc, qv_max_inc,ioption, & - l_precip_clear_only,l_fog_off,cld_bld_coverage,cld_clr_coverage + l_precip_clear_only,l_fog_off,cld_bld_coverage,cld_clr_coverage,& + i_T_Q_adjust,l_saturate_bkCloud,i_precip_vertical_check,l_rtma3d use gsi_metguess_mod, only: GSI_MetGuess_Bundle use gsi_bundlemod, only: gsi_bundlegetpointer + use gsi_io, only: verbose +#ifdef RR_CLOUDANALYSIS implicit none ! Declare passed variables integer(i_kind),intent(in):: mype -#ifdef RR_CLOUDANALYSIS ! ! background ! @@ -182,8 +197,6 @@ subroutine gsdcloudanalysis(mype) real(r_single),allocatable :: vis2qc(:,:) ! fog real(r_kind) :: thunderRadius=2.5_r_kind - real(r_single) :: r_radius ! influence radius of cloud based on METAR obs - real(r_single) :: r_radius_lowCloud ! influence radius of low cloud to cloud top pressure integer(i_kind) :: miss_obs_int real(r_kind) :: miss_obs_real parameter ( miss_obs_int = -99999 ) @@ -235,7 +248,10 @@ subroutine gsdcloudanalysis(mype) logical :: ifindomain integer(i_kind) :: imaxlvl_ref real(r_kind) :: max_retrieved_qrqs,max_bk_qrqs,ratio_hyd_bk2obs + real(r_kind) :: qrqs_retrieved real(r_kind) :: qrlimit,qrlimit_lightpcp + real(r_kind) :: qnr_limit + real(r_kind) :: dbz_clean_graupel character(10) :: obstype integer(i_kind) :: lunin, is, ier, istatus integer(i_kind) :: nreal,nchanl,ilat1s,ilon1s @@ -253,6 +269,9 @@ subroutine gsdcloudanalysis(mype) real(r_kind),parameter :: rho_w = 999.97_r_kind, rho_a = 1.2_r_kind real(r_kind),parameter :: cldDiameter = 10.0E3_r_kind +! local variables used for adjustment of qr/qs for RTMA_3D to alleviate ghost reflectivity + logical :: print_verbose + integer(i_kind) :: k_cap ! highest level when adjument is done (used for adjust qr/qs for RTMA_3D) ! ! @@ -289,8 +308,6 @@ subroutine gsdcloudanalysis(mype) ! ! krad_bot=7.0_r_single - r_radius=metar_impact_radius - r_radius_lowCloud=metar_impact_radius_lowCloud opt_hydrometeor_retri=3 ! 1=Kessler 2=Lin 3=Thompson opt_cloudtemperature=3 ! 3=latent heat, 4,5,6 = adiabat profile @@ -310,6 +327,9 @@ subroutine gsdcloudanalysis(mype) istat_lightning=0 istat_nasalarc=0 + print_verbose=.false. + if (verbose) print_verbose=.true. + call load_gsdpbl_hgt(mype) ! ! check consistency of the options @@ -694,7 +714,7 @@ subroutine gsdcloudanalysis(mype) ! ! if(istat_surface == 1) then - call cloudCover_surface(mype,lat2,lon2,nsig,r_radius,thunderRadius, & + call cloudCover_surface(mype,lat2,lon2,nsig,thunderRadius, & cld_bld_hgt,t_bk,p_bk,q_bk,h_bk,zh, & numsao,nvarcld_p,numsao,oi,oj,ocld,owx,oelvtn,odist, & cld_cover_3d,cld_type_3d,wthr_type_2d,pcp_type_3d, & @@ -869,7 +889,7 @@ subroutine gsdcloudanalysis(mype) ! 2013) ! - if(l_use_hydroretrieval_all) then !RTMA + if(l_use_hydroretrieval_all .or. l_rtma3d) then !RTMA qrlimit=15.0_r_kind*0.001_r_kind do k=1,nsig do j=2,lat2-1 @@ -907,6 +927,103 @@ subroutine gsdcloudanalysis(mype) end do end do end do + +! ---- verical check and adjustment to the analysis of precipitation +! in order to remove/reduce the backround reflectivity "ghost" in +! analysis. +! Note: here rain_3d, snow_3d have been already changed into unit of kg/kg. + if(i_precip_vertical_check > 0) then + + if(print_verbose) then + write(6,'(1x,A,I4.4,A)')"SUB gsdcloudanalysis: precip_vertical_check start... (for pe=",mype,")." + else + if(mype == 0) then + write(6,'(1x,A,I4.4,A)')"SUB gsdcloudanalysis: precip_vertical_check start ... (only print for pe=",mype,")." + end if + end if + + qnr_limit=200000_r_kind + dbz_clean_graupel=35.0_r_kind + + do j=2,lat2-1 + do i=2,lon2-1 + +! 1. search the max reflectivity obs for veritcal profile at each grid +! point (same code used in hydrometeor anlysis for RAP forecast) + refmax=-999.0_r_kind + imaxlvl_ref=0 + do k=1,nsig + if(ref_mos_3d(i,j,k) > refmax) then + imaxlvl_ref=k + refmax=ref_mos_3d(i,j,k) + endif + enddo +! 2. check and adjustment along the profile at each grid point + if( refmax > 0 .and. (imaxlvl_ref > 0 .and. imaxlvl_ref < nsig ) ) then + ! cleaning the Graupel, if refmax <= dbz_clean_graupel (35dbz) + ! because graupel is copied from background, not retrieved in cloud analysis. + ! (as seen above, graupel_3d(i,j,k) = ges_qg(j,i,k) ) + if( refmax <= dbz_clean_graupel ) graupel_3d(i,j,:) = zero + + ! adjusting hydrometeors based on maximum reflectivity level + select case (i_precip_vertical_check) + case(2) ! adjust each level along the profile (1:nsig) + max_retrieved_qrqs=snow_3d(i,j,imaxlvl_ref)+rain_3d(i,j,imaxlvl_ref) + do k=1,nsig + qrqs_retrieved=snow_3d(i,j,k)+rain_3d(i,j,k) + if(qrqs_retrieved > max_retrieved_qrqs .and. qrqs_retrieved > 0.0001_r_kind) then + ratio_hyd_bk2obs=max(min(max_retrieved_qrqs/qrqs_retrieved,1.0_r_kind),0.0_r_kind) + if(rain_3d(i,j,k) > zero) then + rain_3d(i,j,k) = rain_3d(i,j,k)*ratio_hyd_bk2obs + nrain_3d(i,j,k)= min(nrain_3d(i,j,k)/ratio_hyd_bk2obs*2.5_r_kind,qnr_limit) + endif + if(snow_3d(i,j,k) > zero) then + snow_3d(i,j,k) = snow_3d(i,j,k)*ratio_hyd_bk2obs + end if + end if + end do + case(3) ! adjust the dbz-obs-missed levels below max-dbz layer (1:kcap) + ! based on the qr+qs on max-refl level + ! keep the retrieved cloud analysis as much as possible + max_retrieved_qrqs=snow_3d(i,j,imaxlvl_ref)+rain_3d(i,j,imaxlvl_ref) + k_cap=min(imaxlvl_ref,nsig) + do k=k_cap,1,-1 + if( ref_mos_3d(i,j,k) <= -100.0_r_kind ) then ! dbz-obs-missing level + qrqs_retrieved=snow_3d(i,j,k)+rain_3d(i,j,k) + if(qrqs_retrieved > max_retrieved_qrqs .and. qrqs_retrieved > 0.0001_r_kind) then + ratio_hyd_bk2obs=max(min(max_retrieved_qrqs/qrqs_retrieved,1.0_r_kind),0.0_r_kind) + if(rain_3d(i,j,k) > zero) then + rain_3d(i,j,k) = rain_3d(i,j,k)*ratio_hyd_bk2obs + ! for nrain_3d: 2.5(old) or 1.0(new4) or 1.5(new5/6) 2.5(old, new7) 2.0(new8) + nrain_3d(i,j,k)= min(nrain_3d(i,j,k)/ratio_hyd_bk2obs*2.5_r_kind,qnr_limit) + endif + if(snow_3d(i,j,k) > zero) then + snow_3d(i,j,k) = snow_3d(i,j,k)*ratio_hyd_bk2obs + end if + end if + end if + end do + case default + rain_3d(i,j,k) = rain_3d(i,j,k) + nrain_3d(i,j,k)= nrain_3d(i,j,k) + snow_3d(i,j,k) = snow_3d(i,j,k) + end select + + end if + + end do + end do + + if(print_verbose) then + write(6,'(1x,A,I4.4,A)')"SUB gsdcloudanalysis: precip_vertical_check is done ... (for pe=",mype,")." + else + if(mype == 0) then + write(6,'(1x,A,I4.4,A)')"SUB gsdcloudanalysis: precip_vertical_check is done ... (only print for pe=",mype,")." + end if + end if + + end if + elseif(l_precip_clear_only) then !only clear for HRRRE do k=1,nsig do j=2,lat2-1 @@ -1099,7 +1216,7 @@ subroutine gsdcloudanalysis(mype) ! call cloud_saturation(mype,l_conserve_thetaV,i_conserve_thetaV_iternum, & lat2,lon2,nsig,q_bk,t_bk,p_bk, & - cld_cover_3d,wthr_type_2d,cldwater_3d,cldice_3d,sumqci,qv_max_inc) + cld_cover_3d,wthr_type_2d,cldwater_3d,cldice_3d,sumqci,qv_max_inc, l_saturate_bkCloud) ! @@ -1136,24 +1253,50 @@ subroutine gsdcloudanalysis(mype) do k=1,nsig do j=1,lat2 do i=1,lon2 - if(l_conserve_thetaV) then + ! T/Q update + ! =0 no T/Q adjustment + if(i_T_Q_adjust==0) then + if(mype==0) then + write(6,*) 'gsdcloudanalysis: no T/Q adjustment',mype + endif + ! =1 default T/Q adjustment + elseif(i_T_Q_adjust==1) then if(.not.twodvar_regional .or. .not.tsensible) then - ges_tv(j,i,k)=t_bk(i,j,k)*(p_bk(i,j,k)/h1000)**rd_over_cp * & ! t_bk is potential T - (one+fv*q_bk(i,j,k)) ! convert T to virtual T + ! t_bk is potential T, convert to virtual T + ges_tv(j,i,k)=t_bk(i,j,k)*(p_bk(i,j,k)/h1000)**rd_over_cp * (one+fv*q_bk(i,j,k)) ges_tsen(j,i,k,itsig) = ges_tv(j,i,k)/(one+fv*q_bk(i,j,k)) else - ges_tsen(j,i,k,itsig)=t_bk(i,j,k)*(p_bk(i,j,k)/h1000)**rd_over_cp ! t_bk is potential T - ges_tv(j,i,k) = ges_tsen(j,i,k,itsig)*(one+fv*q_bk(i,j,k)) ! convert virtual T to T + ! t_bk is potential T, convert virtual T to T + ges_tsen(j,i,k,itsig)=t_bk(i,j,k)*(p_bk(i,j,k)/h1000)**rd_over_cp + ges_tv(j,i,k) = ges_tsen(j,i,k,itsig)*(one+fv*q_bk(i,j,k)) endif - endif ! l_conserve_thetaV - ges_q(j,i,k)=q_bk(i,j,k)/(1+q_bk(i,j,k)) ! Here q is mixing ratio kg/kg, - ! need to convert to specific humidity + ! Here q is mixing ratio kg/kg, need to convert to specific humidity + ges_q(j,i,k)=q_bk(i,j,k)/(1+q_bk(i,j,k)) + ! =2 T/Q adjustment only for case of clearing + elseif(i_T_Q_adjust==2) then + if(.not.twodvar_regional .or. .not.tsensible) then + ! t_bk is potential T, convert to virtual T + ges_tv(j,i,k)=max(ges_tv(j,i,k),t_bk(i,j,k)*(p_bk(i,j,k)/h1000)**rd_over_cp * (one+fv*q_bk(i,j,k))) + ges_tsen(j,i,k,itsig) = max(ges_tsen(j,i,k,itsig),ges_tv(j,i,k)/(one+fv*q_bk(i,j,k))) + else + ! t_bk is potential T, convert virtual T to T + ges_tsen(j,i,k,itsig)= max(ges_tsen(j,i,k,itsig),t_bk(i,j,k)*(p_bk(i,j,k)/h1000)**rd_over_cp) + ges_tv(j,i,k) = max(ges_tv(j,i,k),ges_tsen(j,i,k,itsig)*(one+fv*q_bk(i,j,k))) + endif + ! Here q is mixing ratio kg/kg, need to convert to specific humidity + ges_q(j,i,k)=min(ges_q(j,i,k),q_bk(i,j,k)/(1+q_bk(i,j,k))) + else + write(6,*) 'gsdcloudanalysis: WARNING no T/Q adjustment, check i_T_Q_adjust value',mype + endif + + ! hydrometeor update ges_qr(j,i,k)=rain_3d(i,j,k) ges_qs(j,i,k)=snow_3d(i,j,k) ges_qg(j,i,k)=graupel_3d(i,j,k) ges_ql(j,i,k)=cldwater_3d(i,j,k) ges_qi(j,i,k)=cldice_3d(i,j,k) ges_qnr(j,i,k)=nrain_3d(i,j,k) + ! cloud number concentration update if( l_numconc ) then ges_qni(j,i,k)=nice_3d(i,j,k) ges_qnc(j,i,k)=nwater_3d(i,j,k) @@ -1193,9 +1336,13 @@ subroutine gsdcloudanalysis(mype) endif #else /* Start no RR cloud analysis library block */ + implicit none + +! Declare passed variables + integer(i_kind),intent(in):: mype +! if( mype == 0) write(6,*)'gsdcloudanalysis: dummy routine, does nothing!' #endif /* End no RR cloud analysis library block */ - end subroutine gsdcloudanalysis diff --git a/src/gsi/gsdcloudanalysis4gfs.F90 b/src/gsi/gsdcloudanalysis4gfs.F90 index c778471120..294ae32cf4 100644 --- a/src/gsi/gsdcloudanalysis4gfs.F90 +++ b/src/gsi/gsdcloudanalysis4gfs.F90 @@ -78,11 +78,11 @@ subroutine gsdcloudanalysis4gfs(mype) use gsi_metguess_mod, only: GSI_MetGuess_Bundle use gsi_bundlemod, only: gsi_bundlegetpointer +#ifdef RR_CLOUDANALYSIS implicit none ! Declare passed variables integer(i_kind),intent(in):: mype -#ifdef RR_CLOUDANALYSIS ! ! background ! @@ -931,10 +931,15 @@ subroutine gsdcloudanalysis4gfs(mype) write(6,*) 'gsdcloudanalysis: generalized cloud analysis finished:',mype write(6,*) '========================================' endif + #else /* Start no RR cloud analysis library block */ + implicit none + +! Declare passed variables + integer(i_kind),intent(in):: mype +! if( mype == 0) write(6,*)'gsdcloudanalysis: dummy routine, does nothing!' #endif /* End no RR cloud analysis library block */ - end subroutine gsdcloudanalysis4gfs diff --git a/src/gsi/gsdcloudlib_pseudoq_mod.f90 b/src/gsi/gsdcloudlib_pseudoq_mod.f90 index 5afba70452..b7544a860c 100644 --- a/src/gsi/gsdcloudlib_pseudoq_mod.f90 +++ b/src/gsi/gsdcloudlib_pseudoq_mod.f90 @@ -32,7 +32,8 @@ module gsdcloudlib_pseudoq_mod contains -SUBROUTINE cloudCover_Surface_col(mype,nsig,& +SUBROUTINE cloudCover_Surface_col(mype,nsig, & + i_cloud_q_innovation,& cld_bld_hgt,h_bk,zh, & NVARCLD_P,ocld,Oelvtn,& wthr_type,pcp_type_obs, & @@ -57,6 +58,7 @@ SUBROUTINE cloudCover_Surface_col(mype,nsig,& ! input argument list: ! mype - processor ID ! nsig - no. of levels +! i_cloud_q_innovation - flag to control building/clearing/both ! cld_bld_hgt - Height below which cloud building is done ! ! h_bk - 3D background height (m) @@ -96,6 +98,7 @@ SUBROUTINE cloudCover_Surface_col(mype,nsig,& integer(i_kind),intent(in) :: mype integer(i_kind),intent(in) :: nsig + integer(i_kind),intent(in) :: i_cloud_q_innovation real(r_kind), intent(in) :: cld_bld_hgt ! ! surface observation @@ -124,7 +127,7 @@ SUBROUTINE cloudCover_Surface_col(mype,nsig,& INTEGER(i_kind) :: k INTEGER(i_kind) :: ic integer(i_kind) :: firstcloud,cl_base_broken_k,obused - integer(i_kind) :: kcld + integer(i_kind) :: kcld,kclr real(r_single) :: underlim REAL(r_kind) :: zdiff REAL(r_kind) :: zlev_clr,cloud_dz,cl_base_ista,betav @@ -140,6 +143,7 @@ SUBROUTINE cloudCover_Surface_col(mype,nsig,& firstcloud = 0 obused =0 kcld=-9 + kclr=99 ! !***************************************************************** ! analysis of surface/METAR cloud observations @@ -161,6 +165,15 @@ SUBROUTINE cloudCover_Surface_col(mype,nsig,& endif enddo + ! cloud clearing obs + if(i_cloud_q_innovation==20 .or. i_cloud_q_innovation==22) then + do k=3,nsig,5 + if (h_bk(k) < zlev_clr) then + cld_cover_obs(k)=0.0_r_single + endif + enddo + endif + ! -- Now consider non-clear obs ! -------------------------- else @@ -203,10 +216,12 @@ SUBROUTINE cloudCover_Surface_col(mype,nsig,& if(k==8) underlim=95.0_r_kind ! 3000 feet if(k>=9 .and. k= 1.0_r_kind .and. (firstcloud==0 .or. abs(zdiff)= 3) cld_cover_obs(kclr)=0.0_r_single + endif - endif ! end if ocld valid endif ! obused enddo ! end IC loop endif ! end if cloudy ob diff --git a/src/gsi/gsi_cldtotOper.F90 b/src/gsi/gsi_cldtotOper.F90 index 5a63e24765..11516daac3 100644 --- a/src/gsi/gsi_cldtotOper.F90 +++ b/src/gsi/gsi_cldtotOper.F90 @@ -107,7 +107,7 @@ subroutine setup_(self, lunin, mype, is, nobs, init_pass,last_pass) diagsave = write_diag(jiter) .and. diag_conv select case(i_cloud_q_innovation) - case(2) + case(20, 21, 22) call setup(self%obsLL(:), self%odiagLL(:), & lunin,mype,bwork,awork(:,iwork),nele,nobs,is,diagsave) diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index 34fbd38ea0..95ff7f79b4 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -152,6 +152,9 @@ module gsimod use rapidrefresh_cldsurf_mod, only: init_rapidrefresh_cldsurf, & dfi_radar_latent_heat_time_period,metar_impact_radius,& metar_impact_radius_lowcloud,l_gsd_terrain_match_surftobs, & + l_metar_impact_radius_change, & + metar_impact_radius_max,metar_impact_radius_min,& + metar_impact_radius_max_height,metar_impact_radius_min_height,& l_sfcobserror_ramp_t, l_sfcobserror_ramp_q, & l_pbl_pseudo_surfobst,l_pbl_pseudo_surfobsq,l_pbl_pseudo_surfobsuv, & pblh_ration,pps_press_incr,l_gsd_limit_ocean_q, & @@ -165,7 +168,8 @@ module gsimod i_lightpcp,i_sfct_gross,l_use_hydroretrieval_all,l_numconc,l_closeobs,& i_coastline,i_gsdqc,qv_max_inc,ioption,l_precip_clear_only,l_fog_off,& cld_bld_coverage,cld_clr_coverage,& - i_cloud_q_innovation,i_ens_mean,DTsTmax + i_cloud_q_innovation,i_ens_mean,DTsTmax,& + i_T_Q_adjust,l_saturate_bkCloud,l_rtma3d,i_precip_vertical_check use gsi_metguess_mod, only: gsi_metguess_init,gsi_metguess_final use gsi_chemguess_mod, only: gsi_chemguess_init,gsi_chemguess_final use tcv_mod, only: init_tcps_errvals,tcp_refps,tcp_width,tcp_ermin,tcp_ermax @@ -468,10 +472,18 @@ module gsimod ! 2021-01-05 x.zhang/lei - add code for updating delz analysis in regional da ! 09-07-2020 CAPS Add options for directDA_radaruse_mod to use direct radar DA capabilities ! 02-09-2021 CAPS(J. Park) Add vad_near_analtime flag (obsqc) to assimilate newvad obs around analysis time only +! 10-10-2019 Zhao added options l_rtma3d and l_precip_vertical_check +! (adjustment to the cloud-analysis retrieved profile of +! Qg/Qs/Qr/QnrQto to alleviate the reflectivity ghost in +! RTMA3D.) +! 04-16-2020 Zhao change option l_precip_vertical_check to i_precip_vertical_check +! option for checking and adjusting the profile of Qr/Qs/Qg/Qnr +! retrieved through cloud analysis to reduce the background +! reflectivity ghost in analysis. (default is 0) ! 01-07-2022 Hu Add fv3_io_layout_y to let fv3lam interface read/write subdomain restart ! files. The fv3_io_layout_y needs to match fv3lam model ! option io_layout(2). -! +! !EOP !------------------------------------------------------------------------- @@ -1328,6 +1340,17 @@ module gsimod ! enhancement for RR appilcation ): ! dfi_radar_latent_heat_time_period - DFI forward integration window in minutes ! metar_impact_radius - metar low cloud observation impact radius in grid number +! l_metar_impact_radius_change - if .true. the impact radius will change +! with height that set up with the metar_impact_radius_max, min, +! max_height, min_height, (default:false) +! metar_impact_radius_max - The max impact radius of metar cloud observation +! in meter (default: 100000 m). +! metar_impact_radius_min - The min impact radius of metar cloud observation +! in meter (default: 10000 m). +! metar_impact_radius_max_height - The hight above which metar_impact_radius_max apply +! in meter (default: 1200m). +! metar_impact_radius_min_height - The hight below which metar_impact_radius_min apply +! in meter (default: 200m). ! l_gsd_terrain_match_surftobs - if .true., GSD terrain match for surface temperature observation ! l_sfcobserror_ramp_t - namelist logical for adjusting surface temperature observation error ! l_sfcobserror_ramp_q - namelist logical for adjusting surface moisture observation error @@ -1421,7 +1444,9 @@ module gsimod ! i_cloud_q_innovation - integer to choose if and how cloud obs are used ! 0= no innovations ! 1= cloud total innovations -! 2= water vapor innovations +! 20= cloud build/clear derived water vapor innovations +! 21= cloud build derived water vapor innovations +! 22= cloud clear derived water vapor innovations ! 3= cloud total & water vapor innovations ! i_ens_mean - integer for setupcldtot behavior ! 0=single model run @@ -1429,10 +1454,28 @@ module gsimod ! 2=ensemble members ! DTsTmax - maximum allowed difference between Tskin and the first ! level T. This is to safety guard soil T adjustment. +! i_T_Q_adjust - =0 no temperature and moisture adjustment in hydrometeor analyis +! =1 (default) temperature and moisture are adjusted in hydrometeor analyis +! =2 temperature and moisture only adjusted for clearing (warmer, drier) +! l_saturate_bkCloud - if .true. ensure saturation for all cloud 3-d points in background +! where observed cloud cover is missing (default:true). +! l_rtma3d - logical option for turning on configuration for RTMA3D +! (default is .FALSE.) +! i_precip_vertical_check - integer option for checking and adjusting +! Qr/Qs/Qg and Qnr after cloud analysis +! to reduce the background reflectivity ghost in +! analysis. (default is 0) +! = 0(no adjustment) +! = 1(Clean off Qg only, where dbz_obs_max<=35dbz in the profile) +! = 2(clean Qg as in 1, and adjustment to the retrieved Qr/Qs/Qnr throughout the whole profile) +! = 3(similar to 2, but adjustment to Qr/Qs/Qnr only below maximum reflectivity level +! and where the dbz_obs is missing); ! namelist/rapidrefresh_cldsurf/dfi_radar_latent_heat_time_period, & metar_impact_radius,metar_impact_radius_lowcloud, & - l_gsd_terrain_match_surftobs, & + l_metar_impact_radius_change,metar_impact_radius_max,& + metar_impact_radius_min,metar_impact_radius_max_height,& + metar_impact_radius_min_height,l_gsd_terrain_match_surftobs, & l_sfcobserror_ramp_t,l_sfcobserror_ramp_q, & l_pbl_pseudo_surfobst,l_pbl_pseudo_surfobsq,l_pbl_pseudo_surfobsuv, & pblh_ration,pps_press_incr,l_gsd_limit_ocean_q, & @@ -1446,7 +1489,8 @@ module gsimod i_lightpcp,i_sfct_gross,l_use_hydroretrieval_all,l_numconc,l_closeobs,& i_coastline,i_gsdqc,qv_max_inc,ioption,l_precip_clear_only,l_fog_off,& cld_bld_coverage,cld_clr_coverage,& - i_cloud_q_innovation,i_ens_mean,DTsTmax + i_cloud_q_innovation,i_ens_mean,DTsTmax, & + i_T_Q_adjust,l_saturate_bkCloud,l_rtma3d,i_precip_vertical_check ! chem(options for gsi chem analysis) : ! berror_chem - .true. when background for chemical species that require diff --git a/src/gsi/rapidrefresh_cldsurf_mod.f90 b/src/gsi/rapidrefresh_cldsurf_mod.f90 index 60c2bd84e6..1ee35fffba 100644 --- a/src/gsi/rapidrefresh_cldsurf_mod.f90 +++ b/src/gsi/rapidrefresh_cldsurf_mod.f90 @@ -22,6 +22,13 @@ module rapidrefresh_cldsurf_mod ! 04-01-2017 Hu added option i_gsdqc to turn on special observation qc ! from GSD (for RAP/HRRR application) ! 2018-09-12 Ladwig added options l_precip_clear_only +! 2019-10-10 Zhao added options l_rtma3d and l_precip_vertical_check (for +! RTMA3D only now) +! 2020-04-16 Zhao change option l_precip_vertical_check to i_precip_vertical_check +! option for checking and adjusting the profile of Qr/Qs/Qg/Qnr +! retrieved through cloud analysis to reduce the background +! reflectivity ghost in analysis. (default is 0) +! ! ! Subroutines Included: ! sub init_rapidrefresh_cldsurf - initialize RR related variables to default values @@ -33,6 +40,20 @@ module rapidrefresh_cldsurf_mod ! def metar_impact_radius - impact radius for METAR cloud observation ! def metar_impact_radius_lowCloud - impact radius for METAR cloud observation ! that indicate low cloud base +! def l_metar_impact_radius_change - if .true. the impact radius will change +! with height that set up with the +! metar_impact_radius_max, min, max_height, +! min_height, (default:false) +! def metar_impact_radius_max - The max impact radius of metar cloud +! observation in meter (default: 100000 m). +! def metar_impact_radius_min - The min impact radius of metar cloud +! observation in meter (default: 10000 m). +! def metar_impact_radius_max_height - The hight above which +! metar_impact_radius_max apply +! in meter (default: 1200m). +! def metar_impact_radius_min_height - The hight below which +! metar_impact_radius_min apply +! in meter (default: 200m). ! def l_gsd_terrain_match_surfTobs - namelist logical for GSD terrain ! match for surface temperature observation ! def l_sfcobserror_ramp_t - namelist logical for adjusting surface temperature observation error @@ -135,12 +156,31 @@ module rapidrefresh_cldsurf_mod ! i_cloud_q_innovation - integer to choose if and how cloud obs are used ! 0= no innovations ! 1= cloud total innovations -! 2= water vapor innovations +! 20= cloud build/clear derived water vapor innovations +! 21= cloud build derived water vapor innovations +! 22= cloud clear derived water vapor innovations ! 3= cloud total & water vapor innovations ! i_ens_mean - integer for setupcldtot behavior ! 0=single model run ! 1=ensemble mean ! 2=ensemble members +! i_T_Q_adjust - =0 no temperature and moisture adjustment in hydrometeor analyis +! =1 (default) temperature and moisture are adjusted in hydrometeor analyis +! =2 temperature and moisture only adjusted for clearing (warmer, drier) +! l_saturate_bkCloud - if .true. ensure saturation for all cloud 3-d points +! in background where observed cloud cover is missing +! (default:true). +! l_rtma3d - logical option for turning on configuration for RTMA3D +! (default is .FALSE.) +! i_precip_vertical_check - integer option for checking and adjusting +! Qr/Qs/Qg and Qnr after precipitation analysis +! to reduce the background reflectivity ghost in +! analysis. (default is 0) +! = 0(no adjustment) +! = 1(Clean off Qg only, where dbz_obs_max<=35dbz in the profile) +! = 2(clean Qg as in 1, and adjustment to the retrieved Qr/Qs/Qnr throughout the whole profile) +! = 3(similar to 2, but adjustment to Qr/Qs/Qnr only below maximum reflectivity level +! and where the dbz_obs is missing); ! ! attributes: ! language: f90 @@ -159,6 +199,11 @@ module rapidrefresh_cldsurf_mod public :: dfi_radar_latent_heat_time_period public :: metar_impact_radius public :: metar_impact_radius_lowCloud + public :: l_metar_impact_radius_change + public :: metar_impact_radius_max + public :: metar_impact_radius_min + public :: metar_impact_radius_max_height + public :: metar_impact_radius_min_height public :: l_gsd_terrain_match_surfTobs public :: l_sfcobserror_ramp_t public :: l_sfcobserror_ramp_q @@ -203,11 +248,20 @@ module rapidrefresh_cldsurf_mod public :: i_cloud_q_innovation public :: i_ens_mean public :: DTsTmax + public :: i_T_Q_adjust + public :: l_saturate_bkCloud + public :: l_rtma3d + public :: i_precip_vertical_check logical l_hydrometeor_bkio real(r_kind) dfi_radar_latent_heat_time_period real(r_kind) metar_impact_radius real(r_kind) metar_impact_radius_lowCloud + logical l_metar_impact_radius_change + real(r_kind) metar_impact_radius_max + real(r_kind) metar_impact_radius_min + real(r_kind) metar_impact_radius_max_height + real(r_kind) metar_impact_radius_min_height logical l_gsd_terrain_match_surfTobs logical l_sfcobserror_ramp_t logical l_sfcobserror_ramp_q @@ -252,6 +306,10 @@ module rapidrefresh_cldsurf_mod integer(i_kind) i_cloud_q_innovation integer(i_kind) i_ens_mean real(r_kind) DTsTmax + integer(i_kind) i_T_Q_adjust + logical l_saturate_bkCloud + logical l_rtma3d + integer(i_kind) i_precip_vertical_check contains @@ -293,6 +351,11 @@ subroutine init_rapidrefresh_cldsurf dfi_radar_latent_heat_time_period = 30.0_r_kind ! in minutes metar_impact_radius = 10.0_r_kind ! in grid metar_impact_radius_lowCloud = 4.0_r_kind ! in grid + l_metar_impact_radius_change = .false. ! .true. =radius change vertically + metar_impact_radius_max = 50000.0_r_kind ! in meter + metar_impact_radius_min = 20000.0_r_kind ! in meter + metar_impact_radius_max_height = 3000.0_r_kind ! in meter + metar_impact_radius_min_height = 200.0_r_kind ! in meter l_gsd_terrain_match_surfTobs = .false. ! .true. = turn on GSD terrain ! match for surface ! temperature observation @@ -351,6 +414,11 @@ subroutine init_rapidrefresh_cldsurf i_cloud_q_innovation = 0 ! 0 = no increments from cloud obs i_ens_mean = 0 ! typical ob behavior DTsTmax = 20.0_r_kind ! maximum allowed difference between Ts and T 1st level + i_T_Q_adjust= 1 ! temperature and moisture are adjusted + l_saturate_bkCloud= .true. + l_rtma3d = .false. ! turn configuration for rtma3d off + i_precip_vertical_check = 0 ! No check and adjustment to retrieved Qr/Qs/Qg (default) + return end subroutine init_rapidrefresh_cldsurf diff --git a/src/gsi/read_Lightning.f90 b/src/gsi/read_Lightning.f90 index 28f2814c9b..00dbcc3f69 100644 --- a/src/gsi/read_Lightning.f90 +++ b/src/gsi/read_Lightning.f90 @@ -402,11 +402,6 @@ subroutine read_lightning_grid(nread,ndata,infile,obstype,lunout,twind,sis,nobs) call stop2(50) endif loop_report: do while (ireadsb(lunin) == 0) - ntb = ntb+1 - if (ntb>maxobs) then - write(6,*)'read_lightning: reports exceed maximum ',maxobs - call stop2(50) - endif ! Extract type, date, and location information call ufbint(lunin,hdr,5,1,iret,hdrstr) @@ -426,6 +421,12 @@ subroutine read_lightning_grid(nread,ndata,infile,obstype,lunout,twind,sis,nobs) cycle loop_report endif endif +! + ntb = ntb+1 + if (ntb>maxobs) then + write(6,*)'read_lightning: reports exceed maximum ',maxobs + call stop2(50) + endif ! read in observations call ufbint(lunin,obs,1,35,iret,obsstr) diff --git a/src/gsi/read_obs.F90 b/src/gsi/read_obs.F90 index b08ea7f094..626952bf9d 100644 --- a/src/gsi/read_obs.F90 +++ b/src/gsi/read_obs.F90 @@ -1562,7 +1562,7 @@ subroutine read_obs(ndata,mype) if(i_gsdcldanal_type==2) then call read_NASA_LaRC_cloud(nread,npuse,nouse,infile,obstype,lunout,sis,nobs_sub1(1,i)) else if(i_gsdcldanal_type==1 .or. i_gsdcldanal_type==6 & - .or. i_gsdcldanal_type==3 .or. i_gsdcldanal_type==7) then + .or. i_gsdcldanal_type==3 .or. i_gsdcldanal_type==7 .or. i_gsdcldanal_type==99) then call read_nasa_larc(nread,npuse,infile,obstype,lunout,twind,sis,nobs_sub1(1,i)) end if string='READ_NASA_LaRC' diff --git a/src/gsi/reorg_metar_cloud.f90 b/src/gsi/reorg_metar_cloud.f90 index f21400910f..2d947f2ef3 100644 --- a/src/gsi/reorg_metar_cloud.f90 +++ b/src/gsi/reorg_metar_cloud.f90 @@ -42,8 +42,12 @@ subroutine reorg_metar_cloud(cdata,nreal,ndata,cdata_all,maxobs,ngrid) use kinds, only: r_kind,i_kind,r_double use gridmod, only: nlon,nlat - use constants, only: one,half + use gridmod, only: region_dx + use constants, only: one,half,zero use rapidrefresh_cldsurf_mod, only: metar_impact_radius + use rapidrefresh_cldsurf_mod, only: l_metar_impact_radius_change, & + metar_impact_radius_max,metar_impact_radius_min,& + metar_impact_radius_max_height,metar_impact_radius_min_height implicit none @@ -59,6 +63,8 @@ subroutine reorg_metar_cloud(cdata,nreal,ndata,cdata_all,maxobs,ngrid) ! integer(i_kind) :: ista_prev,ista_prev2,ista_save + real(r_kind),dimension(nreal) :: cdata_temp + real(r_kind),dimension(12) :: cloudlevel_temp INTEGER(i_kind),allocatable :: first_sta(:,:) INTEGER(i_kind),allocatable :: next_sta(:) INTEGER(i_kind) :: null_p @@ -84,10 +90,18 @@ subroutine reorg_metar_cloud(cdata,nreal,ndata,cdata_all,maxobs,ngrid) real(r_kind) :: spval_p parameter (spval_p = 99999._r_kind) + real(r_kind) :: mindx,dxij,delat_radius,delta_height,radiusij + integer(i_kind) :: isprdij ! ! isprd=int(metar_impact_radius + half) + if(l_metar_impact_radius_change) then + mindx=minval(region_dx) + isprd=int(metar_impact_radius_max/mindx + half) + delat_radius=metar_impact_radius_max-metar_impact_radius_min + delta_height=metar_impact_radius_max_height-metar_impact_radius_min_height + endif if(isprd <= 0) return if(ndata <= 0) return ngrid = 0 @@ -260,19 +274,54 @@ subroutine reorg_metar_cloud(cdata,nreal,ndata,cdata_all,maxobs,ngrid) if (min_dist < 1.e9_r_kind) then if (i1 > 1 .and. i1 < nlon .and. j1 > 1 .and. j1 < nlat) then - iout = iout + 1 - if(iout > maxobs) then - write(6,*)'reorg_metar_cloud: ***Error*** ndata > maxobs ' - call stop2(50) - end if + min_dist=sqrt(min_dist) do k=1,nreal - cdata_all(k,iout) = cdata(k,ista_min) + cdata_temp(k)=cdata(k,ista_min) enddo - cdata_all(24,iout) = cdata_all(2,iout) ! save observaion station i - cdata_all(25,iout) = cdata_all(3,iout) ! save observaion station j - cdata_all(2,iout) = float(i1) ! grid index i - cdata_all(3,iout) = float(j1) ! grid index j - cdata_all(23,iout)=sqrt(min_dist) ! distance from station + if(l_metar_impact_radius_change) then + dxij=region_dx(j1,i1) + + cloudlevel_temp=-99999.0_r_kind + ic=0 + do k=1,6 + if(cdata_temp(5+k) > zero .and. cdata_temp(11+k) > zero ) then + radiusij=metar_impact_radius_min + delat_radius* & + max(min((cdata_temp(11+k)-metar_impact_radius_min_height)/delta_height,one),zero) + isprdij=int(radiusij/dxij+half) + if(min_dist <= isprdij) then + ic=ic+1 + cloudlevel_temp(0+ic)=cdata_temp(5+k) + cloudlevel_temp(6+ic)=cdata_temp(11+k) + endif + endif + enddo + if(ic==0) then + if(abs(cdata_temp(6)) < 0.0001_r_kind) ic=1 ! clear + else + do k=1,6 + cdata_temp(5+k)=cloudlevel_temp(0+k) + cdata_temp(11+k)=cloudlevel_temp(6+k) + enddo + endif + else + ic=1 + endif + + if(ic > 0) then + iout = iout + 1 + if(iout > maxobs) then + write(6,*)'reorg_metar_cloud: ***Error*** ndata > maxobs ' + call stop2(50) + end if + do k=1,nreal + cdata_all(k,iout) = cdata_temp(k) + enddo + cdata_all(24,iout) = cdata_all(2,iout) ! save observaion station i + cdata_all(25,iout) = cdata_all(3,iout) ! save observaion station j + cdata_all(2,iout) = float(i1) ! grid index i + cdata_all(3,iout) = float(j1) ! grid index j + cdata_all(23,iout)= min_dist ! distance from station + endif endif endif enddo ! j1 diff --git a/src/gsi/setupcldtot.F90 b/src/gsi/setupcldtot.F90 index 565075bec3..3d899d1a82 100755 --- a/src/gsi/setupcldtot.F90 +++ b/src/gsi/setupcldtot.F90 @@ -12,7 +12,7 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di !! . . . . ! subprogram: setupcldtot compute rhs of oi for pseudo moisture observations from ! METAR and Satellite cloud observations -! prgmmr: Ladwag org: GSD date: 2019-06-01 +! prgmmr: Ladwig org: GSD date: 2019-06-01 ! ! abstract: For moisture observations, this routine ! a) reads obs assigned to given mpi task (geographic region), @@ -272,7 +272,7 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di allocate(cdiagbuf(nobs*nsig),rdiagbuf(nreal,nobs*nsig)) rdiagbuf=zero endif - if (i_cloud_q_innovation == 2 .or. i_cloud_q_innovation == 3) then + if (i_cloud_q_innovation >= 20 .or. i_cloud_q_innovation == 3) then iip=0 allocate(cdiagbufp(nobs*nsig),rdiagbufp(nreal,nobs*nsig)) cdiagbufp="EMPTY" @@ -460,7 +460,7 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di cycle endif - call cloudCover_surface_col(mype,nsig,cld_bld_hgt,h_bk,z_bk, & + call cloudCover_surface_col(mype,nsig,i_cloud_q_innovation,cld_bld_hgt,h_bk,z_bk, & nvarcld_p,ocld,oelvtn,wthr_type,pcp_type_obs,vis2qc,cld_cover_obs) @@ -515,8 +515,8 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di muse(i)=.true. !******************************************************************************* - if (i_cloud_q_innovation /= 2) then - write(*,*) "Warning - setupcldtot: this code version is only designed for i_cloud_q_innovation == 2" + if (i_cloud_q_innovation < 20 .or. i_cloud_q_innovation > 22 ) then + write(*,*) "Warning - setupcldtot: this code version is only designed for i_cloud_q_innovation == 20,21,22" return else @@ -565,6 +565,8 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di ddiff=qv_ob-q_bk(k) q_build0_count=q_build0_count+1 endif + ! build error = 80% + error=one/(cloudqvis*8.E-01_r_kind) elseif (qob > -0.000001_r_single) then @@ -577,13 +579,15 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di ddiff=qv_ob-q_bk(k) q_clear0_count=q_clear0_count+1 endif + ! clear error = 30% + error=one/(cloudqvis*3.E-01_r_kind) else cycle endif q_obcount=q_obcount+1 - error=one/(cloudqvis*3.E-01_r_kind) + ! all obs errors = 30% ratio_errors=1.0_r_kind val = error*ddiff @@ -711,7 +715,7 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di !! Write information to diagnostic file if(conv_diagsave)then - if (i_cloud_q_innovation == 2 .and. iip>0) then + if (i_cloud_q_innovation >= 20 .and. iip>0) then if(netcdf_diag) call nc_diag_write if(binary_diag)then write(7)' q',nchar,nreal,iip,mype,ioff0 From 97e5144edfd8279f0a23575b9dfa53e7be40dce3 Mon Sep 17 00:00:00 2001 From: "xu.li" Date: Fri, 21 Jan 2022 21:06:19 +0000 Subject: [PATCH 17/26] GitHub Issue NOAA-EMC/GSI#270. Add capability to assimilate Saildrone, Argo, & Glider observation in GSI: NSST --- src/gsi/read_nsstbufr.f90 | 94 ++++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 20 deletions(-) diff --git a/src/gsi/read_nsstbufr.f90 b/src/gsi/read_nsstbufr.f90 index 8339dad2a0..adfdee4f13 100644 --- a/src/gsi/read_nsstbufr.f90 +++ b/src/gsi/read_nsstbufr.f90 @@ -21,6 +21,10 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & ! 2021-02-15 Li - modify to handle bufr ships, restricted (nc001101,shipsb) and ! unrestricted (NC001113, shipub), and bufr land based lcman (nc001104) ! 2021-09-09 Li - modify to handle bufr ships, restricted (nc001013,shipsu) +! 2021-12-14 Li - modify to handle bufr Saildrone sea water temperature Obs. (001120) +! 2022-01-12 Li - modify to handle bufr subpfl sea water temperature (Argo & Glider) Obs. (031005) +! 2022-01-12 Li - Modify the maxmum depth to be 20 m for the shallowest T of the T-Profile Obs. +! ! ! input argument list: ! infile - unit from which to read BUFR data @@ -102,20 +106,22 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & real(r_double), dimension(4) :: loc real(r_double), dimension(2,255) :: tpf real(r_double), dimension(2,65535) :: tpf2 + real(r_double), dimension(3,65535) :: tpf3 real(r_double) :: msst,sst equivalence (crpid,hdr(7)) real(r_kind),dimension(0:3):: ts real(r_kind),dimension(0:3):: sfcpct + real(r_single), dimension(65535) :: apres real(r_kind) :: tdiff,sstime,usage,sfcr,t4dv,rsc real(r_kind) :: tsavg,vty,vfr,sty,stp,sm,sn,zz,ff10 real(r_kind) :: dlat,dlon,sstoe,dlat_earth,dlon_earth real(r_kind) :: dlat_earth_deg,dlon_earth_deg - real(r_kind) :: zob,tz,tref,dtw,dtc,tz_tr + real(r_kind) :: pres1,zob,tz,tref,dtw,dtc,tz_tr real(r_kind) cdist,disterr,disterrmax,rlon00,rlat00 - real(r_double) :: clath,clonh + real(r_double) :: clath,clonh,r_rpid integer(i_kind) ntest real(r_kind),allocatable,dimension(:,:):: data_all @@ -185,17 +191,22 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & do while (ireadmg(lunin,subset,idate) == 0) msub = nmsub(lunin) -! case ( 'NC001001' ) ; ctyp='ships ' -! case ( 'NC001002' ) ; ctyp='dbuoy ' -! case ( 'NC001003' ) ; ctyp='dbuoyb ' -! case ( 'NC001003' ) ; ctyp='mbuoy ' -! case ( 'NC001103' ) ; ctyp='mbuoyb ' -! case ( 'NC001004' ) ; ctyp='lcman ' -! case ( 'NC001005' ) ; ctyp='tideg ' -! case ( 'NC001007' ) ; ctyp='cstgd ' -! case ( 'NC031001' ) ; ctyp='bathy ' -! case ( 'NC031002' ) ; ctyp='tesac ' -! case ( 'NC031003' ) ; ctyp='trkob ' +! case ( 'NC001001' ) ; ctyp='ships ' +! case ( 'NC001101' ) ; ctyp='shipsb ' +! case ( 'NC001113' ) ; ctyp='shipub ' +! case ( 'NC001104' ) ; ctyp='Land_lcman ' +! case ( 'NC001002' ) ; ctyp='dbuoy ' +! case ( 'NC001003' ) ; ctyp='dbuoyb ' +! case ( 'NC001003' ) ; ctyp='mbuoy ' +! case ( 'NC001103' ) ; ctyp='mbuoyb ' +! case ( 'NC001120' ) ; ctyp='saildron ' +! case ( 'NC001004' ) ; ctyp='lcman ' +! case ( 'NC001005' ) ; ctyp='tideg ' +! case ( 'NC001007' ) ; ctyp='cstgd ' +! case ( 'NC031001' ) ; ctyp='bathy ' +! case ( 'NC031002' ) ; ctyp='tesac ' +! case ( 'NC031003' ) ; ctyp='trkob ' +! case ( 'NC031005' ) ; ctyp='argo_glider ' read_loop: do while (ireadsb(lunin) == 0) call ufbint(lunin,hdr,7,1,iret,headr) @@ -235,10 +246,18 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & elseif ( trim(subset) == 'NC001102' ) then ! DBUOYB msst = 11.0_r_kind ! for drifting buoyb, assign to be 11 call ufbint(lunin,sst,1,1,iret,'SST0') + elseif ( trim(subset) == 'NC001120' ) then ! SailDrone + msst = 11.0_r_kind ! for SailDrone obs, assign to be 11 + call ufbint(lunin,sst,1,1,iret,'SST0') +! +! get station ID of SailDrone Obs. +! + call ufbint(lunin,r_rpid,1,1,iret,'WMOP') + write(crpid,'(I7)') int(r_rpid) elseif ( trim(subset) == 'NC031002' ) then ! TESAC msst = 12.0_r_kind ! for ARGO, assign to be 12 call ufbint(lunin,tpf2,2,65535,klev,'DBSS STMP') ! read T_Profile - if ( tpf2(1,1) < 5.0_r_kind ) then + if ( tpf2(1,1) < 20.0_r_kind ) then sst = tpf2(2,1) else sst = bmiss @@ -247,7 +266,7 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & msst = 13.0_r_kind ! for BATHY, assign to be 13 call ufbint(lunin,tpf2,2,65535,klev,'DBSS STMP') ! read T_Profile - if ( tpf2(1,1) < 5.0_r_kind ) then + if ( tpf2(1,1) <= 20.0_r_kind ) then sst = tpf2(2,1) else sst = bmiss @@ -260,6 +279,32 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & else sst = bmiss endif + elseif ( trim(subset) == 'NC031005' ) then ! Argo or Glider + msst = 12.0_r_kind ! for ARGO, assign to be 12 + call ufbint(lunin,tpf3,3,65535,klev,'SSTH SALNH WPRES') ! get klev,T,water pres & salinity + + call ufbint(lunin,r_rpid,1,1,iret,'WMOP') + write(crpid,'(I7)') int(r_rpid) + + apres(:) = real(tpf3(3,:)) + + pres1 = minval(apres)/10000.0_r_kind ! converting wpres from Pa to dbar for minmum depth + ! Not always layer 1 +! +! get zob in meters +! + zob = ((-3.434e-12_r_kind*pres1+1.113e-7_r_kind)*pres1+0.712953_r_kind)*pres1 & + + 14190.7_r_kind*log(one+1.83e-5_r_kind*pres1) + zob = (zob/(980.0_r_kind+1.113e-4*pres1))*1000.0_r_kind +! +! assign sst if z1 <= 20 m +! + if ( zob <= 20.0_r_kind ) then + sst = tpf3(1,minloc(apres,dim=1)) + else + sst = bmiss + endif + elseif ( trim(subset) == 'NC001005' ) then ! TIDEG msst = 15.0_r_kind ! for TIDEG, assign to be 15 call ufbint(lunin,sst,1,1,iret,'SST1') ! read SST @@ -486,29 +531,38 @@ subroutine read_nsstbufr(nread,ndata,nodata,gstime,infile,obstype,lunout, & kx = 196 sstoe = 0.75_r_kind endif - + elseif ( trim(subset) == 'NC001120' ) then ! SailDrone + zob = r0_6 + kx = 190 ! classify saildrone to be drifting buoy type + sstoe = half elseif ( trim(subset) == 'NC001004' .or. trim(subset) == 'NC001104' .or. & ! LCMAN trim(subset) == 'NC031003' .or. & ! TRKOB trim(subset) == 'NC001005' .or. trim(subset) == 'NC001007' ) then ! TIDEG, CSTGD zob = one kx = 197 sstoe = one - elseif ( trim(subset) == 'NC031002' ) then ! TESAC/ARGO - if ( tpf(1,1) >= one .and. tpf(1,1) < 5.0_r_kind ) then + elseif ( trim(subset) == 'NC031002' ) then ! TESAC + if ( tpf(1,1) >= one .and. tpf(1,1) < 20.0_r_kind ) then zob = tpf(1,1) elseif ( tpf(1,1) >= zero .and. tpf(1,1) < one ) then zob = one endif - kx = 198 + kx = 198 sstoe = one + elseif ( trim(subset) == 'NC031005' ) then ! ARGO/Glider + kx = 199 ! classify argo & glider to be bathy type + sstoe = r0_6 elseif ( trim(subset) == 'NC031001' ) then ! BATHY - if ( tpf(1,1) >= one .and. tpf(1,1) < 5.0_r_kind ) then + if ( tpf(1,1) >= one .and. tpf(1,1) <= 20.0_r_kind ) then zob = tpf(1,1) elseif ( tpf(1,1) >= zero .and. tpf(1,1) < one ) then zob = one endif kx = 199 sstoe = half + else + write(*,*) 'unrecognized data type, set kx = 0' + kx = 0 endif ! ! Determine usage From 1ac9dfacb4e51ab568f4492018abb76316b055d0 Mon Sep 17 00:00:00 2001 From: "xu.li" Date: Wed, 16 Feb 2022 19:43:30 +0000 Subject: [PATCH 18/26] GitHub Issue NOAA-EMC/GSI#303. Modifications of two GSI scripts to the filename being consistent the change in ufs_utils --- scripts/exgdas_enkf_sfc.sh | 6 ++---- scripts/exglobal_atmos_analysis.sh | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/scripts/exgdas_enkf_sfc.sh b/scripts/exgdas_enkf_sfc.sh index 4d927800d7..2be78dc060 100755 --- a/scripts/exgdas_enkf_sfc.sh +++ b/scripts/exgdas_enkf_sfc.sh @@ -128,11 +128,9 @@ else fi if [ $DONST = "YES" ]; then - export NST_ANL=".true." - export GSI_FILE=${GSI_FILE:-$COMIN/${APREFIX}dtfanl.nc} + export NST_FILE=${NST_FILE:-$COMIN/${APREFIX}dtfanl.nc} else - export NST_ANL=".false." - export GSI_FILE="NULL" + export NST_FILE="NULL" fi export APRUNCY=${APRUN_CYCLE:-$APRUN_ESFC} diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh index 0abc722c27..58c544493f 100755 --- a/scripts/exglobal_atmos_analysis.sh +++ b/scripts/exglobal_atmos_analysis.sh @@ -1004,11 +1004,9 @@ if [ $DOGCYCLE = "YES" ]; then fi if [ $DONST = "YES" ]; then - export NST_ANL=".true." - export GSI_FILE=${GSI_FILE:-$COMOUT/${APREFIX}dtfanl.nc} + export NST_FILE=${NST_FILE:-$COMOUT/${APREFIX}dtfanl.nc} else - export NST_ANL=".false." - export GSI_FILE="NULL" + export NST_FILE="NULL" fi if [ $DOIAU = "YES" ]; then From 315f4116224b2e3c58f2b1519dafdaeaf49b82e6 Mon Sep 17 00:00:00 2001 From: "edward.safford" Date: Tue, 22 Feb 2022 18:22:20 +0000 Subject: [PATCH 19/26] GSI issue #290. Port non-operational portions of RadMon to wcoss2. This completes issue #290 --- util/Radiance_Monitor/RadMon_install.pl | 48 ++++---- util/Radiance_Monitor/build_RadMon_cmake.sh | 35 +++--- .../data_extract/ush/RadMon_CP_glb.sh | 34 ++++-- .../data_extract/ush/RadMon_DE_glb.sh | 37 ++++-- .../data_extract/ush/RadMon_DE_rgn.sh | 47 +++++--- .../data_extract/ush/radmon_copy.sh | 2 +- util/Radiance_Monitor/get_hostname.pl | 56 ---------- util/Radiance_Monitor/get_machine.sh | 38 +++++++ .../Radiance_Monitor/image_gen/parm/glbl_conf | 40 ------- .../image_gen/parm/plot_rad_conf | 45 -------- .../Radiance_Monitor/image_gen/parm/rgnl_conf | 36 ------ .../image_gen/ush/RadMon_IG_glb.sh | 83 ++++++++------ .../image_gen/ush/RadMon_IG_rgn.sh | 64 +++++------ .../image_gen/ush/Transfer.sh | 43 ++++--- .../image_gen/ush/mk_angle_plots.sh | 10 +- .../image_gen/ush/mk_bcoef_plots.sh | 11 +- .../image_gen/ush/mk_bcor_plots.sh | 7 +- .../image_gen/ush/mk_digital_ang.sh | 7 +- .../image_gen/ush/mk_digital_bcoef.sh | 6 +- .../image_gen/ush/mk_digital_time.sh | 9 +- .../image_gen/ush/mk_horiz_plots.sh | 6 +- .../image_gen/ush/mk_time_plots.sh | 19 +++- .../image_gen/ush/plot_angle.sh | 2 +- .../image_gen/ush/plot_bcoef.sh | 6 +- .../image_gen/ush/plot_bcor.sh | 6 +- .../image_gen/ush/plot_summary.sh | 6 +- .../image_gen/ush/plot_time.sh | 6 +- .../driver/test_jgdas_verfrad_wcoss2.sh | 79 +++++++++++++ .../driver/test_jgdas_verfrad_wcoss_d.sh | 2 +- .../gdas_radmon/fix/gdas_radmon_base.tar | Bin 471040 -> 471040 bytes .../gdas_radmon/fix/gdas_radmon_satype.txt | 2 +- .../scripts/exgdas_atmos_verfrad.sh | 2 +- .../nam_radmon/fix/nam_radmon_satype.txt | 2 +- .../sorc/verf_radtime.fd/time.f90 | 1 + .../radmon_shared/ush/radmon_ck_stdout.sh | 105 ------------------ .../radmon_shared/ush/radmon_verf_time.sh | 31 ++---- util/Radiance_Monitor/parm/RadMon_config | 32 ++++-- .../parm/RadMon_user_settings | 17 ++- 38 files changed, 456 insertions(+), 526 deletions(-) delete mode 100755 util/Radiance_Monitor/get_hostname.pl create mode 100755 util/Radiance_Monitor/get_machine.sh delete mode 100755 util/Radiance_Monitor/image_gen/parm/glbl_conf delete mode 100755 util/Radiance_Monitor/image_gen/parm/plot_rad_conf delete mode 100755 util/Radiance_Monitor/image_gen/parm/rgnl_conf create mode 100755 util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss2.sh delete mode 100755 util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_ck_stdout.sh diff --git a/util/Radiance_Monitor/RadMon_install.pl b/util/Radiance_Monitor/RadMon_install.pl index 4f655dfd4a..48612ac4b3 100755 --- a/util/Radiance_Monitor/RadMon_install.pl +++ b/util/Radiance_Monitor/RadMon_install.pl @@ -5,31 +5,30 @@ # # This script makes sets all necessary configuration definitions # and calls the makeall.sh script to build all the necessary -# executables. This script works for hera, wcoss, wcoss_c, and -# wcoss_d machines. +# executables. # #------------------------------------------------------------------- use IO::File; use File::Copy qw(move); - my $machine = `/usr/bin/perl get_hostname.pl`; + sub trim { + my $s = shift; $s =~ s/^\s+|\s+$//g; + return $s + }; + + + + my $machine = trim(`./get_machine.sh`); my $my_machine="export MY_MACHINE=$machine"; - if( $machine ne "wcoss_c" && $machine ne "hera" && $machine ne "wcoss_d" ) { + if( $machine ne "wcoss_c" && $machine ne "hera" && $machine ne "wcoss_d" && $machine ne "wcoss2" ) { die( "ERROR --- Unrecognized machine hostname, $machine. Exiting now...\n" ); } else { print "machine = $machine\n"; } - # - # surge, hera, and wcoss are all little endian machines, and all run linux - # - my $little_endian = "export LITTLE_ENDIAN=\${LITTLE_ENDIAN:-0}"; - my $my_os = "linux"; - - # # Idenfity basedir location of package # @@ -62,6 +61,9 @@ elsif( $machine eq "wcoss_d" ){ $tankdir = "/gpfs/dell2/emc/modeling/noscrub/$user_name/nbns"; } + elsif( $machine eq "wcoss2" ){ + $tankdir = "/lfs/h2/emc/da/noscrub/$user_name/nbns"; + } print "Please specify TANKDIR location for storage of data and image files.\n"; print " Return to accept default location or enter new location now.\n"; @@ -158,6 +160,10 @@ $my_ptmp="export MY_PTMP=\${MY_PTMP:-/scratch2/NCEPDEV/stmp3}"; $my_stmp="export MY_STMP=\${MY_STMP:-/scratch2/NCEPDEV/stmp1}"; } + elsif( $machine eq "wcoss2" ){ + $my_ptmp="export MY_PTMP=\${MY_PTMP:-/lfs/h2/emc/ptmp}"; + $my_stmp="export MY_STMP=\${MY_STMP:-/lfs/h2/emc/stmp}"; + } print "my_ptmp = $my_ptmp\n"; print "my_stmp = $my_stmp\n"; @@ -182,9 +188,6 @@ elsif( $_ =~ "WEBDIR=" ) { print $out "$my_webdir\n"; } - elsif( $_ =~ "LITTLE_ENDIAN=" ) { - print $out "$little_endian\n"; - } elsif( $_ =~ "MY_MACHINE=" ) { print $out "$my_machine\n"; } @@ -210,17 +213,22 @@ print "Updating parm/RadMon_user_settings\n"; my $account = "export ACCOUNT=\${ACCOUNT:-fv3-cpu}"; - if( $machine ne "hera" ) { + if( $machine eq "wcoss2" ){ + $account = "export ACCOUNT=\${ACCOUNT:-GFS-DEV}"; + } elsif ( $machine ne "hera" ) { $account = "export ACCOUNT=\${ACCOUNT:-}"; } - my $project = "export PROJECT=\${PROJECT:-GDAS-T2O}"; - if( $machine ne "wcoss_c" && $machine ne "wcoss_d" ) { - $project="export PROJECT="; - } + if( $machine eq "hera" ) { + $project = "export PROJECT=\${PROJECT:-GDAS-T2O}"; + } elsif( $machine eq "wcoss_d" || $machine eq "wcoss2" ){ + $project = "export PROJECT=\${PROJECT:-GFS-DEV}"; + } else { + my $project="export PROJECT="; + } my $job_queue="export JOB_QUEUE="; - if( $machine eq "wcoss_c" ) { + if( $machine eq "wcoss_c" || $machine eq "wcoss2" ) { $job_queue="export JOB_QUEUE=\${JOB_QUEUE:-dev}"; } elsif( $machine eq "wcoss_d" ){ $job_queue = "export JOB_QUEUE=\${JOB_QUEUE:-dev_shared}"; diff --git a/util/Radiance_Monitor/build_RadMon_cmake.sh b/util/Radiance_Monitor/build_RadMon_cmake.sh index 3e6e48d1d8..a11f1049b0 100755 --- a/util/Radiance_Monitor/build_RadMon_cmake.sh +++ b/util/Radiance_Monitor/build_RadMon_cmake.sh @@ -23,28 +23,17 @@ echo "top_level = ${top_level}" export MY_RADMON=${MY_RADMON:-$top_level} echo "MY_RADMON = ${MY_RADMON}" -if [[ -d /dcom && -d /hwrf ]] ; then - . /usrx/local/Modules/3.2.10/init/sh - target=wcoss - . $MODULESHOME/init/sh -elif [[ -d /cm ]] ; then - . $MODULESHOME/init/sh - target=wcoss_c -elif [[ -d /ioddev_dell ]]; then +target=`./get_machine.sh` +echo "target = $target" + +if [[ $target = "wcoss_c" || $target = "wcoss_d" || + $target = "orion" || $target = "wcoss2" || + $target = "s4" ]] ; then . $MODULESHOME/init/sh - target=wcoss_d -elif [[ -d /scratch1 ]] ; then +elif [[ $target = "hera" ]] ; then . /apps/lmod/lmod/init/sh - target=hera -elif [[ -d /data ]] ; then - . /usr/share/lmod/lmod/init/sh - target=s4 -elif [[ -d /work ]]; then - . $MODULESHOME/init/sh - target=orion -elif [[ -d /jetmon ]] ; then +elif [[ $target = "jet" ]] ; then . /apps/lmod/lmod/init/sh - target=jet else echo "unknown target = $target" exit 9 @@ -74,8 +63,8 @@ fi if [[ ${target} = "hera" || ${target} = "wcoss" \ || ${target} = "wcoss_c" || ${target} = "wcoss_d" \ - || ${target} = "orion" || ${target} = "jet" \ - || ${target} = "s4" ]]; then + || ${target} = "orion" || ${target} = "jet" \ + || ${target} = "s4" || ${target} = "wcoss2" ]]; then echo Building nwprod executables on ${target} echo @@ -100,6 +89,10 @@ if [[ ${target} = "hera" || ${target} = "wcoss" \ elif [ $target = wcoss_c ]; then module purge module load $dir_modules/modulefile.ProdGSI.$target + elif [ $target = wcoss2 ]; then + module purge + module use -a $dir_modules + module load modulefile.ProdGSI.$target.lua fi diff --git a/util/Radiance_Monitor/data_extract/ush/RadMon_CP_glb.sh b/util/Radiance_Monitor/data_extract/ush/RadMon_CP_glb.sh index dd59ee8326..b24927322a 100755 --- a/util/Radiance_Monitor/data_extract/ush/RadMon_CP_glb.sh +++ b/util/Radiance_Monitor/data_extract/ush/RadMon_CP_glb.sh @@ -103,22 +103,30 @@ this_dir=`dirname $0` top_parm=${this_dir}/../../parm -export RADMON_CONFIG=${RADMON_CONFIG:-${top_parm}/RadMon_config} -if [[ -s ${RADMON_CONFIG} ]]; then - . ${RADMON_CONFIG} -else - echo "Unable to source ${RADMON_CONFIG} (radmon config) file" +radmon_config=${radmon_config:-${top_parm}/RadMon_config} +if [[ ! -e ${radmon_config} ]]; then + echo "Unable to source ${radmon_config} file" exit 2 fi -if [[ -s ${RADMON_USER_SETTINGS} ]]; then - . ${RADMON_USER_SETTINGS} -else - echo "Unable to source ${RADMON_USER_SETTINGS} (radmon user settings) file" +. ${radmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_config} file" + exit $? +fi + + +radmon_user_settings=${radmon_user_settings:-${top_parm}/RadMon_user_settings} +if [[ ! -e ${radmon_user_settings} ]]; then + echo "Unable to source ${radmon_user_settings} file" exit 3 fi -export USHradmon=${USHradmon:-$HOMEradmon/ush} +. ${radmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Unable to source ${radmon_user_settings} file" + exit $? +fi #--------------------------------------------------------------- @@ -150,7 +158,7 @@ export CYC=`echo $PDATE|cut -c9-10` # Set data and radstat locations #--------------------------------------------------------------- if [[ -n ${radstat_loc} ]]; then - export RADSTAT_LOCATION=${radstat_loc} + RADSTAT_LOCATION=${radstat_loc} fi export RADSTAT_LOCATION=${RADSTAT_LOCATION}/${RUN}.${PDY}/${CYC}/atmos @@ -182,6 +190,10 @@ if [[ -d ${DATA_LOCATION} ]]; then elif [[ $MY_MACHINE = "hera" ]]; then $SUB --account=${ACCOUNT} --time=10 -J ${jobname} -D . \ -o ${logfile} --ntasks=1 --mem=5g ${job} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=5000M -l walltime=20:00 -N ${jobname} ${job} fi else echo "Unable to locate DATA_LOCATION: ${DATA_LOCATION}" diff --git a/util/Radiance_Monitor/data_extract/ush/RadMon_DE_glb.sh b/util/Radiance_Monitor/data_extract/ush/RadMon_DE_glb.sh index 43f67b58d7..ef689e36a6 100755 --- a/util/Radiance_Monitor/data_extract/ush/RadMon_DE_glb.sh +++ b/util/Radiance_Monitor/data_extract/ush/RadMon_DE_glb.sh @@ -95,21 +95,32 @@ this_dir=`dirname $0` top_parm=${this_dir}/../../parm -export RADMON_CONFIG=${RADMON_CONFIG:-${top_parm}/RadMon_config} -if [[ -s ${RADMON_CONFIG} ]]; then - . ${RADMON_CONFIG} -else - echo "Unable to source ${RADMON_CONFIG} file" +radmon_config=${radmon_config:-${top_parm}/RadMon_config} +if [[ ! -e ${radmon_config} ]]; then + echo "Unable to source ${radmon_config} file" exit 2 fi -if [[ -s ${RADMON_USER_SETTINGS} ]]; then - . ${RADMON_USER_SETTINGS} -else - echo "Unable to source ${RADMON_USER_SETTINGS} file" +. ${radmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_config} file" + exit $? +fi + + +radmon_user_settings=${radmon_user_settings:-${top_parm}/RadMon_user_settings} +if [[ ! -e ${radmon_user_settings} ]]; then + echo "Unable to source ${radmon_user_settings} file" exit 3 fi +. ${radmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Unable to source ${radmon_user_settings} file" + exit $? +fi + + #------------------------------------------------------- # Create log and TANK directories if they don't exist #------------------------------------------------------- @@ -226,15 +237,19 @@ if [[ -e ${radstat} && -e ${biascr} ]]; then if [[ $MY_MACHINE = "wcoss_d" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -o ${logfile} \ - -M 100 -R affinity[core] -W 0:20 -J ${jobname} -cwd ${PWD} ${job} + -M 5000 -R affinity[core] -W 0:20 -J ${jobname} -cwd ${PWD} ${job} elif [[ $MY_MACHINE = "wcoss_c" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -o ${logfile} \ - -M 100 -W 0:20 -J ${jobname} -cwd ${PWD} ${job} + -M 5000 -W 0:20 -J ${jobname} -cwd ${PWD} ${job} elif [[ $MY_MACHINE = "hera" ]]; then $SUB --account=${ACCOUNT} --time=10 -J ${jobname} -D . \ -o ${logfile} --ntasks=1 --mem=5g ${job} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=5000M -l walltime=20:00 -N ${jobname} ${job} fi else # radstat and/or biascr not found diff --git a/util/Radiance_Monitor/data_extract/ush/RadMon_DE_rgn.sh b/util/Radiance_Monitor/data_extract/ush/RadMon_DE_rgn.sh index 8a4bdc18e1..97b0e2499d 100755 --- a/util/Radiance_Monitor/data_extract/ush/RadMon_DE_rgn.sh +++ b/util/Radiance_Monitor/data_extract/ush/RadMon_DE_rgn.sh @@ -161,19 +161,30 @@ export RAD_AREA=rgn top_parm=${this_dir}/../../parm -export RADMON_CONFIG=${RADMON_CONFIG:-${top_parm}/RadMon_config} -if [[ -s ${RADMON_CONFIG} ]]; then - . ${RADMON_CONFIG} -else - echo "Unable to source ${RADMON_CONFIG} file" - exit 2 +radmon_config=${radmon_config:-${top_parm}/RadMon_config} +if [[ ! -e ${radmon_config} ]]; then + echo "Unable to source ${radmon_config} file" + exit 2 fi -if [[ -s ${RADMON_USER_SETTINGS} ]]; then - . ${RADMON_USER_SETTINGS} -else - echo "Unable to source ${RADMON_USER_SETTINGS} file" - exit 3 + +. ${radmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_config} file" + exit $? +fi + + +radmon_user_settings=${radmon_user_settings:-${top_parm}/RadMon_user_settings} +if [[ ! -e ${radmon_user_settings} ]]; then + echo "Unable to source ${radmon_user_settings} file" + exit 3 +fi + +. ${radmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Unable to source ${radmon_user_settings} file" + exit $? fi #--------------------------------------------- @@ -280,15 +291,23 @@ mkdir -p ${DATA} logfile=$LOGdir/DE.${PDY}.${cyc}.log +job=$HOMEnam/jobs/JNAM_VERFRAD + if [[ $MY_MACHINE = "wcoss_d" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -M 40 -R affinity[core] -o ${logfile} \ - -W 0:05 -J ${jobname} -cwd ${PWD} $HOMEnam/jobs/JNAM_VERFRAD + -W 0:05 -J ${jobname} -cwd ${PWD} ${job} + elif [[ $MY_MACHINE = "wcoss_c" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -M 40 -o ${logfile} -W 0:10 \ - -J ${jobname} -cwd ${PWD} $HOMEnam/jobs/JNAM_VERFRAD + -J ${jobname} -cwd ${PWD} ${job} + elif [[ $MY_MACHINE = "hera" ]]; then $SUB -A $ACCOUNT -l procs=1,walltime=0:05:00 -N ${jobname} -V \ - -j oe -o ${logfile} ${HOMEnam}/jobs/JNAM_VERFRAD + -j oe -o ${logfile} ${job} + +elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=5000M -l walltime=20:00 -N ${jobname} ${job} fi diff --git a/util/Radiance_Monitor/data_extract/ush/radmon_copy.sh b/util/Radiance_Monitor/data_extract/ush/radmon_copy.sh index 0c4f10882f..9e85cd3204 100755 --- a/util/Radiance_Monitor/data_extract/ush/radmon_copy.sh +++ b/util/Radiance_Monitor/data_extract/ush/radmon_copy.sh @@ -126,7 +126,7 @@ if [[ ${exit_value} -eq 0 ]]; then if [[ ${CLEAN_TANKVERF} -eq 1 ]]; then - days_to_keep=40 + days_to_keep=60 ${HOMEradmon}/ush/clean_tankdir.sh ${RAD_AREA} ${days_to_keep} fi diff --git a/util/Radiance_Monitor/get_hostname.pl b/util/Radiance_Monitor/get_hostname.pl deleted file mode 100755 index bd30491bc8..0000000000 --- a/util/Radiance_Monitor/get_hostname.pl +++ /dev/null @@ -1,56 +0,0 @@ -#! /usr/bin/perl - -#------------------------------------------------------------------- -# get_hostname.pl -# -# This script determines the hostname of the current machine. The -# possiblities are ccs, zeus, wcoss or "" if the host is not -# one of those three. -#------------------------------------------------------------------- - -# use IO::File; -# use File::Copy qw(move); - - my $arch; - $arch = ` uname -s | tr '[:upper:]' '[:lower:]' `; - $arch =~ s/^\s+|\s+$//g; - my $my_os = "export MY_OS=$arch"; - - # - # Determine if installation is on wcoss_c, wcoss_d, or hera - # - if( $arch ne "linux" && $arch ne "aix" ) { - die( "only linux and aix are supported, $arch is not\n" ); - } - - - my $machine = ""; - - # - # zeus login nodes are fe1-fe8, and hostname command only returns the node name, - # while ccs and (perhaps) wcoss return [hostname].ncep.noaa.gov. Keep only the - # actual hostname and see if it matches the node names for zeus, tide, or gyre. - # - my $host = ""; - $host = ` hostname `; - chomp( $host ); - - if( $host =~ /\./ ) { - my @hostnames = split( '\.', $host ); - $host = $hostnames[0]; - } - - if( $host =~ /hfe/ ) { - $machine = "hera"; - } - elsif( $host =~ /login/ ) { - $machine = "wcoss_c"; - } - elsif( $host =~ /m/ || $host =~ /v/ ){ - $machine = "wcoss_d"; # dell machines are mXXaY/vXXaY - } - - print "$machine"; - - exit 0; - diff --git a/util/Radiance_Monitor/get_machine.sh b/util/Radiance_Monitor/get_machine.sh new file mode 100755 index 0000000000..7cbfadc612 --- /dev/null +++ b/util/Radiance_Monitor/get_machine.sh @@ -0,0 +1,38 @@ +#! /bin/bash + +#------------------------------------------------------------------ +# get_machine.sh +# +# Determine which platform we're running on. System name will +# be journaled to stdout so calling scripts can get it there. +# If system is not recognized an empty string will be returned +# so it's up to the calling scripts to correctly interpret that. +#------------------------------------------------------------------ + +target="" + +if [[ -d /cm ]] ; then + . $MODULESHOME/init/sh + target=wcoss_c +elif [[ -d /ioddev_dell ]]; then + . $MODULESHOME/init/sh + target=wcoss_d +elif [[ -d /scratch1 ]] ; then + . /apps/lmod/lmod/init/sh + target=hera +elif [[ -d /data ]] ; then + . /usr/share/lmod/lmod/init/sh + target=s4 +elif [[ -d /work ]]; then + . $MODULESHOME/init/sh + target=orion +elif [[ -d /jetmon ]] ; then + . /apps/lmod/lmod/init/sh + target=jet +elif [[ -d /lfs ]] ; then + . $MODULESHOME/init/sh + target=wcoss2 +fi + +echo $target +exit diff --git a/util/Radiance_Monitor/image_gen/parm/glbl_conf b/util/Radiance_Monitor/image_gen/parm/glbl_conf deleted file mode 100755 index 44cf124b96..0000000000 --- a/util/Radiance_Monitor/image_gen/parm/glbl_conf +++ /dev/null @@ -1,40 +0,0 @@ -#------------------------------------------------------- -# -# glbl_conf -# -# Contains definitions for internal reference used -# to produce images from glbl data sources. -# -# Users should not need need to edit this file. -#------------------------------------------------------- - -# -# web server resources -# -WEBDIR=${WEBDIR}/${RADMON_SUFFIX} -if [[ $TANK_USE_RUN -eq 1 ]]; then - WEBDIR=${WEBDIR}/${RUN} -fi -export WEBDIR=${WEBDIR}/pngs - - -# -# internal package reference -# -#export TOP_IMGNDIR=${MY_TANKDIR}/imgn/${RADMON_SUFFIX} -export TANKDIR=${MY_TANKDIR}/stats/${RADMON_SUFFIX} -export TOP_ARCHIVE_DIR=${ARCHIVE_DIR} -export ARCHIVE_DIR=${ARCHIVE_DIR}/${RADMON_SUFFIX} - -# -# top of image directory tree for this source -# -export IMGNDIR=${IMGNDIR:-${MY_TANKDIR}/imgn/${RADMON_SUFFIX}/${RUN}/radmon/pngs} - - -# -# GrADS script definitions -# -export PLOT_ANGLE_COUNT=plot_angle_count.glb.gs -export PLOT_ANGLE_SEP=plot_angle_sep.glb.gs - diff --git a/util/Radiance_Monitor/image_gen/parm/plot_rad_conf b/util/Radiance_Monitor/image_gen/parm/plot_rad_conf deleted file mode 100755 index caf244615a..0000000000 --- a/util/Radiance_Monitor/image_gen/parm/plot_rad_conf +++ /dev/null @@ -1,45 +0,0 @@ -#------------------------------------------------------- -# -# plot_rad_conf -# -# Contains definitions for export for image processing -# common to all scripts. -# -#------------------------------------------------------- - - - -#------------------------------------------------------- -# Internal reference definitions. These should not -# be edited. -# -#export PTMP_USER=${PTMP}/${USER} -#export STMP_USER=${STMP}/${USER} - -#export SCRIPTS=${RADMON_IMAGE_GEN}/ush -#export PARM=${RADMON_IMAGE_GEN}/parm -#export GSCRIPTS=${RADMON_IMAGE_GEN}/gscripts -#export EXEDIR=${RADMON_IMAGE_GEN}/exec - -#export PLOT_COMP_DIR=${STMP_USER}/plot_comp_jobs -#export LOGDIR=${LOGSverf_rad}/rad${RADMON_SUFFIX} -#export PLOT_WORK_DIR=${STMP_USER}/plotjobs_${RADMON_SUFFIX} - -if [[ $MY_MACHINE = "wcoss" ]]; then - export GRADS=/usrx/local/GrADS/2.0.1/bin/grads - export STNMAP=/usrx/local/GrADS/2.0.1/bin/stnmap - export GADDIR=/usrx/local/GrADS/2.0.1/lib -elif [[ $MY_MACHINE = "zeus" ]]; then - export GRADS=/apps/grads/2.0.1a/bin/grads - export STNMAP=/apps/grads/2.0.1a/bin/stnmap - shell=sh - . $MODULESHOME/init/$shell - module load grads/2.0.1a -elif [[ $MY_MACHINE = "theia" ]]; then - export GRADS=/apps/grads/2.0.1a/bin/grads - export STNMAP=/apps/grads/2.0.1a/bin/stnmap - shell=sh - . $MODULESHOME/init/$shell - module load grads/2.0.1a -fi - diff --git a/util/Radiance_Monitor/image_gen/parm/rgnl_conf b/util/Radiance_Monitor/image_gen/parm/rgnl_conf deleted file mode 100755 index ff7f022684..0000000000 --- a/util/Radiance_Monitor/image_gen/parm/rgnl_conf +++ /dev/null @@ -1,36 +0,0 @@ -#------------------------------------------------------- -# -# rgnl_conf -# -# Contains definitions for generating images from regional -# sources. -# -# Users should not need to make any changes to this file. -#------------------------------------------------------- - - -# -# rename WEBDIR for this RADMON_SUFFIX -# -export WEBDIR=${WEBDIR}/regional/${RADMON_SUFFIX}/pngs - -# -# internal package reference -# -export TOP_IMGNDIR=${MY_TANKDIR}/imgn/regional/${RADMON_SUFFIX} -export IMGNDIR=${MY_TANKDIR}/imgn/regional/${RADMON_SUFFIX}/radmon/pngs -export TANKDIR=${MY_TANKDIR}/stats/regional/${RADMON_SUFFIX} -export TOP_ARCHIVE_DIR=${ARCHIVE_DIR} -export ARCHIVE_DIR=${ARCHIVE_DIR}/regional/${RADMON_SUFFIX} - -# -# GrADS script definitions -# -export PLOT_ANGLE_COUNT=plot_angle_count.rgn.gs -export PLOT_ANGLE_SEP=plot_angle_sep.rgn.gs - -# -# Empty out PLOT_ALL_REGIONS flag -# -export PLOT_ALL_REGIONS="" - diff --git a/util/Radiance_Monitor/image_gen/ush/RadMon_IG_glb.sh b/util/Radiance_Monitor/image_gen/ush/RadMon_IG_glb.sh index 0263d21801..c5b2f87d44 100755 --- a/util/Radiance_Monitor/image_gen/ush/RadMon_IG_glb.sh +++ b/util/Radiance_Monitor/image_gen/ush/RadMon_IG_glb.sh @@ -83,24 +83,31 @@ rad_area=glb this_dir=`dirname $0` top_parm=${this_dir}/../../parm -export RADMON_CONFIG=${RADMON_CONFIG:-${top_parm}/RadMon_config} - -if [[ -s ${RADMON_CONFIG} ]]; then - . ${RADMON_CONFIG} -else - echo "Unable to source ${RADMON_CONFIG}" +radmon_config=${radmon_config:-${top_parm}/RadMon_config} +if [[ ! -e ${radmon_config} ]]; then + echo "Unable to source ${radmon_config}" exit 2 fi -if [[ -s ${RADMON_USER_SETTINGS} ]]; then - . ${RADMON_USER_SETTINGS} -else - echo "Unable to source ${RADMON_USER_SETTINGS}" - exit 3 +. ${radmon_config} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_config} file" + exit $? +fi + + +radmon_user_settings=${radmon_user_settings:-${top_parm}/RadMon_user_settings} +if [[ ! -e ${radmon_user_settings} ]]; then + echo "Unable to locate ${radmon_user_settings} file" + exit 4 +fi + +. ${radmon_user_settings} +if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_user_settings} file" + exit $? fi -#. ${IG_PARM}/plot_rad_conf -. ${IG_PARM}/glbl_conf #-------------------------------------------------------------------- # Determine cycle to plot. Exit if cycle is > last available @@ -112,21 +119,21 @@ fi # 2. Read from ${TANKimg}/last_plot_time file and advanced # one cycle. # 3. Using the last available cycle for which there is -# data in ${TANKDIR}. +# data in ${TANKverf}. # -# If option 2 has been used the ${IMGNDIR}/last_plot_time file -# will be updated with ${PDATE} if the plot is able to run. +# If option 2 has been used the last_plot_time file will be +# updated with ${PDATE} if the plot is able to run. #-------------------------------------------------------------------- echo "TANKimg = ${TANKimg}" -last_plot_time=${TANKimg}/${RUN}/radmon/last_plot_time +last_plot_time=${TANKimg}/last_plot_time echo "last_plot_time file = ${last_plot_time}" latest_data=`${IG_SCRIPTS}/nu_find_cycle.pl --cyc 1 \ - --dir ${TANKDIR} --run ${RUN}` + --dir ${TANKverf} --run ${RUN}` if [[ ${latest_data} = "" ]]; then latest_data=`${IG_SCRIPTS}/find_cycle.pl --cyc 1 \ - --dir ${TANKDIR} --run ${RUN}` + --dir ${TANKverf} --run ${RUN}` fi if [[ ${pdate} = "" ]]; then @@ -163,7 +170,6 @@ fi # Calculate start date (first cycle to be included in the plots -- # PDATE is the latest/last cycle in the plots. #-------------------------------------------------------------------- -export NUM_CYCLES=${NUM_CYCLES:-121} hrs=`expr ${NUM_CYCLES} \\* -6` echo "hrs = $hrs" @@ -175,7 +181,7 @@ export PDY=`echo $PDATE|cut -c1-8` #-------------------------------------------------------------------- -# Locate ieee_src in $TANKDIR and verify data files are present +# Locate ieee_src in $TANKverf and verify data files are present # ieee_src=${TANKverf}/${RUN}.${PDY}/${CYC}/${MONITOR} @@ -211,9 +217,9 @@ cd $PLOT_WORK_DIR #------------------------------------------------------------- # Locate the satype file or set SATYPE by assembling a list -# from available data files in $TANKDIR/angle. +# from available data files in $TANKverf/angle. #------------------------------------------------------------- -tankdir_info=${TANKDIR}/info +tankdir_info=${TANKverf}/info satype_file=${satype_file:-${tankdir_info}/gdas_radmon_satype.txt} if [[ ! -e $satype_file ]]; then satype_file=${HOMEgdas}/fix/gdas_radmon_satype.txt @@ -268,9 +274,9 @@ fi #-------------------------------------------------------------------- # Check for log file and extract data for error report there #-------------------------------------------------------------------- -if [[ $DO_DATA_RPT -eq 1 || $DO_DIAG_RPT -eq 1 ]]; then +if [[ $DO_DATA_RPT -eq 1 ]]; then - warn_file=${TANKDIR}/${RUN}.${PDY}/${CYC}/${MONITOR}/warning.${PDATE} + warn_file=${TANKverf}/${RUN}.${PDY}/${CYC}/${MONITOR}/warning.${PDATE} if [[ -e ${warn_file} ]]; then echo "mailing warning report" /bin/mail -s "RadMon warning" -c "${MAIL_CC}" ${MAIL_TO} < ${warn_file} @@ -290,7 +296,7 @@ fi #-------------------------------------------------------------------- # Remove all but the last 30 cycles worth of data image files. #-------------------------------------------------------------------- -${IG_SCRIPTS}/rm_img_files.pl --dir ${TANKimg}/radmon/pngs --nfl 30 +${IG_SCRIPTS}/rm_img_files.pl --dir ${TANKimg}/pngs --nfl 30 @@ -302,7 +308,7 @@ ${IG_SCRIPTS}/rm_img_files.pl --dir ${TANKimg}/radmon/pngs --nfl 30 #---------------------------------------------------------------------- if [[ $RUN_TRANSFER -eq 1 ]]; then - if [[ $MY_MACHINE = "wcoss_c" || $MY_MACHINE = "wcoss_d" ]]; then + if [[ $MY_MACHINE = "wcoss_c" || $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss2" ]]; then cmin=`date +%M` # minute (MM) ctime=`date +%G%m%d%H` # YYYYMMDDHH rtime=`$NDATE +1 $ctime` # ctime + 1 hour @@ -311,21 +317,30 @@ if [[ $RUN_TRANSFER -eq 1 ]]; then run_time="$rhr:$cmin" # HH:MM format for lsf (bsub command) transfer_log=${LOGdir}/Transfer_${RADMON_SUFFIX}.log + if [[ -e ${transfer_log} ]]; then + rm ${transfer_log} + fi transfer_queue=transfer - if [[ $MY_MACHINE = "wcoss_d" ]]; then + if [[ $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss2" ]]; then transfer_queue=dev_transfer fi jobname=transfer_${RADMON_SUFFIX} - job="${IG_SCRIPTS}/Transfer.sh --nosrc --area ${rad_area} ${RADMON_SUFFIX}" + job="${IG_SCRIPTS}/Transfer.sh --nosrc ${RADMON_SUFFIX}" - if [[ $TANK_USE_RUN -eq 1 ]]; then - job="${job} --run $RUN" - fi - echo "job = $job" + export WEBDIR=${WEBDIR}/${RADMON_SUFFIX}/${RUN}/pngs + + if [[ $MY_MACHINE = "wcoss2" ]]; then + cmdfile=transfer_cmd + echo "${IG_SCRIPTS}/Transfer.sh --nosrc ${RADMON_SUFFIX}" >$cmdfile - $SUB -P $PROJECT -q $transfer_queue -o ${transfer_log} -M 80 -W 0:45 -R affinity[core] -J ${jobname} -cwd ${PWD} -b $run_time ${job} + $SUB -q $transfer_queue -A $ACCOUNT -o ${transfer_log} -V \ + -l select=1:mem=500M -l walltime=45:00 -N ${jobname} ${cmdfile} + else + $SUB -P $PROJECT -q $transfer_queue -o ${transfer_log} -M 80 -W 0:45 \ + -R affinity[core] -J ${jobname} -cwd ${PWD} -b $run_time ${job} + fi fi fi diff --git a/util/Radiance_Monitor/image_gen/ush/RadMon_IG_rgn.sh b/util/Radiance_Monitor/image_gen/ush/RadMon_IG_rgn.sh index df41a62fd1..c8eec4d35d 100755 --- a/util/Radiance_Monitor/image_gen/ush/RadMon_IG_rgn.sh +++ b/util/Radiance_Monitor/image_gen/ush/RadMon_IG_rgn.sh @@ -93,8 +93,7 @@ else exit 2 fi -. ${IG_PARM}/plot_rad_conf -. ${IG_PARM}/rgnl_conf +export PLOT_ALL_REGIONS="" #-------------------------------------------------------------------- @@ -115,17 +114,17 @@ fi # 2. Read from ${TANKimg}/last_plot_time file and advanced # one cycle. # 3. Using the last available cycle for which there is -# data in ${TANKDIR}. +# data in ${TANKverf}. # -# If option 2 has been used the ${IMGNDIR}/last_plot_time file -# will be updated with ${PDATE} if the plot is able to run. +# If option 2 has been used the last_plot_time file will be +# updated with ${PDATE} if the plot is able to run. #-------------------------------------------------------------------- echo "TANKimg = ${TANKimg}" -last_plot_time=${TANKimg}/radmon/last_plot_time +last_plot_time=${TANKimg}/last_plot_time echo "last_plot_time file = ${last_plot_time}" -latest_data=`${IG_SCRIPTS}/find_cycle.pl --cyc 1 --dir ${TANKDIR}` +latest_data=`${IG_SCRIPTS}/find_cycle.pl --cyc 1 --dir ${TANKverf}` if [[ ${pdate} = "" ]]; then if [[ -e ${last_plot_time} ]]; then @@ -177,7 +176,7 @@ else export PDY=`echo $PDATE|cut -c1-8` fi -satype_file=${TANKDIR}/info/${TANKDIR_INFO}/nam_radmon_satype.txt +satype_file=${TANKverf}/info/nam_radmon_satype.txt if [[ ! -e $satype_file ]]; then satype_file=${HOMEnam}/fix/nam_radmon_satype.txt @@ -193,8 +192,8 @@ echo "satype : ${satype}" # data. This will get us a list of satypes to plot even if # the $satype_file can't be found. # -if [[ -d ${TANKDIR}/radmon.${PDY} ]]; then - test_list=`ls ${TANKDIR}/radmon.${PDY}/*angle.*${PDATE}.ieee_d.*` +if [[ -d ${TANKverf}/radmon.${PDY} ]]; then + test_list=`ls ${TANKverf}/radmon.${PDY}/*angle.*${PDATE}.ieee_d.*` fi for test in ${test_list}; do @@ -221,7 +220,6 @@ echo $SATYPE pid=${pid:-$$} export PLOT_WORK_DIR=${STMP_USER}/${RADMON_SUFFIX}/radmon/plotjobs.${pid} mkdir -p $PLOT_WORK_DIR -#cd $PLOT_WORK_DIR if [[ ! -d ${PLOT_WORK_DIR} ]]; then echo "Unable to create PLOT_WORK_DIR: ${PLOT_WORK_DIR}" exit 6 @@ -260,7 +258,7 @@ if [[ $RUN_TRANSFER -eq 1 ]]; then cyc=`echo $PDATE|cut -c9-10` if [[ ${cyc} = "00" || ${cyc} = "06" || ${cyc} = "12" || ${cyc} = "18" ]]; then - if [[ $MY_MACHINE = "wcoss_c" || $MY_MACHINE = "wcoss_d" ]]; then + if [[ $MY_MACHINE = "wcoss_c" || $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss2" ]]; then cmin=`date +%M` # minute (MM) ctime=`date +%G%m%d%H` # YYYYMMDDHH rtime=`$NDATE +1 $ctime` # ctime + 1 hour @@ -269,19 +267,32 @@ if [[ $RUN_TRANSFER -eq 1 ]]; then run_time="$rhr:$cmin" # HH:MM format for lsf (bsub command) transfer_log=${LOGdir}/Transfer_${RADMON_SUFFIX}.log + if [[ -e ${transfer_log} ]]; then + rm ${transfer_log} + fi transfer_queue=transfer - if [[ $MY_MACHINE = "wcoss_d" ]]; then + if [[ $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss2" ]]; then transfer_queue=dev_transfer fi jobname=transfer_${RADMON_SUFFIX} - job="${IG_SCRIPTS}/Transfer.sh --nosrc --area ${RAD_AREA} ${RADMON_SUFFIX}" - + job="${IG_SCRIPTS}/Transfer.sh --nosrc ${RADMON_SUFFIX}" echo "job = $job" - $SUB -P $PROJECT -q $transfer_queue -o ${transfer_log} -M 80 -W 0:45 \ - -R affinity[core] -J ${jobname} -cwd ${PWD} -b $run_time ${job} + export WEBDIR=${WEBDIR}/regional/${RADMON_SUFFIX}/pngs + + if [[ $MY_MACHINE = "wcoss2" ]]; then + cmdfile=transfer_cmd + echo "${IG_SCRIPTS}/Transfer.sh --nosrc ${RADMON_SUFFIX}" >$cmdfile + + $SUB -q $transfer_queue -A $ACCOUNT -o ${transfer_log} -V \ + -l select=1:mem=500M -l walltime=45:00 -N ${jobname} ${cmdfile} + + else + $SUB -P $PROJECT -q $transfer_queue -o ${transfer_log} -M 80 -W 0:45 \ + -R affinity[core] -J ${jobname} -cwd ${PWD} -b $run_time ${job} + fi fi fi @@ -289,24 +300,9 @@ fi #-------------------------------------------------------------------- -# remove all but the last 30 cycles of date image files. -#-------------------------------------------------------------------- -${IG_SCRIPTS}/rm_img_files.pl --dir ${TANKimg}/radmon/pngs --nfl 30 - - -#-------------------------------------------------------------------- -# Check for log file and extract data for error report there -#-------------------------------------------------------------------- -#if [[ $DO_DATA_RPT -eq 1 || $DO_DIAG_RPT -eq 1 ]]; then -# -# logfile=${LOGdir}/data_extract.${RADMON_SUFFIX}.${sdate}.${CYA}.log -# -# if [[ -s $logfile ]]; then -# ${IG_SCRIPTS}/extract_err_rpts.sh $sdate $CYA $logfile -# fi -#fi -# +# remove all but the last 30 cycles of image files. #-------------------------------------------------------------------- +${IG_SCRIPTS}/rm_img_files.pl --dir ${TANKimg}/pngs --nfl 30 echo end RadMon_IG_rgn.sh diff --git a/util/Radiance_Monitor/image_gen/ush/Transfer.sh b/util/Radiance_Monitor/image_gen/ush/Transfer.sh index 169a513b6b..93f2232ecb 100755 --- a/util/Radiance_Monitor/image_gen/ush/Transfer.sh +++ b/util/Radiance_Monitor/image_gen/ush/Transfer.sh @@ -3,7 +3,7 @@ function usage { echo "Usage: Transfer.sh [-n|--nosrc] suffix" echo " Suffix is data source identifier that matches data in " - echo " the $TANKDIR/stats directory." + echo " the $MY_TANKDIR/stats directory." echo " -n|--nosrc Do not source the radmon_package/parm/* files." echo " This should be used if the parm files have already" echo " been sourced by the calling script." @@ -42,7 +42,6 @@ do ;; -r|--run) RUN=$2 - TANK_USE_RUN=1 shift # past argument ;; *) @@ -58,40 +57,36 @@ echo "SOURCE_PARMS = $SOURCE_PARMS" echo "AREA = $AREA" echo "RADMON_SUFFIX = $RADMON_SUFFIX" echo "RUN = $RUN" -echo "TANK_USE_RUN = $TANK_USE_RUN" set -ax if [[ $SOURCE_PARMS -eq 1 ]]; then this_dir=`dirname $0` - top_parm=${this_dir}/../../parm - export RADMON_CONFIG=${RADMON_CONFIG:-${top_parm}/RadMon_config} - if [[ -s ${RADMON_CONFIG} ]]; then - . ${RADMON_CONFIG} - else - echo "ERROR: Unable to source ${RADMON_CONFIG}" - exit + radmon_config=${radmon_config:-${top_parm}/RadMon_config} + if [[ ! -e ${radmon_config} ]]; then + echo "Unable to locate ${radmon_config} file" + exit 3 fi - if [[ -s ${RADMON_USER_SETTINGS} ]]; then - . ${RADMON_USER_SETTINGS} - else - echo "ERROR: Unable to source ${RADMON_USER_SETTINGS}" - exit + . ${radmon_config} + if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_config} file" + exit $? fi - . ${IG_PARM}/plot_rad_conf + radmon_user_settings=${radmon_user_settings:-${top_parm}/RadMon_user_settings} + if [[ ! -e ${radmon_user_settings} ]]; then + echo "Unable to locate ${radmon_user_settings} file" + exit 4 + fi - if [[ $AREA == "glb" ]]; then - . ${RADMON_IMAGE_GEN}/parm/glbl_conf - elif [[ $AREA == "rgn" ]]; then - . ${RADMON_IMAGE_GEN}/parm/rgnl_conf - else - echo "ERROR: Unable to determine AREA for ${RADMON_SUFFIX}" - exit + . ${radmon_user_settings} + if [[ $? -ne 0 ]]; then + echo "Error detected while sourcing ${radmon_user_settings} file" + exit $? fi fi @@ -106,7 +101,7 @@ echo "IMGNDIR = ${IMGNDIR}" echo "WEBDIR = ${WEBDIR}" if [[ ${IMGNDIR} != "/" ]]; then - if [[ $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss_c" ]]; then + if [[ $MY_MACHINE = "wcoss_d" || $MY_MACHINE = "wcoss_c" || $MY_MACHINE = "wcoss2" ]]; then /usr/bin/rsync -ave ssh --exclude *.ctl.${Z} \ --exclude 'horiz' --exclude *.png --delete-during ${IMGNDIR}/ \ ${WEB_USER}@${WEB_SVR}.ncep.noaa.gov:${WEBDIR}/ diff --git a/util/Radiance_Monitor/image_gen/ush/mk_angle_plots.sh b/util/Radiance_Monitor/image_gen/ush/mk_angle_plots.sh index 6f448836d2..72b9348e85 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_angle_plots.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_angle_plots.sh @@ -22,14 +22,14 @@ export CYCLE_INTERVAL=${CYCLE_INTERVAL:-6} echo "START_DATE, CYCLE_INTERVAL = ${START_DATE}, ${CYCLE_INTERVAL}" imgndir=${IMGNDIR}/angle -tankdir=${TANKDIR}/angle +tankdir=${TANKverf}/angle if [[ ! -d ${imgndir} ]]; then mkdir -p ${imgndir} fi #------------------------------------------------------------------- -# Locate/update the control files in $TANKDIR/radmon.$PDY. $PDY +# Locate/update the control files in $TANKverf/radmon.$PDY. $PDY # starts at END_DATE and walks back to START_DATE until ctl files # are found or we run out of dates to check. Report an error to # the log file and exit if no ctl files are found. @@ -98,7 +98,7 @@ for type in ${SATYPE}; do done if [[ $allmissing = 1 ]]; then - echo ERROR: Unable to plot. All angle control files are missing from ${TANKDIR} for requested date range. + echo ERROR: Unable to plot. All angle control files are missing from ${TANKverf} for requested date range. exit 2 fi @@ -198,6 +198,10 @@ elif [[ ${MY_MACHINE} = "jet" ]]; then elif [[ ${MY_MACHINE} = "wcoss_c" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -o ${logfile} -M 600 -W ${wall_tm} \ -J ${jobname} -cwd ${PWD} $cmdfile + +elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=1g -l walltime=30:00 -N ${jobname} ${cmdfile} fi diff --git a/util/Radiance_Monitor/image_gen/ush/mk_bcoef_plots.sh b/util/Radiance_Monitor/image_gen/ush/mk_bcoef_plots.sh index 32149a08ff..05e175470b 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_bcoef_plots.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_bcoef_plots.sh @@ -17,14 +17,14 @@ echo "begin mk_bcoef_plots.sh" echo "NUM_CYCLES, CYCLE_INTERVAL = ${NUM_CYCLES}, ${CYCLE_INTERVAL}" imgndir="${IMGNDIR}/bcoef" -tankdir="${TANKDIR}/bcoef" +tankdir="${TANKverf}/bcoef" if [[ ! -d ${imgndir} ]]; then mkdir -p ${imgndir} fi #------------------------------------------------------------------- -# Locate/update the control files in $TANKDIR/radmon.$PDY. $PDY +# Locate/update the control files in $TANKverf/radmon.$PDY. $PDY # starts at END_DATE and walks back to START_DATE until ctl files # are found or we run out of dates to check. Report an error to # the log file and exit if no ctl files are found. @@ -94,7 +94,7 @@ for type in ${SATYPE}; do done if [[ $allmissing = 1 ]]; then - echo "ERROR: Unable to plot. All bcoef control files are missing from ${TANKDIR} for requested date range." + echo "ERROR: Unable to plot. All bcoef control files are missing from ${TANKverf} for requested date range." exit 2 fi @@ -129,9 +129,14 @@ elif [[ $MY_MACHINE = "wcoss_c" ]]; then elif [[ $MY_MACHINE = "hera" || $MY_MACHINE = "s4" ]]; then $SUB --account $ACCOUNT --ntasks=1 --mem=5g --time=1:00:00 -J ${jobname} \ -o ${logfile} -D . $IG_SCRIPTS/plot_bcoef.sh + elif [[ $MY_MACHINE = "jet" ]]; then $SUB --account $ACCOUNT --ntasks=1 --mem=5g --time=1:00:00 -J ${jobname} \ -p ${RADMON_PARTITION} -o ${logfile} -D . $IG_SCRIPTS/plot_bcoef.sh + +elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=1g -l walltime=1:00:00 -N ${jobname} $IG_SCRIPTS/plot_bcoef.sh fi echo "end mk_bcoef_plots.sh" diff --git a/util/Radiance_Monitor/image_gen/ush/mk_bcor_plots.sh b/util/Radiance_Monitor/image_gen/ush/mk_bcor_plots.sh index beac676c82..ba41fe9d9a 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_bcor_plots.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_bcor_plots.sh @@ -16,7 +16,7 @@ date echo "begin mk_bcor_plots.sh" imgndir=${IMGNDIR}/bcor -tankdir=${TANKDIR}/bcor +tankdir=${TANKverf}/bcor if [[ ! -d ${imgndir} ]]; then mkdir -p ${imgndir} @@ -24,7 +24,7 @@ fi #------------------------------------------------------------------- -# Locate/update the control files in $TANKDIR/radmon.$pdy. $pdy +# Locate/update the control files in $TANKverf/radmon.$pdy. $pdy # starts at END_DATE and walks back to START_DATE until ctl files # are found or we run out of dates to check. Report an error to # the log file and exit if no ctl files are found. @@ -245,6 +245,9 @@ for sat in ${bigSATLIST}; do $SUB --account ${ACCOUNT} -n $ctr -o ${logfile} -D . -J ${jobname} \ -p ${RADMON_PARTITION} --time=1:00:00 --wrap "srun -l --multi-prog ${cmdfile}" + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=1g -l walltime=1:00:00 -N ${jobname} ${cmdfile} fi echo "submitted $sat" diff --git a/util/Radiance_Monitor/image_gen/ush/mk_digital_ang.sh b/util/Radiance_Monitor/image_gen/ush/mk_digital_ang.sh index 73eb257056..5168e22572 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_digital_ang.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_digital_ang.sh @@ -93,7 +93,12 @@ for type in ${SATYPE_LIST}; do # build input (namelist) file # nchanl=`cat ./${type}.ctl | grep title |gawk '{print $4}'` - ncycle=`ls -l ./${type}.*.ieee_d | wc -l` + + ncycle=$NUM_CYCLES + ntimes=`ls -1 ${type}.*.*ieee_d | wc -l` + if [[ $ntimes -lt $ncycle ]]; then + ncycle=$ntimes + fi scan_start=`cat ./$scaninfo | grep $type | gawk '{print $2}'` scan_stepsz=`cat ./$scaninfo | grep $type | gawk '{print $3}'` diff --git a/util/Radiance_Monitor/image_gen/ush/mk_digital_bcoef.sh b/util/Radiance_Monitor/image_gen/ush/mk_digital_bcoef.sh index 9db936a719..9da4218795 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_digital_bcoef.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_digital_bcoef.sh @@ -49,7 +49,11 @@ for type in ${SATYPE_LIST}; do # build input (namelist) file # nchanl=`cat ./${type}.ctl | grep title |gawk '{print $4}'` - ncycle=`ls -l ./${type}.*.ieee_d | wc -l` + ncycle=$NUM_CYCLES + ntimes=`ls -1 ${type}.*.*ieee_d | wc -l` + if [[ $ntimes -lt $ncycle ]]; then + ncycle=$ntimes + fi rm -f ${input} cat < ${input} diff --git a/util/Radiance_Monitor/image_gen/ush/mk_digital_time.sh b/util/Radiance_Monitor/image_gen/ush/mk_digital_time.sh index 35c8e8f831..422751437b 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_digital_time.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_digital_time.sh @@ -62,7 +62,13 @@ for type in ${SATYPE_LIST}; do # build input (namelist) file # nchanl=`cat ./${type}.ctl | grep title |gawk '{print $4}'` - ncycle=`ls -l ./${type}.*.ieee_d | wc -l` + + ncycle=$NUM_CYCLES + ntimes=`ls -1 ${type}.*.*ieee_d | wc -l` + if [[ $ntimes -lt $ncycle ]]; then + ncycle=$ntimes + fi + nregion=5 if [[ $RAD_AREA = 'rgn' ]]; then nregion=1 @@ -108,7 +114,6 @@ EOF ctr=$(($ctr+1)) done - #------------------------------ # build chan.txt using ctl file # diff --git a/util/Radiance_Monitor/image_gen/ush/mk_horiz_plots.sh b/util/Radiance_Monitor/image_gen/ush/mk_horiz_plots.sh index 78735112de..009adfed98 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_horiz_plots.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_horiz_plots.sh @@ -114,8 +114,8 @@ cat << EOF > input.$sat.$ihh EOF ./horiz.x < input.$sat.$ihh > stdout.$sat.$ihh - rm -f $TANKDIR/horiz/stdout.$sat.$ihh - $NCP stdout.$sat.$ihh $TANKDIR/horiz/stdout.$sat.$ihh + rm -f $TANKverf/horiz/stdout.$sat.$ihh + $NCP stdout.$sat.$ihh $TANKverf/horiz/stdout.$sat.$ihh done done @@ -132,7 +132,7 @@ for sat in ${SATYPE}; do fi $NCP ${sat}.ctl* $IMGNDIR/horiz/${sat}.ctl - ${COMPRESS} -f $TANKDIR/horiz/${sat}.ctl + ${COMPRESS} -f $TANKverf/horiz/${sat}.ctl chmod a+r ${sat}*.ieee_d* done diff --git a/util/Radiance_Monitor/image_gen/ush/mk_time_plots.sh b/util/Radiance_Monitor/image_gen/ush/mk_time_plots.sh index e96a29adfe..c1ccf2c116 100755 --- a/util/Radiance_Monitor/image_gen/ush/mk_time_plots.sh +++ b/util/Radiance_Monitor/image_gen/ush/mk_time_plots.sh @@ -15,7 +15,7 @@ echo Start mk_time_plots.sh set -ax imgndir=${IMGNDIR}/time -tankdir=${TANKDIR}/time +tankdir=${TANKverf}/time if [[ ! -d ${imgndir} ]]; then mkdir -p ${imgndir} @@ -24,7 +24,7 @@ fi #------------------------------------------------------------------- # Locate/update the control files. If no ctl file is available # report a warning to the log file. Search order is $imgndir, -# the $TANKDIR/radmon.$pdy, then $tankdir. +# then $TANKverf/radmon.$pdy. # allmissing=1 pdy=`echo $PDATE|cut -c1-8` @@ -150,6 +150,10 @@ elif [[ ${MY_MACHINE} = "hera" || ${MY_MACHINE} = "s4" ]]; then elif [[ ${MY_MACHINE} = "jet" ]]; then ${SUB} --account ${ACCOUNT} --ntasks=1 --mem=5g --time=1:00:00 -J ${jobname} \ --partition ${RADMON_PARTITION} -o ${logfile} ${IG_SCRIPTS}/plot_summary.sh + +elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=1g -l walltime=10:00 -N ${jobname} ${IG_SCRIPTS}/plot_summary.sh fi @@ -225,6 +229,10 @@ list="count penalty omgnbc total omgbc" elif [[ ${MY_MACHINE} = "wcoss_c" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -M 500 -o ${logfile} -W ${wall_tm} \ -J ${jobname} -cwd ${PWD} ${cmdfile} + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=1g -l walltime=1:00:00 -N ${jobname} ${cmdfile} fi @@ -265,15 +273,22 @@ list="count penalty omgnbc total omgbc" if [[ $MY_MACHINE = "wcoss_d" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -M 500 -R affinity[core] -o ${logfile} \ -W ${wall_tm} -J ${jobname} -cwd ${PWD} ${cmdfile} + elif [[ ${MY_MACHINE} = "wcoss_c" ]]; then $SUB -q $JOB_QUEUE -P $PROJECT -M 500 -o ${logfile} -W ${wall_tm} \ -J ${jobname} -cwd ${PWD} ${cmdfile} + elif [[ $MY_MACHINE = "hera" || $MY_MACHINE = "s4" ]]; then $SUB --account ${ACCOUNT} -n ${ctr} -o ${logfile} -D . -J ${jobname} --time=4:00:00 \ --wrap "srun -l --multi-prog ${cmdfile}" + elif [[ $MY_MACHINE = "jet" ]]; then $SUB --account ${ACCOUNT} -n ${ctr} -o ${logfile} -D . -J ${jobname} --time=4:00:00 \ -p ${RADMON_PARTITION} --wrap "srun -l --multi-prog ${cmdfile}" + + elif [[ $MY_MACHINE = "wcoss2" ]]; then + $SUB -q $JOB_QUEUE -A $ACCOUNT -o ${logfile} -V \ + -l select=1:mem=1g -l walltime=1:30:00 -N ${jobname} ${cmdfile} fi done diff --git a/util/Radiance_Monitor/image_gen/ush/plot_angle.sh b/util/Radiance_Monitor/image_gen/ush/plot_angle.sh index aa4a639bc1..75d1baddb4 100755 --- a/util/Radiance_Monitor/image_gen/ush/plot_angle.sh +++ b/util/Radiance_Monitor/image_gen/ush/plot_angle.sh @@ -57,7 +57,7 @@ imgdef=`echo ${#IMGNDIR}` if [[ $imgdef -gt 0 ]]; then ctldir=$IMGNDIR/angle else - ctldir=$TANKDIR/angle + ctldir=$TANKverf/angle fi echo ctldir = $ctldir diff --git a/util/Radiance_Monitor/image_gen/ush/plot_bcoef.sh b/util/Radiance_Monitor/image_gen/ush/plot_bcoef.sh index f3b3260785..0a21b5a555 100755 --- a/util/Radiance_Monitor/image_gen/ush/plot_bcoef.sh +++ b/util/Radiance_Monitor/image_gen/ush/plot_bcoef.sh @@ -38,7 +38,7 @@ imgdef=`echo ${#IMGNDIR}` if [[ $imgdef -gt 0 ]]; then ctldir=$IMGNDIR/bcoef else - ctldir=$TANKDIR/bcoef + ctldir=$TANKverf/bcoef fi echo ctldir = $ctldir @@ -50,8 +50,8 @@ echo ctldir = $ctldir # place on the web server. # # Data file location may either be in angle, bcoef, bcor, and time -# subdirectories under $TANKDIR, or in the Operational organization -# of radmon.YYYYMMDD directories under $TANKDIR. +# subdirectories under $TANKverf, or in the Operational organization +# of radmon.YYYYMMDD directories under $TANKverf $NCP ${IG_SCRIPTS}/mk_digital_bcoef.sh . diff --git a/util/Radiance_Monitor/image_gen/ush/plot_bcor.sh b/util/Radiance_Monitor/image_gen/ush/plot_bcor.sh index 656bb465a5..83702c9e1e 100755 --- a/util/Radiance_Monitor/image_gen/ush/plot_bcor.sh +++ b/util/Radiance_Monitor/image_gen/ush/plot_bcor.sh @@ -51,7 +51,7 @@ imgdef=`echo ${#IMGNDIR}` if [[ $imgdef -gt 0 ]]; then ctldir=$IMGNDIR/bcor else - ctldir=$TANKDIR/bcor + ctldir=$TANKverf/bcor fi echo ctldir = $ctldir @@ -62,8 +62,8 @@ echo ctldir = $ctldir # place on the web server. # # Data file location may either be in angle, bcoef, bcor, and time -# subdirectories under $TANKDIR, or in the Operational organization -# of radmon.YYYYMMDD directories under $TANKDIR. +# subdirectories under $TANKverf, or in the Operational organization +# of radmon.YYYYMMDD directories under $TANKverf for type in ${SATYPE2}; do diff --git a/util/Radiance_Monitor/image_gen/ush/plot_summary.sh b/util/Radiance_Monitor/image_gen/ush/plot_summary.sh index 14596039f9..bc394bb8e7 100755 --- a/util/Radiance_Monitor/image_gen/ush/plot_summary.sh +++ b/util/Radiance_Monitor/image_gen/ush/plot_summary.sh @@ -36,7 +36,7 @@ imgdef=`echo ${#IMGNDIR}` if [[ $imgdef -gt 0 ]]; then ctldir=$IMGNDIR/time else - ctldir=$TANKDIR/time + ctldir=$TANKverf/time fi @@ -47,7 +47,7 @@ chanf="chan.txt" #-------------------------------------------------------------------- # Assemble the required data files (*.ieee_d), make txt files, and # conditionally create static images (see below), and move all -# resulting files to the $TANKDIR/imgn directory for transfer to +# resulting files to the $TANKverf/imgn directory for transfer to # server. # for type in ${SATYPE2}; do @@ -151,7 +151,7 @@ EOF # b) build the use.txt file from the ctl file # c) build the input file (namelist for summary.x) # d) run the summary.x executable - # e) copy the [satype].sum.txt file to $TANKDIR/imgn/{suffix}/pngs/summary/. + # e) copy the [satype].sum.txt file to $TANKverf/imgn/{suffix}/pngs/summary/. # f) clean up echo "BEGIN data file generation:" diff --git a/util/Radiance_Monitor/image_gen/ush/plot_time.sh b/util/Radiance_Monitor/image_gen/ush/plot_time.sh index 8697966d7f..e33528acdd 100755 --- a/util/Radiance_Monitor/image_gen/ush/plot_time.sh +++ b/util/Radiance_Monitor/image_gen/ush/plot_time.sh @@ -52,7 +52,7 @@ imgdef=`echo ${#IMGNDIR}` if [[ $imgdef -gt 0 ]]; then ctldir=$IMGNDIR/time else - ctldir=$TANKDIR/time + ctldir=$TANKverf/time fi echo ctldir = $ctldir @@ -63,8 +63,8 @@ echo ctldir = $ctldir # place on the web server. # # Data file location may either be in angle, bcoef, bcor, and time -# subdirectories under $TANKDIR, or in the Operational organization -# of radmon.YYYYMMDD directories under $TANKDIR. +# subdirectories under $TANKverf, or in the Operational organization +# of radmon.YYYYMMDD directories under $TANKverf # for type in ${SATYPE2}; do diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss2.sh b/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss2.sh new file mode 100755 index 0000000000..7c87107d23 --- /dev/null +++ b/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss2.sh @@ -0,0 +1,79 @@ +#!/bin/ksh + +#PBS -o gdas_vradmon.out +#PBS -e gdas_vradmon.err +#PBS -N gdas_vradmon +#PBS -q dev +#PBS -l select=1:mem=5000M +#PBS -l walltime=20:00 +#PBS -A GFS-DEV + +set -ax + +export PDATE=${PDATE:-2021082300} + +############################################################# +# Specify whether the run is production or development +############################################################# +export PDY=`echo $PDATE | cut -c1-8` +export cyc=`echo $PDATE | cut -c9-10` +export job=gdas_verfrad.${cyc} +export pid=${pid:-$$} +export jobid=${job}.${pid} +export envir=prod +export DATAROOT=/lfs/h1/ops/canned/com/gfs/v16.2 +export COMROOT=/lfs/h2/emc/ptmp/${LOGNAME} + +if [[ ! -d ${COMROOT}/logs/jlogfiles ]]; then + mkdir -p ${COMROOT}/logs/jlogfiles +fi + + +############################################################# +# Load modules +############################################################# +module load prod_util/2.0.10 +module load util_shared/1.4.0 + +#module load lsf/10.1 +#module load ips/18.0.1.163 +#module load impi/18.0.1 +#module load prod_util/1.1.0 +#module load grib_util/1.1.0 +#module load util_shared/1.1.0 + +module list + + +############################################################# +# Set user specific variables +############################################################# +export RADMON_SUFFIX=test_rad +export DATA=/lfs/h2/emc/stmp/${LOGNAME}/${RADMON_SUFFIX} # rename this to WORKDIR +if [[ -d ${DATA} ]]; then + rm -rf ${DATA} + mkdir -p ${DATA} +fi +export RAD_DATA_IN=${DATA} +export jlogfile=${COMROOT}/logs/jlogfiles/${RADMON_SUFFIX}_jlog + +export NWTEST=/lfs/h2/emc/da/noscrub/Edward.Safford/git/gsi/GSI/util/Radiance_Monitor/nwprod + +export HOMEgdas=${NWTEST}/gdas_radmon +export HOMEgfs=${HOMEgdas} +export FIXgdas=${FIXgdas:-$HOMEgfs/fix} + +export JOBGLOBAL=${HOMEgdas}/jobs +export HOMEradmon=${NWTEST}/radmon_shared +export COM_IN=${DATAROOT} +export TANKverf=${COMROOT}/${RADMON_SUFFIX} + +export parm_file=${HOMEgdas}/parm/gdas_radmon.parm + +############################################################# +# Execute job +############################################################# +$JOBGLOBAL/JGDAS_ATMOS_VERFRAD + +exit + diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss_d.sh b/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss_d.sh index 3c398fa7a0..a58b6895f3 100755 --- a/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss_d.sh +++ b/util/Radiance_Monitor/nwprod/gdas_radmon/driver/test_jgdas_verfrad_wcoss_d.sh @@ -14,7 +14,7 @@ set -x #export PDATE=2018091706 # binary radstat #export PDATE=2018110206 # netcdf radstat -export PDATE=2020022806 # netcdf radstat +export PDATE=2022021506 # netcdf radstat ############################################################# # Specify whether the run is production or development diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon/fix/gdas_radmon_base.tar b/util/Radiance_Monitor/nwprod/gdas_radmon/fix/gdas_radmon_base.tar index 762ce086814e4ec96ed5b7e0a0ecbb61357ca5da..de912ddfe16138c5257fb36f0d670d3834913ed3 100644 GIT binary patch delta 14589 zcmaKzZLDoaS;xE2z4zR{P}*9c1=_euY}y*xu30m))|y}u12;;H;e$p*KS;4PX|$;{ zKvEmrrGW|ttL+LLu>!U|_cTQjaia%gl@#Q~^3oP-DHNqKh)8NfMIvaV{+>1S%&fKV zxt^xUU3<@(`OowEf1a6rcK3o92Sd9Prd4z zU%KYnE3f+1wOJfH8ix%xoH~xP2aV&!N7hGAzjj;4p8fozzCGET=af0mmvN0dc+QKz zygu`JSD&tP{(y|NC&78~u`_gBJ+AE!nsaST8TTXXr}gc@<1R1benQ5z2Vz{CmzQxr zGmbkD-(W6(bbZ>-UX%CoYQ}nF4q6*oKD6F?&Fh}2`}sA-cIISqXY6%l?2V(0PO|qm z9Xq6RzFEe(lVE)la=-cNEgkz-S-(DsoZeREeEW#=Bzt-r`@iLytxLq@+EZ%zGo7uO z*0`p&&Np4%oKhQaW~h#0iEp^-x?dh1dclLY-FE(wrfy6(TzK34D_6J6+Eww-_Vu!9 zn?5~;uIZPoAdjc>zu~)v58~JL()rM|A;d?wY>aK|-W+>j-BeY*w7so^^E%i&YfWqA zQRYg2!(}%;bH%?+Do<f2{NUD^(H2Ixj|MsJ%iF z?bn^R?Qs3?yqHgP>nd?st2)i~H;sC$e|E#CEQ=v8klTDRW1 zJXczAc;36tUDdW-HVHfW7Oi#J>!P>k_wZ3S#n6gbhh!ZsUT1vhf?@z&?|ho8UiKCT zH7B_L9}9-iVrCOL1gq~=7}2KLTQ`wIYi;P8q-ha;&nJDxU{G$8y`aNvYCrM(an0ey zzkhsHv&=*eVcFCgF{kONZkKNMNxO-PC2x2<%H$`gviip&Naq0qM z=hBS-|M%76@(Kbj30p zmQf(|wL@Zgu86D}KKGuz6_Gxg3?EuN*1IlCq1i}FCXAL6UnjEQFGQmFh@bW32~!|6 ztm(281Wp%KRHRTf!?)hMyRyDps-um$5f8~x8R5?4Ac1vi7`5{lT?8S%)CZ`8s={~V z2{nAIGt@PiK?YAi49~e^Z{^+6sO-h`;JW%4Ft!Z{Sn|X+UDMbuTZ6?tNOcOKt*vid zPS1fL2u<67&n5{sNK@zS@*M88D} zu4~#DktR~GW_a~ocddGIUY`>~-z;6o{Hbrd4HV8#Z4y?}_0jpO$}fpj2HmJ2TrkFz z6y8e8?@vh5H|-u@L8F&Kvc|uWD}`Q-vPYP6Ww5h}GH?T1>jpf5mn>ZD!7-6D$+jd* zcVHUzJdwn(cl`JY%URl@4IIO?N*vhZJU^QT^CniY@@;1ul>=YF>9av} zzG<4sGN%~s-#fl?eLwXJ2{bui_SVkh1AZb_8ifW&K!{c|yk9!kP`njgz)wJ-gInB~ z5%M_2@Z{ZhtqfU>&1OkRRE9LgH>+L}%QQ;Wu;K{{cF;kL<7h`<#y{H}C>=twCRr_z zaWp9Y48?HvJrXAg)wNmxu7*gnZn{nKTsyc;5d>+XX*HZU1OYEGSr9f@%rr+SlAB9$ zvj}4F@53I*5NV?T6e?kvDT$$LZT?o?Go-|+QQ||4PC|3|SKYB6H3(PZbZs`uQ4G<7 zCm3G!NBD(-`Klj}7#jFM#^5(GY{&ueDgi?d4a#V8v<8Dz5pgcD9=zUfM5&!O-n(_q z&MkY3+g25GQ4wVxV_Sj_BuueD5mj2U2NH5NR^g=1dgrthuuF?ObbZD`*r=`26R;R& zj{c(Z7~cE-yH~x?b=^=!ZH9TNsa3)WX9zr@EbDJXK(AwOkm$MStp;s=D2rg}K<4MouA5B%C?~ zGyM2^y|TecjT6PiMoEw4wDd^rlWlC==!7?ns}jCRh;cL`pal05t9S6`SjCKkiO7_c zGPrDXxc)=CWF`VVj4rJTPg%OU(=b3yGBbRN!E69BukFd8ksA}n#$w(T-bgV=lNbjfy_M#Dh ziU;*%2rbQlI__?wjnn>e_q>MBc{z=&sLQD_;ZoJ%^InGYNERrT4&Q;7#a+{TVEGWr zuBF?gTpUY>ngrADeE)|QA6zjn!5lsv->u+L%ZA2Feze)81Ro)2wpThQJux(nCjVet zWnHIURl~S`AE_cAB9B|Y`s}446ncU_zLn4tyE!KVws@}7vHOVUuSU(hMqp5Vj5k_ z*8ww&qlNBM*M_WdsZKJ51~9SPZ`P2*yZ)L=fry$rH{xA*h=yC*ax+Ch%4Q6i78CVy z8qHQH1z_V@4D@MeY^WHdjHUM?kE#g%x$`$4Ufj8=Eatjw)m1Ah5Y*w-Akc5#y1Yw% z&Y@`(1<$pPh8Fr=@n_RwRI^x`+{;T<2R$%KfOrMJZ~0e!DbMTA-C zq5_@<$4nVeVr#T`#9TdL(Pt_`h9E?1wkNstc<3xnR>Oxsv3F4u#3t1hjrUS#CLLB( zob}ExUVr!k7qEmJ(eXjDPhTi#7ebf&8WoGtQ?l*O1NV*DfM^N@NYbi^V-!zX<5ctp zvS`O$lFW41Y?`@RY%JlUxk_sYZ&T-|M-m{KQPd2k$4GB&D(d0sPmv8Qv3KHlgaTUn z=`D(?xw7Fo1%VJ$@|kJ{ITLDqLEr z9B)>^kz@dw3t5Wvx@lTdoFAXD8mMWRkRf4vQz=jZy!_MD=x{*Vp&0`ahoVd$aRA-7 zU`Lh{O@M)*NUDyb(FD1H+^d?91BIXg6`=_w*=+9)*L(&HumN_iixOzjMRFEu(T!HS zRMV3H#91l1AR(4ifEsOae&}UuasZ;8W=?4D4!3?5T~OgoWJubd#E-?=?Ny=E9- z_$k9k&ZYII2kq?l|Ew-K@5NT2)!#B+I?XtoWvvCtQ$93Q{L+_U^S4@ zG1zCP)+FaPp5vFyS2+ummTJZT$Hs!?v0!-k3t)h#kxFzR7^E$yVxi2;Yeo#CE{c5F zm)BrTz=cf0U{wwjeNCqap`sgFIWZSy4D0Va`ge;}hfz)ififUp83fAFjgKI@DG2RFtoL~~`2fuRv0{A2wc6&@}}EvY%nV z9H6C18*xM6lAwr$gRA%v1g|OhiZ*^;bOZsR zR8S%aNGd!w`zQRBdkEP#=>OqdIbKt8aW1ftxYk#ERX}hO$Vps;TT#BjhqN65h$8(F zM67f3<}e6`BoIVA&e=)RDhXG^8}V zaMvVnJ&K|js)#}k`?5n*;n%d}N~nT#VyT%&P=~X>dFon!^XnZT=xv0OVPG~6zf;Mu z$Q(rMwPaCvLZVT%^J)W=48jMWDkQoFgAbz92y?*kEQ4%;r>FlBo8h05JWN;25mULMX z9DLG3DMrCL7|m)m3Vg?rH5CL_iJ0b=x!!$JKuG_X93My0KOUP0`bg-RgMju;-9xSd zsib z%88X_BC3{<@6ezssrgk9^gWvNSTOv?Q;}Li5Ow3?8<=pxP}YnX=Dxw@HfT~3H=TZp zM%bt-gH|KGsO+J1F6sSl_{N?8@v3bcluH~XXyYk#&(+$i6D%TLEy)%^^-G#fkGu-Q zrn1T)=(zT}Aqsacv!sSn5yY>5_uMf^pw_gPN-)T6oMa#AaCTf|6a*)^Q-d({qI1OO z$iPZ-Hy;RcF$&t3t#WKz#@lTf!}=Nj-4iaUcsV^xi((!GUM*6P!-hdj(z+Og1fJXp zCZG1waLX|pYvI00PG0a^;%DAZTyg!e|B;wI%b+YGmrWEC96E1&6a=w#CJ3%mGI5-b zG$;YQ9F=3RwB!^2m2*dUVhqGt5Y=$T_s*r+B#i)-J{gkoEhlxndZ?bdkOLm7NTo+a z5$Su@Qt1Mg$vFt-t%yXVGgdak?|ko~l@Mk!mWo+Umde>LWlG+Wph^wkVr~=>y>_I6 zq&MQ8u%)!>c#pKKO6oY_-1Uc_K6gbgb&{SbY`6}U%c&DE#8ReUKsfY(;wofz_(DH& zgor_oyftsKa|(ANkPI$TUf=ihFKn%tcFN(YP$>>`VjORc#qcx=V!Xkn;fi@BKwqqp-a zY?TIB1VO#Z>-2czw_*}}AFI#;V*iDQ7Iz&M6kMv&d@Lve2OJSTD2lsBQB3mzR|lx; z=`Sb>I`(uYl1(5PI^h)T1%;f@&eLlSc#~8sT=~{1~pP_AfbW;g4*32q%)ThMbu;?P5Zp1O=kNh*B1i zJ5XE_u>uNN$N`UpihNANc@GqC6!XL`9(&f}r@wDS7M_q5B9Wt1(rWJnS;SJi_^I4` zRZk=uN}GGKEM2sGUjSKPsi{R-Q0%<_5?q9kT+&Mg2>JxMoq8gOVyvT#0g)Rw(t;pj znPLaEe48SzfPm6%-W=Nh(MuQS;35QNQfu-Fsl7SP$kAfFoHC6T^Ta^sQ_e=?%bfDE zSwc^?gI2mygGNWDqqlJUu}rJ|sYfj;CMNxBT_n6+5NesGH?wpKLn94yd`8g-vx?C(OP53MM~xrL=! zU6$qAPQC?;qh$q*C}`wTyJrjGnWnV26w9W?Sc%^h3&=8i+huF%n2hsV+W;L(Q; z@0&wM%IGVP{C{&_b!6XMwOvMkVw=&p+Cg*gn@?^ZJEAB)6Gys(M}BrP^7C=zfxFvb z&M)ns@$mMq9M*{+WjJ2j9yGBGe|Z1Mm$qME zwd)R=eV^f9*xstcaOT;sy!DD_kH5;Y@mE-}#=!P4YXb;oc)}+5hgpZoe^udm@6f2ZQ_fZT*4Z&JF)5LL#0X fJo4My$Ieo59zH4~o0CZY+uM)spSFGUzb^Ve3VGSj delta 14164 zcmZ{rZLBRMrko+oV8}wteF5!RY=gr@WGdee6SLN@q;gz zcoXf1-89%Vq#Eg1w}=I8?>SBJ1?ho%F)E}Yq?B3^E20%>2x*XL140a_ZT&s7=6Tl4 zzMGQ}y6;(g)_*;(|L4Ev-1_8Iw?28*@0>nSHNJN5xaFlMYgg456xHBXZyr{w>yG_= z<%WMa_4tE(r}xvM;g$=>Rqd`-7v)tidg;lg+5N0b^QtRkm5aNc^^(&U>5ktktNcz} zFUzZ{@mbZbXZgJ9RiJNz+qLS3yy|u1s-3ugG_U%Jan(*-Kb2SA%&NL-cJ274(=X67 z{tBx?wbQDT{{NO z1(p1`SXUgtHLhx!wry*7LFJk%?)vUscU`f$;?C8h>%#du#rKO9NWeC+E-M*D5|pVTi-REE^Y;1=j5Y2OMZrz z-FC^E{|80q$~Zl!2u;tILo==^3Q)+Va}=(hp=kQ5?PW{(Y0578zVTH?(PNQuTLBgN zwhb=I(u898#_-;C9jns!@{jz4;LD~8;~GA8p%2^J$JzF662D4Dq|a4yd&GF5%|yHs=E)?z%1*@T1Du58Hrn2$WPbQ?Gi&%&mGa%v5W0=fU0!f zyQZzvciGf8O$=&XSNa$lziAlSNkf)LBz z6AP|3Gqf(+vq04JO_%V_%;1La-+O+F2jBK(f(W$Gv=~mq4kU3qDyw-s1fJZaKr4z^ zI{e+X77tC+cLb{0rV4HF7F*ci>zgaqzQPxiOW8h@k)%prVf(P<3pSh^0(ickqNgj{ zI{FwpGeqn|?94S?a@&c*{=JV(Z|hT_Qep zUG00rKy~OVOU#I8n|5Y`@u0&?-g(*DkqVV=8k$%VH&ZHMhg!C@?>Qf$B#K(L?Ymev z6NbKQYN8_q#SmQ6hdSFKIOp96X>Nx<6%2h{YI>2IRoV3+V*t|@hIwAJq4t_mS_=AHrmM?3qic%jipr&dUyyU^c4vYHGQv|yynEJ8} zvG$!|;M`RmEprLoo?<9~=NR7ft~11>oZXxeYK~)=I*Q;Hh+5KBok9BatvZ7O;apcW z_S=ASVs9V&z6o{QDpH&4Zr^+1=HD(l`J2O)_gn%RNy3Z<Z=@`RYl-T$HD5g>-+OFtMLDV! zIyxR@smn>)`Ia2k#p3HO)s0zT_~9GxIrBXYfuWTb5ab&6+*Chs{Kc6%{h6!}k_B(-wYs<-Lb%3fTk|Z?lphntmU9x9ridp&T1k+44vNMEB&_ zAt=A7Fc`(-}DMFQFTTf~Z@hMg=pUp1)+z*dv6CO5?rRvLX??$ zHotu9iTAGy87=0{_FkyAhCMuPVQFc&dg^f=lBf?;P|>}8O}TGu$ei?toO!+`bMxXpbmXF( z&p-@cd7t$DShm&omzx;8S^wUD+b99eIGTkJO!WNsBBh&p2et-7Eh3pDY6Yh zF+BhMhwH$wY&DP`S2j#tlPh4~=6v~D2cuA{BnVhhM+|<$98T%AU~nDmWUA?sA9!jz zNqipfxif9%k-9Mnh<<%fe$2O2>@ zb(iI*7=H5TVBOM>qSId7_)ub9`$(15Jx2_%9{oHTf^W830>RL?fyqJ*;UUjep4K2M ze&W(IU;O$9&a9bun7xfhP<%?Bq_qG=WRVzcpJOzEs5**D@*Uqq#$amCAQ%+1wqb~d zu9?V$f!O@v`&MVx#6FWK1!f9@nt~+NYWfHXTJQs+)Z8Dg3_>6+UO z^^PKuWgV#xt%?*x4}}!^AdqGl-uX9&YxoH4EMXnVJ5^t!gK5vUl&>*~EhsB2nI3F3 z2&*@YE$Lb8DZyY;k<1T`>qZ}E2*u{ZA6nhJE|4H#jJC0eOhmZCf^;rS0XbW^1E$>> zZDrVG->P2*gc57$a7|Pv(28UD;z#aZH}E6`!^slp4JA5>B7pKQEkRG1ha{At$6x8o zAYe#$RhAOqZAhVNm=3L@ORP{45D+IGA|PnrR?iBDx=PE|dhMz$wUy$$z(7n|mZ15< zjH%h0oLD6GD!7PT(KXawfi%PL^1p>IiomD+50?{K2xAF*(I>TYG>d!>7Pn;wVnRbW z5CTGsjY0%OpDKF-wGV2)jp4^WnmB8vQy~~UbyFEwF-?>i1A5iM4mGN?ih==IM-(jM zQgC$`+;kr7(4w&=dNQ-aTmKGU&@Jh@)4^qurtzB{y3zC*1GZjZaI{|KF%6?AC(S%2 zP<#l(^k@+=sMkr;m|?j4V<=0aF6Rn?v_s3##}>35+f=?tM_8lOfDN>6bH->;3y zKn&rP7T}~O8Mka1!-qb8xQ66WKCCh#x#mt&cqdttDPD@~6kAbMKzHme-I?-2wB;;zd9K(}`2V+x51t9wou7Jaj&0N2`| z13ZQ3s>}-1Ow2MlLkfhirqNZcK#}^9Pad2KUCnT%gEXl{5?SYT4nDWJ{!9B;wiHkl z{8@`aRD*X}nd1y6eCej^q8|oI35#GRF5sDmT9k5 z8}S=Q7s@ifjFi*0!sr*K1IV~MdUnir{QbdNcjWIKImYyWnf@uL|acg!bi02sKNXWTU zP!aTyBxs_BT+4t&3or~!j@#6^82;r`+;Ui2f&~}*p~N(XFh#qO~bF}MTjdEN{7~@8p5at7blVt3lIjEhOqwM0X1D^3 z!R*jNaB{2R5&(r_Je@%(hS&ZhJt?5HYL1Tlz(K(h^rC0lCnU`mh$XXl00X*u-%SUV z5`_Mwx3MEaSc>Hs;R3xJ-8{qa3y+f*G@aTc21WoR2AxH*!+6`3F^~rfJ0NP&l@el# z6IX2355U0vCuLwdkD~;jh>d=mVfd|oVz!nc(PZNyBCMlR=@+LSltEDaGYH8y26_#B zk>n~kf;mI_c9WSiV=jkUf*Ahdvj<=xud|ZISXHAKsxtzZ7S5>9Bqrxbf#8;fnb8^} z{ug>@0U^q(nn^t8C??B*7#{y;FyL}VEZvl`iKsH)w9K0e46xXYL0nG5S2;44a1i3b z`T=~FE6@p{_=X0NL|k*m(YHSL3C3CqC7RP{Zd?Zl<}s@f=Np2Nb7lxQ05hc-f?`Yv znIUM~at)CpLafF#mq=I!apMyL0_l_nqO}naC;^sIw4p6aP|ghmhpV|y*Fg+N)(9VN zqRwLefV`;DMObp@v{kN;?)W?)qFgg&y_b+c7E#_`$mBhD2O(ge$5w>m*Qm7AB79R* za<^<5yqR0f5~N0*xLvlyr@#0JASe-8e-m#=8cjKc{cKP9UdQhhlVA`I!0eh<6D-_C z65|?{$RscX!yv?Y($x$@adhREu*6n=QY*En@@SM>+jIoME!h@`uGe=aq;U~=opB|^ z7dXZgZFGB?Y!i*0f%v&E3kV8!u9i|H;5!k04Me)rx|~ z$1pnurZ|raffU7NileW6B?<_s3|1!y5tx^{8I@-n#8@WG#9ZKT**Kkmr7f~gZ7IqP zHN`9UPwqmIZRNNb#Nk(QM~m9Q@221?5F1hLEn}&&OG_|*ErJ3am<#x1MtPYB!`3!Q zAblXoOb`iqBsiwsC5Wg0Lo6W!70fq1r@$TDscWpAZ;A1xDvcR}f}`;oK>9L4L1c10 zuI`Yg&P8MTt%zl?&@J8P=*-h22rgmrT>&&svP^3i@`RmyjLbCl=jW26W^fs1Ao0#3 zli`<3zNsUK@KeFimytRA%-0UC;ms0hB~Dyy9S=CHbhK@Vm*KOdCke z-2SMYnWT6H$I1{&sJt&CD00Nz`(JO^UsJ@HmyOiObR_qtvXUQ0Q`>a3b9yhq?Ce^3 zLu^`&!$>tYHV|}Lf-F4>#L_&|BxWFn-}v@rV1RIBEdvblx`@W#c^I}zq0j>BYRm#Y zGL)IG<;5I$rD5RSlsYRP4a3pJ|I<+k<^7;+2S#`#QH!@UE051qW5*mpT_0|I>cy|=(o0i$OPRr>j-xr5p2J8>Kn@~+TAdT=_Z zV|u0I<~j#UME#ly5W9->nfkFAyBO|y_Of5(Qf(e|j4JrwjGc&w8Hfuo3qpx}N46n` zDh2`_8|BES+}QhWEN=VFC12RPY^a{Qbj@JKKs_C%AfaHn3YS>V={Wj$#zm%WMcdVF zD=%6>-j*Qa4nF->wypG1I3NA!q37PXcR59!H~RFjfZ%I&BR>9N)V}3O8Oo7u(?cZ~ zWcCvub9nZEhENo3ONdG5Hh1o=POX8?-N=LnHBj_Po!{{BR#MM~qVc($#4HH2Lvdh^ zPLYL)7?CK77HFb6ZVQy>UU6)7-*G`PYwMr@zP2Y&Y}2f{m$|8y({@up3kq)0!}KB~ zsoF6gj(c&6ComPenSiHXN zAq9gdGtBmOUvv&RzS$RX8!)BGU^{urR%z!m{&GWDljd7)efg;CKL$CKQES_i>AD zalu_2TwNB=Jo3bMuYUYe$pCo36u6RxXz<=`KKz2!6+eVcT+fzIQ<(;i&0PXWTYXkqs9FR#Gz(i9Cm?*YH5 z&sEp0isNgpA7|_tb22t7*TkHeosIP*z21;ZDM4w)2&W=vAOzVya$BOQPw%XFJtDpH zI5X#`u3!E1J_@+JI-*y+=*{xRueB~m-xrgrCp_d#KZ{pugj^I!wJ29n^spNT~O3iM8O(}Tf9@D z+fm=7qa-kFCz5bio!i9KoyShWR=H`hyB~TFTv=cFDA>VmUVYQ*DoPjXkP7CbOv99K zG#Igyw>0t=yuQgFE}Xmjm8;LL)?y5KXaZ2MBMG7uhL2gf8%;@vn41#gAX=FzF$ix{ zTlmUV1EQ6l4dt14XSYoG)mN`>J;voP`m$0x4kjUHm>^XaL;`}hoGi%3pyIlk$VuA} z+o<&vDK#*ESb@@KK}Aytw0~J_{w&V@`wy<_=dDp=CB@Q%3T{g=j0s4*SvS^6{U+>k z5mgW(-rq13#4&W$+zelX>1GrNj*LY5thD2~cipsl;)e9MF`HZ7zT%H#P>3%$|Bsx` z-nlycEnWAvJ=W2wcdfg9@ASpG?k?8Bn0K!G-PyW7lIQWV%Z}&We(&Dddyk#ISs%G~ zT$YAv*V5z1&mKRKm%jPLcYf+yPMm$qeqQ?VeU@@Dw&SU1AKpKGTz7vot&6+XJvLkS znY3=#fzCcYTlYEE5u$F_^Zs?V?hEp~-G2df_Q~10FU#}V#_xLGQ~MY0Z!Y}i{x9ia yzBw+g+g*$Qdtd(!ZF9^2$vWbH*Scr-_3y7Xw_JR3T(|4chc7sJ>hP+Q7ydt(gng0# diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon/fix/gdas_radmon_satype.txt b/util/Radiance_Monitor/nwprod/gdas_radmon/fix/gdas_radmon_satype.txt index 9d04981c78..30836d410c 100644 --- a/util/Radiance_Monitor/nwprod/gdas_radmon/fix/gdas_radmon_satype.txt +++ b/util/Radiance_Monitor/nwprod/gdas_radmon/fix/gdas_radmon_satype.txt @@ -1,2 +1,2 @@ -abi_g16 abi_g17 ahi_himawari8 amsua_metop-a amsua_metop-b amsua_metop-c amsua_n15 amsua_n18 amsua_n19 atms_npp atms_n20 avhrr_metop-a avhrr_metop-b avhrr_n18 avhrr_n19 cris-fsr_npp cris-fsr_n20 hirs4_metop-a hirs4_n19 iasi_metop-a iasi_metop-b iasi_metop-c mhs_metop-a mhs_metop-b mhs_metop-c mhs_n19 seviri_m08 seviri_m11 ssmis_f17 ssmis_f18 +abi_g16 abi_g17 ahi_himawari8 amsua_metop-b amsua_metop-c amsua_n15 amsua_n18 amsua_n19 atms_npp atms_n20 avhrr_metop-b avhrr_n18 avhrr_n19 cris-fsr_npp cris-fsr_n20 hirs4_n19 iasi_metop-b iasi_metop-c mhs_metop-b mhs_metop-c mhs_n19 seviri_m08 seviri_m11 ssmis_f17 ssmis_f18 diff --git a/util/Radiance_Monitor/nwprod/gdas_radmon/scripts/exgdas_atmos_verfrad.sh b/util/Radiance_Monitor/nwprod/gdas_radmon/scripts/exgdas_atmos_verfrad.sh index 263c3b59a6..58caae2279 100755 --- a/util/Radiance_Monitor/nwprod/gdas_radmon/scripts/exgdas_atmos_verfrad.sh +++ b/util/Radiance_Monitor/nwprod/gdas_radmon/scripts/exgdas_atmos_verfrad.sh @@ -182,7 +182,7 @@ if [[ -s ${radstat} && -s ${biascr} ]]; then # optionally run clean_tankdir script # if [[ ${CLEAN_TANKVERF} -eq 1 ]]; then - ${USHradmon}/clean_tankdir.sh glb 40 + ${USHradmon}/clean_tankdir.sh glb 60 rc_clean_tankdir=$? echo "rc_clean_tankdir = $rc_clean_tankdir" fi diff --git a/util/Radiance_Monitor/nwprod/nam_radmon/fix/nam_radmon_satype.txt b/util/Radiance_Monitor/nwprod/nam_radmon/fix/nam_radmon_satype.txt index cab5bae0e2..e7a45ea763 100644 --- a/util/Radiance_Monitor/nwprod/nam_radmon/fix/nam_radmon_satype.txt +++ b/util/Radiance_Monitor/nwprod/nam_radmon/fix/nam_radmon_satype.txt @@ -1,2 +1,2 @@ -airs_aqua amsua_aqua amsua_n18 amsua_metop-a amsua_metop-b amsua_n19 iasi_metop-a iasi_metop-b hirs4_n19 mhs_metop-a mhs_metop-b mhs_npp mhs_n19 seviri_m08 seviri_m10 +airs_aqua amsua_aqua amsua_n18 amsua_metop-a amsua_metop-b amsua_n19 iasi_metop-a iasi_metop-b hirs4_n19 mhs_metop-a mhs_metop-b mhs_npp mhs_n19 seviri_m08 diff --git a/util/Radiance_Monitor/nwprod/radmon_shared/sorc/verf_radtime.fd/time.f90 b/util/Radiance_Monitor/nwprod/radmon_shared/sorc/verf_radtime.fd/time.f90 index df93ce2c5e..5e637c353a 100755 --- a/util/Radiance_Monitor/nwprod/radmon_shared/sorc/verf_radtime.fd/time.f90 +++ b/util/Radiance_Monitor/nwprod/radmon_shared/sorc/verf_radtime.fd/time.f90 @@ -311,6 +311,7 @@ program time ! If observation was assimilated, accumulate sums in appropriate regions if (data_chan(j)%errinv > 1.e-6) then + pen = (data_chan(j)%errinv*(data_chan(j)%omgbc))**2 cor_tot(1) = (data_chan(j)%omgnbc - data_chan(j)%omgbc) diff --git a/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_ck_stdout.sh b/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_ck_stdout.sh deleted file mode 100755 index a3d0a67f45..0000000000 --- a/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_ck_stdout.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/bin/ksh - -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: radmon_ck_stdout.sh -# Script description: Scan stdout files for problems reading the diagnostic -# files. -# -# Author: Ed Safford Org: NP23 Date: 2012-02-02 -# -# Abstract: This script scans the stdout files produced by the radmon_time -# executable for problems reading the diagnostic files. -# -# This script is a child script of radmon_verf_time.sh. The parent -# script generates the stdout files which this script examines. -# -# -# Script history log: -# 2012-02-02 Safford initial script -# -# Usage: radmon_ck_stdout.sh outfile -# -# Input script positional parameters: -# outfile output file name -# required -# -# Imported Shell Variables: -# SATYPE list of satellite/instrument sources -# defaults to none -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# err Last return code -# -# Modules and files referenced: -# scripts : -# -# programs : -# -# fixed data : -# -# input data : $data_file -# -# output data: $outfile -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -#################################################################### - -# Command line arguments. -outfile=${1:-${outfile:?}} - -# Other variables -SATYPE=${SATYPE:-} -err=0 - -if [[ "$VERBOSE" = "YES" ]]; then - set -ax - echo "$(date) executing $0 $* >&2" -fi -################################################################################ -# Preprocessing - -outfile=$1 -error_msg="PROBLEM reading diagnostic file" - -for type in ${SATYPE}; do - if [[ "$VERBOSE" = "YES" ]]; then - echo ${type} - fi - if [[ -s "stdout.${type}" ]]; then - if [[ "$VERBOSE" = "YES" ]]; then - echo stdout.${type} - fi - match=`gawk "/$error_msg/" stdout.$type` - - match_len=`echo ${#match}` - if [[ $match_len > 0 ]]; then - echo "${type} ${match}" >> $outfile - fi - fi -done - -################################################################################ -# Post processing -if [[ "$VERBOSE" = "YES" ]]; then - echo $(date) EXITING $0 with error code ${err} >&2 -fi - -set +x -exit ${err} diff --git a/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_verf_time.sh b/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_verf_time.sh index 0b3506e20a..4603dad218 100755 --- a/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_verf_time.sh +++ b/util/Radiance_Monitor/nwprod/radmon_shared/ush/radmon_verf_time.sh @@ -27,8 +27,6 @@ # yyyymmddcc format; required # # Imported Shell Variables: -# DO_DIAG_RPT switch to build the diagnostic report -# defaults to 1 (on) # DO_DATA_RPT switch to build the data report # defaults to 1 (on) # RADMON_SUFFIX data source suffix @@ -122,7 +120,6 @@ if [[ $RADMON_NETCDF -eq 1 ]]; then netcdf_boolean=".true." fi -DO_DIAG_RPT=${DO_DIAG_RPT:-1} DO_DATA_RPT=${DO_DATA_RPT:-1} RADMON_SUFFIX=${RADMON_SUFFIX:-opr} RAD_AREA=${RAD_AREA:-glb} @@ -291,10 +288,11 @@ fi #------------------------------------------------------------------- #################################################################### -if [[ $DO_DIAG_RPT -eq 1 ]]; then - echo "DOING DIAG RPT!!!" -# build the disclaimer and region files +if [[ $DO_DATA_RPT -eq 1 ]]; then +#--------------------------- +# build report disclaimer +# cat << EOF > ${disclaimer} @@ -338,7 +336,7 @@ EOF lines=`wc -l <${diag}` echo "lines in diag = $lines" - if [[ $lines -gt 1 ]]; then + if [[ $lines -gt 0 ]]; then cat ${diag_report} cp ${diag} ${TANKverf_rad}/bad_diag.${PDATE} else @@ -346,13 +344,7 @@ EOF fi fi -fi - -#------------------------------------------------------------------- -# Assemble the bad penalty/channel report - -if [[ $DO_DATA_RPT -eq 1 ]]; then #---------------------------------------------------------------- # Identify bad_pen and bad_chan files for this cycle and @@ -429,7 +421,6 @@ if [[ $DO_DATA_RPT -eq 1 ]]; then if [[ $do_pen -eq 1 ]]; then echo "calling radmon_err_rpt for pen" -# $NCP ${TANKverf_radM1}/${prev_bad_pen} ./ ${radmon_err_rpt} ${prev_bad_pen} ${bad_pen} pen ${qdate} \ ${PDATE} ${diag_report} ${pen_err} fi @@ -437,7 +428,6 @@ if [[ $DO_DATA_RPT -eq 1 ]]; then if [[ $do_chan -eq 1 ]]; then echo "calling radmon_err_rpt for chan" -# $NCP ${TANKverf_radM1}/${prev_bad_chan} ./ ${radmon_err_rpt} ${prev_bad_chan} ${bad_chan} chan ${qdate} \ ${PDATE} ${diag_report} ${chan_err} fi @@ -457,7 +447,6 @@ if [[ $DO_DATA_RPT -eq 1 ]]; then echo DOING ERROR REPORTING -# echo "Begin Cycle Data Integrity Report" > $report cat << EOF > $report Radiance Monitor warning report @@ -527,13 +516,9 @@ EOF rm -f ${pen_err} fi -# if [[ $USE_MAIL -eq 1 ]]; then - echo >> $report - cat ${disclaimer} >> $report -# else -# echo End Cycle Data Integrity Report >> $report - echo >> $report -# fi + echo >> $report + cat ${disclaimer} >> $report + echo >> $report fi #------------------------------------------------------------------- diff --git a/util/Radiance_Monitor/parm/RadMon_config b/util/Radiance_Monitor/parm/RadMon_config index f2d2ece60d..d411da3902 100644 --- a/util/Radiance_Monitor/parm/RadMon_config +++ b/util/Radiance_Monitor/parm/RadMon_config @@ -20,7 +20,7 @@ export MONITOR=radmon # you checked out only the Radiance_Monitor portion of the branch then # MY_RADMON should point to that. # -export MY_RADMON=${MY_RADMON:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/GSI/util/Radiance_Monitor} +export MY_RADMON=${MY_RADMON:-/lfs/h2/emc/da/noscrub/Edward.Safford/git/gsi/GSI/util/Radiance_Monitor} # # The MY_TANKDIR will be the location for the extracted data files and @@ -28,7 +28,7 @@ export MY_RADMON=${MY_RADMON:-/gpfs/dell2/emc/modeling/noscrub/Edward.Safford/GS # and the succedding scripts will construct and use subdirectories under # this location. # -export MY_TANKDIR=${MY_TANKDIR:-/u/Edward.Safford/nbns} +export MY_TANKDIR=${MY_TANKDIR:-/lfs/h2/emc/da/noscrub/Edward.Safford/nbns} export RUN=${RUN:-gdas} @@ -39,13 +39,16 @@ TANKimg=${TANKimg:-${MY_TANKDIR}/imgn} if [[ $RAD_AREA = "rgn" ]]; then TANKverf=${TANKverf}/regional - TANKimg=${TANKimg}/regional + TANKimg=${TANKimg}/regional/${RADMON_SUFFIX} export RUN="" export TANK_USE_RUN="" +else + TANKimg=${TANKimg}/${RADMON_SUFFIX}/${RUN} fi export TANKverf=${TANKverf}/${RADMON_SUFFIX} -export TANKimg=${TANKimg}/${RADMON_SUFFIX} +export TANKimg=${TANKimg}/radmon +export IMGNDIR=${TANKimg}/pngs # @@ -67,16 +70,15 @@ export WEBDIR=${WEBDIR:-/home/people/emc/www/htdocs/gmb/gdas/radiance/esafford} ############################################################################### ############################################################################### -export MY_MACHINE=wcoss_d -export LITTLE_ENDIAN=${LITTLE_ENDIAN:-0} +export MY_MACHINE=wcoss2 # # Log and work space definitions # -export MY_PTMP=${MY_PTMP:-/gpfs/dell2/ptmp} +export MY_PTMP=${MY_PTMP:-/lfs/h2/emc/ptmp} export PTMP_USER=${PTMP_USER:-${MY_PTMP}/${LOGNAME}} -export MY_STMP=${MY_STMP:-/gpfs/dell2/stmp} +export MY_STMP=${MY_STMP:-/lfs/h2/emc/stmp} export STMP_USER=${STMP_USER:-${MY_STMP}/${LOGNAME}} LOGdir=${LOGdir:-${PTMP_USER}/logs/${RADMON_SUFFIX}} @@ -211,6 +213,20 @@ elif [[ $MY_MACHINE = "jet" ]]; then export RADMON_PARTITION=${RADMON_PARTITION:-kjet} +elif [[ $MY_MACHINE = "wcoss2" ]]; then + module load prod_util/2.0.13 + module load util_shared/1.4.0 + + #------------------------ + # temporary workaround + # + module use /apps/test/modules + module load GrADS/2.2.1-cce-11.0.4 + #------------------------ + + export SUB="qsub" + export COMPRESS=/usr/bin/gzip + export UNCOMPRESS="/usr/bin/gunzip -f" fi diff --git a/util/Radiance_Monitor/parm/RadMon_user_settings b/util/Radiance_Monitor/parm/RadMon_user_settings index f14fc0bd14..588325d54e 100644 --- a/util/Radiance_Monitor/parm/RadMon_user_settings +++ b/util/Radiance_Monitor/parm/RadMon_user_settings @@ -79,14 +79,6 @@ export USE_TM=${USE_TM:-tm12} # for most parallels. 0 = off, 1 = on export USE_STATIC_SATYPE=${USE_STATIC_SATYPE:-1} -# -# DO_DIAG_RPT switches on/off the diagnostic error reporting. This is check -# primarily intended for use with the operational data sets (GDAS,NDAS) where -# detection and reporting of a missing sat/instrument source in a given cycle run -# is desirable. It is not normally necessary in parallels. 0 = off, 1 = on -export DO_DIAG_RPT=${DO_DIAG_RPT:-0} - - # DO_DATA_RPT switches on/off error checking and reporting of the penalty values # by channel for each sat/instrument source. This is a check primarily intended # for use iwth the operational data sets (GDAS,NDAS) where detection and @@ -94,7 +86,9 @@ export DO_DIAG_RPT=${DO_DIAG_RPT:-0} # desirable. It is not normally necesary to apply this to parallels. 0 = off, 1 = on export DO_DATA_RPT=${DO_DATA_RPT:-0} - +# +# MAIL_TO and MAIL_CC are the email addresses used to distribute warning messages. +# export MAIL_TO=${MAIL_TO:-'edward.safford@noaa.gov'} if [[ -e /u/${LOGNAME}/bin/get_cc_list.pl ]]; then @@ -126,6 +120,11 @@ else export CYCLE_INTERVAL=${CYCLE_INTERVAL:-6} fi +# +# NUM_CYCLES is the number of cycles to be used time series plots. +# +export NUM_CYCLES=${NUM_CYCLES:-121} + # # RUN_TRANSFER allows for an immediate invocation of the Transfer.sh script # after plotting is complete. From b0b5f4f444c63e1c46270e7676a91d4700346d02 Mon Sep 17 00:00:00 2001 From: "andrew.eichmann" Date: Thu, 24 Feb 2022 23:10:05 +0000 Subject: [PATCH 20/26] GitHub Issue NOAA-EMC/GSI#311 --- jobs/JGDAS_EFSOI | 2 +- jobs/JGDAS_EFSOI_FCST | 5 ++++- scripts/exgdas_efsoi.sh | 29 ++++++++++++++++++++--------- scripts/exgdas_efsoi_update.sh | 5 ++++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/jobs/JGDAS_EFSOI b/jobs/JGDAS_EFSOI index b3fd5180da..af60ddeb7b 100755 --- a/jobs/JGDAS_EFSOI +++ b/jobs/JGDAS_EFSOI @@ -79,6 +79,7 @@ vPDY=$(echo $VDATE | cut -c1-8) vcyc=$(echo $VDATE | cut -c9-10) export APREFIX="${CDUMP}.t${cyc}z." +export VPREFIX="${CDUMP}.t${vcyc}z." export GPREFIX="gdas.t${gcyc}z." export ASUFFIX=${ASUFFIX:-$SUFFIX} export GSUFFIX=${GSUFFIX:-$SUFFIX} @@ -105,7 +106,6 @@ ${EFSOIUPDSH:-$SCRgfs/exgdas_efsoi.sh} status=$? [[ $status -ne 0 ]] && exit $status - ############################################## # End JOB SPECIFIC work ############################################## diff --git a/jobs/JGDAS_EFSOI_FCST b/jobs/JGDAS_EFSOI_FCST index ce4f8ec03c..a9e4fc78f1 100755 --- a/jobs/JGDAS_EFSOI_FCST +++ b/jobs/JGDAS_EFSOI_FCST @@ -62,6 +62,8 @@ if [ $RUN_ENVIR = "nco" ]; then export ROTDIR=${COMROOT:?}/$NET/$envir fi +# tells the forecast script to use efsoi ensemble +export EFSOI_TASK="YES" ############################################## # Begin JOB SPECIFIC work @@ -81,7 +83,8 @@ export FHMIN=$FHMIN_ENKF export FHOUT=$FHOUT_ENKF export FHMAX=$FHMAX_ENKF -export FORECASTSH=$HOMEgfs/scripts/exglobal_efsoi_forecast.sh +export FORECASTSH=$HOMEgfs/scripts/exglobal_forecast.sh + # Get ENSBEG/ENSEND from ENSGRP and NMEM_EFCSGRP export ENSEND=$((NMEM_EFCSGRP * ENSGRP)) diff --git a/scripts/exgdas_efsoi.sh b/scripts/exgdas_efsoi.sh index f2763ff311..8d9b6bfebe 100755 --- a/scripts/exgdas_efsoi.sh +++ b/scripts/exgdas_efsoi.sh @@ -44,7 +44,7 @@ APRUN_ENKF=${APRUN_ENKF:-${APRUN:-""}} NTHREADS_ENKF=${NTHREADS_ENKF:-${NTHREADS:-1}} # Executables -EFSOIEXEC=${EFSOIEXEC:-$HOMEgfs/exec/efsoi.x} +EFSOIEXEC=${EFSOIEXEC:-$HOMEgfs/exec/global_efsoi.x} # Cycling and forecast hour specific parameters CDATE=${CDATE:-"2001010100"} @@ -54,6 +54,8 @@ GPREFIX=${GPREFIX:-""} GSUFFIX=${GSUFFIX:-$SUFFIX} APREFIX=${APREFIX:-""} ASUFFIX=${ASUFFIX:-$SUFFIX} +VPREFIX=${VPREFIX:-""} +VSUFFIX=${VSUFFIX:-$SUFFIX} SMOOTH_ENKF=${SMOOTH_ENKF:-"YES"} @@ -65,11 +67,11 @@ RADSTAT=${RADSTAT:-${APREFIX}radstat} # AFE not needed? EFSOISTAT=${EFSOISTAT:-${APREFIX}efsoistat} #AFE for EFSOI -#VERFANL=${VERFANL:-${APREFIX}atmanl.nemsio} -VERFANL=${VERFANL:-${APREFIX}atmanl.ensres.nc} +VERFANL=${VERFANL:-${VPREFIX}atmanl.ensres.nc} +INITANL=${INITANL:-${APREFIX}atmanl.ensres.nc} FCSTLONG=${GPREFIX}atmf030.ensmean.nc FCSTSHORT=${APREFIX}atmf024.ensmean.nc -FCST6HRS=${PPREFIX}atmf006.ensmean.nc +#FCST6HRS=${PPREFIX}atmf006.ensmean.nc OSENSEIN=osense_${CDATE}_init.dat OSENSEOUT=osense_${CDATE}_final.dat @@ -186,12 +188,21 @@ done $NLN $COMIN_GES_ENS/${GPREFIX}atmf006.ensmean${GSUFFIX} sfg_${CDATE}_fhr06_ensmean $NLN $COMIN_GES_ENS/${GPREFIX}atmf006.ensmean${GSUFFIX} sfg_${CDATE}_fhr03_ensmean +# The following deals with different files with the same local name (assuming +# a 24hr EFSOI forecast): +# both are hybrid analyses from gdas - one from CDATE saved during the +# corresponding GDAS cycle in the efsoigdas tree to be used in +# the localization advection in EFSOI, the other from VDATE to be used +# for verification. + +# saved analysis to be used for localization advection +#$NLN ${COMIN_ANL}/${VERFANL} ${APREFIX}atmanl.ensmean.nc +$NLN $COMOUT_ANL_ENSFSOI/${INITANL} ${APREFIX}atmanl.ensmean.nc + # verifying analysis -$NLN ${COMIN_ANL}/${VERFANL} . -# the above way is the proper one, but this bit of subterfuge -# is necessary because ensmean is hard coded into GSI - needs -# to changed -$NLN ${COMIN_ANL}/${VERFANL} ${APREFIX}atmanl.ensmean.nc +#$NLN ${COMIN_ANL}/${VERFANL} . +$NLN $ATMGES_ENSMEAN . + # forecasts $NLN $COMIN_GES_ENS/$FCSTLONG . diff --git a/scripts/exgdas_efsoi_update.sh b/scripts/exgdas_efsoi_update.sh index a69aa766a3..5f178d5d2a 100755 --- a/scripts/exgdas_efsoi_update.sh +++ b/scripts/exgdas_efsoi_update.sh @@ -59,6 +59,7 @@ ASUFFIX=${ASUFFIX:-$SUFFIX} SMOOTH_ENKF=${SMOOTH_ENKF:-"YES"} GBIASe=${GBIASe:-${APREFIX}abias_int.ensmean} +ATMANL_GSI_ENSRES=$COMINatmos/${APREFIX}atmanl.ensres$ASUFFIX CNVSTAT=${CNVSTAT:-${APREFIX}cnvstat} OZNSTAT=${OZNSTAT:-${APREFIX}oznstat} RADSTAT=${RADSTAT:-${APREFIX}radstat} @@ -397,8 +398,10 @@ export ERR=$rc export err=$ERR $ERRSCRIPT || exit 2 -# save for EFSOI task (still needed?) +# save for EFSOI task $NCP $COMOUT_ANL_ENS/$GBIASe $COMOUT_ANL_ENSFSOI +# save for EFSOI localization advection +$NCP $ATMANL_GSI_ENSRES $COMOUT_ANL_ENSFSOI # Cat runtime output files. cat stdout stderr > $COMOUT_ANL_ENSFSOI/$ENKFSTAT From 9f52e0b8d24b7fe7ba80ea11cb8735676940b407 Mon Sep 17 00:00:00 2001 From: "andrew.eichmann" Date: Mon, 28 Feb 2022 19:28:44 +0000 Subject: [PATCH 21/26] GitHub Issue NOAA-EMC/GSI#316 --- util/EFSOI_Utilities/src/efsoi.f90 | 8 ++++---- util/EFSOI_Utilities/src/loadbal_efsoi.f90 | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/util/EFSOI_Utilities/src/efsoi.f90 b/util/EFSOI_Utilities/src/efsoi.f90 index 54527c559c..8dbf386ef7 100644 --- a/util/EFSOI_Utilities/src/efsoi.f90 +++ b/util/EFSOI_Utilities/src/efsoi.f90 @@ -42,7 +42,7 @@ module efsoi indxproc_obs, nobs_max use scatter_chunks_efsoi, only: fcerror_chunk, anal_chunk use enkf_obsmod, only: oberrvar, ob, ensmean_ob, obloc, obloclon, obloclat, oblnp, & - obtime, nobstot, corrlengthsq, lnsigl, obtimel, anal_ob + obtime, nobstot, corrlengthsq, lnsigl, obtimel, anal_ob_post use constants, only: constants_initialized, pi, zero, one use params, only: nanals, corrlengthnh, corrlengthtr, corrlengthsh, & tar_minlon, tar_maxlon, tar_minlat, tar_maxlat, & @@ -300,19 +300,19 @@ subroutine efsoi_update() call mpi_send(anal_obchunk_prior,numobsperproc(nproc+1)*nanals,mpi_real4,0, & 1,mpi_comm_world,ierr) else - allocate(anal_ob(1:nanals,nobstot)) +! allocate(anal_ob_post(1:nanals,nobstot)) allocate(buffertmp(nanals,nobs_max)) do np=1,numproc-1 call mpi_recv(buffertmp,numobsperproc(np+1)*nanals,mpi_real4,np, & 1,mpi_comm_world,mpi_status,ierr) do nob1=1,numobsperproc(np+1) nob2 = indxproc_obs(np+1,nob1) - anal_ob(:,nob2) = buffertmp(:,nob1) + anal_ob_post(:,nob2) = buffertmp(:,nob1) end do end do do nob1=1,numobsperproc(1) nob2 = indxproc_obs(1,nob1) - anal_ob(:,nob2) = anal_obchunk_prior(:,nob1) + anal_ob_post(:,nob2) = anal_obchunk_prior(:,nob1) end do deallocate(buffertmp) end if diff --git a/util/EFSOI_Utilities/src/loadbal_efsoi.f90 b/util/EFSOI_Utilities/src/loadbal_efsoi.f90 index 778468a469..4ba46a4760 100644 --- a/util/EFSOI_Utilities/src/loadbal_efsoi.f90 +++ b/util/EFSOI_Utilities/src/loadbal_efsoi.f90 @@ -95,7 +95,7 @@ module loadbal_efsoi use params, only: datapath, nanals, simple_partition, & corrlengthnh, corrlengthsh, corrlengthtr, lupd_obspace_serial,& efsoi_flag -use enkf_obsmod, only: nobstot, obloc, oblnp, ensmean_ob, obtime, anal_ob, corrlengthsq +use enkf_obsmod, only: nobstot, obloc, oblnp, ensmean_ob, obtime, anal_ob_post, corrlengthsq use kinds, only: r_kind, i_kind, r_double, r_single use kdtree2_module, only: kdtree2, kdtree2_create, kdtree2_destroy, & kdtree2_result, kdtree2_r_nearest @@ -277,7 +277,7 @@ subroutine load_balance_efsoi() do np=1,numproc-1 do nob1=1,numobsperproc(np+1) nob2 = indxproc_obs(np+1,nob1) - anal_obchunk_prior(1:nanals,nob1) = anal_ob(1:nanals,nob2) + anal_obchunk_prior(1:nanals,nob1) = anal_ob_post(1:nanals,nob2) end do call mpi_send(anal_obchunk_prior,nobs_max*nanals,mpi_real4,np, & 1,mpi_comm_world,ierr) @@ -285,10 +285,10 @@ subroutine load_balance_efsoi() ! anal_obchunk_prior on root (no send necessary) do nob1=1,numobsperproc(1) nob2 = indxproc_obs(1,nob1) - anal_obchunk_prior(1:nanals,nob1) = anal_ob(1:nanals,nob2) + anal_obchunk_prior(1:nanals,nob1) = anal_ob_post(1:nanals,nob2) end do - ! now we don't need anal_ob anymore for serial EnKF. - if (.not. lupd_obspace_serial) deallocate(anal_ob) + ! now we don't need anal_ob_post anymore for serial EnKF. + if (.not. lupd_obspace_serial) deallocate(anal_ob_post) else ! recv one large message on each task. call mpi_recv(anal_obchunk_prior,nobs_max*nanals,mpi_real4,0, & From b7b745e3914798075a9914dc7dadda8809c63f11 Mon Sep 17 00:00:00 2001 From: Rahul Mahajan Date: Tue, 1 Mar 2022 23:42:21 -0500 Subject: [PATCH 22/26] remove ush/EnKF directory with obsolete scripts GitHub Issue NOAA-EMC/GSI#318 --- ush/EnKF/analupdate.sh | 208 ---- ush/EnKF/arch.sh | 98 -- ush/EnKF/check_fgfiles_serial.sh | 121 -- ush/EnKF/check_obsfiles_serial.sh | 99 -- ush/EnKF/current.enkfparms | 169 --- ush/EnKF/dateutils.py | 144 --- ush/EnKF/drive_gfs | 205 ---- ush/EnKF/drive_gsi | 369 ------ ush/EnKF/enkfa5.parms | 172 --- ush/EnKF/enkfdriver.sh | 17 - ush/EnKF/firstges_multi.sh | 169 --- ush/EnKF/get_enkf_ic.sh | 325 ------ ush/EnKF/gfscontrol.sh | 138 --- ush/EnKF/global_chgres.sh | 433 ------- ush/EnKF/global_chgresp.sh | 436 ------- ush/EnKF/global_cycle.sh | 369 ------ ush/EnKF/global_cyclep.sh | 373 ------ ush/EnKF/global_postgp.sh | 282 ----- ush/EnKF/global_postgpp.sh | 286 ----- ush/EnKF/incdate | 8 - ush/EnKF/obsproc_ensmean.sh | 115 -- ush/EnKF/obsproc_multi.sh | 110 -- ush/EnKF/para_config.gdas_enkf_fcst | 63 - .../para_config.gdas_enkf_inflate_recenter | 28 - ush/EnKF/para_config.gdas_enkf_innovate_obs | 65 -- ush/EnKF/para_config.gdas_enkf_post | 27 - ush/EnKF/para_config.gdas_enkf_select_obs | 28 - ush/EnKF/para_config.gdas_enkf_update | 28 - ush/EnKF/randates.py | 10 - ush/EnKF/rerun_fg.sh | 90 -- ush/EnKF/rhist_saveenkf.sh | 227 ---- ush/EnKF/run_enkf | 101 -- ush/EnKF/run_enkfupdate_convonly.sh | 141 --- ush/EnKF/run_enkfupdate_testcase.sh | 140 --- ush/EnKF/run_fg_gfs | 79 -- ush/EnKF/run_fg_gfs_multi.sh | 92 -- ush/EnKF/run_gfs | 765 ------------ ush/EnKF/run_gsi | 1039 ----------------- ush/EnKF/runenkf_trunk.sh | 209 ---- ush/EnKF/runobs_multi.csh | 151 --- ush/EnKF/sub_gfsctrlhigh.sh | 75 -- ush/EnKF/test.py | 7 - ush/EnKF/test_gdas_enkf_fcst.sh | 92 -- ush/EnKF/test_gdas_enkf_inflate_recenter.sh | 85 -- ush/EnKF/test_gdas_enkf_innovate_obs.sh | 102 -- ush/EnKF/test_gdas_enkf_post.sh | 80 -- ush/EnKF/test_gdas_enkf_select_obs.sh | 96 -- ush/EnKF/test_gdas_enkf_update.sh | 87 -- ush/EnKF/verifec.py | 238 ---- 49 files changed, 8791 deletions(-) delete mode 100755 ush/EnKF/analupdate.sh delete mode 100755 ush/EnKF/arch.sh delete mode 100755 ush/EnKF/check_fgfiles_serial.sh delete mode 100755 ush/EnKF/check_obsfiles_serial.sh delete mode 100755 ush/EnKF/current.enkfparms delete mode 100755 ush/EnKF/dateutils.py delete mode 100755 ush/EnKF/drive_gfs delete mode 100755 ush/EnKF/drive_gsi delete mode 100755 ush/EnKF/enkfa5.parms delete mode 100755 ush/EnKF/enkfdriver.sh delete mode 100755 ush/EnKF/firstges_multi.sh delete mode 100755 ush/EnKF/get_enkf_ic.sh delete mode 100755 ush/EnKF/gfscontrol.sh delete mode 100755 ush/EnKF/global_chgres.sh delete mode 100755 ush/EnKF/global_chgresp.sh delete mode 100755 ush/EnKF/global_cycle.sh delete mode 100755 ush/EnKF/global_cyclep.sh delete mode 100755 ush/EnKF/global_postgp.sh delete mode 100755 ush/EnKF/global_postgpp.sh delete mode 100755 ush/EnKF/incdate delete mode 100755 ush/EnKF/obsproc_ensmean.sh delete mode 100755 ush/EnKF/obsproc_multi.sh delete mode 100755 ush/EnKF/para_config.gdas_enkf_fcst delete mode 100755 ush/EnKF/para_config.gdas_enkf_inflate_recenter delete mode 100755 ush/EnKF/para_config.gdas_enkf_innovate_obs delete mode 100755 ush/EnKF/para_config.gdas_enkf_post delete mode 100755 ush/EnKF/para_config.gdas_enkf_select_obs delete mode 100755 ush/EnKF/para_config.gdas_enkf_update delete mode 100755 ush/EnKF/randates.py delete mode 100755 ush/EnKF/rerun_fg.sh delete mode 100755 ush/EnKF/rhist_saveenkf.sh delete mode 100755 ush/EnKF/run_enkf delete mode 100755 ush/EnKF/run_enkfupdate_convonly.sh delete mode 100755 ush/EnKF/run_enkfupdate_testcase.sh delete mode 100755 ush/EnKF/run_fg_gfs delete mode 100755 ush/EnKF/run_fg_gfs_multi.sh delete mode 100755 ush/EnKF/run_gfs delete mode 100755 ush/EnKF/run_gsi delete mode 100755 ush/EnKF/runenkf_trunk.sh delete mode 100755 ush/EnKF/runobs_multi.csh delete mode 100755 ush/EnKF/sub_gfsctrlhigh.sh delete mode 100755 ush/EnKF/test.py delete mode 100755 ush/EnKF/test_gdas_enkf_fcst.sh delete mode 100755 ush/EnKF/test_gdas_enkf_inflate_recenter.sh delete mode 100755 ush/EnKF/test_gdas_enkf_innovate_obs.sh delete mode 100755 ush/EnKF/test_gdas_enkf_post.sh delete mode 100755 ush/EnKF/test_gdas_enkf_select_obs.sh delete mode 100755 ush/EnKF/test_gdas_enkf_update.sh delete mode 100644 ush/EnKF/verifec.py diff --git a/ush/EnKF/analupdate.sh b/ush/EnKF/analupdate.sh deleted file mode 100755 index 4e9ea66a09..0000000000 --- a/ush/EnKF/analupdate.sh +++ /dev/null @@ -1,208 +0,0 @@ -#!/bin/tcsh -#@ shell = /usr/bin/tcsh -#@ job_name = enkfa_update -#@ output = $(job_name).$(jobid).out -#@ error = $(job_name).$(jobid).err -#@ notification = never -#@ job_type = parallel -#@ wall_clock_limit = 01:30:00 -#@ class = dev -#@ group = devonprod -#@ account_no = GDAS-T2O -#@ tasks_per_node = 48 -#@ environment = COPY_ALL -#@ node = 8 -#@ node_usage = not_shared -#@ node_resources = ConsumableMemory(110GB) -#@ task_affinity = cpu(1) -#@ network.MPI = csss,shared,us -#@ queue - -# Set environment variables for NCEP IBM -export MEMORY_AFFINITY=MCM -export MP_SHARED_MEMORY=yes - -# Set environment variables for no threads -export AIXTHREAD_SCOPE=S -export XLSMPOPTS="parthds=1:stack=128000000" - -# Environment variables from Carolyn -export LAPI_DEBUG_ENABLE_AFFINITY=YES -export MP_FIFO_MTU=4K -export MP_SYNC_QP=YES -export MP_RFIFO_SIZE=16777216 -export MP_SHM_ATTACH_THRESH=500000 # default is better sometimes -export MP_EUIDEVELOP=min -#RDMA specific tunables: -export MP_USE_BULK_XFER=yes -export MP_BULK_MIN_MSG_SIZE=64k -export MP_RC_MAX_QP=8192 -export LAPI_DEBUG_RC_DREG_THRESHOLD=1000000 -export LAPI_DEBUG_QP_NOTIFICATION=no -export LAPI_DEBUG_RC_INIT_SETUP=yes - -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms - -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycles=10 -set ncycle=1 -echo "ncycle = " $ncycle "and ncycles = " $ncycles - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" -# copy hostfileall to working dir. - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -set niter=1 -set alldone='no' -echo "${analdate} compute analysis increment `date`" -# need symlinks for satbias_angle, satbias_in, satinfo - -##ln -fs ${datapath2}/abias ${datapath2}/satbias_in - -setenv COMINGES /global/noscrub/${LOGNAME}/bias_prd09q1o -setenv ABIAS ${COMINGES}/biascr.${datdump}.${analdate} -ln -fs ${COMINGES}/biascr.${datdump}.${analdate} ${datapath2}/satbias_in -ln -fs ${datapath2}/satang ${datapath2}/satbias_angle -##setenv ABIAS ${datapathp1}/${PREINP1}abias - -ln -fs ${CONVINFO} ${datapath2}/convinfo -ln -fs ${SATINFO} ${datapath2}/satinfo -ln -fs ${OZINFO} ${datapath2}/ozinfo - -set nanal=1 -set filemissing='no' -while ($nanal <= $nanals) - set charnanal="mem"`printf %03i $nanal` - set analfile="${datapath2}/sanl_${analdate}_${charnanal}" - if { /bin/test ! -s $analfile } set filemissing='yes' - @ nanal = $nanal + 1 -end -##if { /bin/test ! -s $ABIAS } set filemissing='yes' - -if($filemissing == 'yes') then - while ($alldone == 'no' && $niter <= $nitermax) - if ($niter == 1) then - csh ${enkfscripts}/${ensda} >&! ${current_logdir}/ensda.out - set exitstat=$status - echo "exit status $exitstat" - else - csh ${enkfscripts}/${ensda} >>& ${current_logdir}/ensda.out - set exitstat=$status - endif - if ($exitstat == 0) then - set alldone='yes' - else - echo "some files missing, try again .." - @ niter = $niter + 1 - endif - end -else - set alldone='yes' -endif - -if($alldone == 'no') then - echo "Tried ${nitermax} times to run ensda and failed: ${analdate}" - exit 1 -endif -echo "${analdate} done computing analysis increment `date`" - -# create ensemble mean sig anal files (runobs.csh creates -# ensemble mean surface file). - -if ($cleanup_ensmean == 'true' || ($cleanup_ensmean == 'false' && { /bin/test ! -s ${datapath}/${analdate}/sanl_${analdate}_ensmean })) then - ${enkfexec}/getsigensmean.x ${datapath}/${analdate}/ sanl_${analdate}_ensmean sanl_${analdate} ${nanals} anal -endif - -##setenv PGMOUT ${current_logdir}/chgres_sfccycle_control.out -# ps tend diagnostics on ensemble member 1 -###time ${enkfexec}/getpstend.x ${datapath}/${analdate}/ ${analdate} 1 - -## DTK This has been moved back to "gfscontrol.sh" -#set LONB_save=$LONB -#set LATB_save=$LATB -#set JCAP_save=$JCAP -#setenv LONB $LONB_HIGH -#setenv LATB $LATB_HIGH -#setenv JCAP $JCAP_HIGH -# Run surface cycle and chgres -#time sh $CYCLESH ${datapathm1}/enkf.t${hrm1}z.bf06 ${datapath2}/sfcanl_${analdate}_control -#$CHGRESSH ${datapath2}/sanl_${analdate}_ensmean /dev/null ${datapath2}/sanl_${analdate}_control /dev/null - -#setenv LONB $LONB_save -#setenv LATB $LATB_save -#setenv JCAP $JCAP_save - -set nanal=1 -set filemissing='no' -while ($nanal <= $nanals) - set charnanal="mem"`printf %03i $nanal` - set analfile="${datapath2}/sanl_${analdate}_${charnanal}" - if { /bin/test ! -s $analfile } set filemissing='yes' - @ nanal = $nanal + 1 -end - -#set charnanal=control -#set analfile="${datapath2}/sanl_${analdate}_${charnanal}" -#set sfcanlfile="${datapath2}/sfcanl_${analdate}_${charnanal}" -#if { /bin/test ! -s $analfile } set filemissing='yes' -#if { /bin/test ! -s $sfcanlfile } set filemissing='yes' - -if($filemissing == 'yes') then - echo "FILES ARE MISSING, CANNOT SUBMIT FIRST GUESS FOR NEXT CYCLE. STOPPING HERE!" -else - tcsh ${enkfscripts}/firstges_multi.sh -endif - -exit 0 diff --git a/ush/EnKF/arch.sh b/ush/EnKF/arch.sh deleted file mode 100755 index 6dd64b0e68..0000000000 --- a/ush/EnKF/arch.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/tcsh - -## PASS IN ANALDATE and ARCH-HOUR VIA PSUB -echo "IN ARCHIVE AND CLEANUP SCRIPT" - -# import parameters -source ${CONFIG} - -# current analysis time. -echo "analdate = $analdate" - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` - -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -echo "SET MORE PARMS" -setenv datapath2 "${datapath}/${analdate}/" -setenv hpsstar "/nwprod/util/ush/hpsstar" - -setenv archdate `${incdate} $analdate -$ARCHLAG` -setenv hrar `echo $archdate | cut -c9-10` - -echo "ARCHDATE = $archdate" -echo "hrar = $hrar" - -if ($do_cleanup == 'true') then - echo "PERFORM CLEANUP OF DIRECTORY" - echo "make tar files, then clean up files `date`" - cd $datapath2 - tar -cvf sanl_ens_${analdate}.tar sanl*${analdate}*mem* - tar -cvf sfhr06_ens_${analdate}.tar sfg*${analdate}*fhr06*mem* - tar -cvf bfhr06_ens_${analdate}.tar bfg*${analdate}*fhr06*mem* - tar -cvf sfcanl_ens_${analdate}.tar sfcanl*${analdate}*mem* - - /bin/rm -f diag*a*${analdate}*mem* - /bin/rm -f diag*conv*${analdate}*mem* - /bin/rm -f diag*s*${analdate}*mem* - /bin/rm -f diag*${analdate}*mem* - - /bin/rm -f sfg*${analdate}*mem* - /bin/rm -f gfg_${analdate}*mem* - /bin/rm -f sanl*${analdate}*mem* - /bin/rm -f ganl*${analdate}*mem* - /bin/rm -f sfcanl*${analdate}*mem* - /bin/rm -f sflxgrb*${analdate}*mem* - /bin/rm -f bfg*${analdate}*mem* - - /bin/rm -f *${yr}${mon}${day}_mem*.t${hr}z* - /bin/rm -f *.sigr1 *.sigr2 *.sfcr *.log* - /bin/rm -rf gsitmp* - /bin/rm -rf gfs.* - /bin/rm -f *.nml - /bin/rm -f hxprime* - - cd $current_logdir - tar -cvf run_fg_logs.tgz run_fg_mem* - tar -cvf run_obs_logs.tgz run_obs_mem* - tar -cvf run_cycle_logs.tgz run_cycle_mem* - tar -cvf chgres_logs.tgz chgres_mem* - /bin/rm -f *mem* - echo "${analdate} done cleanup `date`" - -### exit 0 -endif - -echo "hpssfile = ${hpssdir}/${archdate}enkfanl.tar" -echo "from directory : ${datapath}/${archdate}/" - -mkdir -p ${archdiskdir} -/bin/rcp ${datapath}/${archdate}/*.tar ${archdiskdir}/ -/bin/rcp ${datapath}/${archdate}/enkf.t${hrar}z.sf06 ${archdiskdir}/sf06_${archdate}_control -/bin/rcp ${datapath}/${archdate}/sanl_*_control ${archdiskdir}/ -/bin/rcp ${datapath}/${archdate}/sfcanl_*_control ${archdiskdir}/ - - -cd ${datapath} -${hpsstar} put ${hpssdir}/${archdate}enkfanl.tar ${archdate}/* - -rm -rf ${datapath}/${archdate} - -echo "DONE WITH CLEANUP AND ARCHIVING" -exit 0 diff --git a/ush/EnKF/check_fgfiles_serial.sh b/ush/EnKF/check_fgfiles_serial.sh deleted file mode 100755 index 1a79859041..0000000000 --- a/ush/EnKF/check_fgfiles_serial.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/tcsh - -# import parameters -setenv CONFIG /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms -source ${CONFIG} - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -# current analysis time. -setenv analdate $analdate - -echo "analdate = $analdate" - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` - -echo "SET DATE PARAMETERS" -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" - - -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -# make log dir for analdate - -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -setenv DATOUT "${datapath}${analdatep1}" -setenv datapath2 "${datapath}/${analdate}/" - -echo "set DATOUT" -@ nanalsp1 = $nanals + 1 -echo "nanalsp1=",$nanalsp1 - -# Check every minute, for a maximum of 90 minutes -set ncheck=1 -set ncheckmax=90 - -while ($ncheck <= $ncheckmax) - set nanal2=1 - set anyfilemissing='no' - while ($nanal2 <= $nanals) - setenv charnanal "mem`printf %03i $nanal2`" - set fhr=$FHMIN - set outfiles="" - while ($fhr <= $FHMAX) - set charhr="fhr`printf %02i $fhr`" - set outfiles = "${outfiles} ${datapath}${analdatep1}/sfg_${analdatep1}_${charhr}_${charnanal} ${datapath}${analdatep1}/bfg_${analdatep1}_${charhr}_${charnanal}" - @ fhr = $fhr + $FHOUT - end - set filemissing='no' - foreach outfile ($outfiles) -## ls -l $outfile - if (-e $outfile) then -## echo "${outfile} is OK" - else - echo "${outfile} is missing" - set filemissing='yes' - set anyfilemissing='yes' - endif - end - @ nanal2 = $nanal2 + 1 - end - - if ($anyfilemissing == 'yes') then - echo 'there are output files missing...wait another minute' - sleep 60 - @ ncheck = $ncheck + 1 - if ($ncheck == $ncheckmax) then - echo 'SOMETHING FAILED IN FG STEP, JOB STOPPING' - exit 1 - endif - else - echo "all output files seem OK" -## CALL ARCHIVE SCRIPT HERE - echo "analdate=$analdate" - echo "CONFIG=$CONFIG" - $SUB -a GDAS-T2O -e analdate,CONFIG -g devonprod -j enkf_archive -o ${current_logdir}/enkf_archive.out -p 1 -q 1 -r 1000 -t 00:45:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/arch.sh -## EXIT OUT OF CHECK LOOP - @ ncheck = $ncheckmax + 1 - endif - -end -## end check < checkmax - -# CHECK SURFACE FILE -set filemissing='no' -set sfcffile="${datapath2}/enkf.t${hr}z.bf06" -if { /bin/test ! -s $sfcffile } set filemissing='yes' - -#if($filemissing == 'yes') then -# echo "SURFACE F06 FILE MISSING, WAIT 5 MINUTES" -# sleep 300 -#else -# echo "SURFACE F06 FILE IS READY, CONTINUE ON TO NEXT CYCLE" -#endif - - -## next analdate: increment by $ANALINC - setenv analdate `${incdate} $analdate $ANALINC` - echo "setenv analdate ${analdate}" >! $startupenv - -## SUBMIT NEXT CYCLE - echo "submit cycle for ${analdate}" - ${enkfscripts}/enkfdriver.sh - - exit 0 - diff --git a/ush/EnKF/check_obsfiles_serial.sh b/ush/EnKF/check_obsfiles_serial.sh deleted file mode 100755 index edd4935081..0000000000 --- a/ush/EnKF/check_obsfiles_serial.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/tcsh - -# import parameters -setenv CONFIG /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms -source ${CONFIG} - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -# current analysis time. -setenv analdate $analdate - -echo "analdate = $analdate" - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` - -echo "SET DATE PARAMETERS" -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" - - -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -# make log dir for analdate - -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -setenv DATOUT "${datapath}${analdatep1}" -setenv datapath2 "${datapath}/${analdate}/" - -echo "set DATOUT" -@ nanalsp1 = $nanals + 1 -echo "nanalsp1=",$nanalsp1 - -# Check every minute, for a maximum of 90 minutes -set ncheck=1 -set ncheckmax=90 - -while ($ncheck <= $ncheckmax) - set nanal=0 - set anyfilemissing='no' - set filemissing='no' - while ($nanal <= $nanals) - if ($nanal == '0') then - setenv charnanal2 "ensmean" - else - setenv charnanal2 "mem"`printf %03i $nanal` - endif - - echo $nanal - echo $charnanal2 - set obsfiles = "${datapath2}/diag_conv_ges.${analdate}_${charnanal2} ${datapath2}/sfcanl_${analdate}_${charnanal2}" - - foreach obsfile ($obsfiles) - ls -l $obsfile - if { /bin/test ! -s $obsfile } then - set filemissing='yes' - set anyfilemissing='yes' - endif - end - if ($filemissing == 'yes') then - echo "file missing .." - else - echo "files ok .." - endif - @ nanal = $nanal + 1 - end - - if ($anyfilemissing == 'yes') then - echo 'there are output files missing...wait another minute' - sleep 120 - @ ncheck = $ncheck + 1 - if ($ncheck == $ncheckmax) then - echo 'SOMETHING FAILED IN OBS STEP, JOB STOPPING' - exit 1 - endif - else - echo "all output files seem OK" - echo "Submit EnKF update step now" - llsubmit ${enkfscripts}/analupdate.sh - exit 0 - endif - -end - -## end check < checkmax diff --git a/ush/EnKF/current.enkfparms b/ush/EnKF/current.enkfparms deleted file mode 100755 index 160d38dc24..0000000000 --- a/ush/EnKF/current.enkfparms +++ /dev/null @@ -1,169 +0,0 @@ -setenv MP_SHARED_MEMORY=yes -setenv MEMORY_AFFINITY=MCM -setenv enddate 2008080118 - -set ensda = "run_enkf" -set runobs = 'runobs_multi.csh' -set fg_gfs = "run_fg_gfs_multi.sh" -set ctrl_gfs = 'gfscontrol.sh' -set drive_ensmean = "drive_gfs" -set cleanup_obs = 'false' # remove existing obs files -set cleanup_anal = 'false' # remove existing anal files -set cleanup_fg = 'false' # remove existing first guess files -set cleanup_ensmean = 'false' # remove existing ensmean files -set fg_only = 'false' # if true, just run first guess forecast -set do_cleanup = 'false' # if true, create tar files, delete *mem* files. - -##setenv basedir `dirname $PWD` -setenv basedir "/global/save/wx20kd/enkf/work/" -set datadir="${basedir}" - -# where the data will be created -setenv datapath "/global/noscrub/wx20kd/enkf_a5/" - -# Data reside in obs directory set dynamically in loop below ${obsdir} -# log directory -setenv logdir "/global/noscrub/wx20kd/logs/enkf_a5/" - -# some scripts reside here -# also need to make this dependent on user or a group writeable area -compo - -setenv enkfscripts "${basedir}/scripts/ncep" -setenv enkfexec "${basedir}/src/" - -# name of enkf executable. -setenv enkfbin "${enkfexec}/global_enkf.x" - -# Set archive directories -setenv archdiskdir ${datapath}/archive -setenv hpssdir /hpssuser/g01/wx20kd/enkfa5 -# remove 24hr old directories and put stuff to tape -setenv ARCHLAG 24 - -setenv incdate "${enkfscripts}/incdate" - -setenv homedir $PWD -setenv qcomp ecomp - -########################################################################## -# enkf parameters. -setenv corrlengthnh 1500 -setenv corrlengthtr 1500 -setenv corrlengthsh 1500 -setenv lnsigcutoffnh 1.5 -setenv lnsigcutofftr 1.5 -setenv lnsigcutoffsh 1.5 -setenv lnsigcutoffpsnh 2.2 -setenv lnsigcutoffpstr 2.2 -setenv lnsigcutoffpssh 2.2 -setenv lnsigcutoffsatnh 3.3 -setenv lnsigcutoffsattr 3.3 -setenv lnsigcutoffsatsh 3.3 -setenv obtimelnh 15. -setenv obtimeltr 15. -setenv obtimelsh 15. - -# Assimilation parameters -setenv JCAP 190 -setenv JCAP_HIGH 382 -setenv LEVS 64 -setenv LEVS_ges 64 -setenv LONB 576 -setenv LATB 288 -setenv LONA 576 -setenv LATA 288 -setenv SMOOTHINF 24 -setenv LONB_HIGH 1152 -setenv LATB_HIGH 576 -setenv npts `expr \( $LONA \) \* \( $LATA \)` -setenv LSOIL 4 -setenv RUN "gdas1" - -## DTK FIX OBS PATH -setenv obs_datapath "/global/shared/dump/" -##setenv datdump gfs -setenv datdump gdas - -setenv NTRAC 3 -setenv nvars 4 -setenv ntrac_update 2 -setenv LANDICE_OPT 2 -# parameters for additive inflation -setenv scalefact 40 -setenv addpertpath "/global/noscrub/wx20kd/sig190/" -setenv lonscramble 1 -setenv runprefix "gdas1" - -setenv random_partition .false. -setenv simple_partition .false. -setenv iassim_order 0 -setenv use_height .false. -setenv use_letkf .false. - -setenv covinflatemax 1.e2 -setenv covinflatemin 1.0 -setenv covinflatenh 0.0 -setenv covinflatetr 0.0 -setenv covinflatesh 0.0 -setenv lnsigcovinfcutoff 6.0 - -setenv analpertwtnh 0.9 -setenv analpertwtsh 0.9 -setenv analpertwttr 0.9 - -setenv pseudo_rh .true. - -setenv sprd_tol 1.e30 - -setenv nanals 60 -## DTK : specifiy number of members to process per job/node for first ges (GFS) and obs (GSI) processing -setenv nmem_per_node 4 - -setenv paoverpb_thresh 1.0 -setenv saterrfact 1.0 -setenv deterministic .true. -setenv sortinc .true. - -setenv numiter 1 -setenv nitermax 3 - -########################################################################## -# Some binaries and scripts reside here -# - -setenv HOMEGLOBAL ${basedir} -setenv FIXGLOBAL /nwprod/fix -setenv FIXGSI /global/save/wx20kd/ensda/ersl/fixgsi -setenv EXECGLOBAL /global/save/wx20kd/ensda/ersl/bin -setenv SIGLEVEL ${FIXGLOBAL}/global_hyblev.l64.txt -setenv GSIEXEC /global/save/wx20kd/gsi/hybrid/src/global_gsi.x -setenv CHGRESEXEC ${EXECGLOBAL}/global_chgres_thread_moorthi -setenv USHGLOBAL $EXECGLOBAL -setenv CHGRESSH ${enkfscripts}/global_chgres.sh -setenv CYCLESH ${enkfscripts}/global_cycle.sh -setenv POSTGPSH ${enkfscripts}/global_postgpp.sh -setenv POSTGPLIST ${FIXGLOBAL}/global_kplist.1d.txt -setenv POSTGPEXEC $EXECGLOBAL/global_postgs -setenv POSTPROC "YES" # if yes, compute pgrb files for 6-h forecast for every member. -setenv IO 360 -setenv JO 181 - -setenv SATINFO ${FIXGSI}/global_satinfo.txt.n19_off.r2008 - -# 6-h cycle -setenv FHMAX 9 -setenv FHMIN 3 -setenv FHDFI 3 -setenv FHOUT 1 -setenv FHLWR $FHOUT - -setenv ANALINC 6 -setenv DELTSFC $ANALINC - -setenv PARMFILE=/global/save/wx20kd/enkf/work/scripts/ncep/enkfa5.parms -setenv NODEOBS=1 -setenv NODEENKF=5 -setenv NODEFG=2 - -# TO GET RID OF EVENTUALLY -setenv nbackground_max 32 diff --git a/ush/EnKF/dateutils.py b/ush/EnKF/dateutils.py deleted file mode 100755 index e6c12d5761..0000000000 --- a/ush/EnKF/dateutils.py +++ /dev/null @@ -1,144 +0,0 @@ -import datetime, calendar - -""" -utilities for working with dates using datetime module (Python 2.3 or later) - -Jeff Whitaker -""" - - -hrsgregstart = 13865688 # hrs from 00010101 to 15821015 in Julian calendar. -# times in many datasets use mixed Gregorian/Julian calendar, datetime -# module uses a proleptic Gregorian calendar. So, I use datetime to compute -# hours since start of Greg. calendar (15821015) and add this constant to -# get hours since 1-Jan-0001 in the mixed Gregorian/Julian calendar. -gregstart = datetime.datetime(1582,10,15) # datetime.datetime instance -day1 = datetime.datetime(1,1,1) # datetime.datetime instance - -def dateto_hrs_since_day1CE(curdate,mixedcal=True): - """given datetime.datetime instance, compute hours since 1-Jan-0001""" - if mixedcal: - if curdate < gregstart: - msg = 'date must be after start of gregorian calendar (15821015)!' - raise ValueError, msg - difftime = curdate-gregstart - hrsdiff = 24*difftime.days + difftime.seconds/3600 - return hrsdiff+hrsgregstart - else: - difftime = curdate-day1 - return 24.*(difftime.days+1)+difftime.seconds/3600. - -def hrs_since_day1CE_todate(hrs,mixedcal=True): - """return datetime.datetime instance given hours since 1-Jan-0001""" - if hrs < 0.0: - msg = "hrs must be positive!" - raise ValueError, msg - delta = datetime.timedelta(hours=1) - if mixedcal: - hrs_sincegreg = hrs - hrsgregstart - curdate = gregstart + hrs_sincegreg*delta - else: - curdate = hrs*delta - return curdate - -def dateshift(analdate,fcsthr): - """ - verifdate = incdate(analdate, fcsthr) - - compute verification date given analysis date string (yyyymmddhh) and - fcst hour. - """ - yyyy,mm,dd,hh = splitdate(analdate) - analdate = datetime.datetime(yyyy,mm,dd,hh) - verifdate = analdate + fcsthr*datetime.timedelta(hours=1) - verifdate = makedate(verifdate.year,verifdate.month,verifdate.day,verifdate.hour) - return verifdate - - -def splitdate(yyyymmddhh): - """ - yyyy,mm,dd,hh = splitdate(yyyymmddhh) - - give an date string (yyyymmddhh) return integers yyyy,mm,dd,hh. - """ - yyyy = int(yyyymmddhh[0:4]) - mm = int(yyyymmddhh[4:6]) - dd = int(yyyymmddhh[6:8]) - hh = int(yyyymmddhh[8:10]) - return yyyy,mm,dd,hh - -def makedate(yyyy,mm,dd,hh): - """ - yyyymmddhh = makedate(yyyy,mm,dd,hh) - - return a date string of the form yyyymmddhh given integers yyyy,mm,dd,hh. - """ - return '%0.4i'%(yyyy)+'%0.2i'%(mm)+'%0.2i'%(dd)+'%0.2i'%(hh) - -def hrstodate(hrs,mixedcal=True): - """ - yyyymmddhh = hrstodate(hrs) - - return a date string of the form yyyymmddhh given hrs since day 1 CE. - """ - date = hrs_since_day1CE_todate(hrs,mixedcal=mixedcal) - return makedate(date.year,date.month,date.day,date.hour) - -def datetohrs(yyyymmddhh,mixedcal=True): - """ - hrs = hrstodate(yyyymmddhh) - - return hrs since day 1 CE given a date string of the form yyyymmddhh. - """ - yyyy,mm,dd,hh = splitdate(yyyymmddhh) - return dateto_hrs_since_day1CE(datetime.datetime(yyyy,mm,dd,hh),mixedcal=mixedcal) - -def daterange(date1,date2,hrinc): - """ - date_list = daterange(date1,date2,hrinc) - - return of list of date strings of the form yyyymmddhh given - a starting date, ending date and an increment in hours. - """ - date = date1 - delta = datetime.timedelta(hours=1) - yyyy,mm,dd,hh = splitdate(date) - d = datetime.datetime(yyyy,mm,dd,hh) - n = 0 - dates = [date] - while date < date2: - d = d + hrinc*delta - date = makedate(d.year,d.month,d.day,d.hour) - dates.append(date) - n = n + 1 - return dates - -def dayofyear(yyyy,mm,dd): - """ - return integer day of year given yyyy,mm,dd - """ - d = datetime.datetime(yyyy,mm,dd) - d0 = datetime.datetime(yyyy,1,1) - return (d-d0).days - -def getyrmon(day_of_year,yyyy=2001): - d1 = datetime.datetime(yyyy,1,1) - if calendar.isleap(d1.year) and day_of_year > 366: - raise ValueError, 'not that many days in the year' - if not calendar.isleap(d1.year) and day_of_year > 365: - raise ValueError, 'not that many days in the year' - d2 = d1 + (day_of_year-1)*datetime.timedelta(days=1) - return d2.month,d2.day - -def daysinmonth(yyyy,mm): - """ - return number of days in month given yyyy,mm - """ - return calendar.monthrange(yyyy,mm)[1] - -if __name__ == "__main__": - print dayofyear(2000,2,29) - print daysinmonth(2000,2) - print datetohrs('0001010100',mixedcal=False) - print datetohrs('2001010100',mixedcal=False) - print datetohrs('2001010100',mixedcal=True) diff --git a/ush/EnKF/drive_gfs b/ush/EnKF/drive_gfs deleted file mode 100755 index 27c9347271..0000000000 --- a/ush/EnKF/drive_gfs +++ /dev/null @@ -1,205 +0,0 @@ -#!/bin/bash - -# needed env vars: SIGI, SFCI, HOMEGLOBAL, ANALHR, RUN, JCAP, LEVS -# DATOUT, FHOUT, FHMAX, FHDFI, datapath, analdate, analdatep1, charnanal -# HOSTFILE, nprocs - -echo "starting drive_gfs at `date`" -export ANALHR=`echo $analdate | cut -c9-10` -export cyc=$ANALHR - -#set -xa - -# #### 05/05/99 ############################### -# SETUP GFS FCST PROCESSING VARIABLES -# ############################################# - -#################################### -# obtain unique process id (pid) and make temp directory -#################################### -export pid=$$ -export DATA=$datapath2/gfstmp.${pid} -homedir=$PWD -mkdir $DATA -cd $DATA - -export cycle=t${cyc}z - -#################################### -# Specify NET and RUN Name and model -#################################### -export NET=$RUN - -#################################### -# SENDSMS - Flag Events on SMS -# SENDCOM - Copy Files From TMPDIR to $DATOUT -# SENDDBN - Issue DBNet Client Calls -# RERUN - Rerun fcst from beginning (default no) -# VERBOSE - Specify Verbose Output in exglobal_fcst.sh -#################################### -export SENDSMS=YES -export SENDCOM=YES -export SENDDBN=NO -export RERUN=YES -export VERBOSE=NO - -#################################### -# Specify Execution Areas -#################################### -#export EXECGLOBAL=$HOMEGLOBAL/bin -#export FIXGLOBAL=$HOMEGLOBAL/fix - -############################################## -# Define COM directories -############################################## -mkdir -m 775 -p $DATOUT - -#################################### -# Specify Special Fcst Vars -#################################### -# -# Forecast Horizontal Resolution -# -# JCAP from env -# -# Forecast Vertical Resolution -# -# LEVS from env -# export added by Grant and Rich 11/13/2003 -# for T382 -if [[ $JCAP == '382' ]]; then -export DELTIM=180 #Added to compensate for failure - #due to 'unphysical max speed' error. -fi - -export CO2CON=$FIXGLOBAL/global_co2con.l${LEVS}.f77 -export MTNVAR=$FIXGLOBAL/global_mtnvar.t${JCAP}.f77 -export CLTUNE=$FIXGLOBAL/global_cldtune.f77 -export DTBTHE=$FIXGLOBAL/global_tbthe.f77 -export O3FORC=$FIXGLOBAL/global_o3prdlos.f77 -export O3CLIM=$FIXGLOBAL/global_o3clim.txt -export OROGRAPHY=$FIXGLOBAL/global_orography.t$JCAP.grb -export CHGRESEXEC=$EXEGLOBAL/global_chgres -# -# Restart File Names -# -export SIGR1=$DATOUT/${RUN}.${cycle}.sigr1.t${JCAP}l${LEVS} -export SIGR2=$DATOUT/${RUN}.${cycle}.sigr2.t${JCAP}l${LEVS} -export SFCR=$DATOUT/${RUN}.${cycle}.sfcr.t${JCAP}l${LEVS} - -msg="HAS BEGUN on `hostname`" - -env - -export NTHREADS=1 -#export OMP_NUM_THREADS=1 - -#################################### -# Check if this is a restart -# -# Define Initialization File Names -# -# Run Forecast -# -#################################### -if test -f $SIGR1 -a -f $SIGR2 -a -f $SFCR -a $RERUN = "NO" -then - cp $SIGR1 $DATA/sigr1 - cp $SIGR2 $DATA/sigr2 - cp $SFCR $DATA/sfcr - - export SIGI=$SIGR1 - export SIGI2=$SIGR2 - export SFCI=$SFCR - - msg="Forecast Starting with Restart files in $GESdir" -else - # - # Forecast Start Hour - # - export FHINI=0 - - # SIGI, SFCI must be specified as env vars. - - if test -f $SIGI -a -f $SFCI - then - echo "Forecast Starting with Initial Guess Fields" - else - echo "Initial Guess Fields Not Available/No Guess from J920" - fi - -fi - -############################################################ -# Start Section 2 of the GFS Forecast 180-384 Hours -############################################################ -# -# Forecast hour to Read One Time level -# -export FHROT=0 -# -# Forecast Hour Output Frequency -# -#export FHOUT=12 -# -# Forecast Length (Hours) -# -#export FHMAX=240 -# -# Forecast Hour Restart Frequency -# -#export FHRES=$FHMAX -# -# Interval to Zero out precip field,etc. -# Should not be less that FHOUT -# -export FHZER=$FHOUT -# -# Half number of hours of digital filter initialization -# -#export FHDFI=3 -# -# Surface cycling boundary condition update frequency in hours -# -#export FHCYC=24 -# -# PDS Grid Designator -# -export IGEN=96 -export LIOPE=.false. # no IO server node (default is .true.) -# -# Output File Names -# -#export SIGO=${SIGO:-$DATOUT/${RUN}.${cycle}.sf'${FH}'} -#export SFCO=${SFCO:-$DATOUT/${RUN}.${cycle}.bf'${FH}'} -#export FLXO=${FLXO:-$DATOUT/${RUN}.${cycle}.sfluxgrbf'${FH}'} -#export LOGO=${LOGO:-$DATOUT/${RUN}.${cycle}.logf'${FH}'} -export SIGO=${SIGO:-${DATOUT}/sfg_${analdatep1}_fhr'${FH}'_${charnanal}} -export SFCO=${SFCO:-${DATOUT}/bfg_${analdatep1}_fhr'${FH}'_${charnanal}} -export FLXO=${FLXO:-${DATOUT}/sflxgrb_${analdatep1}_fhr'${FH}'_${charnanal}} -#export LOGO=${LOGO:-${DATOUT}/log_${analdatep1}_fhr'${FH}'_${charnanal}} -# don't need flux and log files. -#export FLXO=/dev/null -export LOGO=/dev/null - -#cp $SIGR1 $DATA/sigr1 -#cp $SIGR2 $DATA/sigr2 -#cp $SFCR $DATA/sfcr - -# -# Execute the Forecast script -# -echo "executing run_gfs at `date`" -sh ${homedir}/run_gfs - -msg="ENDED NORMALLY." - -############################## -# Remove the Temporary working directory -############################## -cd $homedir -rm -rf $DATA - -# remove *.fh00 files -/bin/rm -rf $DATOUT/*_fhr00_${charnanal} -echo "ending run_gfs at `date`" diff --git a/ush/EnKF/drive_gsi b/ush/EnKF/drive_gsi deleted file mode 100755 index ade5ccff6f..0000000000 --- a/ush/EnKF/drive_gsi +++ /dev/null @@ -1,369 +0,0 @@ -#!/bin/sh -# env vars used: -# ANALHR, datapath datapath2, obs_datapath, HXONLY, DIAGCONV, SAVEHX -# HOMEGLOBAL, charnanal - -echo "starting gsi at `date`" -export cyc=$ANALHR -homedir=$PWD -export CDATE=$analdate - -#date - -#export PS4='$SECONDS + ' -#date -set -xa - -# #### 05/05/99 ############################### -# SETUP GFS ANALYSIS PROCESSING VARIABLES -# ############################################# - -#################################### -# obtain unique process id (pid) and make temp directory -#################################### -export pid=$$ -job='gsitmp' -export DATA=$datapath2/${job}.${pid} -mkdir $DATA -cd $DATA - -export cycle=t${cyc}z - -#################################### -# Specify NET and RUN Name and model -#################################### -export NET=$RUN -#export RUN=gdas1 -# output diagnostic file for conventional obs. -#export DIAGCONV=.true. -# only do forward operator, exit GSI before minimization. -#export HXONLY=.true. - -#################################### -# File To Log Msgs -#################################### -export jlogfile=/com/logs/para/jlogfile - -#################################### -# Determine Job Output Name on System -#################################### -export outid="LL$job" -export jobid="${outid}.o${pid}" -export pgmout="OUTPUT.${pid}" -export pgmerr=$logdir/errfile - -#################################### -# SENDSMS - Flag Events on SMS -# SENDCOM - Copy Files From TMPDIR to $COMOUT -# SENDDBN - Issue DBNet Client Calls -# VERBOSE - Specify Verbose Output in exglobal_fcst.sh -#################################### -export SENDSMS=YES -export SENDCOM=YES -export SAVEGES=YES -export SENDDBN=NO -export VERBOSE=YES - -#################################### -# Specify Execution Areas -#################################### -#export EXECGLOBAL=$HOMEGLOBAL/bin -#export FIXGLOBAL=$HOMEGLOBAL/fix -#export USHGLOBAL=$HOMEGLOBAL/ush - -export ERRSCRIPT=err_chk -export LOGSCRIPT=startmsg -export FILESTYLE='L' - -############################## -# Set up the UTILITIES -############################## -#export utilscript=/nwprod/util/ush -#export utilexec=/nwprod/util/exec - -############################## -# Run setup to initialize working directory and utility scripts -############################## -#sh $utilscript/setup.sh - -############################## -# Run setpdy and initialize PDY variables -############################## -#sh $utilscript/setpdy.sh -#. PDY - -############################################## -# Define COM directories -############################################## -export COMIN=$obs_datapath/${analdate}/gdas -export COMOUT=$datapath2 -mkdir -m 775 -p $COMOUT - -############################################## -# Define GES directories -############################################## -gespath=$COMIN -export GESdir=$gespath -##mkdir -m 775 -p $GESdir - -#################################### -# Specify Special Fcst Vars -#################################### -# -# Forecast Horizontal Resolution -# -#export JCAP=126 -#export JCAP_ges=126 -#export JCAP=126 -#export JCAP_ges=126 -# -# Forecast Vertical Resolution -# -#export LEVS=64 -#export LEVS_ges=64 -# -# These are for the T382L64 -# -#export LONA=768 -#export LATA=384 -#export LONB=1152 -#export LATB=576 -# t254 -#export LONA=512 -#export LATA=256 -#export LONB=768 -#export LATB=384 -# t126 -#export LONA=256 -#export LATA=128 -#export LONB=384 -#export LATB=190 -#export LSOIL=4 -export NLAT=$((${LATA}+2)) -# -# Analysis Fix Fields -# -export FNGLAC=${FIXGLOBAL}/global_glacier.2x2.grb -export FNMXIC=${FIXGLOBAL}/global_maxice.2x2.grb -export FNTSFC=${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb -export FNSNOC=${FIXGLOBAL}/global_snoclim.1.875.grb -export FNZORC=${FIXGLOBAL}/global_zorclim.1x1.grb -export FNALBC=${FIXGLOBAL}/global_albedo4.1x1.grb -export FNAISC=${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb -export FNTG3C=${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb -export FNVEGC=${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb -export FNVETC=${FIXGLOBAL}/global_vegtype.1x1.grb -export FNSOTC=${FIXGLOBAL}/global_soiltype.1x1.grb -export FNSMCC=${FIXGLOBAL}/global_soilmcpc.1x1.grb -export FNOROG=${FIXGLOBAL}/global_orography.t${JCAP}.grb -export FNMASK=${FIXGLOBAL}/global_slmask.t${JCAP}.grb - -export BERROR=${FIXGSI}/global_berror.l${LEVS}y${NLAT}.f77 - -export SATANGL=${FIXGSI}/global_satangbias.txt -export SATINFO=${FIXGSI}/global_satinfo.txt.n19_off.r2008 -export RTMSPEC=${FIXGSI}/global_CRTM_SpcCoeff.f77 -export RTMTRAN=${FIXGSI}/global_CRTM_TauCoeff.f77 -export RTMEMIS=${FIXGSI}/crtm_gfsgsi/EmisCoeff/Big_Endian/EmisCoeff.bin -export RTMAERO=${FIXGSI}/crtm_gfsgsi/AerosolCoeff/Big_Endian/AerosolCoeff.bin -export RTMCLDS=${FIXGSI}/crtm_gfsgsi/CloudCoeff/Big_Endian/CloudCoeff.bin - -export CONVINFO=${FIXGSI}/global_convinfo.txt -export OZINFO=${FIXGSI}/global_ozinfo.txt.r2008 -export PCPINFO=${FIXGSI}/global_pcpinfo.txt - - -# -# Analysis Input Fields -# -export PREINP=${RUN}.${cycle}. -export PREINPm1=${RUN}.${cyclem1}. -export FNTSFA=${COMIN}/sstgrb.gdas.$analdate -export FNACNA=${COMIN}/icegrb.gdas.$analdate -export FNSNOA=${COMIN}/snogrb_t382.gdas.$analdate - -#export SIGGES=${COMIN}/${PREINP}sgesprep -#export SIGG03=${COMIN}/${PREINP}sgm3prep -#export SIGG09=${COMIN}/${PREINP}sgp3prep - -#export PREPQC=${COMIN}/${PREINP}prepbufr -#export B1HRS2=${COMIN}/${PREINP}1bhrs2.tm00.bufr_d -#export B1MSU=${COMIN}/${PREINP}1bmsu.tm00.bufr_d -#export B1HRS3=${COMIN}/${PREINP}1bhrs3.tm00.bufr_d -#export B1AMUA=${COMIN}/${PREINP}1bamua.tm00.bufr_d -#export B1AMUB=${COMIN}/${PREINP}1bamub.tm00.bufr_d -#export B1HRS4=${COMIN}/${PREINP}1bhrs4.tm00.bufr_d -#export B1MHS=${COMIN}/${PREINP}1bmhs.tm00.bufr_d -#export AIRSBF=${COMIN}/${PREINP}airsev.tm00.bufr_d -#export SBUVBF=${COMIN}/${PREINP}osbuv.tm00.bufr_d -#export SMIPCP=${COMIN}/${PREINP}spssmi.tm00.bufr_d -#export TMIPCP=${COMIN}/${PREINP}sptrmm.tm00.bufr_d -#export GPSBF=${COMIN}/${PREINP}gpsro.tm00.bufr_d - -############################################################################ -# -# Check grib date of current snogrb vs that of prev cycle -# -# if cdate_of_snogrb -le cdate_of_snoprv, i.e. file has not been updated -# then set namelist input to CYCLEXEC to use the snow from the guess -# FNSNOA=" ";CYCLVARS="FSNOL=99999.,FSNOS=99999.," -# FNSNOA is the name of the snow depth analysis file -# when not supplied, signals to CYCLEXEC to blend guess and climatology -# (Note: file must be " ", not "" or the shell syntax for default -# values X=${X:-default} will reset to default if X="") -# FSNOL=99999.,FSNOS=99999., sets the blending of guess and climo to -# use 100% guess -# -#################################### -#prev_cdate=$($utilexec/ndate -6 $PDY$cyc) -#snoprv=`$utilscript/getges.sh -q -t snogrb_high -v $prev_cdate` -#if [ `$utilexec/wgrib -4yr ${FNSNOA} 2>/dev/null|grep -i snowc |\ -# awk -F: '{print $3}'|awk -F= '{print $2}'` -le \ -# `$utilexec/wgrib -4yr $snoprv 2>/dev/null |grep -i snowc |\ -# awk -F: '{print $3}'|awk -F= '{print $2}'` ] ; then -# export FNSNOA=" " -# export CYCLVARS="FSNOL=99999.,FSNOS=99999.," -#fi -############################################################################ -# -# Output File Names -# -export SIGANL=${SIGANL:-$COMOUT/siganl_gsi} -export SFCANL=${SFCANL:-$COMOUT/sfcanl_gsi} -export ABIAS=${ABIAS:-$COMOUT/abias} -export SATANGO=${SATANGO:-$COMOUT/satang} -#export GINCOUT=$COMOUT/${RUN}.${cycle}.gesfile -export GINCOUT=/dev/null -#export PCPSTAT=${COMOUT}/${RUN}.${cycle}.pcpstat -#export RADSTAT=${COMOUT}/${RUN}.${cycle}.radstat -#export GSISTAT=${COMOUT}/${RUN}.${cycle}.gsistat -#export CNVSTAT=${COMOUT}/${RUN}.${cycle}.cnvstat -#export OZNSTAT=${COMOUT}/${RUN}.${cycle}.oznstat -export PCPSTAT=/dev/null -export RADSTAT=/dev/null -export GSISTAT=/dev/null -export CNVSTAT=/dev/null -export OZNSTAT=/dev/null - -# -# PDS Grid Designator -# -export IGEN=81 - -msg="HAS BEGUN on `hostname`" -#postmsg "$jlogfile" "$msg" - -#################################### -# Check if this is a restart -# -# Define Previous Guess File Names -#################################### -#gesenvir=${envir} -# -## $utilscript/getges.sh -t sfcges -r ${JCAP_ges}${LEVS_ges} -v $PDY$cyc \ -# -e $gesenvir bges -#err1=$? -## $utilscript/getges.sh -t sfcgm3 -r ${JCAP_ges}${LEVS_ges} -v $PDY$cyc \ -# -e $gesenvir sfcf03 -##$utilscript/getges.sh -t sfcgp3 -r ${JCAP_ges}${LEVS_ges} -v $PDY$cyc \ -# -e $gesenvir sfcf09 -##$utilscript/getges.sh -t biascr -r ${JCAP_ges}${LEVS_ges} -v $PDY$cyc \ -# -e $gesenvir gbias -##$utilscript/getges.sh -t satang -r ${JCAP_ges}${LEVS_ges} -v $PDY$cyc \ -# -e $gesenvir gsatang - - -#if test "$err1" -eq '0' -##if [ -s $GBIAS ] && [ -s $GSATANG ] && [ -s $SFCGES ] && [ -s $SFCG03 ] && [ -s $SFCG09 ] && [ -s $SIGGES ] && [ -s $SIGG03 ] && [ -s $SIGG09 ]; -if [ -s $GBIAS ] && [ -s $GSATANG ] && [ -s $SFCG06a ] && [ -s $SFCG03a ] && [ -s $SFCG09a ] && [ -s $SIGGES ] && [ -s $SIGG03 ] && [ -s $SIGG09 ]; -then - echo "Analysis Starting/Guess Fields Found" - #postmsg "$jlogfile" "$msg" - -else - echo "Analysis Cannot Start/Guess Fields Not Available" - exit 1 - #postmsg "$jlogfile" "$msg" - #export pgm=$job - #export err=911 - #err_chk -fi - -############################ -# Make use of updated angle dependent bias file, if it exists. -if [[ -s $GSATANG ]]; then - export SATANGL=$GSATANG -fi - -env - -############################ -# Added for pmdv hang trace -# -Item T44 Problem on Technical List -############################ -#export MP_PMDLOG=yes -#export MP_INFOLEVEL=6 -############################ - -############################ -# Added to reduce wall time when running more than one task per node -#export MP_SHARED_MEMORY=YES - -#NOTE: BIND_TASKS=YES requires running 16 tasks/node -#export MP_USE_BULK_XFER=yes -#export BIND_TASKS=YES - - - -############################################################# -# Execute the script -echo "executing run_gsi at `date`" -sh ${homedir}/run_gsi -############################################################# - -#export MP_PMDLOG=no -#poe rm /tmp/mplog* - -########## -# NOTES: 1) script exglobal_analysis.sh compresses the contents of -# RADSTAT, PCPSTAT, OZNSTAT, and CNVSTAT. These stat files -# files are tarballs of compressed files. -# 2) SFCANL, SIGANL are input to the GFS forecast following the analysis -# 3) ABIAS, and SATANGO are used in the following analysis cycle -# 4) GINCOUT from the GFS early cycle (GFS) is used as input in the -# GFS late (GDAS) cycle -# 5) GSISTAT, RADSTAT, PCPSTAT, OZNSTAT, CNVSTAT are diagnostic output -########## - -#if test "$SAVEGES" = "YES" -#then -# cp $SFCANL $GESdir/${RUN}.${cycle}.sfcanl -# cp $SIGANL $GESdir/${RUN}.${cycle}.sanl -# cp $ABIAS $GESdir/${RUN}.${cycle}.abias -# cp $SATANGO $GESdir/${RUN}.${cycle}.satang -# cp $GINCOUT $GESdir/${RUN}.${cycle}.gesfile -#fi -#if test "$SENDCOM" = "YES" -#then -# cp $SFCANL $COMOUT/${RUN}.${cycle}.sfcanl -# cp $SIGANL $COMOUT/${RUN}.${cycle}.sanl -# cp $ABIAS $COMOUT/${RUN}.${cycle}.abias -# cp $SATANGO $COMOUT/${RUN}.${cycle}.satang -# cp $GINCOUT $COMOUT/${RUN}.${cycle}.gesfile -#fi -# -#cat $pgmout -# -#grep resident $DATA/mpi* -# -#echo "`hostname` -- `date`" > $COMOUT/where_ibm_${RUN}_anal_ran.${cycle} - -msg="ENDED NORMALLY." -#postmsg "$jlogfile" "$msg" - -############################## -# Remove the Temporary working directory -############################## -cd $homedir -rm -rf $DATA -echo "ending gsi at `date`" diff --git a/ush/EnKF/enkfa5.parms b/ush/EnKF/enkfa5.parms deleted file mode 100755 index f6a94cfcc7..0000000000 --- a/ush/EnKF/enkfa5.parms +++ /dev/null @@ -1,172 +0,0 @@ -setenv MP_SHARED_MEMORY=yes -setenv MEMORY_AFFINITY=MCM -setenv enddate 2008080118 - -set ensda = "run_enkf" -set runobs = 'runobs_multi.csh' -set fg_gfs = "run_fg_gfs_multi.sh" -set ctrl_gfs = 'gfscontrol.sh' -set drive_ensmean = "drive_gfs" -set cleanup_obs = 'false' # remove existing obs files -set cleanup_anal = 'false' # remove existing anal files -set cleanup_fg = 'false' # remove existing first guess files -set cleanup_ensmean = 'false' # remove existing ensmean files -set fg_only = 'false' # if true, just run first guess forecast -set do_cleanup = 'false' # if true, create tar files, delete *mem* files. - -##setenv basedir `dirname $PWD` -setenv basedir "/global/save/wx20kd/enkf/work/" -set datadir="${basedir}" - -# where the data will be created -setenv datapath "/global/noscrub/wx20kd/enkf_a5/" - -# Data reside in obs directory set dynamically in loop below ${obsdir} -# log directory -setenv logdir "/global/noscrub/wx20kd/logs/enkf_a5/" - -# some scripts reside here -# also need to make this dependent on user or a group writeable area -compo - -setenv enkfscripts "${basedir}/scripts_ncep" -setenv enkfexec "${basedir}/src/" - -# name of enkf executable. -setenv enkfbin "${enkfexec}/global_enkf.x" - -# Set archive directories -setenv archdiskdir ${datapath}/archive -setenv hpssdir /hpssuser/g01/wx20kd/enkfa5 -# remove 24hr old directories and put stuff to tape -setenv ARCHLAG 24 - -setenv incdate "${enkfscripts}/incdate" - -setenv homedir $PWD -setenv qcomp ecomp - -########################################################################## -# enkf parameters. -setenv corrlengthnh 1500 -setenv corrlengthtr 1500 -setenv corrlengthsh 1500 -setenv lnsigcutoffnh 1.5 -setenv lnsigcutofftr 1.5 -setenv lnsigcutoffsh 1.5 -setenv lnsigcutoffpsnh 2.2 -setenv lnsigcutoffpstr 2.2 -setenv lnsigcutoffpssh 2.2 -setenv lnsigcutoffsatnh 3.3 -setenv lnsigcutoffsattr 3.3 -setenv lnsigcutoffsatsh 3.3 -setenv obtimelnh 15. -setenv obtimeltr 15. -setenv obtimelsh 15. - -# Assimilation parameters -setenv JCAP 190 -setenv JCAP_HIGH 382 -setenv LEVS 64 -setenv LEVS_ges 64 -setenv LONB 576 -setenv LATB 288 -setenv LONA 576 -setenv LATA 288 -setenv SMOOTHINF 24 -setenv LONB_HIGH 1152 -setenv LATB_HIGH 576 -setenv npts `expr \( $LONA \) \* \( $LATA \)` -setenv LSOIL 4 -setenv RUN "gdas1" - -## DTK FIX OBS PATH -setenv obs_datapath "/global/shared/dump/" -##setenv datdump gfs -setenv datdump gdas - -setenv NTRAC 3 -setenv nvars 3 -setenv ntrac_update 2 -setenv LANDICE_OPT 2 -# parameters for additive inflation -setenv scalefact 40 -setenv addpertpath "/global/noscrub/wx20kd/sig190/" -setenv lonscramble 1 -setenv runprefix "gdas1" - -setenv random_partition .false. -setenv simple_partition .false. -setenv iassim_order 0 -setenv use_height .false. -setenv use_letkf .false. - -setenv covinflatemax 1.e2 -setenv covinflatemin 1.0 -setenv covinflatenh 0.0 -setenv covinflatetr 0.0 -setenv covinflatesh 0.0 -setenv lnsigcovinfcutoff 6.0 - -setenv analpertwtnh 0.9 -setenv analpertwtsh 0.9 -setenv analpertwttr 0.9 - -setenv pseudo_rh .true. - -setenv sprd_tol 1.e30 - -setenv nanals 60 -## DTK : specifiy number of members to process per job/node for first ges (GFS) and obs (GSI) processing -setenv nmem_per_node 4 - -setenv paoverpb_thresh 1.0 -setenv saterrfact 1.0 -setenv deterministic .true. -setenv sortinc .true. - -setenv numiter 1 -setenv nitermax 3 - -########################################################################## -# Some binaries and scripts reside here -# - -setenv HOMEGLOBAL ${basedir} -setenv FIXGLOBAL /nwprod/fix -setenv FIXGSI /global/save/wx20kd/ensda/ersl/fixgsi -setenv EXECGLOBAL /global/save/wx20kd/ensda/ersl/bin -setenv SIGLEVEL ${FIXGLOBAL}/global_hyblev.l64.txt -setenv GSIEXEC /global/save/wx20kd/gsi/hybrid/src/global_gsi.x -setenv CHGRESEXEC ${EXECGLOBAL}/global_chgres_thread_moorthi -setenv USHGLOBAL $EXECGLOBAL -setenv CHGRESSH ${enkfscripts}/global_chgres.sh -setenv CYCLESH ${enkfscripts}/global_cycle.sh -setenv POSTGPSH ${enkfscripts}/global_postgpp.sh -setenv POSTGPLIST ${FIXGLOBAL}/global_kplist.1d.txt -setenv POSTGPEXEC $EXECGLOBAL/global_postgs -setenv POSTPROC "YES" # if yes, compute pgrb files for 6-h forecast for every member. -setenv IO 360 -setenv JO 181 - -setenv PREPDATA /global/noscrub/${LOGNAME}/prepqc08/ -setenv CONVINFO ${FIXGSI}/global_convinfo.txt -setenv SATINFO ${FIXGSI}/global_satinfo.txt.n19_off.r2008 -setenv OZINFO ${FIXGSI}/global_ozinfo.txt.r2008 - -# 6-h cycle -setenv FHMAX 9 -setenv FHMIN 3 -setenv FHDFI 3 -setenv FHOUT 1 -setenv FHLWR $FHOUT - -setenv ANALINC 6 -setenv DELTSFC $ANALINC - -setenv PARMFILE=/global/save/wx20kd/enkf/work/scripts_ncep/enkfa5.parms -setenv NODEOBS=1 -setenv NODEENKF=5 -setenv NODEFG=2 - -# TO GET RID OF EVENTUALLY -setenv nbackground_max 32 diff --git a/ush/EnKF/enkfdriver.sh b/ush/EnKF/enkfdriver.sh deleted file mode 100755 index 7d7cc43980..0000000000 --- a/ush/EnKF/enkfdriver.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/tcsh - -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -if ($analdate >= $enddate) then - echo "***********" - echo "end of experiment reached" - echo "***********" -else - if ($fg_only == "false") then - tcsh ${enkfscripts}/obsproc_ensmean.sh - else - tcsh ${enkfscripts}/firstges_multi.sh - endif -endif diff --git a/ush/EnKF/firstges_multi.sh b/ush/EnKF/firstges_multi.sh deleted file mode 100755 index 7607782817..0000000000 --- a/ush/EnKF/firstges_multi.sh +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/tcsh - -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms - -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycle=1 - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" -# copy hostfileall to working dir. -##/bin/cp -f ${datapath}/hostfileall ${datapath2} - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - - -# run ensemble first guess. -# first, clean up old first guesses. -if ($cleanup_fg == 'true') then -set fhr=$FHMIN -while ( $fhr <= $FHMAX) - set charfhr="fhr`printf %02i $fhr`" - /bin/rm -f ${datapath}${analdatep1}/sfg_${analdatep1}_${charfhr}*_* - /bin/rm -f ${datapath}${analdatep1}/bfg_${analdatep1}_${charfhr}*_* - @ fhr = $fhr + $FHOUT -end -endif -mkdir -p ${datapath}${analdatep1} - -## BITS FOR (HIRES) CONTROL FORECAST JOB -set LONB_save=$LONB -set LATB_save=$LATB -set JCAP_save=$JCAP -setenv LONB $LONB_HIGH -setenv LATB $LATB_HIGH -setenv JCAP $JCAP_HIGH - -## FILES FOR SFC CYCLE ETC -setenv COMIN "${obs_datapath}/${analdate}/${datdump}" -setenv FNTSFA "${COMIN}/sstgrb.${datdump}.${analdate}" -setenv FNACNA "${COMIN}/icegrb.${datdump}.${analdate}" -setenv FNSNOA "${COMIN}/snogrb.${datdump}.${analdate}" - - -set filemissing='no' -set charnanal=control -set analfile="${datapath2}/sanl_${analdate}_${charnanal}" -set sfcanlfile="${datapath2}/sfcanl_${analdate}_${charnanal}" -if { /bin/test ! -s $analfile } set filemissing='yes' -if { /bin/test ! -s $sfcanlfile } set filemissing='yes' - -if($filemissing == 'yes') then -# Run surface cycle and chgres - cd ${datapath2} - setenv PGMOUT ${current_logdir}/chgres_sfccycle_control.out - time sh $CYCLESH ${datapathm1}/enkf.t${hrm1}z.bf06 ${datapath2}/sfcanl_${analdate}_control - $CHGRESSH ${datapath2}/sanl_${analdate}_ensmean /dev/null ${datapath2}/sanl_${analdate}_control /dev/null - cd ${enkfscripts} -else - echo "FILES ALREADY APPEAR TO EXIST" -endif - -setenv LONB $LONB_save -setenv LATB $LATB_save -setenv JCAP $JCAP_save - -# CHECK AGAIN -set filemissing='no' -set charnanal=control -set analfile="${datapath2}/sanl_${analdate}_${charnanal}" -set sfcanlfile="${datapath2}/sfcanl_${analdate}_${charnanal}" -if { /bin/test ! -s $analfile } set filemissing='yes' -if { /bin/test ! -s $sfcanlfile } set filemissing='yes' - -if($filemissing == 'yes') then - echo "FILES ARE MISSING, CANNOT SUBMIT CTRL FCST JOB" -else - echo "SUBMIT HI-RES GFS CNTRL" - $SUB -a GDAS-T2O -g devonprod -j enkf_gfsctrl -o ${current_logdir}/run_gfsctrl.out -p 64/6/N -q dev -r 1640/1 -t 00:20:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/${ctrl_gfs} -endif - -## Submit chunks of jobs based on nanals/nmem_per_node settings - @ num_jobs = $nanals / $nmem_per_node - set max_jobs=50 - if ($num_jobs >= $max_jobs) then - echo "THERE ARE TOO MANY JOB STEPS REQUIRED, NUM_JOBS = $num_jobs" - echo "CHECK NANALS & NMEM_PER_NODE IN CONFIG" - echo "STOPPING SCRIPTS HERE" - exit 1 - else - echo "there are $num_jobs job steps required for first ges processing" - endif - - set job=1 - set n1=1 - set n2=$nmem_per_node - - while ($job <= $num_jobs) - setenv NSTART $n1 - setenv NEND $n2 - echo "NSTART=$NSTART" - echo "NEND=$NEND" - $SUB -a GDAS-T2O -e NSTART,NEND -g devonprod -j enkf_fg$job -o ${current_logdir}/run_fg$job.out -p 32 -q dev -r 1000 -t 00:45:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/${fg_gfs} - - @ job = $job + 1 - @ n1 = $n1 + $nmem_per_node - @ n2 = $n2 + $nmem_per_node - - if ($n2 > $nanals) then - @ n2 = $nanals - else -## - endif - end - -# submit script to do file checking, set to wait 10 minutes before checking files -$SUB -a GDAS-T2O -g devonprod -j enkf_check_fgfiles -o ${current_logdir}/check_fg_files.out -q dev -r 1000 -t 03:00:00 -u ${LOGNAME} -w +0010 ${enkfscripts}/check_fgfiles_serial.sh -exit 0 diff --git a/ush/EnKF/get_enkf_ic.sh b/ush/EnKF/get_enkf_ic.sh deleted file mode 100755 index 94f2e691ad..0000000000 --- a/ush/EnKF/get_enkf_ic.sh +++ /dev/null @@ -1,325 +0,0 @@ -#!/bin/ksh - -## Below are LoadLeveler (IBM queueing system) commands -#@ error=$(job_name).e$(jobid) -#@ job_type=parallel -#@ class=devhigh -#@ group=devonprod -#@ account_no = GDAS-T2O -#@ job_name=get_enkf_ic -#@ network.MPI=sn_all,shared,us -#@ tasks_per_node=1 -#@ node = 1 -#@ node_usage=not_shared -#@ task_affinity = core(32) -#@ parallel_threads = 32 -#@ node_resources = ConsumableMemory (110 GB) -#@ wall_clock_limit = 3:00:00 -#@ startdate = 09/27/06 05:00 -#@ notification=error -#@ restart=no -#@ queue - -## Below are PBS (Linux queueing system) commands -#PBS -o get_enkf_ic.e${jobid} -#PBS -N get_enkf_ic -#PBS -q service -#PBS -l walltime=12:00:00 -#PBS -l nodes=1:ppn=1 -#PBS -j eo -#PBS -A ada -#PBS -V - - -set -ax - -# Set user parameters -CDATE=2012061218 # date for which to get initial conditions (ic) - # For CDATE < 2012052100, get ensemble ic from operational GEFS - # For CDATE >= 2012052100, get ensemble ic from operational EnKF - - -machine=IBMP6 # platform (only two machine currently supported) - # machine = IBMP6 for NCEP CCS (cirrus/stratus) - # machine = ZEUS for NOAA R&D machine - - -SAVDIR=ensic.$CDATE # name of directory to which ics are copied - # full path is OUTDIR=$PRETMP/ptmp/$LOGNAME/$SAVDIR - - -NMEM_ENKF=80 # number of ensemble members (do not change) - - -# Specific spectral / grid dimension to which to chgres ensemble members -# NOTE: This script does NOT run chgres for CDATE >= 2012052100 -# -JCAP_ENKF=254 # spectral truncation -LEVS_ENKF=64 # number of vertical levels -LONB_ENKF=768 # number of longitude points -LATB_ENKF=384 # number of gaussian latitude points - - -#---------- Users should not need to edit anything below this line ----------# - -# Set paths -machine=$(echo $machine|tr '[a-z]' '[A-Z]') -if [ $machine = IBMP6 ] ; then - PRETMP="" -elif [ $machine = ZEUS ]; then - PREPTMP=/scratch2/portfolios/NCEPDEV -else - echo "***WARNING*** $machine not supported" - exit -fi -OUTDIR=$PRETMP/ptmp/$LOGNAME/$SAVDIR -TMPDIR=$PRETMP/stmp/$LOGNAME/get_enkf_ic.$CDATE - -# Set script variables -export NCP=${NCP:-cp} - -if [ $machine = IBMP6 ] ; then - export MEMORY_AFFINITY=MCM - export MP_SHARED_MEMORY=yes - export XLFRTEOPTS="nlwidth=80" - export MP_LABELIO=yes - export MP_INFOLEVEL=1 - export CHGRESSH=${CHGRESSH:-/nwprod/ush/global_chgres.sh} - export NDATE=${NDATE:-/nwprod/util/exec/ndate} - export HTAR=${HTAR:-/usr/bin/htar} -elif [ $machine = ZEUS ]; then - /bin/ksh --login - module load intel - module load mpt - module load hpss - export paradir="/scratch2/portfolios/NCEPDEV/global/save" - export HOMEDIR=${HOMEDIR:-$paradir/Shrinivas.Moorthi/para} - export EXECDIR=$HOMEDIR/exec - export FIXGLOBAL=$HOMEDIR/fix/fix_am - export USHDIR=$HOMEDIR/ush - export CHGRESEXEC=$EXECDIR/global_chgres - export CHGRESSH=$USHDIR/global_chgres_uf_gaea.sh - export NDATE=${NDATE:-$UTILDIR/exec/ndate} - export HTAR=${HTAR:-/apps/hpss/htar} -fi - -# Set, create, cd to temporary work directory. Make OUTDIR -rm -rf $TMPDIR -mkdir -p $TMPDIR -cd $TMPDIR - -mkdir -p $OUTDIR - - -# Set date and GDAS/GEFS paths -sdate=`echo $CDATE | cut -c1-8` -hha=`echo $CDATE | cut -c9-10` - -prodgdas=/com/gfs/prod/gdas.$sdate -comgdas=$prodgdas -PREFIX=gdas1.t${hha}z - -prodenkf=/com/gfs/prod/enkf.$sdate/$hha -comenkf=$prodenkf - -prodgefs=/com/gens/prod/gefs.${sdate}/${hha} -comgefs=$prodgefs - - -# If GDAS files are not online, retrieve from tape. -if [[ ! -s $prodgdas/$PREFIX.sanl || ! -s $prodgdas/$PREFIX.sfcanl ]]; then - YYYY=`echo $CDATE | cut -c1-4` - MM=`echo $CDATE | cut -c5-6` - DD=`echo $CDATE | cut -c7-8` - HH=`echo $CDATE | cut -c9-10` - - comgdas=$TMPDIR$prodgdas - mkdir -p $comgdas - cd $comgdas - - hpssfile=/NCEPPROD/hpssprod/runhistory/rh${YYYY}/${YYYY}${MM}/${YYYY}${MM}${DD}/com_gfs_prod_gdas.${YYYY}${MM}${DD}${HH}.tar - $HTAR -xvf $hpssfile ./$PREFIX.sanl - $HTAR -xvf $hpssfile ./$PREFIX.sfcanl - rc=$? - if [[ "$rc" != "0" ]]; then - echo "***WARNING*** can not retrieve GDAS initial conditions for $CDATE" - exit - fi -fi - -# Copy GDAS initial condtions to OUTDIR -comdir=$comgdas -$NCP $comdir/$PREFIX.sanl $OUTDIR/siganl.gdas.$CDATE -$NCP $comdir/$PREFIX.sfcanl $OUTDIR/sfcanl.gdas.$CDATE - - -# If CDATE >= 2012052100, look for EnKF files. If not online, retrieve from tape. -if [[ $CDATE -ge 2012052100 ]]; then - if [[ ! -s $prodenkf/siganl_${CDATE}_mem001 || ! -s $prodenkf/sfcanl_${CDATE}_mem001 ]]; then - YYYY=`echo $CDATE | cut -c1-4` - MM=`echo $CDATE | cut -c5-6` - DD=`echo $CDATE | cut -c7-8` - HH=`echo $CDATE | cut -c9-10` - - comenkf=$TMPDIR$prodenkf - mkdir -p $comenkf - cd $comenkf - - hpssfile=/NCEPPROD/hpssprod/runhistory/rh${YYYY}/${YYYY}${MM}/${YYYY}${MM}${DD}/com_gfs_prod_enkf.${YYYY}${MM}${DD}_${HH}.anl.tar - $HTAR -xvf $hpssfile - rc=$? - if [[ "$rc" != "0" ]]; then - echo "***WARNING*** can not retrieve GEFS initial conditions for $CDATE" - exit - fi - fi - -# Copy EnKF initial conditions to OUTDIR - comdir=$comenkf - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="mem"`printf %03i $imem` - $NCP $comdir/siganl_${CDATE}_$member $OUTDIR/ - $NCP $comdir/sfcanl_${CDATE}_$member $OUTDIR/ - (( imem = $imem + 1 )) - done -fi - - -# If CDATE before operational EnKF, use GEFS. -if [[ $CDATE -lt 2012052100 ]]; then - -# If GEFS files are not online, retrieve from tape - if [[ ! -s $prodgefs/init/gec00.t${hha}z.sanl || ! -s $prodgefs/init/gec00.t${hha}z.sfcanl ]]; then - YYYY=`echo $CDATE | cut -c1-4` - MM=`echo $CDATE | cut -c5-6` - DD=`echo $CDATE | cut -c7-8` - HH=`echo $CDATE | cut -c9-10` - - comgefs=$TMPDIR$prodgefs - mkdir -p $comgefs - cd $comgefs - - hpssfile=/NCEPPROD/hpssprod/runhistory/rh${YYYY}/${YYYY}${MM}/${YYYY}${MM}${DD}/com_gens_prod_gefs.${YYYY}${MM}${DD}_${HH}.init.tar - $HTAR -xvf $hpssfile - rc=$? - if [[ "$rc" != "0" ]]; then - echo "***WARNING*** can not retrieve GEFS initial conditions for $CDATE" - exit - fi - fi - -# Copy GEFS control files to TMPDIR - comdir=$comgefs/init - $NCP $comdir/gec00.t${hha}z.sanl $TMPDIR/siganl_${CDATE}_control.gefs - $NCP $comdir/gec00.t${hha}z.sfcanl $TMPDIR/sfcanl_${CDATE}_control.gefs - -# Chgres GEFS control to EnKF resolution - export SIGI=$TMPDIR/siganl_${CDATE}_control.gefs - export SFCI=$TMPDIR/sfcanl_${CDATE}_control.gefs - export SIGO=$TMPDIR/siganl_${CDATE}_control - export SFCO=$TMPDIR/sfcanl_${CDATE}_control - export SIGLEVEL=/nwprod/fix/global_hyblev.l64.txt - export VERBOSE=YES - export DATA=$TMPDIR/chgres_control - - export JCAP_ens=$JCAP_ENKF - export LEVS_ens=$LEVS_ENKF - export LONB_ens=$LONB_ENKF - export LATB_ens=$LATB_ENKF - export NTRAC=3 - export IDVC=2 - export IDSL=1 - export LSOIL=4 - export CHGRESVARS="IDVT=21,IDVM=0" - export OUTTYP=2 - - if [ $machine = IBMP6 ]; then - export CHGRESTHREAD=32 - elif [ $machine = ZEUS ]; then - export CHGRESTHREAD=1 # service queue can only use 1 core - fi - export OMP_NUM_THREADS=$CHGRESTHREAD - export NTHREADS=$OMP_NUM_THREADS - - $CHGRESSH $SIGI $SFCI $SIGO $SFCO $JCAP_ens $LEVS_ens $LONB_ens $LATB_ens - rc=$? - if [[ "$rc" != "0" ]]; then - echo "***WARNING*** chgres of GEFS initial conditions failed with return code $rc" - exit - fi - - export OMP_NUM_THREADS=1 - export NTHREADS=$OMP_NUM_THREADS - -# Loop to replicate control surface analysis as ensemble member -# surface analyses. This means initial surface analyses are -# identical. Only the atmospheric files are perturbed. - - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="mem"`printf %03i $imem` - $NCP $TMPDIR/sfcanl_${CDATE}_control $OUTDIR/sfcanl_${CDATE}_${member} - (( imem = $imem + 1 )) - done - - -# Loop to rename GEFS atmospheric initial conditions - imem=1 - cd $comdir - for file in `ls gep*sanl*`; do - member="mem"`printf %03i $imem` - $NCP $comdir/$file $TMPDIR/sanl_${CDATE}_${member}.gefs - (( imem = $imem + 1 )) - done - -# Loop to chgres GEFS atmospheric initial conditions to EnKF resolution - imem=1 - while [[ $imem -le $NMEM_ENKF ]]; do - member="mem"`printf %03i $imem` - export SIGI=$TMPDIR/sanl_${CDATE}_${member}.gefs - export SFCI=/dev/null - export SIGO=$TMPDIR/sanl_${CDATE}_${member} - export SFCO=/dev/null - export SIGLEVEL=/nwprod/fix/global_hyblev.l64.txt - export VERBOSE=YES - export DATA=$TMPDIR/chgres_${member} - - export JCAP_ens=$JCAP_ENKF - export LEVS_ens=$LEVS_ENKF - export LONB_ens=$LONB_ENKF - export LATB_ens=$LATB_ENKF - export NTRAC=3 - export IDVC=2 - export IDSL=1 - export LSOIL=4 - export CHGRESVARS="IDVT=21,IDVM=0" - export OUTTYP=2 - - if [ $machine = IBMP6 ]; then - export CHGRESTHREAD=32 - elif [ $machine = ZEUS ]; then - export CHGRESTHREAD=1 # service queue can only use 1 core - fi - export OMP_NUM_THREADS=$CHGRESTHREAD - export NTHREADS=$OMP_NUM_THREADS - - $CHGRESSH $SIGI $SFCI $SIGO $SFCO $JCAP_ens $LEVS_ens $LONB_ens $LATB_ens - rc=$? - if [[ "$rc" != "0" ]]; then - echo "***WARNING*** chgres of GEFS ensemble members failed with return code $rc" - exit - fi - - export OMP_NUM_THREADS=1 - export NTHREADS=$OMP_NUM_THREADS - -# Copy chgres'd GEFS to OUTDIR - $NCP $SIGO $OUTDIR/siganl_${CDATE}_${member} - - (( imem = $imem + 1 )) - done -fi - -exit - diff --git a/ush/EnKF/gfscontrol.sh b/ush/EnKF/gfscontrol.sh deleted file mode 100755 index e583d7861f..0000000000 --- a/ush/EnKF/gfscontrol.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/tcsh - -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms - -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycles=10 -set ncycle=1 -##while ($ncycle <= $ncycles) -echo "ncycle = " $ncycle "and ncycles = " $ncycles - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" -# copy hostfileall to working dir. -##/bin/cp -f ${datapath}/hostfileall ${datapath2} - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -# run high res forecast. -set FHMAX_save=$FHMAX -set RUN_save=$RUN -set POSTPROC_save=$POSTPROC -set JCAP_save=$JCAP -set FHOUT_save=$FHOUT -set LONB_save=$LONB -set LATB_save=$LATB -setenv FHMAX 9 -setenv FHOUT 1 -setenv RUN enkf -setenv POSTPROC NO -setenv DATOUT ${datapath2} -setenv DATA ${datapath2}/chgrestmp.$$ - -setenv JCAP $JCAP_HIGH -setenv LONB $LONB_HIGH -setenv LATB $LATB_HIGH - -#### IC is either just enkf ens mean (which res changed).. -####if ($JCAP_HIGH != $JCAP_save) then -##### Run surface cycle and chgres -####time sh $CYCLESH ${datapathm1}/enkf.t${hrm1}z.bf06 ${datapath2}/sfcanl_${analdate}_control -####$CHGRESSH ${datapath2}/sanl_${analdate}_ensmean /dev/null ${datapath2}/sanl_${analdate}_control /dev/null - - -setenv SIGO ${DATOUT}/${RUN}.t${hr}z.sf'${FH}' -setenv SFCO ${DATOUT}/${RUN}.t${hr}z.bf'${FH}' -setenv FLXO ${DATOUT}/${RUN}.t${hr}z.sfluxgrbf'${FH}' -setenv SIGI ${datapath}${analdate}/sanl_${analdate}_control -setenv SFCI ${datapath}${analdate}/sfcanl_${analdate}_control -setenv RERUN YES -echo "${analdate} run ${FHMAX} hour single forecast from eda solution `date`" -sh ${enkfscripts}/${drive_ensmean} >&! ${current_logdir}/gfs_fcst.out - -unsetenv SIGO -unsetenv SFCO -unsetenv FLXO -echo "${analdate} done running ${FHMAX} hour single forecast `date`" - -# do postprocessing -set nbackground = 0 -setenv DATA ${datapath2}/postgptmp_00.$$ -sh ${enkfscripts}/global_postgp.sh ${datapath2}/sanl_${analdate}_control /dev/null /dev/null ${datapath2}/${RUN}.t${hr}z.pgrbanl /dev/null $IO $JO >&! ${current_logdir}\ -/gfs_fcst_pgrbanl.out & -@ nbackground = $nbackground + 1 -set fh=$FHOUT -while ($fh <= $FHMAX) - if ($fh < 10) then - set fh=`printf %02i $fh` - endif - setenv DATA ${datapath2}/postgptmp_${fh}.$$ - sh ${enkfscripts}/global_postgp.sh ${datapath2}/${RUN}.t${hr}z.sf${fh} ${datapath2}/${RUN}.t${hr}z.sfluxgrbf${fh} /dev/null ${datapath2}/${RUN}.t${hr}z.pgrbf${fh} /de\ -v/null $IO $JO >&! ${current_logdir}/gfs_fcst_pgrbf${fh}.out & - @ nbackground = $nbackground + 1 - if ($nbackground == $nbackground_max) then - echo "waiting at forecast hour $fh" - wait - set nbackground = 1 - endif - @ fh = $fh + $FHOUT -end -sleep 45 -wait -/bin/rm -f ${datapath}/postgptmp_* - -endif - -exit 0 diff --git a/ush/EnKF/global_chgres.sh b/ush/EnKF/global_chgres.sh deleted file mode 100755 index 698307314f..0000000000 --- a/ush/EnKF/global_chgres.sh +++ /dev/null @@ -1,433 +0,0 @@ - -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: chgres_global.sh -# Script description: Changes resolution of global restart files. -# -# Author: Mark Iredell Org: NP23 Date: 1999-03-01 -# -# Abstract: This script changes the resolution of the global restart files, -# namely the sigma file or the surface file or both. The resolution -# of the output files is given in the argument list or as imported -# environment variables. The resolution of the input files are taken -# from the header records in the respective files. Resolution is -# given as spectral truncation, number of levels, number of longitudes -# and number of latitudes. The names of the input and output restart files -# are also given in the argument list or as imported environment variables. -# Other control variables may be specified in the imported environment, too. -# For example, an alternate orography and sigma level structure may be -# specified for the output sigma file, while an alternate sea-land mask -# may be specified for the surface file. -# -# Script history log: -# 1999-03-01 Mark Iredell -# -# Usage: chgres_global.sh JCAP LEVS LONB LATB SIGINP SFCINP SIGOUT SFCOUT -# -# Input script positional parameters: -# 1 Input sigma file -# defaults to $SIGINP; skip sigma conversion if missing -# 2 Input surface file -# defaults to $SFCINP; skip surface conversion if missing -# 3 Output sigma file -# defaults to $SIGOUT, then to sigout -# 4 Output sigma file -# defaults to $SFCOUT, then to sfcout -# 5 New spectral truncation -# defaults to $JCAP; one or the other is required -# 6 New number of levels -# defaults to $LEVS; one or the other is required -# 7 New number of longitudes -# defaults to $LONB; one or the other is required -# 8 New number of latitudes -# defaults to $LATB; one or the other is required -# 9 Output gfsio file -# defaults to $GFSOUT, then to gfsout -# 10 Output file type -# defaults to $OUTTYP, then to 2 -# 11 Grid output file type -# defaults to $IDRT, then to 4 -# -# Imported Shell Variables: -# SIGINP Input sigma file -# overridden by $1; skip sigma conversion if missing -# SFCINP Input surface file -# overridden by $2; skip surface conversion if missing -# OUTTYP Output file type -# 1: gfsio ; 2: sigio sigma (default); 0: both -# IDRT Grid output file type -# 4: guassian(default); 0: lat-lon -# SIGOUT Output sigma file -# overridden by $3; defaults to sigout -# GFSOUT Output gfsio file -# overridden by $9; defaults to gfsout -# SFCOUT Output surface file -# overridden by $4; defaults to sfcout -# JCAP New spectral truncation -# overridden by $5; one or the other is required -# LEVS New number of levels -# overridden by $6; one or the other is required -# LONB New number of longitudes -# overridden by $7; one or the other is required -# LATB New number of latitudes -# overridden by $8; one or the other is required -# NTRAC New number of tracers -# defaults to input sigma file value -# IDVC New vertical coordinate id (1 for sigma, 2 for hybrid) -# defaults to input sigma file value -# IDSL New midlayer pressure id (1 for phillips, 2 for mean) -# defaults to input sigma file value -# FIXGLOBAL Directory for global fixed files -# defaults to /nwprod/fix -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# OROGRAPHY New orography ("NULL" to use from input sigma file) -# defaults to ${FIXGLOBAL}/global_orography.t${JCAP}.grb -# SIGLEVEL New sigma levels ("NULL" to use from input sigma file) -# defaults to ${FIXGLOBAL}/global_siglevel.l${LEVS}.txt -# O3CLIM New ozone climatology (required if adding ozone) -# defaults to ${FIXGLOBAL}/global_o3clim.txt -# SLMASK New sea-land mask ("NULL" to use from input surface file) -# defaults to ${FIXGLOBAL}/global_slmask.t${JCAP}.grb -# FNGLAC Input glacier climatology GRIB file -# defaults to ${FIXGLOBAL}/global_glacier.2x2.grb -# FNMXIC Input maximum sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_maxice.2x2.grb -# FNTSFC Input SST climatology GRIB file -# defaults to ${FIXGLOBAL}/global_sstclim.2x2.grb -# FNSNOC Input snow climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoclim.1.875.grb -# FNZORC Input roughness climatology GRIB file -# defaults to ${FIXGLOBAL}/global_zorclim.1x1.grb -# FNALBC Input albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_albedo4.1x1.grb -# FNAISC Input sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_iceclim.2x2.grb -# FNTG3C Input deep soil temperature climatology GRIB file -# defaults to ${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb -# FNVEGC Input vegetation fraction climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegfrac.1x1.grb -# FNVETC Input vegetation type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegtype.1x1.grb -# FNSOTC Input soil type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soiltype.1x1.grb -# FNSMCC Input soil moisture climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soilmcpc.1x1.grb -# FNVMNC Input min veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmin.0.144x0.144.grb -# FNVMXC Input max veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmax.0.144x0.144.grb -# FNSLPC Input slope type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_slope.1x1.grb -# FNABSC Input max snow albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoalb.1x1.grb -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXGLOBAL}/seaice_newland.grb -# CLIMO_ -# FIELDS_OPT 1-Climo/static fields (albedo, soil type, greenness, etc.) -# interpolated from input grid. -# 2-Vegetation, slope and soil type interpolated from input -# grid. All other climo/static fields from sfccycle. -# 3-All climo/static fields from sfccycle. -# LANDICE_OPT 1-Input no landice => output landice -# 2-Input landice => output landice. -# 3-Input no landice => output no landice -# 4-Input landice => output no landice -# 5-Output landice regardless of input -# LSOIL 2-Output file with 2 soil layers -# 4-Output file with 4 soil layers -# 0-Default, number of soil layers same as input file -# IVSSFC Version number of surface restart file -# 0-Default, same as input file. -# LONSPERLAT New lonsperlat ("NULL" to use from input surface file) -# defaults to ${FIXGLOBAL}/global_lonsperlat.t${JCAP}.txt -# CHGRESEXEC Change resolution executable -# defaults to ${EXECGLOBAL}/global_chgres -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# CHGRESVARS Other namelist inputs to the change resolution executable -# such as LONBI,LATBI,IGEN,MGG,JC,MQUICK -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CHGRESEXEC -# -# input data : $1 or $SIGINP -# $2 or $SFCINP -# $OROGRAPHY -# $SIGLEVEL -# $O3CLIM -# $SLMASK -# $LONSPERLAT -# -# output data: $3 or $SIGOUT -# $4 or $SFCOUT -# $9 or $GFSOUT -# $PGMOUT -# $PGMERR -# -# scratch : ${DATA}/chgres.inp.sig -# ${DATA}/chgres.inp.orogb -# ${DATA}/chgres.inp.siglevel -# ${DATA}/chgres.inp.sfc -# ${DATA}/chgres.inp.slmgb -# ${DATA}/chgres.out.sig -# ${DATA}/chgres.out.sfc -# ${DATA}/fort.35 -# ${DATA}/fort.81 -# ${DATA}/NULL -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export SIGINP=${1:-${SIGINP:-NULL}} -export SFCINP=${2:-${SFCINP:-NULL}} -export OUTTYP=${10:-${OUTTYP:-2}} -export SIGOUT=${3:-${SIGOUT:-sigout}} -export GFSOUT=${9:-${GFSOUT:-gfsout}} -export SFCOUT=${4:-${SFCOUT:-sfcout}} -export JCAP=${5:-${JCAP:?}} -export LEVS=${6:-${LEVS:?}} -export LONB=${7:-${LONB:?}} -export LATB=${8:-${LATB:?}} -export IDRT=${11:-${IDRT:-4}} -# Directories. -export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export DATA=${DATA:-$(pwd)} -# Filenames. -export XC=${XC} -export CHGRESEXEC=${CHGRESEXEC:-${EXECGLOBAL}/global_chgres$XC} -export OROGRAPHY=${OROGRAPHY:-${FIXGLOBAL}/global_orography.t${JCAP}.grb} -export SIGLEVEL=${SIGLEVEL:-${FIXGLOBAL}/global_siglevel.l${LEVS}.txt} -export O3CLIM=${O3CLIM:-${FIXGLOBAL}/global_o3clim.txt} -export SLMASK=${SLMASK:-${FIXGLOBAL}/global_slmask.t${JCAP}.grb} -export FNGLAC=${FNGLAC:-${FIXGLOBAL}/global_glacier.2x2.grb} -export FNMXIC=${FNMXIC:-${FIXGLOBAL}/global_maxice.2x2.grb} -export FNTSFC=${FNTSFC:-${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb} -export FNSNOC=${FNSNOC:-${FIXGLOBAL}/global_snoclim.1.875.grb} -export FNZORC=${FNZORC:-${FIXGLOBAL}/global_zorclim.1x1.grb} -export FNALBC=${FNALBC:-${FIXGLOBAL}/global_albedo4.1x1.grb} -export FNAISC=${FNAISC:-${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb} -export FNTG3C=${FNTG3C:-${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb} -export FNVEGC=${FNVEGC:-${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb} -export FNVETC=${FNVETC:-${FIXGLOBAL}/global_vegtype.1x1.grb} -export FNSOTC=${FNSOTC:-${FIXGLOBAL}/global_soiltype.1x1.grb} -export FNSMCC=${FNSMCC:-${FIXGLOBAL}/global_soilmcpc.1x1.grb} -export FNVMNC=${FNVMNC:-${FIXGLOBAL}/global_shdmin.0.144x0.144.grb} -export FNVMXC=${FNVMXC:-${FIXGLOBAL}/global_shdmax.0.144x0.144.grb} -export FNSLPC=${FNSLPC:-${FIXGLOBAL}/global_slope.1x1.grb} -export FNABSC=${FNABSC:-${FIXGLOBAL}/global_snoalb.1x1.grb} -export FNMSKH=${FNMSKH:-${FIXGLOBAL}/seaice_newland.grb} -export LANDICE_OPT=${LANDICE_OPT:-2} -export CLIMO_FIELDS_OPT=${CLIMO_FIELDS_OPT:-2} -export LONSPERLAT=${LONSPERLAT:-${FIXGLOBAL}/global_lonsperlat.t${JCAP}.txt} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export NTRAC=${NTRAC:-0} -export IDVC=${IDVC:-0} -export IDSL=${IDSL:-0} -export LSOIL=${LSOIL:-0} -export IVSSFC=${IVSSFC:-0} -export CHGRESVARS=${CHGRESVARS} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export XLSMPOPTS=${XLSMPOPTS:-"parthds=$NTHREADS:stack=NTHSTACK"} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -################################################################################ -# Change resolution -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$CHGRESEXEC -export pgm=$PGM -$LOGSCRIPT -rm -f NULL -ln -sf $SIGINP chgres.inp.sig -ln -sf $OROGRAPHY chgres.inp.orogb -ln -sf $SIGLEVEL chgres.inp.siglevel -ln -sf $O3CLIM chgres.inp.o3clim -ln -sf $SFCINP chgres.inp.sfc -ln -sf $SLMASK chgres.inp.slmgb -ln -sf $LONSPERLAT chgres.inp.lonsperlat -ln -sf $SIGOUT chgres.out.sig -ln -sf $GFSOUT chgres.out.grd -ln -sf $SFCOUT chgres.out.sfc - -if [[ $LANDICE_OPT = 3 || $LANDICE_OPT = 4 ]] -then - LANDICE=.false. -else - LANDICE=.true. -fi - -cat << EOF > fort.35 - &NAMSFC - FNGLAC='${FNGLAC}' - FNMXIC='${FNMXIC}' - FNTSFC='${FNTSFC}' - FNSNOC='${FNSNOC}' - FNZORC='${FNZORC}' - FNALBC='${FNALBC}' - FNAISC='${FNAISC}' - FNTG3C='${FNTG3C}' - FNVEGC='${FNVEGC}' - FNVETC='${FNVETC}' - FNSOTC='${FNSOTC}' - FNSMCC='${FNSMCC}' - FNVMNC='${FNVMNC}' - FNVMXC='${FNVMXC}' - FNSLPC='${FNSLPC}' - FNABSC='${FNABSC}' - FNMSKH='${FNMSKH}' - FNTSFA='' - FNACNA='' - FNSNOA='' - LDEBUG=.false. - LANDICE=$LANDICE -/ -EOF - -cat << EOF > fort.81 - &soil_parameters - soil_src_input = "zobler" - smclow_input = 0.5 - smchigh_input = 6.0 - smcmax_input= 0.421, 0.464, 0.468, 0.434, 0.406, 0.465, - 0.404, 0.439, 0.421 - beta_input = 4.26, 8.72, 11.55, 4.74, 10.73, 8.17, - 6.77, 5.25, 4.26 - psis_input = 0.040, 0.620, 0.470, 0.140, 0.100, 0.260, - 0.140, 0.360, 0.040 - satdk_input = 1.41e-5, 0.20e-5, 0.10e-5, 0.52e-5, 0.72e-5, - 0.25e-5, 0.45e-5, 0.34e-5, 1.41e-5 - soil_src_output = "zobler" - smclow_output = 0.5 - smchigh_output = 6.0 - smcmax_output= 0.421, 0.464, 0.468, 0.434, 0.406, 0.465, - 0.404, 0.439, 0.421 - beta_output = 4.26, 8.72, 11.55, 4.74, 10.73, 8.17, - 6.77, 5.25, 4.26 - psis_output = 0.040, 0.620, 0.470, 0.140, 0.100, 0.260, - 0.140, 0.360, 0.040 - satdk_output = 1.41e-5, 0.20e-5, 0.10e-5, 0.52e-5, 0.72e-5, - 0.25e-5, 0.45e-5, 0.34e-5, 1.41e-5 - / - &veg_parameters - veg_src_input = "sib" - veg_src_output = "sib" - salp_output= -999. - snup_output= -999. - / - &options - CLIMO_FIELDS_OPT=${CLIMO_FIELDS_OPT} - LANDICE_OPT=${LANDICE_OPT} - / -EOF - -eval $CHGRESEXEC <&2 -fi -exit $err diff --git a/ush/EnKF/global_chgresp.sh b/ush/EnKF/global_chgresp.sh deleted file mode 100755 index fdb72786be..0000000000 --- a/ush/EnKF/global_chgresp.sh +++ /dev/null @@ -1,436 +0,0 @@ - -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: chgres_global.sh -# Script description: Changes resolution of global restart files. -# -# Author: Mark Iredell Org: NP23 Date: 1999-03-01 -# -# Abstract: This script changes the resolution of the global restart files, -# namely the sigma file or the surface file or both. The resolution -# of the output files is given in the argument list or as imported -# environment variables. The resolution of the input files are taken -# from the header records in the respective files. Resolution is -# given as spectral truncation, number of levels, number of longitudes -# and number of latitudes. The names of the input and output restart files -# are also given in the argument list or as imported environment variables. -# Other control variables may be specified in the imported environment, too. -# For example, an alternate orography and sigma level structure may be -# specified for the output sigma file, while an alternate sea-land mask -# may be specified for the surface file. -# -# Script history log: -# 1999-03-01 Mark Iredell -# -# Usage: chgres_global.sh JCAP LEVS LONB LATB SIGINP SFCINP SIGOUT SFCOUT -# -# Input script positional parameters: -# 1 Input sigma file -# defaults to $SIGINP; skip sigma conversion if missing -# 2 Input surface file -# defaults to $SFCINP; skip surface conversion if missing -# 3 Output sigma file -# defaults to $SIGOUT, then to sigout -# 4 Output sigma file -# defaults to $SFCOUT, then to sfcout -# 5 New spectral truncation -# defaults to $JCAP; one or the other is required -# 6 New number of levels -# defaults to $LEVS; one or the other is required -# 7 New number of longitudes -# defaults to $LONB; one or the other is required -# 8 New number of latitudes -# defaults to $LATB; one or the other is required -# 9 Output gfsio file -# defaults to $GFSOUT, then to gfsout -# 10 Output file type -# defaults to $OUTTYP, then to 2 -# 11 Grid output file type -# defaults to $IDRT, then to 4 -# -# Imported Shell Variables: -# SIGINP Input sigma file -# overridden by $1; skip sigma conversion if missing -# SFCINP Input surface file -# overridden by $2; skip surface conversion if missing -# OUTTYP Output file type -# 1: gfsio ; 2: sigio sigma (default); 0: both -# IDRT Grid output file type -# 4: guassian(default); 0: lat-lon -# SIGOUT Output sigma file -# overridden by $3; defaults to sigout -# GFSOUT Output gfsio file -# overridden by $9; defaults to gfsout -# SFCOUT Output surface file -# overridden by $4; defaults to sfcout -# JCAP New spectral truncation -# overridden by $5; one or the other is required -# LEVS New number of levels -# overridden by $6; one or the other is required -# LONB New number of longitudes -# overridden by $7; one or the other is required -# LATB New number of latitudes -# overridden by $8; one or the other is required -# NTRAC New number of tracers -# defaults to input sigma file value -# IDVC New vertical coordinate id (1 for sigma, 2 for hybrid) -# defaults to input sigma file value -# IDSL New midlayer pressure id (1 for phillips, 2 for mean) -# defaults to input sigma file value -# FIXGLOBAL Directory for global fixed files -# defaults to /nwprod/fix -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# OROGRAPHY New orography ("NULL" to use from input sigma file) -# defaults to ${FIXGLOBAL}/global_orography.t${JCAP}.grb -# SIGLEVEL New sigma levels ("NULL" to use from input sigma file) -# defaults to ${FIXGLOBAL}/global_siglevel.l${LEVS}.txt -# O3CLIM New ozone climatology (required if adding ozone) -# defaults to ${FIXGLOBAL}/global_o3clim.txt -# SLMASK New sea-land mask ("NULL" to use from input surface file) -# defaults to ${FIXGLOBAL}/global_slmask.t${JCAP}.grb -# FNGLAC Input glacier climatology GRIB file -# defaults to ${FIXGLOBAL}/global_glacier.2x2.grb -# FNMXIC Input maximum sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_maxice.2x2.grb -# FNTSFC Input SST climatology GRIB file -# defaults to ${FIXGLOBAL}/global_sstclim.2x2.grb -# FNSNOC Input snow climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoclim.1.875.grb -# FNZORC Input roughness climatology GRIB file -# defaults to ${FIXGLOBAL}/global_zorclim.1x1.grb -# FNALBC Input albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_albedo4.1x1.grb -# FNAISC Input sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_iceclim.2x2.grb -# FNTG3C Input deep soil temperature climatology GRIB file -# defaults to ${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb -# FNVEGC Input vegetation fraction climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegfrac.1x1.grb -# FNVETC Input vegetation type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegtype.1x1.grb -# FNSOTC Input soil type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soiltype.1x1.grb -# FNSMCC Input soil moisture climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soilmcpc.1x1.grb -# FNVMNC Input min veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmin.0.144x0.144.grb -# FNVMXC Input max veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmax.0.144x0.144.grb -# FNSLPC Input slope type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_slope.1x1.grb -# FNABSC Input max snow albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoalb.1x1.grb -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXGLOBAL}/seaice_newland.grb -# CLIMO_ -# FIELDS_OPT 1-Climo/static fields (albedo, soil type, greenness, etc.) -# interpolated from input grid. -# 2-Vegetation, slope and soil type interpolated from input -# grid. All other climo/static fields from sfccycle. -# 3-All climo/static fields from sfccycle. -# LANDICE_OPT 1-Input no landice => output landice -# 2-Input landice => output landice. -# 3-Input no landice => output no landice -# 4-Input landice => output no landice -# 5-Output landice regardless of input -# LSOIL 2-Output file with 2 soil layers -# 4-Output file with 4 soil layers -# 0-Default, number of soil layers same as input file -# IVSSFC Version number of surface restart file -# 0-Default, same as input file. -# LONSPERLAT New lonsperlat ("NULL" to use from input surface file) -# defaults to ${FIXGLOBAL}/global_lonsperlat.t${JCAP}.txt -# CHGRESEXEC Change resolution executable -# defaults to ${EXECGLOBAL}/global_chgres -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# CHGRESVARS Other namelist inputs to the change resolution executable -# such as LONBI,LATBI,IGEN,MGG,JC,MQUICK -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CHGRESEXEC -# -# input data : $1 or $SIGINP -# $2 or $SFCINP -# $OROGRAPHY -# $SIGLEVEL -# $O3CLIM -# $SLMASK -# $LONSPERLAT -# -# output data: $3 or $SIGOUT -# $4 or $SFCOUT -# $9 or $GFSOUT -# $PGMOUT -# $PGMERR -# -# scratch : ${DATA}/chgres.inp.sig -# ${DATA}/chgres.inp.orogb -# ${DATA}/chgres.inp.siglevel -# ${DATA}/chgres.inp.sfc -# ${DATA}/chgres.inp.slmgb -# ${DATA}/chgres.out.sig -# ${DATA}/chgres.out.sfc -# ${DATA}/fort.35 -# ${DATA}/fort.81 -# ${DATA}/NULL -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export SIGINP=${1:-${SIGINP:-NULL}} -export SFCINP=${2:-${SFCINP:-NULL}} -export OUTTYP=${10:-${OUTTYP:-2}} -export SIGOUT=${3:-${SIGOUT:-sigout}} -export GFSOUT=${9:-${GFSOUT:-gfsout}} -export SFCOUT=${4:-${SFCOUT:-sfcout}} -export JCAP=${5:-${JCAP:?}} -export LEVS=${6:-${LEVS:?}} -export LONB=${7:-${LONB:?}} -export LATB=${8:-${LATB:?}} -export IDRT=${11:-${IDRT:-4}} -# Directories. -export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export DATA=${DATA:-$(pwd)} -# Filenames. -export XC=${XC} -export CHGRESEXEC=${CHGRESEXEC:-${EXECGLOBAL}/global_chgres$XC} -export OROGRAPHY=${OROGRAPHY:-${FIXGLOBAL}/global_orography.t${JCAP}.grb} -export SIGLEVEL=${SIGLEVEL:-${FIXGLOBAL}/global_siglevel.l${LEVS}.txt} -export O3CLIM=${O3CLIM:-${FIXGLOBAL}/global_o3clim.txt} -export SLMASK=${SLMASK:-${FIXGLOBAL}/global_slmask.t${JCAP}.grb} -export FNGLAC=${FNGLAC:-${FIXGLOBAL}/global_glacier.2x2.grb} -export FNMXIC=${FNMXIC:-${FIXGLOBAL}/global_maxice.2x2.grb} -export FNTSFC=${FNTSFC:-${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb} -export FNSNOC=${FNSNOC:-${FIXGLOBAL}/global_snoclim.1.875.grb} -export FNZORC=${FNZORC:-${FIXGLOBAL}/global_zorclim.1x1.grb} -export FNALBC=${FNALBC:-${FIXGLOBAL}/global_albedo4.1x1.grb} -export FNAISC=${FNAISC:-${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb} -export FNTG3C=${FNTG3C:-${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb} -export FNVEGC=${FNVEGC:-${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb} -export FNVETC=${FNVETC:-${FIXGLOBAL}/global_vegtype.1x1.grb} -export FNSOTC=${FNSOTC:-${FIXGLOBAL}/global_soiltype.1x1.grb} -export FNSMCC=${FNSMCC:-${FIXGLOBAL}/global_soilmcpc.1x1.grb} -export FNVMNC=${FNVMNC:-${FIXGLOBAL}/global_shdmin.0.144x0.144.grb} -export FNVMXC=${FNVMXC:-${FIXGLOBAL}/global_shdmax.0.144x0.144.grb} -export FNSLPC=${FNSLPC:-${FIXGLOBAL}/global_slope.1x1.grb} -export FNABSC=${FNABSC:-${FIXGLOBAL}/global_snoalb.1x1.grb} -export FNMSKH=${FNMSKH:-${FIXGLOBAL}/seaice_newland.grb} -export LANDICE_OPT=${LANDICE_OPT:-2} -export CLIMO_FIELDS_OPT=${CLIMO_FIELDS_OPT:-2} -export LONSPERLAT=${LONSPERLAT:-${FIXGLOBAL}/global_lonsperlat.t${JCAP}.txt} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export NTRAC=${NTRAC:-0} -export IDVC=${IDVC:-0} -export IDSL=${IDSL:-0} -export LSOIL=${LSOIL:-0} -export IVSSFC=${IVSSFC:-0} -export CHGRESVARS=${CHGRESVARS} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export XLSMPOPTS=${XLSMPOPTS:-"parthds=$NTHREADS:stack=NTHSTACK"} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -#typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -#typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -################################################################################ -# Preprocessing -#$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -################################################################################ -# Change resolution -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$CHGRESEXEC -export pgm=$PGM -#$LOGSCRIPT -rm -f NULL -ln -sf $SIGINP chgres.inp.sig -ln -sf $OROGRAPHY chgres.inp.orogb -ln -sf $SIGLEVEL chgres.inp.siglevel -ln -sf $O3CLIM chgres.inp.o3clim -ln -sf $SFCINP chgres.inp.sfc -ln -sf $SLMASK chgres.inp.slmgb -ln -sf $LONSPERLAT chgres.inp.lonsperlat -ln -sf $SIGOUT chgres.out.sig -ln -sf $GFSOUT chgres.out.grd -ln -sf $SFCOUT chgres.out.sfc - -if [[ $LANDICE_OPT = 3 || $LANDICE_OPT = 4 ]] -then - LANDICE=.false. -else - LANDICE=.true. -fi - -cat << EOF > fort.35 - &NAMSFC - FNGLAC='${FNGLAC}' - FNMXIC='${FNMXIC}' - FNTSFC='${FNTSFC}' - FNSNOC='${FNSNOC}' - FNZORC='${FNZORC}' - FNALBC='${FNALBC}' - FNAISC='${FNAISC}' - FNTG3C='${FNTG3C}' - FNVEGC='${FNVEGC}' - FNVETC='${FNVETC}' - FNSOTC='${FNSOTC}' - FNSMCC='${FNSMCC}' - FNVMNC='${FNVMNC}' - FNVMXC='${FNVMXC}' - FNSLPC='${FNSLPC}' - FNABSC='${FNABSC}' - FNMSKH='${FNMSKH}' - FNTSFA='' - FNACNA='' - FNSNOA='' - LDEBUG=.false. - LANDICE=$LANDICE -/ -EOF - -cat << EOF > fort.81 - &soil_parameters - soil_src_input = "zobler" - smclow_input = 0.5 - smchigh_input = 6.0 - smcmax_input= 0.421, 0.464, 0.468, 0.434, 0.406, 0.465, - 0.404, 0.439, 0.421 - beta_input = 4.26, 8.72, 11.55, 4.74, 10.73, 8.17, - 6.77, 5.25, 4.26 - psis_input = 0.040, 0.620, 0.470, 0.140, 0.100, 0.260, - 0.140, 0.360, 0.040 - satdk_input = 1.41e-5, 0.20e-5, 0.10e-5, 0.52e-5, 0.72e-5, - 0.25e-5, 0.45e-5, 0.34e-5, 1.41e-5 - soil_src_output = "zobler" - smclow_output = 0.5 - smchigh_output = 6.0 - smcmax_output= 0.421, 0.464, 0.468, 0.434, 0.406, 0.465, - 0.404, 0.439, 0.421 - beta_output = 4.26, 8.72, 11.55, 4.74, 10.73, 8.17, - 6.77, 5.25, 4.26 - psis_output = 0.040, 0.620, 0.470, 0.140, 0.100, 0.260, - 0.140, 0.360, 0.040 - satdk_output = 1.41e-5, 0.20e-5, 0.10e-5, 0.52e-5, 0.72e-5, - 0.25e-5, 0.45e-5, 0.34e-5, 1.41e-5 - / - &veg_parameters - veg_src_input = "sib" - veg_src_output = "sib" - salp_output= -999. - snup_output= -999. - / - &options - CLIMO_FIELDS_OPT=${CLIMO_FIELDS_OPT} - LANDICE_OPT=${LANDICE_OPT} - / -EOF - -cat << EOF > fort.912 - &NAMCHG JCAP=$JCAP, LEVS=$LEVS, LONB=$LONB, LATB=$LATB, - NTRAC=$NTRAC, IDVC=$IDVC, IDSL=$IDSL, - LSOIL=$LSOIL, IVSSFC=$IVSSFC, OUTTYP=$OUTTYP, IDRT=$IDRT, $CHGRESVARS - / -EOF -cat $HOSTFILE -$MPICH/bin/mpirun_rsh -hostfile $HOSTFILE -np 1 $CHGRESEXEC -#$MPICH/bin/mpiexec -hostfile $HOSTFILE -n 1 $CHGRESEXEC - -export ERR=$? -export err=$ERR -#$ERRSCRIPT||exit 2 -rm -f NULL -rm -f chgres.inp.sig chgres.inp.orogb chgres.inp.siglevel chgres.inp.o3clim -rm -f chgres.inp.sfc chgres.inp.slmgb chgres.inp.lonsperlat -rm -f chgres.out.sig chgres.out.sfc fort.35 fort.81 -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -#$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/ush/EnKF/global_cycle.sh b/ush/EnKF/global_cycle.sh deleted file mode 100755 index 8f43b5f402..0000000000 --- a/ush/EnKF/global_cycle.sh +++ /dev/null @@ -1,369 +0,0 @@ -#!/bin/sh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_cycle.sh -# Script description: Makes a global spectral model surface analysis -# -# Author: Mark Iredell Org: NP23 Date: 2005-02-03 -# -# Abstract: This script makes a global spectral model surface analysis. -# -# Script history log: -# 2005-02-03 Iredell extracted from global_analysis.sh -# -# Usage: global_cycle.sh SFCGES SFCANL -# -# Input script positional parameters: -# 1 Input surface guess -# defaults to $SFCGES; required -# 2 Output surface analysis -# defaults to $SFCANL, then to ${COMOUT}/sfcanl -# -# Imported Shell Variables: -# SFCGES Input surface guess -# overridden by $1; required -# SFCANL Output surface analysis -# overridden by $5; defaults to ${COMOUT}/sfcanl -# FIXGLOBAL Directory for global fixed files -# defaults to /nwprod/fix -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# USHGLOBAL Directory for global scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# PREINP Prefix to add to input observation files -# defaults to none -# SUFINP Suffix to add to input observation files -# defaults to none -# NCP Copy command -# defaults to cp -# SFCHDR Command to read surface header -# defaults to ${EXECGLOBAL}/global_sfchdr$XC -# CYCLEXEC Surface cycle executable -# defaults to ${EXECGLOBAL}/global_cycle$XC -# FNGLAC Input glacier climatology GRIB file -# defaults to ${FIXGLOBAL}/global_glacier.2x2.grb -# FNMXIC Input maximum sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_maxice.2x2.grb -# FNTSFC Input SST climatology GRIB file -# defaults to ${FIXGLOBAL}/global_sstclim.2x2.grb -# FNSNOC Input snow climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoclim.1.875.grb -# FNZORC Input roughness climatology GRIB file -# defaults to ${FIXGLOBAL}/global_zorclim.1x1.grb -# FNALBC Input albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_albedo4.1x1.grb -# FNAISC Input sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_iceclim.2x2.grb -# FNTG3C Input deep soil temperature climatology GRIB file -# defaults to ${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb -# FNVEGC Input vegetation fraction climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegfrac.1x1.grb -# FNVETC Input vegetation type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegtype.1x1.grb -# FNSOTC Input soil type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soiltype.1x1.grb -# FNSMCC Input soil moisture climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soilmcpc.1x1.grb -# FNVMNC Input min veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmin.0.144x0.144.grb -# FNVMXC Input max veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmax.0.144x0.144.grb -# FNSLPC Input slope type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_slope.1x1.grb -# FNABSC Input max snow albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoalb.1x1.grb -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXGLOBAL}/seaice_newland.grb -# FNOROG Input orography GRIB file (horiz resolution dependent) -# defaults to ${FIXGLOBAL}/global_orography.t$JCAP.grb -# FNMASK Input land mask GRIB file (horiz resolution dependent) -# defaults to ${FIXGLOBAL}/global_slmask.t$JCAP.grb -# FNTSFA Input SST analysis GRIB file -# defaults to ${COMIN}/${PREINP}sstgrb${SUFINP} -# FNACNA Input sea ice analysis GRIB file -# defaults to ${COMIN}/${PREINP}engicegrb${SUFINP} -# FNSNOA Input snow analysis GRIB file -# defaults to ${COMIN}/${PREINP}snogrb${SUFINP} -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# KEEPFH Flag to keep fhour the same (YES or NO) -# defaults to NO -# JCAP Spectral truncation -# defaults to 382 -# CDATE Output analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# FHOUR Output forecast hour -# defaults to the value in the input surface file header -# LATB Number of latitudes in surface cycling -# defaults to the value in the input surface file header -# LONB Number of longitudes in surface cycling -# defaults to the value in the input surface file header -# LSOIL Number of soil layers -# defaults to 4 -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 60 -# DELTSFC Cycling frequency in hours -# defaults to forecast hour of $SFCGES -# CYCLVARS Other namelist inputs to the cycle executable -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CYCLEXEC -# -# fixed data : $FNGLAC -# $FNMXIC -# $FNTSFC -# $FNSNOC -# $FNZORC -# $FNALBC -# $FNAISC -# $FNTG3C -# $FNVEGC -# $FNVETC -# $FNSOTC -# $FNSMCC -# $FNVMNC -# $FNVMXC -# $FNSLPC -# $FNABSC -# $FNMSKH -# $FNOROG -# $FNMASK -# -# input data : $SFCGES -# $FNTSFA -# $FNACNA -# $FNSNOA -# -# output data: $SFCANL -# $PGMOUT -# $PGMERR -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export SFCGES=${1:-${SFCGES:?}} -export SFCANL=${2:-${SFCANL}} -# Directories. -export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export USHGLOBAL=${USHGLOBAL:-/nwprod/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Filenames. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export KEEPFH=${KEEPFH:-NO} -export JCAP=${JCAP:-382} -export SFCHDR=${SFCHDR:-${EXECGLOBAL}/global_sfchdr$XC} -export CYCLEXEC=${CYCLEXEC:-${EXECGLOBAL}/global_cycle$XC} -export FNGLAC=${FNGLAC:-${FIXGLOBAL}/global_glacier.2x2.grb} -export FNMXIC=${FNMXIC:-${FIXGLOBAL}/global_maxice.2x2.grb} -export FNTSFC=${FNTSFC:-${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb} -export FNSNOC=${FNSNOC:-${FIXGLOBAL}/global_snoclim.1.875.grb} -export FNZORC=${FNZORC:-${FIXGLOBAL}/global_zorclim.1x1.grb} -export FNALBC=${FNALBC:-${FIXGLOBAL}/global_albedo4.1x1.grb} -export FNAISC=${FNAISC:-${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb} -export FNTG3C=${FNTG3C:-${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb} -export FNVEGC=${FNVEGC:-${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb} -export FNVETC=${FNVETC:-${FIXGLOBAL}/global_vegtype.1x1.grb} -export FNSOTC=${FNSOTC:-${FIXGLOBAL}/global_soiltype.1x1.grb} -export FNSMCC=${FNSMCC:-${FIXGLOBAL}/global_soilmcpc.1x1.grb} -export FNVMNC=${FNVMNC:-${FIXGLOBAL}/global_shdmin.0.144x0.144.grb} -export FNVMXC=${FNVMXC:-${FIXGLOBAL}/global_shdmax.0.144x0.144.grb} -export FNSLPC=${FNSLPC:-${FIXGLOBAL}/global_slope.1x1.grb} -export FNABSC=${FNABSC:-${FIXGLOBAL}/global_snoalb.1x1.grb} -export FNMSKH=${FNMSKH:-${FIXGLOBAL}/seaice_newland.grb} -export FNOROG=${FNOROG:-${FIXGLOBAL}/global_orography.t$JCAP.grb} -export FNMASK=${FNMASK:-${FIXGLOBAL}/global_slmask.t$JCAP.grb} -export FNTSFA=${FNTSFA:-${COMIN}/${PREINP}sstgrb${SUFINP}} -export FNACNA=${FNACNA:-${COMIN}/${PREINP}engicegrb${SUFINP}} -export FNSNOA=${FNSNOA:-${COMIN}/${PREINP}snogrb${SUFINP}} -export SFCANL=${SFCANL:-${COMIN}/${PREINP}sfcanl} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -if [[ $KEEPFH = YES ]];then -export CDATE=${CDATE:-$($SFCHDR $SFCGES IDATE||echo 0)} -export FHOUR=${FHOUR:-$($SFCHDR $SFCGES FHOUR||echo 0)} -else -export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} -export FHOUR=${FHOUR:-0} -fi -export LATB=${LATB:-$($SFCHDR $SFCGES LATB||echo 0)} -export LONB=${LONB:-$($SFCHDR $SFCGES LONB||echo 0)} -export LSOIL=${LSOIL:-4} -export FSMCL2=${FSMCL2:-60} -export DELTSFC=${DELTSFC:-$($SFCHDR $SFCGES FHOUR||echo 0)} -export CYCLVARS=${CYCLVARS} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -# Set defaults -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -echo "pwd = $pwd" -echo "DATA = $DATA" -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -[[ -d $COMOUT ]]||mkdir -p $COMOUT - -################################################################################ -# Make surface analysis -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$CYCLEXEC -export pgm=$PGM -###$LOGSCRIPT - -rm $SFCANL -iy=$(echo $CDATE|cut -c1-4) -im=$(echo $CDATE|cut -c5-6) -id=$(echo $CDATE|cut -c7-8) -ih=$(echo $CDATE|cut -c9-10) -eval $CYCLEXEC <&2 -fi -exit $err diff --git a/ush/EnKF/global_cyclep.sh b/ush/EnKF/global_cyclep.sh deleted file mode 100755 index 0620537e77..0000000000 --- a/ush/EnKF/global_cyclep.sh +++ /dev/null @@ -1,373 +0,0 @@ -#!/bin/sh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_cycle.sh -# Script description: Makes a global spectral model surface analysis -# -# Author: Mark Iredell Org: NP23 Date: 2005-02-03 -# -# Abstract: This script makes a global spectral model surface analysis. -# -# Script history log: -# 2005-02-03 Iredell extracted from global_analysis.sh -# -# Usage: global_cycle.sh SFCGES SFCANL -# -# Input script positional parameters: -# 1 Input surface guess -# defaults to $SFCGES; required -# 2 Output surface analysis -# defaults to $SFCANL, then to ${COMOUT}/sfcanl -# -# Imported Shell Variables: -# SFCGES Input surface guess -# overridden by $1; required -# SFCANL Output surface analysis -# overridden by $5; defaults to ${COMOUT}/sfcanl -# FIXGLOBAL Directory for global fixed files -# defaults to /nwprod/fix -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# USHGLOBAL Directory for global scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMIN input directory -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# PREINP Prefix to add to input observation files -# defaults to none -# SUFINP Suffix to add to input observation files -# defaults to none -# NCP Copy command -# defaults to cp -# SFCHDR Command to read surface header -# defaults to ${EXECGLOBAL}/global_sfchdr$XC -# CYCLEXEC Surface cycle executable -# defaults to ${EXECGLOBAL}/global_cycle$XC -# FNGLAC Input glacier climatology GRIB file -# defaults to ${FIXGLOBAL}/global_glacier.2x2.grb -# FNMXIC Input maximum sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_maxice.2x2.grb -# FNTSFC Input SST climatology GRIB file -# defaults to ${FIXGLOBAL}/global_sstclim.2x2.grb -# FNSNOC Input snow climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoclim.1.875.grb -# FNZORC Input roughness climatology GRIB file -# defaults to ${FIXGLOBAL}/global_zorclim.1x1.grb -# FNALBC Input albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_albedo4.1x1.grb -# FNAISC Input sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_iceclim.2x2.grb -# FNTG3C Input deep soil temperature climatology GRIB file -# defaults to ${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb -# FNVEGC Input vegetation fraction climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegfrac.1x1.grb -# FNVETC Input vegetation type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegtype.1x1.grb -# FNSOTC Input soil type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soiltype.1x1.grb -# FNSMCC Input soil moisture climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soilmcpc.1x1.grb -# FNVMNC Input min veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmin.0.144x0.144.grb -# FNVMXC Input max veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmax.0.144x0.144.grb -# FNSLPC Input slope type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_slope.1x1.grb -# FNABSC Input max snow albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoalb.1x1.grb -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXGLOBAL}/seaice_newland.grb -# FNOROG Input orography GRIB file (horiz resolution dependent) -# defaults to ${FIXGLOBAL}/global_orography.t$JCAP.grb -# FNMASK Input land mask GRIB file (horiz resolution dependent) -# defaults to ${FIXGLOBAL}/global_slmask.t$JCAP.grb -# FNTSFA Input SST analysis GRIB file -# defaults to ${COMIN}/${PREINP}sstgrb${SUFINP} -# FNACNA Input sea ice analysis GRIB file -# defaults to ${COMIN}/${PREINP}engicegrb${SUFINP} -# FNSNOA Input snow analysis GRIB file -# defaults to ${COMIN}/${PREINP}snogrb${SUFINP} -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# KEEPFH Flag to keep fhour the same (YES or NO) -# defaults to NO -# JCAP Spectral truncation -# defaults to 382 -# CDATE Output analysis date in yyyymmddhh format -# defaults to the value in the input surface file header -# FHOUR Output forecast hour -# defaults to the value in the input surface file header -# LATB Number of latitudes in surface cycling -# defaults to the value in the input surface file header -# LONB Number of longitudes in surface cycling -# defaults to the value in the input surface file header -# LSOIL Number of soil layers -# defaults to 4 -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 60 -# DELTSFC Cycling frequency in hours -# defaults to forecast hour of $SFCGES -# CYCLVARS Other namelist inputs to the cycle executable -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# FILESTYLE File management style flag -# ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA, -# 'X' to use XLFUNIT or symbolic links where appropriate) -# defaults to 'X' -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $CYCLEXEC -# -# fixed data : $FNGLAC -# $FNMXIC -# $FNTSFC -# $FNSNOC -# $FNZORC -# $FNALBC -# $FNAISC -# $FNTG3C -# $FNVEGC -# $FNVETC -# $FNSOTC -# $FNSMCC -# $FNVMNC -# $FNVMXC -# $FNSLPC -# $FNABSC -# $FNMSKH -# $FNOROG -# $FNMASK -# -# input data : $SFCGES -# $FNTSFA -# $FNACNA -# $FNSNOA -# -# output data: $SFCANL -# $PGMOUT -# $PGMERR -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export SFCGES=${1:-${SFCGES:?}} -export SFCANL=${2:-${SFCANL}} -# Directories. -export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export USHGLOBAL=${USHGLOBAL:-/nwprod/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Filenames. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export KEEPFH=${KEEPFH:-NO} -export JCAP=${JCAP:-382} -export SFCHDR=${SFCHDR:-${EXECGLOBAL}/global_sfchdr$XC} -export CYCLEXEC=${CYCLEXEC:-${EXECGLOBAL}/global_cycle$XC} -export FNGLAC=${FNGLAC:-${FIXGLOBAL}/global_glacier.2x2.grb} -export FNMXIC=${FNMXIC:-${FIXGLOBAL}/global_maxice.2x2.grb} -export FNTSFC=${FNTSFC:-${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb} -export FNSNOC=${FNSNOC:-${FIXGLOBAL}/global_snoclim.1.875.grb} -export FNZORC=${FNZORC:-${FIXGLOBAL}/global_zorclim.1x1.grb} -export FNALBC=${FNALBC:-${FIXGLOBAL}/global_albedo4.1x1.grb} -export FNAISC=${FNAISC:-${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb} -export FNTG3C=${FNTG3C:-${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb} -export FNVEGC=${FNVEGC:-${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb} -export FNVETC=${FNVETC:-${FIXGLOBAL}/global_vegtype.1x1.grb} -export FNSOTC=${FNSOTC:-${FIXGLOBAL}/global_soiltype.1x1.grb} -export FNSMCC=${FNSMCC:-${FIXGLOBAL}/global_soilmcpc.1x1.grb} -export FNVMNC=${FNVMNC:-${FIXGLOBAL}/global_shdmin.0.144x0.144.grb} -export FNVMXC=${FNVMXC:-${FIXGLOBAL}/global_shdmax.0.144x0.144.grb} -export FNSLPC=${FNSLPC:-${FIXGLOBAL}/global_slope.1x1.grb} -export FNABSC=${FNABSC:-${FIXGLOBAL}/global_snoalb.1x1.grb} -export FNMSKH=${FNMSKH:-${FIXGLOBAL}/seaice_newland.grb} -export FNOROG=${FNOROG:-${FIXGLOBAL}/global_orography.t$JCAP.grb} -export FNMASK=${FNMASK:-${FIXGLOBAL}/global_slmask.t$JCAP.grb} -export FNTSFA=${FNTSFA:-${COMIN}/${PREINP}sstgrb${SUFINP}} -export FNACNA=${FNACNA:-${COMIN}/${PREINP}engicegrb${SUFINP}} -export FNSNOA=${FNSNOA:-${COMIN}/${PREINP}snogrb${SUFINP}} -export SFCANL=${SFCANL:-${COMIN}/${PREINP}sfcanl} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -if [[ $KEEPFH = YES ]];then -export CDATE=${CDATE:-$($SFCHDR $SFCGES IDATE||echo 0)} -export FHOUR=${FHOUR:-$($SFCHDR $SFCGES FHOUR||echo 0)} -else -export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} -export FHOUR=${FHOUR:-0} -fi -export LATB=${LATB:-$($SFCHDR $SFCGES LATB||echo 0)} -export LONB=${LONB:-$($SFCHDR $SFCGES LONB||echo 0)} -export LSOIL=${LSOIL:-4} -export FSMCL2=${FSMCL2:-60} -export DELTSFC=${DELTSFC:-$($SFCHDR $SFCGES FHOUR||echo 0)} -export CYCLVARS=${CYCLVARS} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export FILESTYLE=${FILESTYLE:-'X'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -#typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -#typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -# Set defaults -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -[[ -d $COMOUT ]]||mkdir -p $COMOUT - -################################################################################ -# Make surface analysis -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$CYCLEXEC -export pgm=$PGM -#$LOGSCRIPT - -rm $SFCANL -iy=$(echo $CDATE|cut -c1-4) -im=$(echo $CDATE|cut -c5-6) -id=$(echo $CDATE|cut -c7-8) -ih=$(echo $CDATE|cut -c9-10) - -cat $HOSTFILE -#echo "$MPICH/bin/mpirun_rsh -hostfile $HOSTFILE -np 1 $CYCLEXEC" -#eval $CYCLEXEC < fort.912 - &NAMCYC - idim=$LONB, jdim=$LATB, lsoil=$LSOIL, - iy=$iy, im=$im, id=$id, ih=$ih, fh=$FHOUR, - DELTSFC=$DELTSFC, - / - &NAMSFCD - FNBGSI="$SFCGES", - FNBGSO="$SFCANL", - FNOROG="$FNOROG", - FNMASK="$FNMASK", - LDEBUG=.false., - / - &NAMSFC - FNGLAC="$FNGLAC", - FNMXIC="$FNMXIC", - FNTSFC="$FNTSFC", - FNSNOC="$FNSNOC", - FNZORC="$FNZORC", - FNALBC="$FNALBC", - FNAISC="$FNAISC", - FNTG3C="$FNTG3C", - FNVEGC="$FNVEGC", - FNVETC="$FNVETC", - FNSOTC="$FNSOTC", - FNSMCC="$FNSMCC", - FNVMNC="$FNVMNC", - FNVMXC="$FNVMXC", - FNSLPC="$FNSLPC", - FNABSC="$FNABSC", - FNMSKH="$FNMSKH", - FNTSFA="$FNTSFA", - FNACNA="$FNACNA", - FNSNOA="$FNSNOA", - LDEBUG=.false., - FSMCL(2)=$FSMCL2, - FSMCL(3)=$FSMCL2, - FSMCL(4)=$FSMCL2, - $CYCLVARS - / -EOF -cat fort.912 -$MPICH/bin/mpirun_rsh -hostfile $HOSTFILE -np 1 $CYCLEXEC -#$MPICH/bin/mpiexec -hostfile $HOSTFILE -n 1 $CYCLEXEC - -export ERR=$? -export err=$ERR -#$ERRSCRIPT||exit 2 - -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -#$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/ush/EnKF/global_postgp.sh b/ush/EnKF/global_postgp.sh deleted file mode 100755 index 2d2682b9ef..0000000000 --- a/ush/EnKF/global_postgp.sh +++ /dev/null @@ -1,282 +0,0 @@ - -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_postgp.sh -# Script description: Posts the global pressure GRIB file -# -# Author: Mark Iredell Org: NP23 Date: 1999-05-01 -# -# Abstract: This script reads a single global sigma file and (optionally) -# a global flux file and creates a global pressure GRIB file. -# The resolution and generating code of the output GRIB file can also -# be set in the argument list. -# -# Script history log: -# 1999-05-01 Mark Iredell -# -# Usage: global_postgp.sh SIGINP FLXINP FLXIOUT PGBOUT PGIOUT IO JO IGEN -# -# Input script positional parameters: -# 1 Input sigma file -# defaults to $SIGINP -# 2 Input flux file -# defaults to $FLXINP -# 3 Output flux index file -# defaults to $FLXIOUT -# 4 Output pressure GRIB file -# defaults to $PGBOUT -# 5 Output pressure GRIB index file -# defaults to $PGIOUT, then to none -# 6 Number of longitudes -# defaults to $IO, then to resolution-dependent defaults -# 7 Number of latitudes -# defaults to $JO, then to resolution-dependent defaults -# 8 Model generating code, -# defaults to $IGEN, then to input sigma generating code -# -# Imported Shell Variables: -# SIGINP Input sigma file -# overridden by $1 -# FLXINP Input flux file -# overridden by $2 -# FLXIOUT Output flux index file -# overridden by $3 -# PGBOUT Output pressure GRIB file -# overridden by $4 -# PGIOUT Output pressure GRIB index file -# overridden by $5; defaults to none -# IO Number of longitudes -# overridden by $6; default is resolution-dependent -# JO Number of latitudes -# overridden by $7; default is resolution-dependent -# IGEN Model generating code -# overridden by $8; defaults to input sigma generating code -# EXECUTIL Directory for utility executables -# defaults to /nwprod/util/exec -# USHUTIL Directory for utility scripts -# defaults to /nwprod/util/ush -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# USHGLOBAL Directory for global scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# MP Multi-processing type ("p" or "s") -# defaults to "p", or "s" if LOADL_STEP_TYPE is not PARALLEL -# XC Suffix to add to executables -# defaults to none -# POSTGPEXEC Global post executable -# defaults to ${EXECGLOBAL}/global_postg$MP$XC -# GRBINDEX GRIB index maker -# defaults to ${EXECUTIL}/grbindex$XC -# ANOMCATSH Global anomaly GRIB script -# defaults to ${USHGLOBAL}/global_anomcat.sh -# POSTGPLIST File containing further namelist inputs -# defaults to /dev/null -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# POSTGPVARS Other namelist inputs to the global post executable -# such as IDRT,KO,PO,KTT,KT,PT,KZZ,ZZ, -# NCPUS,MXBIT,IDS,POB,POT,MOO,MOOA,MOW,MOWA, -# ICEN,ICEN2,IENST,IENSI -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# $ANOMCATSH -# -# programs : $POSTGPEXEC -# $GRBINDEX -# -# input data : $1 or $SIGINP -# $2 or $SFCINP -# $POSTGPLIST -# -# output data: $3 or $FLXIOUT -# $4 or $PGBOUT -# $5 or $PGIOUT -# $PGMOUT -# $PGMERR -# -# scratch : ${DATA}/postgp.inp.sig -# ${DATA}/postgp.inp.flx -# ${DATA}/postgp.out.pgb -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export SIGINP=${1:-${SIGINP}} -export FLXINP=${2:-${FLXINP}} -export FLXIOUT=${3:-${FLXIOUT}} -export PGBOUT=${4:-${PGBOUT}} -export PGIOUT=${5:-${PGIOUT}} -export IO=${6:-${IO:-0}} -export JO=${7:-${JO:-0}} -export IGEN=${8:-${IGEN:-0}} -# Directories. -export EXECUTIL=${EXECUTIL:-/nwprod/util/exec} -export USHUTIL=${USHUTIL:-/nwprod/util/ush} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export USHGLOBAL=${USHGLOBAL:-/nwprod/ush} -export DATA=${DATA:-$(pwd)} -# Filenames. -export MP=${MP:-$([[ $LOADL_STEP_TYPE = PARALLEL ]]&&echo "p"||echo "s")} -export XC=${XC} -export POSTGPEXEC=${POSTGPEXEC:-${EXECGLOBAL}/global_postg$MP$XC} -export GRBINDEX=${GRBINDEX:-${EXECUTIL}/grbindex$XC} -export ANOMCATSH=${ANOMCATSH:-${USHGLOBAL}/global_anomcat.sh} -export POSTGPLIST=${POSTGPLIST:-/dev/null} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export POSTGPVARS=${POSTGPVARS} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -################################################################################ -# Post GRIB -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$POSTGPEXEC -export pgm=$PGM -$LOGSCRIPT -cat <postgp.inp.nml$$ - &NAMPGB - DDSIG='postgp.inp.sig$$', - DDFLX='postgp.inp.flx$$', - DDPGB='postgp.out.pgb$$', - IO=$IO, JO=$JO, IGEN=$IGEN, - $POSTGPVARS -EOF -cat $POSTGPLIST >>postgp.inp.nml$$ -cat <>postgp.inp.nml$$ - / -EOF -if [[ "$VERBOSE" = "YES" ]] -then - cat postgp.inp.nml$$ -fi -ln -sf $SIGINP postgp.inp.sig$$ -ln -sf $FLXINP postgp.inp.flx$$ -ln -sf $PGBOUT postgp.out.pgb$$ - -eval $POSTGPEXEC &2 -fi -exit $err diff --git a/ush/EnKF/global_postgpp.sh b/ush/EnKF/global_postgpp.sh deleted file mode 100755 index 6083863591..0000000000 --- a/ush/EnKF/global_postgpp.sh +++ /dev/null @@ -1,286 +0,0 @@ - -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_postgp.sh -# Script description: Posts the global pressure GRIB file -# -# Author: Mark Iredell Org: NP23 Date: 1999-05-01 -# -# Abstract: This script reads a single global sigma file and (optionally) -# a global flux file and creates a global pressure GRIB file. -# The resolution and generating code of the output GRIB file can also -# be set in the argument list. -# -# Script history log: -# 1999-05-01 Mark Iredell -# -# Usage: global_postgp.sh SIGINP FLXINP FLXIOUT PGBOUT PGIOUT IO JO IGEN -# -# Input script positional parameters: -# 1 Input sigma file -# defaults to $SIGINP -# 2 Input flux file -# defaults to $FLXINP -# 3 Output flux index file -# defaults to $FLXIOUT -# 4 Output pressure GRIB file -# defaults to $PGBOUT -# 5 Output pressure GRIB index file -# defaults to $PGIOUT, then to none -# 6 Number of longitudes -# defaults to $IO, then to resolution-dependent defaults -# 7 Number of latitudes -# defaults to $JO, then to resolution-dependent defaults -# 8 Model generating code, -# defaults to $IGEN, then to input sigma generating code -# -# Imported Shell Variables: -# SIGINP Input sigma file -# overridden by $1 -# FLXINP Input flux file -# overridden by $2 -# FLXIOUT Output flux index file -# overridden by $3 -# PGBOUT Output pressure GRIB file -# overridden by $4 -# PGIOUT Output pressure GRIB index file -# overridden by $5; defaults to none -# IO Number of longitudes -# overridden by $6; default is resolution-dependent -# JO Number of latitudes -# overridden by $7; default is resolution-dependent -# IGEN Model generating code -# overridden by $8; defaults to input sigma generating code -# EXECUTIL Directory for utility executables -# defaults to /nwprod/util/exec -# USHUTIL Directory for utility scripts -# defaults to /nwprod/util/ush -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# USHGLOBAL Directory for global scripts -# defaults to /nwprod/ush -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# MP Multi-processing type ("p" or "s") -# defaults to "p", or "s" if LOADL_STEP_TYPE is not PARALLEL -# XC Suffix to add to executables -# defaults to none -# POSTGPEXEC Global post executable -# defaults to ${EXECGLOBAL}/global_postg$MP$XC -# GRBINDEX GRIB index maker -# defaults to ${EXECUTIL}/grbindex$XC -# ANOMCATSH Global anomaly GRIB script -# defaults to ${USHGLOBAL}/global_anomcat.sh -# POSTGPLIST File containing further namelist inputs -# defaults to /dev/null -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# POSTGPVARS Other namelist inputs to the global post executable -# such as IDRT,KO,PO,KTT,KT,PT,KZZ,ZZ, -# NCPUS,MXBIT,IDS,POB,POT,MOO,MOOA,MOW,MOWA, -# ICEN,ICEN2,IENST,IENSI -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# $ANOMCATSH -# -# programs : $POSTGPEXEC -# $GRBINDEX -# -# input data : $1 or $SIGINP -# $2 or $SFCINP -# $POSTGPLIST -# -# output data: $3 or $FLXIOUT -# $4 or $PGBOUT -# $5 or $PGIOUT -# $PGMOUT -# $PGMERR -# -# scratch : ${DATA}/postgp.inp.sig -# ${DATA}/postgp.inp.flx -# ${DATA}/postgp.out.pgb -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export SIGINP=${1:-${SIGINP}} -export FLXINP=${2:-${FLXINP}} -export FLXIOUT=${3:-${FLXIOUT}} -export PGBOUT=${4:-${PGBOUT}} -export PGIOUT=${5:-${PGIOUT}} -export IO=${6:-${IO:-0}} -export JO=${7:-${JO:-0}} -export IGEN=${8:-${IGEN:-0}} -# Directories. -export EXECUTIL=${EXECUTIL:-/tg4/projects/reanl/whitaker/ncepgfs/bin} -export USHUTIL=${USHUTIL:-/tg4/projects/reanl/whitaker/ncepgfs/scripts} -export EXECGLOBAL=${EXECGLOBAL:-/tg4/projects/reanl/whitaker/ncepgfs/bin} -export USHGLOBAL=${USHGLOBAL:-/tg4/projects/reanl/whitaker/ncepgfs/scripts} -export DATA=${DATA:-$(pwd)} -# Filenames. -export MP=${MP:-$([[ $LOADL_STEP_TYPE = PARALLEL ]]&&echo "p"||echo "s")} -export XC=${XC} -export POSTGPEXEC=${POSTGPEXEC:-${EXECGLOBAL}/global_postgs} -export GRBINDEX=${GRBINDEX:-${EXECUTIL}/grbindex$XC} -export ANOMCATSH=${ANOMCATSH:-${USHGLOBAL}/global_anomcat.sh} -export POSTGPLIST=${POSTGPLIST:-/dev/null} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export POSTGPVARS=${POSTGPVARS} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -#typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -#typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -################################################################################ -# Post GRIB -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$POSTGPEXEC -export pgm=$PGM -$LOGSCRIPT -cat <global_postgp.nml - &NAMPGB - DDSIG='postgp.inp.sig$$', - DDFLX='postgp.inp.flx$$', - DDPGB='postgp.out.pgb$$', - IO=$IO, JO=$JO, IGEN=$IGEN, - $POSTGPVARS -EOF - cat $POSTGPLIST >>global_postgp.nml - cat <>global_postgp.nml - / -EOF -#if [[ "$VERBOSE" = "YES" ]] -#then - cat global_postgp.nml -#fi -ln -sf $SIGINP postgp.inp.sig$$ -ls -l postgp.inp.sig$$ -ln -sf $FLXINP postgp.inp.flx$$ -ls -l postgp.inp.flx$$ -ln -sf $PGBOUT postgp.out.pgb$$ - -#eval $POSTGPEXEC -$MPICH/bin/mpirun_rsh -hostfile $HOSTFILE -np 1 $POSTGPEXEC -#$MPICH/bin/mpiexec -hostfile $HOSTFILE -n 1 $POSTGPEXEC - -export ERR=$? -export err=$ERR -$ERRSCRIPT||exit 2 -rm global_postgp.nml postgp.inp.sig$$ postgp.inp.flx$$ postgp.out.pgb$$ -################################################################################ -# Anomaly concatenation -if [[ -x $ANOMCATSH ]] -then - if [[ -n $PGIOUT ]] - then - $GRBINDEX $PGBOUT $PGIOUT - fi - export PGM=$ANOMCATSH - export pgm=$PGM - $LOGSCRIPT - - eval $ANOMCATSH $PGBOUT $PGIOUT $REDOUT$PGMOUT $REDERR$PGMERR - - export ERR=$? - export err=$ERR - $ERRSCRIPT||exit 3 -fi -################################################################################ -# Make GRIB index file -#if [[ -n $PGIOUT ]] -#then -# $GRBINDEX $PGBOUT $PGIOUT -#fi -#if [[ -r $FLXINP && -n $FLXIOUT ]] -#then -# $GRBINDEX $FLXINP $FLXIOUT -#fi -################################################################################ -# Postprocessing -cd $pwd -[[ $mkdata = YES ]]&&rmdir $DATA -$ENDSCRIPT -set +x -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXITING $0 with return code $err >&2 -fi -exit $err diff --git a/ush/EnKF/incdate b/ush/EnKF/incdate deleted file mode 100755 index 7a55acbd0f..0000000000 --- a/ush/EnKF/incdate +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -if [ $# != 2 ]; then - echo "usage: incdate YYYYMMDDHH hrs" - echo "where YYYYMMDDHH is a 10 character date string (e.g. 2002050312)" - echo "and hrs is integer number of hours to increment YYYMMDDHH" - exit 1 -fi -/opt/freeware/bin/date -u -d "${1:0:4}-${1:4:2}-${1:6:2} ${1:8:2}:00:00 UTC $2 hour" +%Y%m%d%H diff --git a/ush/EnKF/obsproc_ensmean.sh b/ush/EnKF/obsproc_ensmean.sh deleted file mode 100755 index 602fa1c8e7..0000000000 --- a/ush/EnKF/obsproc_ensmean.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/tcsh - -# import parameters -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" - -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycles=10 -set ncycle=1 -echo "ncycle = " $ncycle "and ncycles = " $ncycles - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -echo "starting ens mean computation `date`" -set fh=${FHMIN} -while ($fh <= $FHMAX) - set charfhr="fhr`printf %02i $fh`" - if ($cleanup_ensmean == 'true' || ($cleanup_ensmean == 'false' && { /bin/test ! -s ${datapath}/${analdate}/bfg_${analdate}_${charfhr}_ensmean })) then - ${enkfexec}/getsfcensmean.x ${datapath}/${analdate}/ bfg_${analdate}_${charfhr}_ensmean bfg_${analdate}_${charfhr} ${nanals} - endif - @ fh = $fh + $FHOUT -end -wait - -set fh=$FHOUT # use this if getpstend is run -while ($fh <= $FHMAX) - set charfhr="fhr`printf %02i $fh`" - if ($cleanup_ensmean == 'true' || ($cleanup_ensmean == 'false' && { /bin/test ! -s ${datapath}/${analdate}/sfg_${analdate}_${charfhr}_ensmean })) then - ${enkfexec}/getsigensmean.x ${datapath}/${analdate}/ sfg_${analdate}_${charfhr}_ensmean sfg_${analdate}_${charfhr} ${nanals} ${charfhr} - endif - @ fh = $fh + $FHOUT -end -wait -echo "done ens mean computation `date`" - -# remove obsfiles from the previous cycle -if ($cleanup_obs == 'true') then - /bin/rm -f ${datapathp1}/*abias - /bin/rm -f ${datapathp1}/*satang - /bin/rm -f ${datapath2}/diag*ensmean - set nanal=1 - while ($nanal <= $nanals) - set charnanal="mem`printf %03i $nanal`" - /bin/rm -f ${datapath2}/diag*${charnanal} - @ nanal = $nanal + 1 - end - /bin/rm -f ${datapath2}/hxprime* -endif - -set niter=1 -set alldone='no' -echo "${analdate} compute forward operator `date`" - -setenv NSTART 61 -setenv NEND 61 -setenv SETUP "lread_obs_save=.true.,lread_obs_skip=.false.,lwrite_predterms=.true.," -echo "NSTART=$NSTART" -echo "NEND=$NEND" -$SUB -a GDAS-T2O -e NSTART,NEND,SETUP -g devonprod -j enkf_a5_obsensmean -o ${current_logdir}/run_obsensmean.out -p 32/1/N -q dev -r 4096/1 -t 00:40:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/${runobs} - -exit 0 diff --git a/ush/EnKF/obsproc_multi.sh b/ush/EnKF/obsproc_multi.sh deleted file mode 100755 index 2ad2d9eaf4..0000000000 --- a/ush/EnKF/obsproc_multi.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/tcsh - -# import parameters -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" - -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycles=10 -set ncycle=1 -echo "ncycle = " $ncycle "and ncycles = " $ncycles - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -set alldone='no' -echo "${analdate} compute forward operator `date`" - -setenv SETUP "lread_obs_save=.false.,lread_obs_skip=.true.,lwrite_predterms=.true.," - -## Submit chunks of jobs based on nanals/nmem_per_node settings - @ num_jobs = $nanals / $nmem_per_node - set max_jobs=50 - if ($num_jobs >= $max_jobs) then - echo "THERE ARE TOO MANY JOB STEPS REQUIRED, NUM_JOBS = $num_jobs" - echo "CHECK NANALS & NMEM_PER_NODE IN CONFIG" - echo "STOPPING SCRIPTS HERE" - exit 1 - else - echo "there are $num_jobs job steps required for first ges processing" - endif - - set job=1 - set n1=1 - set n2=$nmem_per_node - - while ($job <= $num_jobs) - setenv NSTART $n1 - setenv NEND $n2 - echo "NSTART=$NSTART" - echo "NEND=$NEND" - $SUB -a GDAS-T2O -e NSTART,NEND,SETUP -g devonprod -j enkf_obs$job -o ${current_logdir}/run_obs$job.out -p 32/1/N -q dev -r 4096/1 -t 00:40:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/${runobs} - - @ job = $job + 1 - @ n1 = $n1 + $nmem_per_node - @ n2 = $n2 + $nmem_per_node - - if ($n2 > $nanals) then - @ n2 = $nanals - else -## - endif - end - -# submit script to do file checking, setup to wait 15 minutes for now -$SUB -a GDAS-T2O -g devonprod -j enkf_check_obsfiles -o ${current_logdir}/check_obs_files.out -q dev -r 1000 -t 03:00:00 -u ${LOGNAME} -w +0015 ${enkfscripts}/check_obsfiles_serial.sh - -exit 0 diff --git a/ush/EnKF/para_config.gdas_enkf_fcst b/ush/EnKF/para_config.gdas_enkf_fcst deleted file mode 100755 index bca0d190d8..0000000000 --- a/ush/EnKF/para_config.gdas_enkf_fcst +++ /dev/null @@ -1,63 +0,0 @@ -# Set variables -export NWROOT=/nwprod -export COM_IN=/global/noscrub/$LOGNAME/com/gfs/para -export SENDDBN=NO -export SAVEGES=NO -export GETGES_NWG=/global/noscrub/$LOGNAME -export gesenvir=para -export GETGES_COM=/global/noscrub/$LOGNAME/com -export GESROOT=/ptmpd3/$LOGNAME/nwges -export KEEPDATA=YES - - -# Set paths -export HOMEgdas=$NWTEST/gdas.${gdas_ver} -export HOMEgsm=$NWTEST/global_shared.${global_shared_ver} - - -# Set fix files - - -# Set script and executable - - -# Dev para jobs -export PEND=/global/save/emc.glopara/svn/gfs/trunk/para/bin/pend -export ERRSCRIPT='eval [[ $err = 0 ]]' - - -# Set beginning and ending ensemble member on EnKF group. -if [[ $ENSGRP -eq 1 ]]; then - export ENSBEG=1 - export ENSEND=8 -elif [[ $ENSGRP -eq 2 ]]; then - export ENSBEG=9 - export ENSEND=16 -elif [[ $ENSGRP -eq 3 ]]; then - export ENSBEG=17 - export ENSEND=24 -elif [[ $ENSGRP -eq 4 ]]; then - export ENSBEG=25 - export ENSEND=32 -elif [[ $ENSGRP -eq 5 ]]; then - export ENSBEG=33 - export ENSEND=40 -elif [[ $ENSGRP -eq 6 ]]; then - export ENSBEG=41 - export ENSEND=48 -elif [[ $ENSGRP -eq 7 ]]; then - export ENSBEG=49 - export ENSEND=56 -elif [[ $ENSGRP -eq 8 ]]; then - export ENSBEG=57 - export ENSEND=64 -elif [[ $ENSGRP -eq 9 ]]; then - export ENSBEG=65 - export ENSEND=72 -elif [[ $ENSGRP -eq 10 ]]; then - export ENSBEG=73 - export ENSEND=80 -else - echo "***ERROR*** INVALID ENSGRP=$ENSGRP" - exit -fi diff --git a/ush/EnKF/para_config.gdas_enkf_inflate_recenter b/ush/EnKF/para_config.gdas_enkf_inflate_recenter deleted file mode 100755 index ea92bdf641..0000000000 --- a/ush/EnKF/para_config.gdas_enkf_inflate_recenter +++ /dev/null @@ -1,28 +0,0 @@ -# Set variables -export NWROOT=/nwprod -export COM_IN=/global/noscrub/$LOGNAME/com/gfs/para -export SENDDBN=NO -export SAVEGES=NO -export SENDCOM=YES -export GETGES_NWG=/global/noscrub/$LOGNAME -export gesenvir=para -export GETGES_COM=/global/noscrub/$LOGNAME/com -export GESROOT=/ptmpd3/$LOGNAME/nwges -export KEEPDATA=YES - - -# Set paths -export HOMEgsi=$NWTEST/global_shared.${global_shared_ver} -export HOMEgsm=$NWTEST/global_shared.${global_shared_ver} -export HOMEgdas=$NWTEST/gdas.${gdas_ver} - - -# Set fix files - - -# Set scripts and executables - - -# Dev para jobs -export PEND=/global/save/emc.glopara/svn/gfs/trunk/para/bin/pend -export ERRSCRIPT='eval [[ $err = 0 ]]' diff --git a/ush/EnKF/para_config.gdas_enkf_innovate_obs b/ush/EnKF/para_config.gdas_enkf_innovate_obs deleted file mode 100755 index 70fd8f6643..0000000000 --- a/ush/EnKF/para_config.gdas_enkf_innovate_obs +++ /dev/null @@ -1,65 +0,0 @@ -# Set variables -export NWROOT=/nwprod -export COM_IN=/global/noscrub/$LOGNAME/com/gfs/para -export SENDDBN=NO -export SAVEGES=NO -export SENDCOM=NO -export GETGES_NWG=/global/noscrub/$LOGNAME -export gesenvir=para -export GETGES_COM=/global/noscrub/$LOGNAME/com -export GESROOT=/ptmpd3/$LOGNAME/nwges -export KEEPDATA=YES - - -# Set paths -export HOMEgsi=$NWTEST/global_shared.${global_shared_ver} -export HOMEgsm=$NWTEST/global_shared.${global_shared_ver} -export HOMEgdas=$NWTEST/gdas.${gdas_ver} - - -# Set fix files - - -# Set script and executable - - -# Dev para jobs -export PEND=/global/save/emc.glopara/svn/gfs/trunk/para/bin/pend -export ERRSCRIPT='eval [[ $err = 0 ]]' - - -# Set beginning and ending ensemble member on EnKF group. -if [[ $ENSGRP -eq 1 ]]; then - export ENSBEG=1 - export ENSEND=8 -elif [[ $ENSGRP -eq 2 ]]; then - export ENSBEG=9 - export ENSEND=16 -elif [[ $ENSGRP -eq 3 ]]; then - export ENSBEG=17 - export ENSEND=24 -elif [[ $ENSGRP -eq 4 ]]; then - export ENSBEG=25 - export ENSEND=32 -elif [[ $ENSGRP -eq 5 ]]; then - export ENSBEG=33 - export ENSEND=40 -elif [[ $ENSGRP -eq 6 ]]; then - export ENSBEG=41 - export ENSEND=48 -elif [[ $ENSGRP -eq 7 ]]; then - export ENSBEG=49 - export ENSEND=56 -elif [[ $ENSGRP -eq 8 ]]; then - export ENSBEG=57 - export ENSEND=64 -elif [[ $ENSGRP -eq 9 ]]; then - export ENSBEG=65 - export ENSEND=72 -elif [[ $ENSGRP -eq 10 ]]; then - export ENSBEG=73 - export ENSEND=80 -else - echo "***ERROR*** INVALID ENSGRP=$ENSGRP" - exit -fi diff --git a/ush/EnKF/para_config.gdas_enkf_post b/ush/EnKF/para_config.gdas_enkf_post deleted file mode 100755 index dde456f501..0000000000 --- a/ush/EnKF/para_config.gdas_enkf_post +++ /dev/null @@ -1,27 +0,0 @@ -# Set variables -export NWROOT=/nwprod -export COM_IN=/global/noscrub/$LOGNAME/com/gfs/para -export SENDDBN=NO -export SAVEGES=NO -export SENDCOM=YES -export GETGES_NWG=/global/noscrub/$LOGNAME -export gesenvir=para -export GETGES_COM=/global/noscrub/$LOGNAME/com -export GESROOT=/ptmpd3/$LOGNAME/nwges -export KEEPDATA=YES - - -# Set paths -export HOMEgdas=$NWTEST/gdas.${gdas_ver} -export HOMEgsm=$NWTEST/global_shared.${global_shared_ver} - - -# Set fix files - - -# Set scripts and executables - - -# Dev para jobs -export PEND=/global/save/emc.glopara/svn/gfs/trunk/para/bin/pend -export ERRSCRIPT='eval [[ $err = 0 ]]' diff --git a/ush/EnKF/para_config.gdas_enkf_select_obs b/ush/EnKF/para_config.gdas_enkf_select_obs deleted file mode 100755 index 48430fec26..0000000000 --- a/ush/EnKF/para_config.gdas_enkf_select_obs +++ /dev/null @@ -1,28 +0,0 @@ -# Set variables -export NWROOT=/nwprod -export COM_IN=/global/noscrub/$LOGNAME/com/gfs/para -export SENDDBN=NO -export SAVEGES=NO -export SENDCOM=NO -export GETGES_NWG=/global/noscrub/$LOGNAME -export gesenvir=para -export GETGES_COM=/global/noscrub/$LOGNAME/com -export GESROOT=/ptmpd3/$LOGNAME/nwges -export KEEPDATA=YES - - -# Set paths -export HOMEgsi=$NWTEST/global_shared.${global_shared_ver} -export HOMEgsm=$NWTEST/global_shared.${global_shared_ver} -export HOMEgdas=$NWTEST/gdas.${gdas_ver} - - -# Set fix files - - -# Set script and executable - - -# Dev para jobs -export PEND=/global/save/emc.glopara/svn/gfs/trunk/para/bin/pend -export ERRSCRIPT='eval [[ $err = 0 ]]' diff --git a/ush/EnKF/para_config.gdas_enkf_update b/ush/EnKF/para_config.gdas_enkf_update deleted file mode 100755 index ea92bdf641..0000000000 --- a/ush/EnKF/para_config.gdas_enkf_update +++ /dev/null @@ -1,28 +0,0 @@ -# Set variables -export NWROOT=/nwprod -export COM_IN=/global/noscrub/$LOGNAME/com/gfs/para -export SENDDBN=NO -export SAVEGES=NO -export SENDCOM=YES -export GETGES_NWG=/global/noscrub/$LOGNAME -export gesenvir=para -export GETGES_COM=/global/noscrub/$LOGNAME/com -export GESROOT=/ptmpd3/$LOGNAME/nwges -export KEEPDATA=YES - - -# Set paths -export HOMEgsi=$NWTEST/global_shared.${global_shared_ver} -export HOMEgsm=$NWTEST/global_shared.${global_shared_ver} -export HOMEgdas=$NWTEST/gdas.${gdas_ver} - - -# Set fix files - - -# Set scripts and executables - - -# Dev para jobs -export PEND=/global/save/emc.glopara/svn/gfs/trunk/para/bin/pend -export ERRSCRIPT='eval [[ $err = 0 ]]' diff --git a/ush/EnKF/randates.py b/ush/EnKF/randates.py deleted file mode 100755 index e0b28b0528..0000000000 --- a/ush/EnKF/randates.py +++ /dev/null @@ -1,10 +0,0 @@ -import sys -from dateutils import * -import random -date1 = sys.argv[1] -date2 = sys.argv[2] -nanals = int(sys.argv[3]) -dates = random.sample(daterange(date1,date2,6),nanals) -for date in dates: - datem1 = dateshift(date,-24) - print '%s %s' % (date,datem1) diff --git a/ush/EnKF/rerun_fg.sh b/ush/EnKF/rerun_fg.sh deleted file mode 100755 index 22a849fd87..0000000000 --- a/ush/EnKF/rerun_fg.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/tcsh - -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms - -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycles=10 -set ncycle=1 -##while ($ncycle <= $ncycles) -echo "ncycle = " $ncycle "and ncycles = " $ncycles - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" -# copy hostfileall to working dir. -##/bin/cp -f ${datapath}/hostfileall ${datapath2} - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - - -# run ensemble first guess. -# first, clean up old first guesses. -if ($cleanup_fg == 'true') then -set fhr=$FHMIN -while ( $fhr <= $FHMAX) - set charfhr="fhr`printf %02i $fhr`" - /bin/rm -f ${datapath}${analdatep1}/sfg_${analdatep1}_${charfhr}*_* - /bin/rm -f ${datapath}${analdatep1}/bfg_${analdatep1}_${charfhr}*_* - @ fhr = $fhr + $FHOUT -end -endif -mkdir -p ${datapath}${analdatep1} - -setenv NSTART 1 -setenv NEND 60 -echo "NSTART=$NSTART" -echo "NEND=$NEND" -$SUB -a GDAS-T2O -e NSTART,NEND -g devonprod -j enkf_a5_fg_rerun -o ${current_logdir}/run_fg_rerun.out -p 32 -q dev -r 1000 -t 02:00:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/${fg_gfs} - -exit 0 diff --git a/ush/EnKF/rhist_saveenkf.sh b/ush/EnKF/rhist_saveenkf.sh deleted file mode 100755 index 784d26ed23..0000000000 --- a/ush/EnKF/rhist_saveenkf.sh +++ /dev/null @@ -1,227 +0,0 @@ -#!/bin/sh -################################################################3 -# -# This script will tar up all the data for a given forecast cycle for -# the directory specified by the first -# argument ($1) and place the tar files on the HPSS server, -# under ${HPSSOUT}. The tar file is put in the directory -# appropriate for data valid for the day specified as the second -# command line argument ($2). -# -# This script breaks up the enkf data directory into three separate -# tar files ( that is, three tar files per cycle ). -# The data files are broken up as proposed by EMC/GMB. -# -# Usage: rhist_saveenkf.sh Directory Date(YYYYMMDDHH format) -# -# Where: Directory = Directory to be tarred. -# Date(YYYYMMDDHH format) = Day that the tar file should be saved under. -# -################################################################3 -set -x - -if [ $# -ne 2 ] -then - echo "Usage: rhist_saveenkf.sh Directory Date(YYYYMMDDHH format) " - exit 1 -fi - -# -# Get directory to be tarred from the first command line argument, -# and check to make sure that the directory exists. -# - -dir=$1 -if [ ! -d $dir ] -then - echo "rhist_saveenkf.sh: Directory $dir does not exist." - exit 2 -fi - -# -# Determine the directory where the tar file will be stored -# and make sure that it exists in HPSS. -# - -year=`echo $2 | cut -c 1-4` -yearmo=`echo $2 | cut -c 1-6` -yrmoday=`echo $2 | cut -c 1-8` -rhcyc=`echo $2 | cut -c 9-10` -rhcycle=t${rhcyc}z - -if [ $TSM_FLAG = 'NO' ] -then - hpssdir0=${HPSSOUT}/rh${year}/${yearmo}/$yrmoday - hpssdir1=${HPSSOUT}/1year/rh${year}/${yearmo}/$yrmoday - hpssdir2=${HPSSOUT}/2year/rh${year}/${yearmo}/$yrmoday - -elif [ $TSM_FLAG = 'YES' ] -then - rhistdir0=${TSMOUT}/rh${year}/${yearmo}/$yrmoday - rhistdir1=${TSMOUT}/1year/rh${year}/${yearmo}/$yrmoday - rhistdir2=${TSMOUT}/2year/rh${year}/${yearmo}/$yrmoday - - ssh ibmtsm1.ncep.noaa.gov "mkdir -p -m 755 $rhistdir0; mkdir -p -m 755 $rhistdir1; mkdir -p -m 755 $rhistdir2" -fi - -# -# Get a listing of all files in the directory to be tarred -# and break the file list up into groups of files. -# Each list of files names the contents of its associated tar file. -# - -cd $DATA - -ls -1 ${dir}/${rhcyc} | grep ${yrmoday}${rhcyc} | awk ' - /^gsistat/ { print "./"$0 > "omg" ; next } - /^omgstat/ { print "./"$0 > "omg" ; next } - /^obsinput/ { print "./"$0 > "omg" ; next } - /^cnvstat/ { print "./"$0 > "omg" ; next } - /^oznstat/ { print "./"$0 > "omg" ; next } - /^radstat/ { print "./"$0 > "omg" ; next } - /^enkfstat/ { print "./"$0 > "anl" ; next } - /^ensstat/ { print "./"$0 > "anl" ; next } - /^pertdates/ { print "./"$0 > "anl" ; next } - /^sfcanl/ { print "./"$0 > "anl" ; next } - /^siganl/ { print "./"$0 > "anl" ; next } - /^sanl/ { print "./"$0 > "anl" ; next } - /^sanl_/&&/_ensmean$/ { print "./"$0 > "anl" ; next } - /^bfg_/&&/_ensmean$/ { print "./"$0 > "fcs" ; next } - /^sfg_/&&/_ensmean$/ { print "./"$0 > "fcs" ; next } - /^fcsstat/ { print "./"$0 > "fcs" ; next } - /^bfg_/&&/_fhr06_/ { print "./"$0 > "fcs" ; next } - /^sfg_/&&/_fhr06s_/ { print "./"$0 > "fcs" ; next } - /^sfg_/&&/_fhr06_/ { print "./"$0 > "fcs" ; next } - /^bfg_/&&/_fhr03_/ { print "./"$0 > "fcs03" ; next } - /^sfg_/&&/_fhr03s_/ { print "./"$0 > "fcs03" ; next } - /^sfg_/&&/_fhr03_/ { print "./"$0 > "fcs03" ; next } - /^bfg_/&&/_fhr09_/ { print "./"$0 > "fcs09" ; next } - /^sfg_/&&/_fhr09s_/ { print "./"$0 > "fcs09" ; next } - /^sfg_/&&/_fhr09_/ { print "./"$0 > "fcs09" ; next } ' - -cd $dir/${rhcyc} - -# Now create a tar file for each group of files - -for file in omg anl fcs fcs03 fcs09 -do - - # - # Pick 1year, 2year, or permanent archive. - # - case $file in - omg) hpssdir=$hpssdir0 - rhistdir=$rhistdir0;; - anl) hpssdir=$hpssdir0 - rhistdir=$rhistdir0;; - fcs) hpssdir=$hpssdir0 - rhistdir=$rhistdir0;; - fcs03) hpssdir=$hpssdir0 - rhistdir=$rhistdir0;; - fcs09) hpssdir=$hpssdir0 - rhistdir=$rhistdir0;; - *) hpssdir=$hpssdir0 - rhistdir=$rhistdir0;; - esac - - # - # Generate the name of the tarfile, which should be the same - # as the absolute path name of the directory being - # tarred, except that "/" are replaced with "_". - # - - tarfile=`echo $PWD | cut -c 2- | tr "/" "_"` - tarfile=${tarfile}.${file}.tar - - # - # Check if the tarfile index exists. If it does, assume that - # the data for the corresponding directory has already been - # tarred and saved. - # - - if [ $TSM_FLAG = 'NO' ] - then - hsi "ls -l ${hpssdir}/${tarfile}.idx" - tar_file_exists=$? - if [ $tar_file_exists -eq 0 ] - then - echo "File $tarfile already saved." - continue - fi - elif [ $TSM_FLAG = 'YES' ] - then - size=`ssh ibmtsm1.ncep.noaa.gov ls -l ${rhistdir}/${tarfile} | awk '{print \$5}'` - if [ -n "$size" ] - then - if [ $size -gt 0 ] - then - echo "File $tarfile already saved." - continue - fi - fi - fi - - # If on Stratus: - # htar is used to create the archive, -P creates - # the directory path if it does not already exist, - # and an index file is also made. - # - - if [ $TSM_FLAG = 'NO' ] - then - date - htar -P -cvf ${hpssdir}/$tarfile -L ${DATA}/$file - err=$? - if [ $err -ne 0 ] - then - echo "rhist_saveenkf.sh: File $tarfile was not successfully created." - exit 3 - fi - date - - # - # Read the tarfile and save a list of files that are in the tar file. - # - - htar -tvf $hpssdir/$tarfile - err=$? - if [ $err -ne 0 ] - then - echo "rhist_saveenkf.sh: Tar file $tarfile was not successfully read to" - echo " generate a list of the files." - exit 4 - fi - - # - # Restrict tar file, if it contains restricted data. - # - ${USHrhist}/rhist_restrict.sh ${hpssdir}/$tarfile - - # - # If on Cirrus send to HSM - # - elif [ $TSM_FLAG = 'YES' ] - then - - # - # Tar up the directory and put the tarred file in the - # appropriate directory in ${TSMOUT}. - # - - date - gtar -cvf ${DATA}/$tarfile -T ${DATA}/$file - err=$? - if [ $err -ne 0 ] - then - echo "rhist_saveenkf.sh: File $tarfile was not successfully created." - exit 3 - fi - date - $SCP $SCP_CONFIG ${DATA}/${tarfile} ibmtsm1.ncep.noaa.gov:${rhistdir}/${tarfile} - - fi -rm ${DATA}/$file - -done - -exit 0 diff --git a/ush/EnKF/run_enkf b/ush/EnKF/run_enkf deleted file mode 100755 index 4365d0df6b..0000000000 --- a/ush/EnKF/run_enkf +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/csh -#set verbose - -cd ${datapath2} -setenv OMP_NUM_THREADS 1 -setenv MEMORY_AFFINITY MCM -setenv BIND_TASKS yes -setenv MP_PULSE 0 -setenv MP_SHARED_MEMORY yes -setenv MP_BULK_MIN_MSG_SIZE 10k -setenv MP_USE_BULK_XFER yes -setenv XLSMPOPTS "parthds=1:stack=128000000" -setenv XLFRTEOPTS "nlwidth=80" -setenv MP_LABELIO yes - -@ nanalsp1 = $nanals + 1 -echo "nanalsp1=",$nanalsp1 - -echo $enkfbin - -cat <! enkf.nml - &nam_enkf - datestring="$analdate",datapath="$datapath2",random_partition=$random_partition, - analpertwtnh=$analpertwtnh,analpertwtsh=$analpertwtsh,analpertwttr=$analpertwttr, - simple_partition=$simple_partition,ntrac_update=$ntrac_update, - covinflatemax=$covinflatemax,covinflatemin=$covinflatemin,pseudo_rh=$pseudo_rh, - corrlengthnh=$corrlengthnh,corrlengthsh=$corrlengthsh,corrlengthtr=$corrlengthtr, - obtimelnh=$obtimelnh,obtimelsh=$obtimelsh,obtimeltr=$obtimeltr,iassim_order=$iassim_order, - lnsigcutoffnh=$lnsigcutoffnh,lnsigcutoffsh=$lnsigcutoffsh,lnsigcutofftr=$lnsigcutofftr, - lnsigcutoffsatnh=$lnsigcutoffsatnh,lnsigcutoffsatsh=$lnsigcutoffsatsh,lnsigcutoffsattr=$lnsigcutoffsattr, - lnsigcutoffpsnh=$lnsigcutoffpsnh,lnsigcutoffpssh=$lnsigcutoffpssh,lnsigcutoffpstr=$lnsigcutoffpstr, - use_height=$use_height,saterrfact=$saterrfact,numiter=$numiter, - sprd_tol=$sprd_tol,paoverpb_thresh=$paoverpb_thresh, - npts=$npts,nlevs=$LEVS,nanals=$nanals,ntrac=$NTRAC,nvars=$nvars,deterministic=$deterministic, - sortinc=$sortinc - / - &END -EOF1 - -cat enkf.nml -# check to see if output files already created. -set nanal=1 -set filemissing='no' -while ($nanal <= $nanals) - set charnanal="mem"`printf %03i $nanal` - set analfile="${datapath2}/ganl_${analdate}_${charnanal}" - if { /bin/test ! -s $analfile } set filemissing='yes' - @ nanal = $nanal + 1 -end -if { /bin/test ! -s $ABIAS } set filemissing='yes' - -if ($filemissing == 'yes') then -## Run EnKF here - poe $enkfbin - - /bin/cp ${datapath2}/satbias_out ${datapath2}/abias - /bin/cp ${datapath2}/satbias_out $ABIAS -endif - - # compute ensemble mean analysis files. - time ${enkfexec}/getsigensmean.x ${datapath2}/ sanl_${analdate}_ensmean sanl_${analdate} ${nanals} - - cd ${enkfscripts} - /global/save/wx20kd/python/Python-2.5.1-32/bin/python test.py 450 $nanals >&! ${datapath2}/sigpairs.dat - cd ${datapath2} - - if ($scalefact == 0) then - echo "NO INFLATION NECESSARY" - else - echo "CALL ADDERRSPEC_NMC TO ADD NMC-BASED INFLATION TO ENSEMBLE" - poe ${enkfexec}/adderrspec_nmcmeth.x $nanals $analdate $LONA $LATA $scalefact $addpertpath $lonscramble $runprefix - - # recenter perturbed ensemble on original mean - time ${enkfexec}/getsigensmean.x ${datapath2}/ sanlp_${analdate}_ensmean sanl_${analdate} ${nanals} - - set filename_meanin=${datapath2}/sanlp_${analdate}_ensmean - set filename_meanout=${datapath2}/sanl_${analdate}_ensmean - set filenamein="${datapath2}/sanl_${analdate}" - set filenameout="${datapath2}/sanl_${analdate}" - - poe ${enkfexec}/recentersigp.x $filenamein $filename_meanin $filename_meanout $filenameout $nanals - endif - -# check output files again. - set nanal=1 - set filemissing='no' - while ($nanal <= $nanals) - set charnanal="mem"`printf %03i $nanal` - set analfile="${datapath2}/sanl_${analdate}_${charnanal}" - if { /bin/test ! -s $analfile } set filemissing='yes' - @ nanal = $nanal + 1 - end - - -if ($filemissing == 'yes') then - echo "there are output files missing!" - exit 1 -else - echo "all output files seem OK" - exit 0 -endif diff --git a/ush/EnKF/run_enkfupdate_convonly.sh b/ush/EnKF/run_enkfupdate_convonly.sh deleted file mode 100755 index b5b3ba1394..0000000000 --- a/ush/EnKF/run_enkfupdate_convonly.sh +++ /dev/null @@ -1,141 +0,0 @@ -#!/bin/sh -## Below are LoadLeveler (IBM queueing system) commands -#@ job_name=enkf_update -#@ error=enkf_update.e$(jobid) -#@ job_type=parallel -#@ network.MPI=sn_all,shared,us -#@ node_usage = not_shared -#@ tasks_per_node = 32 -#@ node = 4 -#@ node_resources = ConsumableMemory(110 GB) -#@ task_affinity = core(1) -#@ parallel_threads = 2 -#@ class= devhigh -#@ group= devonprod -#@ account_no = GDAS-T2O -#@ wall_clock_limit = 0:30:00 -#@ startdate = 07/06/09 10:15 -#@ notification=error -#@ queue - -set -x - - -## NOT SURE WHICH OF THESE TO KEEP ?!?!?! - -# Set environment variables for NCEP IBM -export MEMORY_AFFINITY=MCM -export MP_SHARED_MEMORY=yes -# Set environment variables for no threads -export AIXTHREAD_SCOPE=S -export XLSMPOPTS="parthds=1:stack=128000000" - -# Environment variables from Carolyn -export LAPI_DEBUG_ENABLE_AFFINITY=YES -export MP_FIFO_MTU=4K -export MP_SYNC_QP=YES -export MP_RFIFO_SIZE=16777216 -export MP_SHM_ATTACH_THRESH=500000 # default is better sometimes -export MP_EUIDEVELOP=min -#RDMA specific tunables: -export MP_USE_BULK_XFER=yes -export MP_BULK_MIN_MSG_SIZE=64k -export MP_RC_MAX_QP=8192 -export LAPI_DEBUG_RC_DREG_THRESHOLD=1000000 -export LAPI_DEBUG_QP_NOTIFICATION=no -export LAPI_DEBUG_RC_INIT_SETUP=yes - -# Set environment variables for user preferences -export XLFRTEOPTS="nlwidth=80" -export MP_LABELIO=yes -export MP_INFOLEVEL=1 - -# Variables for debugging (don't always need) -##export XLFRTEOPTS="buffering=disable_all" -export MP_COREFILE_FORMAT=lite - -# Set experiment name and analysis date -adate=2008080112 -exp=test_conv_prof_2thrds - -# Set path/file for enkf executable -basedir=/global/save -enkfpath=$basedir/wx20kd/enkf/work/src -enkfexec=$enkfpath/global_enkf.x - -# directories for case -dirges=/global/noscrub/wx20kd/CASES/$adate/ensges -dirobs=/global/noscrub/wx20kd/CASES/$adate/obs - -# fixed files -FIXGSI=/global/save/wx20kd/ensda/ersl/fixgsi -CONVINFO=${FIXGSI}/global_convinfo.txt -SATINFO=${FIXGSI}/global_satinfo.txt.n19_off.r2008 -OZINFO=${FIXGSI}/global_ozinfo.txt.r2008 - -# temporary directory -tmpdir=/ptmp/wx20kd/enkf/${exp}/ - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir - -ncp=/bin/cp - -# Set up paramters, options and namelist here -# nanals = # of ensemble members -nanals=60 -JCAP=190 -LEVS=64 -LONA=576 -LATA=288 -SMOOTHINF=24 -npts=`expr \( $LONA \) \* \( $LATA \)` -LSOIL=4 -# Number of tracers & dynamic variables -NTRAC=3 -nvars=3 - -cat << EOF > enkf.nml - &nam_enkf - datestring="$adate",datapath="$tmpdir",random_partition=.false., - analpertwtnh=0.9,analpertwtsh=0.9,analpertwttr=0.9, - simple_partition=.false.,ntrac_update=2, - covinflatemax=1.e2,covinflatemin=1,pseudo_rh=.true., - corrlengthnh=1500,corrlengthsh=1500,corrlengthtr=1500, - obtimelnh=15,obtimelsh=15,obtimeltr=15,iassim_order=0, - lnsigcutoffnh=1.5,lnsigcutoffsh=1.5,lnsigcutofftr=1.5, - lnsigcutoffsatnh=3.3,lnsigcutoffsatsh=3.3,lnsigcutoffsattr=3.3, - lnsigcutoffpsnh=2.2,lnsigcutoffpssh=2.2,lnsigcutoffpstr=2.2, - use_height=.false.,saterrfact=1.0,numiter=3, - sprd_tol=1.e30,paoverpb_thresh=1.0, - npts=$npts,nlevs=$LEVS,nanals=$nanals,ntrac=$NTRAC,nvars=$nvars, - deterministic=.true.,sortinc=.true., - / - &END -EOF - -cat enkf.nml - -$ncp $enkfexec ./enkf.x -$ncp $CONVINFO ./convinfo -$ncp $SATINFO ./satinfo -$ncp $OZINFO ./ozinfo -$ncp $dirobs/abias ./abias -$ncp $dirobs/satang ./satang - -ln -fs ./abias ./satbias_in -ln -fs ./satang ./satbias_angle -ln -fs $dirges/sfg* ./ -###ln -fs $dirobs/diag* ./ -ln -fs $dirobs/diag_conv* ./ - -poe hpmcount $tmpdir/enkf.x < enkf.nml > stdout - -rm $tmpdir/diag* -rm $tmpdir/sfg* - -exit - - diff --git a/ush/EnKF/run_enkfupdate_testcase.sh b/ush/EnKF/run_enkfupdate_testcase.sh deleted file mode 100755 index 040b6813f5..0000000000 --- a/ush/EnKF/run_enkfupdate_testcase.sh +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/sh -## Below are LoadLeveler (IBM queueing system) commands -#@ job_name=enkf_update -#@ error=enkf_update.e$(jobid) -#@ job_type=parallel -#@ network.MPI=sn_all,shared,us -#@ node_usage = not_shared -#@ tasks_per_node = 32 -#@ node = 10 -#@ node_resources = ConsumableMemory(110 GB) -#@ task_affinity = core(1) -#@ parallel_threads = 2 -#@ class= devhigh -#@ group= devonprod -#@ account_no = GDAS-T2O -#@ wall_clock_limit = 1:30:00 -#@ startdate = 07/06/09 10:15 -#@ notification=error -#@ queue - -set -x - - -## NOT SURE WHICH OF THESE TO KEEP ?!?!?! - -# Set environment variables for NCEP IBM -export MEMORY_AFFINITY=MCM -export MP_SHARED_MEMORY=yes -# Set environment variables for no threads -export AIXTHREAD_SCOPE=S -export XLSMPOPTS="parthds=1:stack=128000000" - -# Environment variables from Carolyn -export LAPI_DEBUG_ENABLE_AFFINITY=YES -export MP_FIFO_MTU=4K -export MP_SYNC_QP=YES -export MP_RFIFO_SIZE=16777216 -export MP_SHM_ATTACH_THRESH=500000 # default is better sometimes -export MP_EUIDEVELOP=min -#RDMA specific tunables: -export MP_USE_BULK_XFER=yes -export MP_BULK_MIN_MSG_SIZE=64k -export MP_RC_MAX_QP=8192 -export LAPI_DEBUG_RC_DREG_THRESHOLD=1000000 -export LAPI_DEBUG_QP_NOTIFICATION=no -export LAPI_DEBUG_RC_INIT_SETUP=yes - -# Set environment variables for user preferences -export XLFRTEOPTS="nlwidth=80" -export MP_LABELIO=yes -export MP_INFOLEVEL=1 - -# Variables for debugging (don't always need) -##export XLFRTEOPTS="buffering=disable_all" -export MP_COREFILE_FORMAT=lite - -# Set experiment name and analysis date -adate=2008080112 -exp=test - -# Set path/file for enkf executable -basedir=/global/save -enkfpath=$basedir/wx20kd/enkf/work/src -enkfexec=$enkfpath/global_enkf.x - -# directories for case -dirges=/global/noscrub/wx20kd/CASES/$adate/ensges -dirobs=/global/noscrub/wx20kd/CASES/$adate/obs - -# fixed files -FIXGSI=/global/save/wx20kd/ensda/ersl/fixgsi -CONVINFO=${FIXGSI}/global_convinfo.txt -SATINFO=${FIXGSI}/global_satinfo.txt.n19_off.r2008 -OZINFO=${FIXGSI}/global_ozinfo.txt.r2008 - -# temporary directory -tmpdir=/ptmp/wx20kd/enkf/${exp}/ - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir - -ncp=/bin/cp - -# Set up paramters, options and namelist here -# nanals = # of ensemble members -nanals=60 -JCAP=190 -LEVS=64 -LONA=576 -LATA=288 -SMOOTHINF=24 -npts=`expr \( $LONA \) \* \( $LATA \)` -LSOIL=4 -# Number of tracers & dynamic variables -NTRAC=3 -nvars=3 - -cat << EOF > enkf.nml - &nam_enkf - datestring="$adate",datapath="$tmpdir",random_partition=.false., - analpertwtnh=0.9,analpertwtsh=0.9,analpertwttr=0.9, - simple_partition=.false.,ntrac_update=2, - covinflatemax=1.e2,covinflatemin=1,pseudo_rh=.true., - corrlengthnh=1500,corrlengthsh=1500,corrlengthtr=1500, - obtimelnh=15,obtimelsh=15,obtimeltr=15,iassim_order=0, - lnsigcutoffnh=1.5,lnsigcutoffsh=1.5,lnsigcutofftr=1.5, - lnsigcutoffsatnh=3.3,lnsigcutoffsatsh=3.3,lnsigcutoffsattr=3.3, - lnsigcutoffpsnh=2.2,lnsigcutoffpssh=2.2,lnsigcutoffpstr=2.2, - use_height=.false.,saterrfact=1.0,numiter=3, - sprd_tol=1.e30,paoverpb_thresh=1.0, - npts=$npts,nlevs=$LEVS,nanals=$nanals,ntrac=$NTRAC,nvars=$nvars, - deterministic=.true.,sortinc=.true., - / - &END -EOF - -cat enkf.nml - -$ncp $enkfexec ./enkf.x -$ncp $CONVINFO ./convinfo -$ncp $SATINFO ./satinfo -$ncp $OZINFO ./ozinfo -$ncp $dirobs/abias ./abias -$ncp $dirobs/satang ./satang - -ln -fs ./abias ./satbias_in -ln -fs ./satang ./satbias_angle -ln -fs $dirges/sfg* ./ -ln -fs $dirobs/diag* ./ - -poe hpmcount $tmpdir/enkf.x < enkf.nml > stdout - -rm $tmpdir/diag* -rm $tmpdir/sfg* - -exit - - diff --git a/ush/EnKF/run_fg_gfs b/ush/EnKF/run_fg_gfs deleted file mode 100755 index 499be52453..0000000000 --- a/ush/EnKF/run_fg_gfs +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/sh - -# run model -setenv DATOUT ${datapath}${analdatep1} - -set nanal=1 - -while ($nanal <= $nanals) - setenv charnanal "mem`printf %03i $nanal`" - setenv SFCI ${datapath}/${analdate}/sfcanl_${analdate}_${charnanal} - setenv SIGI ${datapath}/${analdate}/sanl_${analdate}_${charnanal} - -# check to see if output files already created. - set fhr=$FHMIN - set outfiles="" - while ($fhr <= $FHMAX) - set charhr="fhr`printf %02i $fhr`" - set outfiles = "${outfiles} ${datapath}${analdatep1}/sfg_${analdatep1}_${charhr}_${charnanal} ${datapath}${analdatep1}/bfg_${analdatep1}_${charhr}_${charnanal}" - @ fhr = $fhr + $FHOUT - end - echo "run_fg_fgs outfiles = " $outfiles - - set filemissing='no' - foreach outfile ($outfiles) - if (-e "${outfile}" ) then - echo "${outfile} is OK" - else - echo "${outfile} is missing" - set filemissing='yes' - endif - end - - if ($filemissing == 'yes') then - echo "nanal = ${nanal}" - time sh ${enkfscripts}/drive_gfs >&! ${current_logdir}/run_fg_${charnanal}.out - else - echo "skipping nanal = ${nanal}, output files already created" - endif - -@ nanal = $nanal + 1 -end - -echo "all done `date`" - -# check to see all files created -echo "checking output files .."`date` - -set nanal=1 -set anyfilemissing='no' -while ($nanal <= $nanals) - setenv charnanal "mem`printf %03i $nanal`" - set fhr=$FHMIN - set outfiles="" - while ($fhr <= $FHMAX) - set charhr="fhr`printf %02i $fhr`" - set outfiles = "${outfiles} ${datapath}${analdatep1}/sfg_${analdatep1}_${charhr}_${charnanal} ${datapath}${analdatep1}/bfg_${analdatep1}_${charhr}_${charnanal}" - @ fhr = $fhr + $FHOUT - end - set filemissing='no' - foreach outfile ($outfiles) - ls -l $outfile - if (-e $outfile) then - echo "${outfile} is OK" - else - echo "${outfile} is missing" - set filemissing='yes' - set anyfilemissing='yes' - endif - end - @ nanal = $nanal + 1 -end - -if ($anyfilemissing == 'yes') then - echo "there are output files missing!" - exit 1 -else - echo "all output files seem OK" - exit 0 -endif diff --git a/ush/EnKF/run_fg_gfs_multi.sh b/ush/EnKF/run_fg_gfs_multi.sh deleted file mode 100755 index f97f8e82ea..0000000000 --- a/ush/EnKF/run_fg_gfs_multi.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/tcsh - -# import parameters -setenv CONFIG /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms -source ${CONFIG} - -echo "IN RUN_FG SCRIPT" - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -# current analysis time. -setenv analdate $analdate - -echo "analdate = $analdate" - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` - -echo "SET DATE PARAMETERS" -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" - - -vv# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -# make log dir for analdate - -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -echo "SET MORE PARMETERS" - -# run model -setenv DATOUT "${datapath}${analdatep1}" -setenv datapath2 "${datapath}/${analdate}/" - -echo "set DATOUT" - -set nanal=$NSTART -@ nanalsp1 = $nanals + 1 -echo "nanalsp1=",$nanalsp1 - -while ($nanal <= $NEND) - setenv charnanal "mem`printf %03i $nanal`" - setenv SFCI "${datapath}/${analdate}/sfcanl_${analdate}_${charnanal}" - setenv SIGI "${datapath}/${analdate}/sanl_${analdate}_${charnanal}" - -# check to see if output files already created. - set fhr=$FHMIN - set outfiles="" - while ($fhr <= $FHMAX) - set charhr="fhr`printf %02i $fhr`" - set outfiles = "${outfiles} ${datapath}${analdatep1}/sfg_${analdatep1}_${charhr}_${charnanal} ${datapath}${analdatep1}/bfg_${analdatep1}_${charhr}_${charnanal}" - @ fhr = $fhr + $FHOUT - end - echo "run_fg_fgs outfiles = " $outfiles - - set filemissing='no' - foreach outfile ($outfiles) - if (-e "${outfile}" ) then - echo "${outfile} is OK" - else - echo "${outfile} is missing" - set filemissing='yes' - endif - end - - if ($filemissing == 'yes') then - echo "nanal = ${nanal}" - time sh ${enkfscripts}/drive_gfs >&! ${current_logdir}/run_fg_${charnanal}.out - else - echo "skipping nanal = ${nanal}, output files already created" - endif - -@ nanal = $nanal + 1 -end - -echo "all done `date`" - -exit 0 diff --git a/ush/EnKF/run_gfs b/ush/EnKF/run_gfs deleted file mode 100755 index 13ab2a1528..0000000000 --- a/ush/EnKF/run_gfs +++ /dev/null @@ -1,765 +0,0 @@ -#!/bin/sh -################################################################################ -#### UNIX Script Documentation Block -# . . -# Script name: global_forecast.sh -# Script description: Runs a global spectral model forecast -# -# Author: Mark Iredell Org: NP23 Date: 1999-05-01 -# -# Abstract: This script runs a single global spectral model forecast. -# The initial conditions and run parameters are passed in the argument list. -# -# Script history log: -# 1999-05-01 Mark Iredell -# 2005-01-03 Cheng-Hsuan Lu :add namelist SOIL_VEG -# set FSMCL(2:4) = FSMCL2 -# add FNVMNC,FNVMXC,FNSLPC,FNABSC -# 2006-02 Shrinivas Moorthi Modified to run ESMF - Stand Alone -# version of GFS - Only filestyle "L" -# allowed - Added a ESMF config file -# The script can run up to 21 ENS members -# concurrently. -# 2006-06 Shrinivas Moorthi : Added default PE$n values to 0 -# -# Usage: global_forecast.sh SIGI SFCI SIGO FLXO FHOUT FHMAX IGEN D3DO -# -# Input script positional parameters: -# 1 Input sigma file 1 -# defaults to $SIGI; one or the other is required -# 2 Input surface file -# defaults to $SFCI; one or the other is required -# 3 Output sigma file with embedded forecast hour '${FH}' -# defaults to $SIGO, then to ${COMOUT}/sigf'${FH}'$SUFOUT -# 4 Output flux file with embedded forecast hour '${FH}' -# defaults to $FLXO, then to ${COMOUT}/flxf'${FH}'$SUFOUT -# 5 Output frequency in hours -# defaults to $FHOUT, then to 3 -# 6 Length of forecast in hours -# defaults to $FHMAX; otherwise FHSEG is required to be set -# 7 Output generating code -# defaults to $IGEN, defaults to 0 -# 8 Output flux file with embedded forecast hour '${FH}' -# defaults to $D3DO, then to ${COMOUT}/d3df'${FH}'$SUFOUT -# -# Imported Shell Variables: -# SIGI Input sigma file -# overridden by $1; one or the other is required -# SFCI Input surface file -# overridden by $2; one or the other is required -# SIGO Output sigma file with embedded forecast hour '${FH}' -# overridden by $3; defaults to ${COMOUT}/sigf'${FH}'$SUFOUT -# FLXO Output flux file with embedded forecast hour '${FH}' -# overridden by $4; defaults to ${COMOUT}/flxf'${FH}'$SUFOUT -# FHOUT Output frequency in hours -# overridden by $5; defaults to 3 -# FHMAX Length of forecast in hours -# overridden by $6; either FHMAX or FHSEG must be set -# IGEN Output generating code -# overridden by $7; defaults to 0 -# FIXGLOBAL Directory for global fixed files -# defaults to /nwprod/fix -# EXECGLOBAL Directory for global executables -# defaults to /nwprod/exec -# DATA working directory -# (if nonexistent will be made, used and deleted) -# defaults to current working directory -# COMOUT output directory -# (if nonexistent will be made) -# defaults to current working directory -# XC Suffix to add to executables -# defaults to none -# SUFOUT Suffix to add to output filenames -# defaults to none -# NCP Copy command -# defaults to cp -# SIGHDR Command to read sigma header -# (required if JCAP, LEVS, or FHINI are not specified) -# defaults to ${EXECGLOBAL}/global_sighdr$XC -# JCAP Spectral truncation -# defaults to the value in the input sigma file header -# LEVS Number of levels -# defaults to the value in the input sigma file header -# FCSTEXEC Forecast executable -# defaults to ${EXECGLOBAL}/global_fcst$XC -# SIGI2 Second time level sigma restart file -# defaults to NULL -# CO2CON Input CO2 radiation (vertical resolution dependent) -# defaults to ${FIXGLOBAL}/global_co2con.l${LEVS}.f77 -# MTNVAR Input mountain variance (horizontal resolution dependent) -# defaults to ${FIXGLOBAL}/global_mtnvar.t${JCAP}.f77 -# CLTUNE Input cloud tuning file -# defaults to ${FIXGLOBAL}/global_cldtune.f77 -# DTBTHE Input equivalent potential temperature file -# defaults to ${FIXGLOBAL}/global_tbthe.f77 -# O3FORC Input ozone forcing (production/loss) climatology -# defaults to ${FIXGLOBAL}/global_o3prdlos.f77 -# O3CLIM Input ozone climatology -# defaults to ${FIXGLOBAL}/global_o3clim.txt -# FNGLAC Input glacier climatology GRIB file -# defaults to ${FIXGLOBAL}/global_glacier.2x2.grb -# FNMXIC Input maximum sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_maxice.2x2.grb -# FNTSFC Input SST climatology GRIB file -# defaults to ${FIXGLOBAL}/global_sstclim.2x2.grb -# FNSNOC Input snow climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoclim.1.875.grb -# FNZORC Input roughness climatology GRIB file -# defaults to ${FIXGLOBAL}/global_zorclim.1x1.grb -# FNALBC Input albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_albedo4.1x1.grb -# FNAISC Input sea ice climatology GRIB file -# defaults to ${FIXGLOBAL}/global_iceclim.2x2.grb -# FNTG3C Input deep soil temperature climatology GRIB file -# defaults to ${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb -# FNVEGC Input vegetation fraction climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegfrac.1x1.grb -# FNVETC Input vegetation type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_vegtype.1x1.grb -# FNSOTC Input soil type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soiltype.1x1.grb -# FNSMCC Input soil moisture climatology GRIB file -# defaults to ${FIXGLOBAL}/global_soilmcpc.1x1.grb -# FNVMNC Input min veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmin.0.144x0.144.grb -# FNVMXC Input max veg frac climatology GRIB file -# defaults to ${FIXGLOBAL}/global_shdmax.0.144x0.144.grb -# FNSLPC Input slope type climatology GRIB file -# defaults to ${FIXGLOBAL}/global_slope.1x1.grb -# FNABSC Input max snow albedo climatology GRIB file -# defaults to ${FIXGLOBAL}/global_snoalb.1x1.grb -# OROGRAPHY Input orography GRIB file (horiz resolution dependent) -# defaults to ${FIXGLOBAL}/global_orography.t$JCAP.grb -# FNMSKH Input high resolution land mask GRIB file -# defaults to ${FIXGLOBAL}/seaice_newland.grb -# FNTSFA Input SST analysis GRIB file -# defaults to none -# FNACNA Input sea ice analysis GRIB file -# defaults to none -# FNSNOA Input snow analysis GRIB file -# defaults to none -# AERODIR Input aersol climatology directory -# defaults to ${FIXGLOBAL} -# EMISDIR Input earth's surface emissivity data directory -# defaults to ${FIXGLOBAL} -# SIGR1 Output first time level sigma restart file -# defaults to ${DATA}/sigr1 which is deleted -# SIGR2 Output second time level sigma restart file -# defaults to ${DATA}/sigr2 which is deleted -# SFCR Output surface restart file -# defaults to ${DATA}/sfcr which is deleted -# SFCO Output surface file with embedded forecast hour '${FH}' -# defaults to ${COMOUT}/sfcf'${FH}'$SUFOUT -# LOGO Output log file with embedded forecast hour '${FH}' -# defaults to ${COMOUT}/logf'${FH}'$SUFOUT -# INISCRIPT Preprocessing script -# defaults to none -# LOGSCRIPT Log posting script -# defaults to none -# ERRSCRIPT Error processing script -# defaults to 'eval [[ $err = 0 ]]' -# ENDSCRIPT Postprocessing script -# defaults to none -# FHINI Starting forecast hour -# defaults to the value in the input sigma file header -# FHSEG Number of hours to integrate -# (only required if FHMAX is not specified) -# defaults to 0 -# DELTIM Timestep in seconds -# defaults to 3600/($JCAP/20) -# FHRES Restart frequency in hours -# defaults to 24 -# FHZER Zeroing frequency in hours -# defaults to 6 -# FHLWR Longwave radiation frequency in hours -# defaults to 3 -# FHSWR Shortwave radiation frequency in hours -# defaults to 1 -# FHROT Forecast hour to Read One Time level -# defaults to 0 -# FHDFI Half number of hours of digital filter initialization -# defaults to 0 -# FHCYC Surface cycling frequency in hours -# defaults to 0 for no cycling -# IDVC Integer ID of the vertical coordinate type -# defaults to that in the header for the input upperair -# file. IDVC=1 for sigma; IDVC=2 for pressure/sigma hybrid -# TFILTC Time filter coefficient -# defaults to 0.85 -# FCSTVARS Other namelist inputs to the forecast executable -# defaults to none set -# FSMCL2 Scale in days to relax to soil moisture climatology -# defaults to 99999 for no relaxation -# FTSFS Scale in days to relax to SST anomaly to zero -# defaults to 90 -# FAISS Scale in days to relax to sea ice to climatology -# defaults to 99999 -# FSNOL Scale in days to relax to snow to climatology -# defaults to 99999 -# FSICL Scale in days to relax to sea ice to climatology -# defaults to 99999 -# CYCLEVARS Other namelist inputs to the surface cycling -# defaults to none set -# NTHREADS Number of threads -# defaults to 1 -# NTHSTACK Size of stack per thread -# defaults to 64000000 -# FILESTYLE File management style flag -# ('L' for symbolic links in $DATA is the only allowed style), -# PGMOUT Executable standard output -# defaults to $pgmout, then to '&1' -# PGMERR Executable standard error -# defaults to $pgmerr, then to '&1' -# pgmout Executable standard output default -# pgmerr Executable standard error default -# REDOUT standard output redirect ('1>' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# -# programs : $FCSTEXEC -# -# input data : $1 or $SIGI -# $2 or $SFCI -# $SIGI2 -# $FNTSFA -# $FNACNA -# $FNSNOA -# -# fixed data : $CO2CON -# $MTNVAR -# $CLTUNE -# $DTBTHE -# $O3FORC -# $O3CLIM -# $FNGLAC -# $FNMXIC -# $FNTSFC -# $FNSNOC -# $FNZORC -# $FNALBC -# $FNAISC -# $FNTG3C -# $FNVEGC -# $FNVETC -# $FNSOTC -# $FNSMCC -# $FNVMNC -# $FNVMXC -# $FNSLPC -# $FNABSC -# $FNMSKH -# $OROGRAPHY -# -# output data: $3 or $SIGO -# $4 or $FLXO -# $SFCO -# $LOGO -# $SIGR1 -# $SIGR2 -# $SFCR -# $PGMOUT -# $PGMERR -# -# scratch : ${DATA}/fort.11 -# ${DATA}/fort.12 -# ${DATA}/fort.14 -# ${DATA}/fort.15 -# ${DATA}/fort.24 -# ${DATA}/fort.27 -# ${DATA}/fort.28 -# ${DATA}/fort.29 -# ${DATA}/fort.43 -# ${DATA}/fort.48 -# ${DATA}/fort.51 -# ${DATA}/fort.52 -# ${DATA}/fort.53 -# ${DATA}/SIG.F* -# ${DATA}/SFC.F* -# ${DATA}/FLX.F* -# ${DATA}/LOG.F* -# ${DATA}/sigr1 -# ${DATA}/sigr2 -# ${DATA}/sfcr -# ${DATA}/NULL -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -#### -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi -# Command line arguments. -export ENS_NUM=${ENS_NUM:-1} -export FM=${FM} -export SIGI=${1:-${SIGI:-?}} -export SFCI=${2:-${SFCI:-?}} -export SIGO=${3:-${SIGO}} -export FLXO=${4:-${FLXO}} -export FHOUT=${5:-${FHOUT:-3}} -export FHMAX=${6:-${FHMAX:-0}} -export IGEN=${7:-${IGEN:-0}} -export D3DO=${8:-${D3DO}} -# Directories. -export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export DATA=${DATA:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Filenames. -export XC=${XC} -export SUFOUT=${SUFOUT} -export SIGHDR=${SIGHDR:-${EXECGLOBAL}/global_sighdr$XC} -export JCAP=${JCAP:-$(echo jcap|$SIGHDR ${SIGI}$FM)} -export LEVS=${LEVS:-$(echo levs|$SIGHDR ${SIGI}$FM)} -export LONR=${LONR:-$(echo lonr|$SIGHDR ${SIGI}$FM)} -export LATR=${LATR:-$(echo latr|$SIGHDR ${SIGI}$FM)} -export LONF=${LONF:-$(echo lonf|$SIGHDR ${SIGI}$FM)} -export LATG=${LATG:-$(echo latf|$SIGHDR ${SIGI}$FM)} -export NTRAC=${NTRAC:-$(echo ntrac|$SIGHDR ${SIGI}$FM)} -export IDVC=${IDVC:-$(echo idvc|$SIGHDR ${SIGI}$FM)} -export NMTVR=${NMTVR:-14} -export LSOIL=${LSOIL:-4} -export NTOZ=${NTOZ:-2} -export NTCW=${NTCW:-3} -export NCLD=${NCLD:-1} -export NGPTC=${NGPTC:-30} -export ADIAB=${ADIAB:-.false.} -export pre_rad=${pre_rad:-.false.} -export random_xkt2=${random_xkt2:-.true.} -export FCSTEXEC=${FCSTEXEC:-${EXECGLOBAL}/global_fcst$XC} -#export FCSTEXEC=${FCSTEXEC:-/nw${envir}/exec/global_fcst$XC} -export SIGI2=${SIGI2:-NULL} -export CO2CON=${CO2CON:-${FIXGLOBAL}/global_co2con.l${LEVS}.f77} -export MTNVAR=${MTNVAR:-${FIXGLOBAL}/global_mtnvar.t${JCAP}.f77} -export CLTUNE=${CLTUNE:-${FIXGLOBAL}/global_cldtune.f77} -export DTBTHE=${DTBTHE:-${FIXGLOBAL}/global_tbthe.f77} -export O3FORC=${O3FORC:-${FIXGLOBAL}/global_o3prdlos.f77} -export O3CLIM=${O3CLIM:-${FIXGLOBAL}/global_o3clim.txt} -export FNGLAC=${FNGLAC:-${FIXGLOBAL}/global_glacier.2x2.grb} -export FNMXIC=${FNMXIC:-${FIXGLOBAL}/global_maxice.2x2.grb} -export FNTSFC=${FNTSFC:-${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb} -export FNSNOC=${FNSNOC:-${FIXGLOBAL}/global_snoclim.1.875.grb} -export FNZORC=${FNZORC:-${FIXGLOBAL}/global_zorclim.1x1.grb} -export FNALBC=${FNALBC:-${FIXGLOBAL}/global_albedo4.1x1.grb} -export FNAISC=${FNAISC:-${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb} -export FNTG3C=${FNTG3C:-${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb} -export FNVEGC=${FNVEGC:-${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb} -export FNVETC=${FNVETC:-${FIXGLOBAL}/global_vegtype.1x1.grb} -export FNSOTC=${FNSOTC:-${FIXGLOBAL}/global_soiltype.1x1.grb} -export FNSMCC=${FNSMCC:-${FIXGLOBAL}/global_soilmcpc.1x1.grb} -export FNVMNC=${FNVMNC:-${FIXGLOBAL}/global_shdmin.0.144x0.144.grb} -export FNVMXC=${FNVMXC:-${FIXGLOBAL}/global_shdmax.0.144x0.144.grb} -export FNSLPC=${FNSLPC:-${FIXGLOBAL}/global_slope.1x1.grb} -export FNABSC=${FNABSC:-${FIXGLOBAL}/global_snoalb.1x1.grb} -export FNMSKH=${FNMSKH:-${FIXGLOBAL}/seaice_newland.grb} -export OROGRAPHY=${OROGRAPHY:-${FIXGLOBAL}/global_orography.t$JCAP.grb} -export FNTSFA=${FNTSFA} -export FNACNA=${FNACNA} -export FNSNOA=${FNSNOA} -export AERODIR=${AERODIR:-${FIXGLOBAL}} -export EMISDIR=${EMISDIR:-${FIXGLOBAL}} -export SIGR1=${SIGR1:-${DATA}/sigr1} -export SIGR2=${SIGR2:-${DATA}/sigr2} -export SFCR=${SFCR:-${DATA}/sfcr} -export SIGO=${SIGO:-${COMOUT}/sigf'${FH}''${MN}'$SUFOUT} -export SFCO=${SFCO:-${COMOUT}/sfcf'${FH}''${MN}'$SUFOUT} -export FLXO=${FLXO:-${COMOUT}/flxf'${FH}''${MN}'$SUFOUT} -export LOGO=${LOGO:-${COMOUT}/logf'${FH}''${MN}'$SUFOUT} -export D3DO=${D3DO:-${COMOUT}/d3df'${FH}''${MN}'$SUFOUT} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export FHINI=${FHINI:-$(echo ifhr|$SIGHDR ${SIGI}$FM)} -export FHSEG=${FHSEG:-0} -export FHMAX=${FHMAX:-$((10#$FHINI+10#$FHSEG))} -export DELTIM=${DELTIM:-$((3600/(JCAP/20)))} -export FHRES=${FHRES:-24} -export FHZER=${FHZER:-6} -export FHLWR=${FHLWR:-3} -export FHSWR=${FHSWR:-1} -export FHROT=${FHROT:-0} -export FHDFI=${FHDFI:-0} -export FHCYC=${FHCYC:-0} -export LIOPE=${LIOPE:-.true.} -if [ $IDVC = 1 ] ; then - export HYBRID=.false. - export GEN_COORD_HYBRID=.false. -elif [ $IDVC = 2 ] ; then - export HYBRID=.true. - export GEN_COORD_HYBRID=.false. -elif [ $IDVC = 3 ] ; then - export HYBRID=.false. - export GEN_COORD_HYBRID=.true. -fi -export TFILTC=${TFILTC:-0.85} -export FCSTVARS=${FCSTVARS:-""} -export FSMCL2=${FSMCL2:-99999} -export FTSFS=${FTSFS:-90} -export FAISS=${FAISS:-99999} -export FSNOL=${FSNOL:-99999} -export FSICL=${FSICL:-99999} -export CYCLVARS=${CYCLVARS} -#export NTHREADS=${NTHREADS:-1} -export OMP_NUM_THREADS=${OMP_NUM_THREADS:-1} -export NTHSTACK=${NTHSTACK:-128000000} -export XLSMPOPTS=${XLSMPOPTS:-"parthds=$NTHREADS:stack=$NTHSTACK"} -export FILESTYLE=${FILESTYLE:-'L'} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export MEMBER_NAMES=${MEMBER_NAMES:-''} -export BIND_TASKS=${BIND_TASKS:-no} -#typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -#typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} -################################################################################ -# Preprocessing -$INISCRIPT -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 -[[ -d $COMOUT ]]||mkdir -p $COMOUT -################################################################################ -# Make forecast -export XLFRTEOPTS="unit_vars=yes" -export PGM=$DATA/$(basename $FCSTEXEC) -export pgm=$PGM -$LOGSCRIPT -${NCP:-cp} $FCSTEXEC $DATA -rm -f NULL -FH=$((10#$FHINI)) -[[ $FH -lt 10 ]]&&FH=0$FH -if [[ $FHINI -gt 0 ]] -then - FH=$((10#$FHINI+10#$FHOUT)) - [[ $FH -lt 10 ]]&&FH=0$FH -fi -while [[ $FH -le $FHMAX ]] -do - eval rm -f $LOGO - ((FH=10#$FH+10#$FHOUT)) - [[ $FH -lt 10 ]]&&FH=0$FH -done -if [[ $FILESTYLE = "L" ]] -then - ln -fs $CO2CON fort.15 - ln -fs $MTNVAR fort.24 - ln -fs $DTBTHE fort.27 - ln -fs $O3FORC fort.28 - ln -fs $CLTUNE fort.43 - ln -fs $O3CLIM fort.48 -else - echo 'FILESTYLE' $FILESTYLE 'NOT SUPPORTED' - exit 222 -fi -for m in 01 02 03 04 05 06 07 08 09 10 11 12 -do - ln -fs $AERODIR/global_aeropac3a.m$m.txt aeropac3a.m$m -done -ln -fs $EMISDIR/sfc_emissivity_idx.txt sfc_emissivity_idx.txt -ln -fs $OROGRAPHY orography - -# -# For one member case i.e. control -# -if [[ $ENS_NUM -le 1 ]] ; then - FH=$((10#$FHINI)) - [[ $FH -lt 10 ]]&&FH=0$FH - if [[ $FHINI -gt 0 ]] ; then - FH=$((10#$FHINI+10#$FHOUT)) - [[ $FH -lt 10 ]]&&FH=0$FH - fi -# For Initial Conditions - ln -fs $SIGI sig_ini - ln -fs $SFCI sfc_ini - ln -fs $SIGI2 sig_ini2 -# For output - while [ $FH -le $FHMAX ] ; do - eval ln -fs $SIGO SIG.F${FH} - eval ln -fs $SFCO SFC.F${FH} - eval ln -fs $FLXO FLX.F${FH} - eval ln -fs $LOGO LOG.F${FH} - eval ln -fs $D3DO D3D.F${FH} - ((FH=10#$FH+10#$FHOUT)) - [[ $FH -lt 10 ]]&&FH=0$FH - done - ln -fs $SIGR1 SIGR1 - ln -fs $SIGR2 SIGR2 - ln -fs $SFCR SFCR -else -# -# For Ensemble runs (members > 1) - for MN in $MEMBER_NAMES ; do -# This is just faking the ensemble ICs. -# ${NCP:-cp} $SIGI ${SIGI}${MN} -# ${NCP:-cp} $SFCI ${SFCI}${MN} -# ${NCP:-cp} $SIGI2 ${SIGI2}${MN} -# For Initial Conditions - ln -fs ${SIGI}${MN} sig_ini${MN} - ln -fs ${SFCI}${MN} sfc_ini${MN} - ln -fs ${SIGI2}${MN} sig_ini2${MN} -# For output - FH=$((10#$FHINI)) - [[ $FH -lt 10 ]]&&FH=0$FH - if [[ $FHINI -gt 0 ]] ; then - FH=$((10#$FHINI+10#$FHOUT)) - [[ $FH -lt 10 ]]&&FH=0$FH - fi - while [[ $FH -le $FHMAX ]] ; do - eval ln -fs $SIGO SIG.F${FH}${MN} - eval ln -fs $SFCO SFC.F${FH}${MN} - eval ln -fs $FLXO FLX.F${FH}${MN} - eval ln -fs $LOGO LOG.F${FH}${MN} - eval ln -fs $D3DO D3D.F${FH}${MN} - ((FH=10#$FH+10#$FHOUT)) - [[ $FH -lt 10 ]]&&FH=0$FH - done - ln -fs ${SIGR1}${MN} SIGR1${MN} - ln -fs ${SIGR2}${MN} SIGR2${MN} - ln -fs ${SFCR}${MN} SFCR${MN} - done -fi - -# -# Create Configure file (i.e. .rc file) here -# PE$n are to be imported from outside. If PE$n are not set from outside, the -# model would give equal processors for all ensembel members. -# -c=1 -while [ $c -le $ENS_NUM ] ; do - eval export PE$c=\${PE$c:-0} - c=$((c+1)) -done -cat << EOF > gfs_namelist.rc - -#nam_gfs +++++++++++++++++++++++++++ -NLUNIT: 35 -DELTIM: ${DELTIM}.0 -NAMELIST: gfs_namelist -TOTAL_MEMBER: $ENS_NUM -PE_MEMBER01: $PE1 -PE_MEMBER02: $PE2 -PE_MEMBER03: $PE3 -PE_MEMBER04: $PE4 -PE_MEMBER05: $PE5 -PE_MEMBER06: $PE6 -PE_MEMBER07: $PE7 -PE_MEMBER08: $PE8 -PE_MEMBER09: $PE9 -PE_MEMBER10: $PE10 -PE_MEMBER11: $PE11 -PE_MEMBER12: $PE12 -PE_MEMBER13: $PE13 -PE_MEMBER14: $PE14 -PE_MEMBER14: $PE15 -PE_MEMBER16: $PE16 -PE_MEMBER17: $PE17 -PE_MEMBER18: $PE18 -PE_MEMBER19: $PE19 -PE_MEMBER20: $PE20 -PE_MEMBER21: $PE21 - -#ESMF_State_Namelist +++++++++++++++ -IDATE1_IMPORT: 0 -Z_IMPORT: 0 -PS_IMPORT: 0 -VOR_IMPORT: 0 -DIV_IMPORT: 0 -TEMP_IMPORT: 0 -Q_IMPORT: 0 -OZ_IMPORT: 0 -SCLD_IMPORT: 0 - -IDATE1_EXPORT: 0 -Z_EXPORT: 0 -PS_EXPORT: 0 -VOR_EXPORT: 0 -DIV_EXPORT: 0 -TEMP_EXPORT: 0 -Q_EXPORT: 0 -OZ_EXPORT: 0 -SCLD_EXPORT: 0 - -# Surface state. -#--------------- -OROGRAPHY_IMPORT: 0 -T_SKIN_IMPORT: 0 -SOIL_MOIS_IMPORT: 0 -SNOW_DEPTH_IMPORT: 0 -SOIL_T_IMPORT: 0 -DEEP_SOIL_T_IMPORT: 0 -ROUGHNESS_IMPORT: 0 -CONV_CLOUD_COVER_IMPORT: 0 -CONV_CLOUD_BASE_IMPORT: 0 -CONV_CLOUD_TOP_IMPORT: 0 -ALBEDO_VISIBLE_SCATTERED_IMPORT: 0 -ALBEDO_VISIBLE_BEAM_IMPORT: 0 -ALBEDO_NEARIR_SCATTERED_IMPORT: 0 -ALBEDO_NEARIR_BEAM_IMPORT: 0 -SEA_LEVEL_ICE_MASK_IMPORT: 0 -VEGETATION_COVER_IMPORT: 0 -CANOPY_WATER_IMPORT: 0 -M10_WIND_FRACTION_IMPORT: 0 -VEGETATION_TYPE_IMPORT: 0 -SOIL_TYPE_IMPORT: 0 -ZENEITH_ANGLE_FACSF_IMPORT: 0 -ZENEITH_ANGLE_FACWF_IMPORT: 0 -UUSTAR_IMPORT: 0 -FFMM_IMPORT: 0 -FFHH_IMPORT: 0 -SEA_ICE_THICKNESS_IMPORT: 0 -SEA_ICE_CONCENTRATION_IMPORT: 0 -TPRCP_IMPORT: 0 -SRFLAG_IMPORT: 0 -ACTUAL_SNOW_DEPTH_IMPORT: 0 -LIQUID_SOIL_MOISTURE_IMPORT: 0 -VEGETATION_COVER_MIN_IMPORT: 0 -VEGETATION_COVER_MAX_IMPORT: 0 -SLOPE_TYPE_IMPORT: 0 -SNOW_ALBEDO_MAX_IMPORT: 0 - -OROGRAPHY_EXPORT: 0 -T_SKIN_EXPORT: 0 -SOIL_MOIS_EXPORT: 0 -SNOW_DEPTH_EXPORT: 0 -SOIL_T_EXPORT: 0 -DEEP_SOIL_T_EXPORT: 0 -ROUGHNESS_EXPORT: 0 -CONV_CLOUD_COVER_EXPORT: 0 -CONV_CLOUD_BASE_EXPORT: 0 -CONV_CLOUD_TOP_EXPORT: 0 -ALBEDO_VISIBLE_SCATTERED_EXPORT: 0 -ALBEDO_VISIBLE_BEAM_EXPORT: 0 -ALBEDO_NEARIR_SCATTERED_EXPORT: 0 -ALBEDO_NEARIR_BEAM_EXPORT: 0 -SEA_LEVEL_ICE_MASK_EXPORT: 0 -VEGETATION_COVER_EXPORT: 0 -CANOPY_WATER_EXPORT: 0 -M10_WIND_FRACTION_EXPORT: 0 -VEGETATION_TYPE_EXPORT: 0 -SOIL_TYPE_EXPORT: 0 -ZENEITH_ANGLE_FACSF_EXPORT: 0 -ZENEITH_ANGLE_FACWF_EXPORT: 0 -UUSTAR_EXPORT: 0 -FFMM_EXPORT: 0 -FFHH_EXPORT: 0 -SEA_ICE_THICKNESS_EXPORT: 0 -SEA_ICE_CONCENTRATION_EXPORT: 0 -TPRCP_EXPORT: 0 -SRFLAG_EXPORT: 0 -ACTUAL_SNOW_DEPTH_EXPORT: 0 -LIQUID_SOIL_MOISTURE_EXPORT: 0 -VEGETATION_COVER_MIN_EXPORT: 0 -VEGETATION_COVER_MAX_EXPORT: 0 -SLOPE_TYPE_EXPORT: 0 -SNOW_ALBEDO_MAX_EXPORT: 0 - -EOF - -# -# WARNING WARNING FILESTYLE "C" will not work for Component Ensembles!!! -# -#eval $PGM < gfs_namelist <' or '1>>') -# defaults to '1>', or to '1>>' to append if $PGMOUT is a file -# REDERR standard error redirect ('2>' or '2>>') -# defaults to '2>', or to '2>>' to append if $PGMERR is a file -# VERBOSE Verbose flag (YES or NO) -# defaults to NO -# -# Exported Shell Variables: -# PGM Current program name -# pgm -# ERR Last return code -# err -# -# Modules and files referenced: -# scripts : $INISCRIPT -# $LOGSCRIPT -# $ERRSCRIPT -# $ENDSCRIPT -# $CHGRESSH -# -# programs : $CYCLEXEC -# $GSIEXEC -# $ANGUPDATEXEC -# -# fixed data : $BERROR -# $SATANGL -# $SATINFO -# $RTMSPEC -# $RTMTRAN -# $RTMEMIS -# $RTMAERO -# $RTMCLDS -# $CONVINFO -# $OZINFO -# $PCPINFO -# -# input data : $SFCGES -# $SIGGES -# $GBIAS -# $GSATANG -# $SFCG03 -# $SFCG04 -# $SFCG05 -# $SFCG07 -# $SFCG08 -# $SFCG09 -# $SIGG03 -# $SIGG04 -# $SIGG05 -# $SIGG07 -# $SIGG08 -# $SIGG09 -# $GINCIN -# $BIASIN -# $FNTSFA -# $FNACNA -# $FNSNOA -# $PREPQC -# $GSNDBF -# $GSNDBF1 -# $B1HRS2 -# $B1MSU -# $B1HRS3 -# $B1HRS4 -# $B1AMUA -# $B1AMUB -# $B1MHS -# $AIRSBF -# $AMSREBF -# $SSMITBF -# $SBUVBF -# $SMIPCP -# $TMIPCP -# $GPSBF -# -# output data: $SFCANL -# $SIGANL -# $ABIAS -# $RADSTAT -# $GSISTAT -# $PCPSTAT -# $CNVSTAT -# $OZNSTAT -# $GINCOUT -# $BIASOUT -# $PGMOUT -# $PGMERR -# -# Remarks: -# -# Condition codes -# 0 - no problem encountered -# >0 - some problem encountered -# -# Control variable resolution priority -# 1 Command line argument. -# 2 Environment variable. -# 3 Inline default. -# -# Attributes: -# Language: POSIX shell -# Machine: IBM SP -# -################################################################################ -# Set environment. -export VERBOSE=${VERBOSE:-"NO"} -if [[ "$VERBOSE" = "YES" ]] -then - echo $(date) EXECUTING $0 $* >&2 - set -x -fi - -###################### -# For testing -JYZ -###################### -#export GSIEXEC=$EXECGLOBAL/global_gsi.x -#export ANGUPDATEXEC=$EXECGLOBAL/global_angupdate -#export CHGRESEXEC=$EXECGLOBAL/global_chgres -#export CHGRESSH=$USHGLOBAL/global_chgres.sh - -# Command line arguments. -export SFCGES=${1:-${SFCGES:?}} -export SIGGES=${2:-${SIGGES:?}} -export GBIAS=${3:-${GBIAS:?}} -export GSATANG=${4:-${GSATANG:?}} -export SFCANL=${5:-${SFCANL}} -export SIGANL=${6:-${SIGANL}} -export ABIAS=${7:-${ABIAS}} -export IGEN=${8:-${IGEN:-0}} -# Directories. -export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix} -export FIXGSI=${FIXGSI:-/nwprod/fix} -export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec} -export USHGLOBAL=${USHGLOBAL:-/nwprod/ush} -export DATA=${DATA:-$(pwd)} -export COMIN=${COMIN:-$(pwd)} -export COMOUT=${COMOUT:-$(pwd)} -# Filenames. -export XC=${XC} -export PREINP=${PREINP} -export SUFINP=${SUFINP} -export SIGHDR=${SIGHDR:-${EXECGLOBAL}/global_sighdr$XC} -export SFCHDR=${SFCHDR:-${EXECGLOBAL}/global_sfchdr$XC} -export JCAP=${JCAP:-$($SIGHDR $SIGGES JCAP||echo 0)} -export LATB=${LATB:-$($SFCHDR $SFCGES LATB||echo 0)} -export LONB=${LONB:-$($SFCHDR $SFCGES LONB||echo 0)} -export LATA=${LATA:-$LATB} -export LONA=${LONA:-$LONB} -export NLAT=${NLAT:-$(($LATA+2))} -export LEVS=${LEVS:-$($SIGHDR $SIGGES LEVS||echo 0)} -export DELTIM=${DELTIM:-$((3600/($JCAP/20)))} -export CYCLEXEC=${CYCLEXEC:-${EXECGLOBAL}/global_cycle$XC} -export GSIEXEC=${GSIEXEC:-${EXECGLOBAL}/global_gsi.x} -export ANGUPDATEXEC=${ANGUPDATEXEC:-${EXECGLOBAL}/global_angupdate$XC} -##export ANGUPDATEXEC=${ANGUPDATEXEC:-/nwprod/exec/global_angupdate} -export CHGRESSH=${CHGRESSH:-${USHGLOBAL}/global_chgres.sh} -export CYCLESH=${CYCLESH:-${EXECGLOBAL}/global_cycle.sh} -export BERROR=${BERROR:-${FIXGSI}/global_berror.l${LEVS}y${NLAT}.f77} -export SATANGL=${SATANGL:-${FIXGSI}/global_satangbias.txt} -export SATINFO=${SATINFO:-${FIXGSI}/global_satinfo.txt} -export RTMSPEC=${RTMSPEC:-${FIXGSI}/global_CRTM_SpcCoeff.f77} -export RTMTRAN=${RTMTRAN:-${FIXGSI}/global_CRTM_TauCoeff.f77} - -#export RTMEMIS=${RTMEMIS:-${FIXGSI}/global_CRTM_EmisCoeff.f77} -#export RTMAERO=${RTMAERO:-${FIXGSI}/global_CRTM_AerosolCoeff.f77} -#export RTMCLDS=${RTMCLDS:-${FIXGSI}/global_CRTM_CldCoeff.f77} -export RTMEMIS=${RTMEMIS:-${FIXGSI}/crtm_gfsgsi/EmisCoeff/Big_Endian/EmisCoeff.bin} -export RTMAERO=${RTMAERO:-${FIXGSI}/crtm_gfsgsi/AerosolCoeff/Big_Endian/AerosolCoeff.bin} -export RTMCLDS=${RTMCLDS:-${FIXGSI}/crtm_gfsgsi/CloudCoeff/Big_Endian/CloudCoeff.bin} - -export CONVINFO=${CONVINFO:-${FIXGSI}/global_convinfo.txt} -export OZINFO=${OZINFO:-${FIXGSI}/global_ozinfo.txt} -export PCPINFO=${PCPINFO:-${FIXGSI}/global_pcpinfo.txt} -export OBERROR=${OBERROR:-${FIXGLOBAL}/prepobs_errtable.global} -export PREPQC=${PREPQC:-/dev/null} -export GSNDBF=${GSNDBF:-/dev/null} -export GSNDBF1=${GSNDBF1:-/dev/null} -export B1HRS2=${B1HRS2:-/dev/null} -export B1MSU=${B1MSU:-/dev/null} -export B1HRS3=${B1HRS3:-/dev/null} -export B1HRS4=${B1HRS4:-/dev/null} -export B1AMUA=${B1AMUA:-/dev/null} -export B1AMUB=${B1AMUB:-/dev/null} -export B1MHS=${B1MHS:-/dev/null} -export AIRSBF=${AIRSBF:-/dev/null} -export IASIBF=${IASIBF:-/dev/null} -export AMSREBF=${AMSREBF:-/dev/null} -export SSMITBF=${SSMITBF:-/dev/null} -export SBUVBF=${SBUVBF:-/dev/null} -export SMIPCP=${SMIPCP:-/dev/null} -export TMIPCP=${TMIPCP:-/dev/null} -export GPSBF=${GPSBF:-/dev/null} -export GINCIN=${GINCIN:-${COMOUT}/gesfile_in} -export BIASIN=${BIASIN:-${COMOUT}/biascor_in} -export SFCG03=${SFCG03:-${COMOUT}/sfcf03} -export SFCG04=${SFCG04:-${COMOUT}/sfcf04} -export SFCG05=${SFCG05:-${COMOUT}/sfcf05} -export SFCG07=${SFCG07:-${COMOUT}/sfcf07} -export SFCG08=${SFCG08:-${COMOUT}/sfcf08} -export SFCG09=${SFCG09:-${COMOUT}/sfcf09} -export SFCG03M=${SFCG03M:-${COMOUT}/sfcfm03} -export SFCG04M=${SFCG04M:-${COMOUT}/sfcfm04} -export SFCG05M=${SFCG05M:-${COMOUT}/sfcfm05} -export SFCG07M=${SFCG07M:-${COMOUT}/sfcfm07} -export SFCG08M=${SFCG08M:-${COMOUT}/sfcfm08} -export SFCG09M=${SFCG09M:-${COMOUT}/sfcfm09} -export SIGG03=${SIGG03:-${COMOUT}/sigf03} -export SIGG04=${SIGG04:-${COMOUT}/sigf04} -export SIGG05=${SIGG05:-${COMOUT}/sigf05} -export SIGG07=${SIGG07:-${COMOUT}/sigf07} -export SIGG08=${SIGG08:-${COMOUT}/sigf08} -export SIGG09=${SIGG09:-${COMOUT}/sigf09} -export SFCANL=${SFCANL:-${COMIN}/${PREINP}sfcanl} -export SIGANL=${SIGANL:-${COMIN}/${PREINP}sanl} -export ABIAS=${ABIAS:-${COMIN}/${PREINP}abias} -export GINCOUT=${GINCOUT:-${COMIN}/${PREINP}gesfile_out} -export BIASOUT=${BIASOUT:-${COMIN}/${PREINP}biascor_out} -export RADSTAT=${RADSTAT:-${COMIN}/${PREINP}radstat} -export GSISTAT=${GSISTAT:-${COMIN}/${PREINP}gsistat} -export PCPSTAT=${PCPSTAT:-${COMIN}/${PREINP}pcpstat} -export CNVSTAT=${CNVSTAT:-${COMIN}/${PREINP}cnvstat} -export OZNSTAT=${OZNSTAT:-${COMIN}/${PREINP}oznstat} -export SATANGO=${SATANGO:-${COMIN}/${PREINP}satang} -export INISCRIPT=${INISCRIPT} -export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'} -export LOGSCRIPT=${LOGSCRIPT} -export ENDSCRIPT=${ENDSCRIPT} -# Other variables. -export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)} -export LSOIL=${LSOIL:-2} -export FSMCL2=${FSMCL2:-60} -export DELTSFC=${DELTSFC:-$($SFCHDR $SFCGES FHOUR||echo 0)} -export CYCLVARS=${CYCLVARS} -export SETUP=${SETUP:-""} -export GRIDOPTS=${GRIDOPTS:-""} -export BKGVERR=${BKGVERR:-""} -export ANBKGERR=${ANBKGERR:-""} -export JCOPTS=${JCOPTS:-""} -export STRONGOPTS=${STRONGOPTS:-""} -export OBSQC=${OBSQC:-""} -export OBSINPUT=${OBSINPUT:-""} -export SUPERRAD=${SUPERRAD:-""} -export SINGLEOB=${SINGLEOB:-""} -export SETUPANG=${SETUPANG:-""} -export OBSINPUTANG=${OBSINPUTANG:-""} -export NTHREADS=${NTHREADS:-1} -export NTHSTACK=${NTHSTACK:-64000000} -export PGMOUT=${PGMOUT:-${pgmout:-'&1'}} -export PGMERR=${PGMERR:-${pgmerr:-'&2'}} -export OBERRFLAG=${OBERRFLAG:-.false.} -export DIAGCONV=${DIAGCONV:-.false.} -export HXONLY=${HXONLY:-.false.} -export PERTURB_OBS=${PERTURB_OBS:-.false.} -export PERTURB_FACT=${PERTURB_FACT:-0} -export PERTURB_BERR=${PERTURB_BERR:-.false.} -export PERTURB_BERR_FACT=${PERTURB_BERR_FACT:-0} -export ONEOB_TEST=${ONEOB_TEST:-.false.} - - -export NCP=${NCP:-cp} -typeset -L1 l=$PGMOUT -[[ $l = '&' ]]&&a=''||a='>' -export REDOUT=${REDOUT:-'1>'$a} -typeset -L1 l=$PGMERR -[[ $l = '&' ]]&&a=''||a='>' -export REDERR=${REDERR:-'2>'$a} - - -homedir=$PWD -pwd=$(pwd) -if [[ -d $DATA ]] -then - mkdata=NO -else - mkdir -p $DATA - mkdata=YES -fi -cd $DATA||exit 99 - -################################################################################ -# Update surface guess file to produce surface analysis - -$CYCLESH $SFCGES $SFCANL - -################################################################################ -# If necessary, change resolution of surface guess files. - -## NOTE: 10/01/2003, r.treadon -## To prevent misleading error messages, copy/process 4,5,7,8 hour -## forecasts only if files exist. - -# here we assume LONA==LONB, LATA==LATB -#if [[ $LATA -ne $LATB && $LONA -ne $LONB ]]; then -# echo "ERROR: LONA must be equal to LONB, LATA must be equal to LATB" -# exit 1 -#fi - -#if [[ $LATA -ne $LATB && $LONA -ne $LONB ]]; then -#echo "executing global_chgres" -#fh=${FHMIN} -#PWD=`pwd` -#DATAHOLD=$DATA -#export NTHREADS=8 -#while [[ $fh -le $FHMAX ]]; do -# fhour="`printf %02i $fh`" -# SFCGIN=${datapath2}/bfg_${analdate}_fhr${fhour}_${charnanal} -# SFCGOUT=${datapath2}/bfg2${analdate}_fhr${fhour}_${charnanal} -# varname="SFCG$fhour"a -# SFCGIN=${varname} -# varname="SFCG$fhour" -# SFCGOUT=${varname} - -################################################################################ -# Make atmospheric analysis -export XLSMPOPTS="parthds=1:stack=$NTHSTACK" -export PGM=$DATA/$(basename $GSIEXEC) -export pgm=$PGM -$LOGSCRIPT - -rm berror_stats satbias_angle satinfo SpcCoeff.bin TauCoeff.bin EmisCoeff.bin -rm AerosolCoeff.bin CloudCoeff.bin convinfo ozinfo pcpinfo errtable -rm prepbufr gsndrbufr gsnd1bufr hirs2bufr msubufr hirs3bufr hirs4bufr -rm amsuabufr amsubbufr mhsbufr sbuvbufr ssmibufr tmibufr airsbufr -rm amsrebufr ssmitbufr gpsrobufr iasibufr -rm satbias_in satbias_ang.in -rm sfcf03 sfcf04 sfcf05 sfcf06 sfcf07 sfcf08 sfcf09 -rm sfcfm03 sfcfm04 sfcfm05 sfcfm06 sfcfm07 sfcfm08 sfcfm09 -rm sigf03 sigf04 sigf05 sigf06 sigf07 sigf08 sigf09 siganl -rm gesfile_in gesfiles_out satbias_in satbias_ang.in satbias_out -rm prepbufr hirs2bufr msubufr hirs3bufr hirs4bufr amsuabufr -rm amsubbufr mhsbufr airsbufr sbuvbufr ssmibufr tmibufr gpsrobufr -rm amsrebufr ssmitbufr gsndrbufr gsnd1bufr - -${NCP:-cp} $GSIEXEC $DATA - -## NOTE: 10/01/2003, r.treadon -## Do not add above file existence tests since -## we do not link to files in operations - - -# Fixed fields -ln -fs $BERROR berror_stats -ln -fs $SATANGL satbias_angle -ln -fs $SATINFO satinfo -#ln -fs $RTMSPEC SpcCoeff.bin -#ln -fs $RTMTRAN TauCoeff.bin -ln -fs $RTMEMIS EmisCoeff.bin -ln -fs $RTMAERO AerosolCoeff.bin -ln -fs $RTMCLDS CloudCoeff.bin -ln -fs $CONVINFO convinfo -ln -fs $OZINFO ozinfo -ln -fs $PCPINFO pcpinfo -ln -fs $OBERROR errtable -# CRTM Spectral and Transmittance coefficients -#nsatsen=`cat satinfo | wc -l` -#isatsen=1 -#while [[ $isatsen -le $nsatsen ]]; do -# flag=`head -n $isatsen satinfo | tail -1 | cut -c1-1` -# if [[ "$flag" != "!" ]]; then -# satsen=`head -n $isatsen satinfo | tail -1 | cut -f 2 -d" "` -# spccoeff=${satsen}.SpcCoeff.bin -# if [[ ! -s $spccoeff ]]; then -# ln -fs $FIXGLOBAL/crtm_gfsgsi/SpcCoeff/No_AC/Big_Endian/$spccoeff $spccoeff -# ln -fs $FIXGLOBAL/crtm_gfsgsi/TauCoeff/Big_Endian/${satsen}.TauCoeff.bin ${satsen}.TauCoeff.bin -# fi -# fi -# isatsen=` expr $isatsen + 1 ` -#done -#satsens="amsua_n15 amsua_n16 amsua_n17 amsua_n18 amsub_n15 amsub_n16 amsub_n17 amsub_n18" -# jsw - this is faster. -if [ -z "$CONVONLY" ]; then -satsens=`ls -1 $FIXGLOBAL/crtm_gfsgsi/SpcCoeff/Big_Endian/ | cut -f1 -d"." ` -for satsen in $satsens; do - #echo $satsen - spccoeff=${satsen}.SpcCoeff.bin - if [[ ! -s $spccoeff ]]; then - ln -fs $FIXGSI/crtm_gfsgsi/SpcCoeff/Big_Endian/$spccoeff $spccoeff - ln -fs $FIXGSI/crtm_gfsgsi/TauCoeff/Big_Endian/${satsen}.TauCoeff.bin ${satsen}.TauCoeff.bin - fi -done -fi -# Observational data -ln -fs $PREPQC prepbufr -ln -fs $GSNDBF gsndrbufr -ln -fs $GSNDBF1 gsnd1bufr -ln -fs $B1HRS2 hirs2bufr -ln -fs $B1MSU msubufr -ln -fs $B1HRS3 hirs3bufr -ln -fs $B1HRS4 hirs4bufr -ln -fs $B1AMUA amsuabufr -ln -fs $B1AMUB amsubbufr -ln -fs $B1MHS mhsbufr -ln -fs $AIRSBF airsbufr -ln -fs $IASIBF iasibufr -ln -fs $AMSREBF amsrebufr -###ln -fs $SSMITBF ssmitbufr -ln -fs $SBUVBF sbuvbufr -ln -fs $SMIPCP ssmibufr -ln -fs $TMIPCP tmibufr -ln -fs $GPSBF gpsrobufr -# jsw - add tcvitals file. -ln -fs $TCVIT tcvitals - -# Guess fields -ln -fs $GBIAS satbias_in -ln -fs $GSATANG satbias_ang.in -ln -fs $GINCIN gesfile_in -ln -fs $BIASIN biascor_in -ln -fs $SIGG03 sigf03 -ln -fs $SIGG04 sigf04 -ln -fs $SIGG05 sigf05 -ln -fs $SIGGES sigf06 -ln -fs $SIGG07 sigf07 -ln -fs $SIGG08 sigf08 -ln -fs $SIGG09 sigf09 -ln -fs $SFCG03 sfcf03 -ln -fs $SFCG04 sfcf04 -ln -fs $SFCG05 sfcf05 -ln -fs $SFCG06 sfcf06 -ln -fs $SFCG07 sfcf07 -ln -fs $SFCG08 sfcf08 -ln -fs $SFCG09 sfcf09 -ln -fs $SFCG03M sfcfm03 -ln -fs $SFCG04M sfcfm04 -ln -fs $SFCG05M sfcfm05 -ln -fs $SFCG06M sfcfm06 -ln -fs $SFCG07M sfcfm07 -ln -fs $SFCG08M sfcfm08 -ln -fs $SFCG09M sfcfm09 -# Output files -ln -fs $SIGANL siganl -ln -fs $ABIAS satbias_out -ln -fs $GINCOUT gesfile_out -ln -fs $BIASOUT biascor_out - - -if [[ "${charnanal}" != "ensmean" ]]; then - ${NCP} ${COMOUT}/obs_input.${CDATE}.tar ${DATA}/ - cd ${DATA} - tar -xvf obs_input.${CDATE}.tar -fi - - -ls -l -# these files on't exist, but the gsi tries to read them. -#touch pcpbias_in -touch ssmisbufr -touch gimgrbufr - -wait # wait for global_cycle to finish. - -if [ -n "$CONVONLY" ]; then - GBIAS=$SFCGES - GSATANG=$SIGGES -fi -if [ -s $GBIAS ] && [ -s $GSATANG ] && [ -s $SFCGES ] && [ -s $SFCG03 ] && [ -s $SFCG09 ] && [ -s $SIGGES ] && [ -s $SIGG03 ] && [ -s $SIGG09 ] && [ -s $SFCANL ]; then - -# Create global_gsi namelist -cat < gsiparm.anl - &SETUP - miter=0,niter(1)=1,niter(2)=1, - niter_no_qc(1)=10000,niter_no_qc(2)=1000000, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=$IGEN,factqmin=0.005,factqmax=0.005,deltim=$DELTIM, - ndat=67,npred=5,iguess=-1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false., - $SETUP - / - &GRIDOPTS - JCAP_B=$JCAP,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS,hybrid=.true., - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - as=0.6,0.6,0.75,0.75,0.75,0.75,1.0,1.0 - vs=0.7, - hzscl=1.7,0.8,0.5, - hswgt=0.45,0.3,0.25, - bw=0.0,norsp=4, - bkgv_flowdep=.true.,bkgv_rewgtfct=1.5, - tsfc_sdv(1)=3.0,tsfc_sdv(2)=3.0, - - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=2.5e7, - $JCOPTS - / - &STRONGOPTS - jcstrong=.false.,nstrong=0,nvmodes_keep=0,period_max=6.,period_width=1.5, - jcstrong_option=2,baldiag_full=.false.,baldiag_inc=.false., - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=145.0,dmesh(3)=145.0,dmesh(4)=145.0,dmesh(5)=145.0,dmesh(6)=150.0,time_window_max=3.0, - dfile(01)='prepbufr', dtype(01)='ps', dplat(01)=' ', dsis(01)='ps', dval(01)=1.0, dthin(01)=0, dsfcalc(01)=0, - dfile(02)='prepbufr' dtype(02)='t', dplat(02)=' ', dsis(02)='t', dval(02)=1.0, dthin(02)=0, dsfcalc(02)=0, - dfile(03)='prepbufr', dtype(03)='q', dplat(03)=' ', dsis(03)='q', dval(03)=1.0, dthin(03)=0, dsfcalc(03)=0, - dfile(04)='prepbufr', dtype(04)='pw', dplat(04)=' ', dsis(04)='pw', dval(04)=1.0, dthin(04)=0, dsfcalc(04)=0, - dfile(05)='prepbufr', dtype(05)='uv', dplat(05)=' ', dsis(05)='uv', dval(05)=1.0, dthin(05)=0, dsfcalc(05)=0, - dfile(06)='prepbufr', dtype(06)='spd', dplat(06)=' ', dsis(06)='spd', dval(06)=1.0, dthin(06)=0, dsfcalc(06)=0, - dfile(07)='prepbufr', dtype(07)='dw', dplat(07)=' ', dsis(07)='dw', dval(07)=1.0, dthin(07)=0, dsfcalc(07)=0, - dfile(08)='radarbufr', dtype(08)='rw', dplat(08)=' ', dsis(08)='rw', dval(08)=1.0, dthin(08)=0, dsfcalc(08)=0, - dfile(09)='prepbufr', dtype(09)='sst', dplat(09)=' ', dsis(09)='sst', dval(09)=1.0, dthin(09)=0, dsfcalc(09)=0, - dfile(10)='gpsrobufr', dtype(10)='gps_ref', dplat(10)=' ', dsis(10)='gps_ref', dval(10)=1.0, dthin(10)=0, dsfcalc(10)=0, - dfile(11)='ssmirrbufr',dtype(11)='pcp_ssmi', dplat(11)='dmsp', dsis(11)='pcp_ssmi', dval(11)=1.0, dthin(11)=-1, dsfcalc(11)=0, - dfile(12)='tmirrbufr', dtype(12)='pcp_tmi', dplat(12)='trmm', dsis(12)='pcp_tmi', dval(12)=1.0, dthin(12)=-1, dsfcalc(12)=0, - dfile(13)='sbuvbufr', dtype(13)='sbuv2', dplat(13)='n16', dsis(13)='sbuv8_n16', dval(13)=1.0, dthin(13)=0, dsfcalc(13)=0, - dfile(14)='sbuvbufr', dtype(14)='sbuv2', dplat(14)='n17', dsis(14)='sbuv8_n17', dval(14)=1.0, dthin(14)=0, dsfcalc(14)=0, - dfile(15)='sbuvbufr', dtype(15)='sbuv2', dplat(15)='n18', dsis(15)='sbuv8_n18', dval(15)=1.0, dthin(15)=0, dsfcalc(15)=0, - dfile(16)='hirs2bufr', dtype(16)='hirs2', dplat(16)='n14', dsis(16)='hirs2_n14', dval(16)=6.0, dthin(16)=1, dsfcalc(16)=0, - dfile(17)='hirs3bufr', dtype(17)='hirs3', dplat(17)='n16', dsis(17)='hirs3_n16', dval(17)=0.0, dthin(17)=1, dsfcalc(17)=0, - dfile(18)='hirs3bufr', dtype(18)='hirs3', dplat(18)='n17', dsis(18)='hirs3_n17', dval(18)=6.0, dthin(18)=1, dsfcalc(18)=0, - dfile(19)='hirs4bufr', dtype(19)='hirs4', dplat(19)='n18', dsis(19)='hirs4_n18', dval(19)=0.0, dthin(19)=1, dsfcalc(19)=0, - dfile(20)='hirs4bufr', dtype(20)='hirs4', dplat(20)='metop-a', dsis(20)='hirs4_metop-a', dval(20)=6.0, dthin(20)=1, dsfcalc(20)=0, - dfile(21)='gsndrbufr', dtype(21)='sndr', dplat(21)='g11', dsis(21)='sndr_g11', dval(21)=0.0, dthin(21)=1, dsfcalc(21)=0, - dfile(22)='gsndrbufr', dtype(22)='sndr', dplat(22)='g12', dsis(22)='sndr_g12', dval(22)=0.0, dthin(22)=1, dsfcalc(22)=0, - dfile(23)='gimgrbufr', dtype(23)='goes_img', dplat(23)='g11', dsis(23)='imgr_g11', dval(23)=0.0, dthin(23)=1, dsfcalc(23)=0, - dfile(24)='gimgrbufr', dtype(24)='goes_img', dplat(24)='g12', dsis(24)='imgr_g12', dval(24)=0.0, dthin(24)=1, dsfcalc(24)=0, - dfile(25)='airsbufr', dtype(25)='airs', dplat(25)='aqua', dsis(25)='airs_aqua', dval(25)=20.0, dthin(25)=1, dsfcalc(25)=0, - dfile(26)='msubufr', dtype(26)='msu', dplat(26)='n14', dsis(26)='msu_n14', dval(26)=2.0, dthin(26)=2, dsfcalc(26)=0, - dfile(27)='amsuabufr', dtype(27)='amsua', dplat(27)='n15', dsis(27)='amsua_n15', dval(27)=10.0, dthin(27)=2, dsfcalc(27)=0, - dfile(28)='amsuabufr', dtype(28)='amsua', dplat(28)='n16', dsis(28)='amsua_n16', dval(28)=0.0, dthin(28)=2, dsfcalc(28)=0, - dfile(29)='amsuabufr', dtype(29)='amsua', dplat(29)='n17', dsis(29)='amsua_n17', dval(29)=0.0, dthin(29)=2, dsfcalc(29)=0, - dfile(30)='amsuabufr', dtype(30)='amsua', dplat(30)='n18', dsis(30)='amsua_n18', dval(30)=10.0, dthin(30)=2, dsfcalc(30)=0, - dfile(31)='amsuabufr', dtype(31)='amsua', dplat(31)='metop-a', dsis(31)='amsua_metop-a', dval(31)=10.0, dthin(31)=2, dsfcalc(31)=0, - dfile(32)='airsbufr', dtype(32)='amsua', dplat(32)='aqua', dsis(32)='amsua_aqua', dval(32)=5.0, dthin(32)=2, dsfcalc(32)=0, - dfile(33)='amsubbufr', dtype(33)='amsub', dplat(33)='n15', dsis(33)='amsub_n15', dval(33)=3.0, dthin(33)=3, dsfcalc(33)=0, - dfile(34)='amsubbufr', dtype(34)='amsub', dplat(34)='n16', dsis(34)='amsub_n16', dval(34)=3.0, dthin(34)=3, dsfcalc(34)=0, - dfile(35)='amsubbufr', dtype(35)='amsub', dplat(35)='n17', dsis(35)='amsub_n17', dval(35)=3.0, dthin(35)=3, dsfcalc(35)=0, - dfile(36)='mhsbufr', dtype(36)='mhs', dplat(36)='n18', dsis(36)='mhs_n18', dval(36)=3.0, dthin(36)=3, dsfcalc(36)=0, - dfile(37)='mhsbufr', dtype(37)='mhs', dplat(37)='metop-a', dsis(37)='mhs_metop-a', dval(37)=3.0, dthin(37)=3, dsfcalc(37)=0, - dfile(38)='ssmitbufr', dtype(38)='ssmi', dplat(38)='f13', dsis(38)='ssmi_f13', dval(38)=0.0, dthin(38)=4, dsfcalc(38)=0, - dfile(39)='ssmitbufr', dtype(39)='ssmi', dplat(39)='f14', dsis(39)='ssmi_f14', dval(39)=0.0, dthin(39)=4, dsfcalc(39)=0, - dfile(40)='ssmitbufr', dtype(40)='ssmi', dplat(40)='f15', dsis(40)='ssmi_f15', dval(40)=0.0, dthin(40)=4, dsfcalc(40)=0, - dfile(41)='amsrebufr', dtype(41)='amsre_low', dplat(41)='aqua', dsis(41)='amsre_aqua', dval(41)=0.0, dthin(41)=4, dsfcalc(41)=0, - dfile(42)='amsrebufr', dtype(42)='amsre_mid', dplat(42)='aqua', dsis(42)='amsre_aqua', dval(42)=0.0, dthin(42)=4, dsfcalc(42)=0, - dfile(43)='amsrebufr', dtype(43)='amsre_hig', dplat(43)='aqua', dsis(43)='amsre_aqua', dval(43)=0.0, dthin(43)=4, dsfcalc(43)=0, - dfile(44)='ssmisbufr', dtype(44)='ssmis_las', dplat(44)='f16', dsis(44)='ssmis_f16', dval(44)=0.0, dthin(44)=4, dsfcalc(44)=0, - dfile(45)='ssmisbufr', dtype(45)='ssmis_uas', dplat(45)='f16', dsis(45)='ssmis_f16', dval(45)=0.0, dthin(45)=4, dsfcalc(45)=0, - dfile(46)='ssmisbufr', dtype(46)='ssmis_img', dplat(46)='f16', dsis(46)='ssmis_f16', dval(46)=0.0, dthin(46)=4, dsfcalc(46)=0, - dfile(47)='ssmisbufr', dtype(47)='ssmis_env', dplat(47)='f16', dsis(47)='ssmis_f16', dval(47)=0.0, dthin(47)=4, dsfcalc(47)=0, - dfile(48)='gsnd1bufr', dtype(48)='sndrd1', dplat(48)='g12', dsis(48)='sndrD1_g12', dval(48)=1.5, dthin(48)=5, dsfcalc(48)=0, - dfile(49)='gsnd1bufr', dtype(49)='sndrd2', dplat(49)='g12', dsis(49)='sndrD2_g12', dval(49)=1.5, dthin(49)=5, dsfcalc(49)=0, - dfile(50)='gsnd1bufr', dtype(50)='sndrd3', dplat(50)='g12', dsis(50)='sndrD3_g12', dval(50)=1.5, dthin(50)=5, dsfcalc(50)=0, - dfile(51)='gsnd1bufr', dtype(51)='sndrd4', dplat(51)='g12', dsis(51)='sndrD4_g12', dval(51)=1.5, dthin(51)=5, dsfcalc(51)=0, - dfile(52)='gsnd1bufr', dtype(52)='sndrd1', dplat(52)='g11', dsis(52)='sndrD1_g11', dval(52)=1.5, dthin(52)=5, dsfcalc(52)=0, - dfile(53)='gsnd1bufr', dtype(53)='sndrd2', dplat(53)='g11', dsis(53)='sndrD2_g11', dval(53)=1.5, dthin(53)=5, dsfcalc(53)=0, - dfile(54)='gsnd1bufr', dtype(54)='sndrd3', dplat(54)='g11', dsis(54)='sndrD3_g11', dval(54)=1.5, dthin(54)=5, dsfcalc(54)=0, - dfile(55)='gsnd1bufr', dtype(55)='sndrd4', dplat(55)='g11', dsis(55)='sndrD4_g11', dval(55)=1.5, dthin(55)=5, dsfcalc(55)=0, - dfile(56)='gsnd1bufr', dtype(56)='sndrd1', dplat(56)='g13', dsis(56)='sndrD1_g13', dval(56)=1.5, dthin(56)=5, dsfcalc(56)=0, - dfile(57)='gsnd1bufr', dtype(57)='sndrd2', dplat(57)='g13', dsis(57)='sndrD2_g13', dval(57)=1.5, dthin(57)=5, dsfcalc(57)=0, - dfile(58)='gsnd1bufr', dtype(58)='sndrd3', dplat(58)='g13', dsis(58)='sndrD3_g13', dval(58)=1.5, dthin(58)=5, dsfcalc(58)=0, - dfile(59)='gsnd1bufr', dtype(59)='sndrd4', dplat(59)='g13', dsis(59)='sndrD4_g13', dval(59)=1.5, dthin(59)=5, dsfcalc(59)=0, - dfile(60)='iasibufr', dtype(60)='iasi', dplat(60)='metop-a', dsis(60)='iasi_metop-a', dval(60)=20.0, dthin(60)=1, dsfcalc(60)=0, - dfile(61)='gomebufr', dtype(61)='gome', dplat(61)='metop-a', dsis(61)='gome_metop-a', dval(61)=1.0, dthin(61)=6, dsfcalc(61)=0, - dfile(62)='omibufr', dtype(62)='omi', dplat(62)='aura', dsis(62)='omi_aura', dval(62)=1.0, dthin(62)=6, dsfcalc(62)=0, - dfile(63)='sbuvbufr', dtype(63)='sbuv2', dplat(63)='n19', dsis(63)='sbuv8_n19', dval(63)=1.0, dthin(63)=0, dsfcalc(63)=0, - dfile(64)='hirs4bufr', dtype(64)='hirs4', dplat(64)='n19', dsis(64)='hirs4_n19', dval(64)=6.0, dthin(64)=1, dsfcalc(64)=0, - dfile(65)='amsuabufr', dtype(65)='amsua', dplat(65)='n19', dsis(65)='amsua_n19', dval(65)=10.0, dthin(65)=2, dsfcalc(65)=0, - dfile(66)='mhsbufr', dtype(66)='mhs', dplat(66)='n19', dsis(66)='mhs_n19', dval(66)=3.0, dthin(66)=3, dsfcalc(66)=0, - dfile(67)='tcvitl' dtype(67)='tcp', dplat(67)=' ', dsis(67)='tcp', dval(67)=1.0, dthin(67)=0, dsfcalc(67)=0, - $OBSINPUT - / - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - $LAGDATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=.false.,uv_hyb_ens=.false.,aniso_a_en=.false.,generate_ens=.false., - n_ens=0,beta1_inv=0.5,s_ens_h=750,s_ens_v=20,jcap_ens=${JCAP_EN}, - jcap_ens_test=190,nlon_ens=576,nlat_ens=288, - write_ens_sprd=.false., - $HYBRID_ENSEMBLE - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${CDATE}, - obhourset=0., - $SINGLEOB - / -EOF - -ls -l $PGM -echo "executing $PGM at `date`" -# Run global_gsi -eval $PGM < gsiparm.anl $REDOUT$PGMOUT $REDERR$PGMERR -rc=$? -echo "done executing $PGM at `date`" - -else -echo "some input files missing, exiting ..." -ls -l $GBIAS -ls -l $GSATANG -ls -l $SFCGES -ls -l $SFCG03 -ls -l $SFCG09 -ls -l $SIGGES -ls -l $SIGG03 -ls -l $SIGG09 -ls -l $SFCANL -exit 1 -fi - -export ERR=$? -export err=$ERR -#$ERRSCRIPT||exit 2 - -# Cat runtime output files. -cat fort.2* > $GSISTAT -cat fort.2* - - -# Loop over first and last outer loops to generate innovation -# diagnostic files for indicated observation types (groups) -# -# NOTE: Since we set miter=2 in GSI namelist SETUP, outer -# loop 03 will contain innovations with respect to -# the analysis. Creation of o-a innovation files -# is triggered by write_diag(3)=.true. The setting -# write_diag(1)=.true. turns on creation of o-g -# innovation files. -# - -if [[ "${charnanal}" = "ensmean" ]]; then - cd ${DATA} - tar -cvf obs_input.${CDATE}.tar obs_input* - ${NCP} obs_input.${CDATE}.tar ${COMOUT}/ -fi - -#loops="01 03" -loops="01" # only save fit to first-guess -pwd -#ls -l ${DATA} -for loop in $loops; do - -# Collect diagnostic files for obs types (groups) below - list="hirs2_n14 msu_n14 sndr_g08 sndr_g10 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g10_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g10 imgr_g12 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 omi_aura ssmi_f13 ssmi_f14 ssmi_f15 hirs4_n18 amsua_n18 mhs_n18 amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16 iasi_metop-a amsua_metop-a mhs_metop-a hirs4_metop-a" - for type in $list; do - #count=`ls ${DATA}/*${type}_${loop}* | wc -l` - count=`ls ${DATA}/dir.*/${type}_${loop}* | wc -l` - if [[ count -gt 0 ]]; then - #cat ${DATA}/${type}_${loop}.* > ${DATA}/diag_${type}_${loop}.${CDATE} - #cat ${DATA}/${type}_${loop}.* > ${COMOUT}/diag_${type}_ges.${CDATE}_${charnanal} - #cat ${DATA}/*${type}_${loop}* > diag_${type}.${CDATE} - cat ${DATA}/dir.*/${type}_${loop}* > ${DATA}/diag_${type}.${CDATE} - if [ $SAVEHX == ".true." ]; then - /bin/cp -f diag_${type}.${CDATE} ${COMOUT}/diag_${type}_ges.${CDATE}_${charnanal} - fi - #if [[ "$loop" = "01" ]]; then - # #mv ${DATA}/diag_${type}_${loop}.${CDATE} ${DATA}/diag_${type}_ges.${CDATE} - # mv ${DATA}/diag_${type}_${loop}.${CDATE} ${COMOUT}/diag_${type}_ges.${CDATE}_${charnanal} - #elif [[ "$loop" = "03" ]]; then - # mv ${DATA}/diag_${type}_${loop}.${CDATE} ${DATA}/diag_${type}_anl.${CDATE} - #else - # mv ${DATA}/diag_${type}_${loop}.${CDATE} ${DATA}/diag_${type}_${loop}.${CDATE} - #fi - fi - done -done -if [ $ONEOB_TEST == ".true." ]; then - echo "copy prepqc ..." - ls -l prepqc - /bin/mv -f prepqc ${COMOUT}/prepqc_oneob - ls -l ${COMOUT}/prepqc_oneob - exit 0 -fi -# stop here? -#if [ $SKIP_ANGUPDATE == ".true." ]; then -# #/bin/rm -rf $HOSTFILE -# exit 0 -#fi - -if [ -n "$CONVONLY" ]; then - exit 0 -fi - - -################################################################################ -# Update angle dependent bias -export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK" -export PGM=$ANGUPDATEXEC -export pgm=$PGM -$LOGSCRIPT - -iy=$(echo $CDATE|cut -c1-4) -im=$(echo $CDATE|cut -c5-6) -id=$(echo $CDATE|cut -c7-8) -ih=$(echo $CDATE|cut -c9-10) - -# local input files assumed to already exist are -# ./satbias_ang.in -# radiance diagnostic files - -if [[ -s satbias_ang.in ]]; then - cp ./satbias_angle ./satbias_ang.in -fi - -cat > global_angupdate.nml < enkf.nml - &nam_enkf - datestring="$adate",datapath="$tmpdir", - analpertwtnh=0.9,analpertwtsh=0.9,analpertwttr=0.9, - ntrac_update=2, - covinflatemax=1.e2,covinflatemin=1,pseudo_rh=.true., - corrlengthnh=1500,corrlengthsh=1500,corrlengthtr=1500, - obtimelnh=15,obtimelsh=15,obtimeltr=15,iassim_order=0, - lnsigcutoffnh=1.5,lnsigcutoffsh=1.5,lnsigcutofftr=1.5, - lnsigcutoffsatnh=3.3,lnsigcutoffsatsh=3.3,lnsigcutoffsattr=3.3, - lnsigcutoffpsnh=2.2,lnsigcutoffpssh=2.2,lnsigcutoffpstr=2.2, - saterrfact=1.0,numiter=3, - sprd_tol=1.e30,paoverpb_thresh=0.975, - npts=$npts,nlevs=$LEVS,nanals=$nanals,ntrac=$NTRAC,nvars=$nvars, - deterministic=.true.,sortinc=.true.,lupd_satbiasc=.false., - nlats=$LATA,nlons=$LONA, - / - &END - &satobs_enkf - sattypes_rad(1) = 'amsua_n15', dsis(1) = 'amsua_n15', - sattypes_rad(2) = 'amsua_n18', dsis(2) = 'amsua_n18', - sattypes_rad(3) = 'amsua_n19', dsis(3) = 'amsua_n19', - sattypes_rad(4) = 'amsub_n16', dsis(4) = 'amsub_n16', - sattypes_rad(5) = 'amsub_n17', dsis(5) = 'amsub_n17', - sattypes_rad(6) = 'amsua_aqua', dsis(6) = 'amsua_aqua', - sattypes_rad(7) = 'amsua_metop-a', dsis(7) = 'amsua_metop-a', - sattypes_rad(8) = 'airs_aqua', dsis(8) = 'airs_aqua', - sattypes_rad(9) = 'hirs3_n17', dsis(9) = 'hirs3_n17', - sattypes_rad(10)= 'hirs4_n19', dsis(10)= 'hirs4_n19', - sattypes_rad(11)= 'hirs4_metop-a', dsis(11)= 'hirs4_metop-a', - sattypes_rad(12)= 'mhs_n18', dsis(12)= 'mhs_n18', - sattypes_rad(13)= 'mhs_n19', dsis(13)= 'mhs_n19', - sattypes_rad(14)= 'mhs_metop-a', dsis(14)= 'mhs_metop-a', - sattypes_rad(15)= 'goes_img_g11', dsis(15)= 'imgr_g11', - sattypes_rad(16)= 'goes_img_g12', dsis(16)= 'imgr_g12', - sattypes_rad(17)= 'goes_img_g13', dsis(17)= 'imgr_g13', - sattypes_rad(18)= 'goes_img_g14', dsis(18)= 'imgr_g14', - sattypes_rad(19)= 'goes_img_g15', dsis(19)= 'imgr_g15', - sattypes_rad(20)= 'avhrr3_n16', dsis(20)= 'avhrr3_n16', - sattypes_rad(21)= 'avhrr3_n17', dsis(21)= 'avhrr3_n17', - sattypes_rad(22)= 'avhrr3_n18', dsis(22)= 'avhrr3_n18', - sattypes_rad(23)= 'amsre_aqua', dsis(23)= 'amsre_aqua', - sattypes_rad(24)= 'ssmis_f16', dsis(24)= 'ssmis_f16', - sattypes_rad(25)= 'ssmis_f17', dsis(25)= 'ssmis_f17', - sattypes_rad(26)= 'ssmis_f18', dsis(26)= 'ssmis_f18', - sattypes_rad(27)= 'ssmis_f19', dsis(27)= 'ssmis_f19', - sattypes_rad(28)= 'ssmis_f20', dsis(28)= 'ssmis_f20', - sattypes_rad(29)= 'sndrd1_g11', dsis(29)= 'sndrD1_g11', - sattypes_rad(30)= 'sndrd2_g11', dsis(30)= 'sndrD2_g11', - sattypes_rad(31)= 'sndrd3_g11', dsis(31)= 'sndrD3_g11', - sattypes_rad(32)= 'sndrd4_g11', dsis(32)= 'sndrD4_g12', - sattypes_rad(33)= 'sndrd1_g12', dsis(33)= 'sndrD1_g12', - sattypes_rad(34)= 'sndrd2_g12', dsis(34)= 'sndrD2_g12', - sattypes_rad(35)= 'sndrd3_g12', dsis(35)= 'sndrD3_g12', - sattypes_rad(36)= 'sndrd4_g12', dsis(36)= 'sndrD4_g12', - sattypes_rad(37)= 'sndrd1_g13', dsis(37)= 'sndrD1_g13', - sattypes_rad(38)= 'sndrd2_g13', dsis(38)= 'sndrD2_g13', - sattypes_rad(39)= 'sndrd3_g13', dsis(39)= 'sndrD3_g13', - sattypes_rad(40)= 'sndrd4_g13', dsis(40)= 'sndrD4_g13', - sattypes_rad(41)= 'sndrd1_g14', dsis(41)= 'sndrD1_g14', - sattypes_rad(42)= 'sndrd2_g14', dsis(42)= 'sndrD2_g14', - sattypes_rad(43)= 'sndrd3_g14', dsis(43)= 'sndrD3_g14', - sattypes_rad(44)= 'sndrd4_g14', dsis(44)= 'sndrD4_g14', - sattypes_rad(45)= 'sndrd1_g15', dsis(45)= 'sndrD1_g15', - sattypes_rad(46)= 'sndrd2_g15', dsis(46)= 'sndrD2_g15', - sattypes_rad(47)= 'sndrd3_g15', dsis(47)= 'sndrD3_g15', - sattypes_rad(48)= 'sndrd4_g15', dsis(48)= 'sndrD4_g15', - sattypes_rad(49)= 'iasi_metop-a', dsis(49)= 'iasi_metop-a', - sattypes_rad(50)= 'atms_npp', dsis(50)= 'atms_npp', - sattypes_rad(51)= 'atms_n20', dsis(51)= 'atms_n20', - sattypes_rad(52)= 'cris_npp', dsis(52)= 'cris_npp', - sattypes_rad(53)= 'cris-fsr_npp', dsis(53)= 'cris-fsr_npp', - sattypes_rad(54)= 'cris-fsr_n20', dsis(54)= 'cris-fsr_n20', - / - &END - &ozobs_enkf - sattypes_oz(1) = 'sbuv2_n16', - sattypes_oz(2) = 'sbuv2_n17', - sattypes_oz(3) = 'sbuv2_n18', - sattypes_oz(4) = 'sbuv2_n19', - sattypes_oz(5) = 'omi_aura', - sattypes_oz(6) = 'gome_metop-a', - / - &END -EOF - -cat enkf.nml - -$ncp $enkfexec ./enkf.x -$ncp $CONVINFO ./convinfo -$ncp $SATINFO ./satinfo -$ncp $OZINFO ./ozinfo -$ncp $dirobs/abias ./abias -$ncp $dirobs/satang ./satang - -ln -fs ./abias ./satbias_in -ln -fs ./satang ./satbias_angle -ln -fs $dirges/sfg* ./ -ln -fs $dirobs/diag* ./ - -poe hpmcount $tmpdir/enkf.x < enkf.nml > stdout - -##/global/save/wx23jd/enkf/work/src/getsigensmean.x $tmpdir/ sanl_2008080112_ensmean sanl_2008080112 60 anal - -##rm $tmpdir/diag* -##rm $tmpdir/sfg* - -exit - - diff --git a/ush/EnKF/runobs_multi.csh b/ush/EnKF/runobs_multi.csh deleted file mode 100755 index 6857be4731..0000000000 --- a/ush/EnKF/runobs_multi.csh +++ /dev/null @@ -1,151 +0,0 @@ -#!/bin/tcsh - -# import parameters -source /global/save/${LOGNAME}/enkf/work/scripts/ncep/current.enkfparms - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -# current analysis time. -setenv analdate $analdate - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` - -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -setenv DIAGCONV .true. -setenv HXONLY .true. -setenv SAVEHX .true. - -setenv datapath2 "${datapath}/${analdate}/" - -set nanal=$NSTART -@ nanalsp1 = $nanals + 1 -echo "nanalsp1=",$nanalsp1 - -while ($nanal <= $NEND) - -if ($nanal == $nanalsp1) then - setenv charnanal "ensmean" -else - setenv charnanal "mem"`printf %03i $nanal` -endif - -setenv SFCG03a ${datapath2}/bfg_${analdate}_fhr03_${charnanal} -setenv SFCG04a ${datapath2}/bfg_${analdate}_fhr04_${charnanal} -setenv SFCG05a ${datapath2}/bfg_${analdate}_fhr05_${charnanal} -setenv SFCG06a ${datapath2}/bfg_${analdate}_fhr06_${charnanal} -setenv SFCG07a ${datapath2}/bfg_${analdate}_fhr07_${charnanal} -setenv SFCG08a ${datapath2}/bfg_${analdate}_fhr08_${charnanal} -setenv SFCG09a ${datapath2}/bfg_${analdate}_fhr09_${charnanal} -setenv SFCG03 ${datapath2}/bfg_${analdate}_fhr03_${charnanal} -setenv SFCG04 ${datapath2}/bfg_${analdate}_fhr04_${charnanal} -setenv SFCG05 ${datapath2}/bfg_${analdate}_fhr05_${charnanal} -setenv SFCG06 ${datapath2}/bfg_${analdate}_fhr06_${charnanal} -setenv SFCG07 ${datapath2}/bfg_${analdate}_fhr07_${charnanal} -setenv SFCG08 ${datapath2}/bfg_${analdate}_fhr08_${charnanal} -setenv SFCG09 ${datapath2}/bfg_${analdate}_fhr09_${charnanal} -setenv SFCGES $SFCG06a -setenv SFCANL ${datapath2}/sfcanl_${analdate}_${charnanal} -# use ensemble mean surface files for forward operator -# (since ob thinning routines use surface information, won't -# get same obs for each ensemble member if different surface -# files specified for each member). -setenv SFCG03Ma ${datapath2}/bfg_${analdate}_fhr03_ensmean -setenv SFCG04Ma ${datapath2}/bfg_${analdate}_fhr04_ensmean -setenv SFCG05Ma ${datapath2}/bfg_${analdate}_fhr05_ensmean -setenv SFCG06Ma ${datapath2}/bfg_${analdate}_fhr05_ensmean -setenv SFCG07Ma ${datapath2}/bfg_${analdate}_fhr07_ensmean -setenv SFCG08Ma ${datapath2}/bfg_${analdate}_fhr08_ensmean -setenv SFCG09Ma ${datapath2}/bfg_${analdate}_fhr09_ensmean -setenv SFCG03M ${datapath2}/bfg_${analdate}_fhr03_ensmean -setenv SFCG04M ${datapath2}/bfg_${analdate}_fhr04_ensmean -setenv SFCG05M ${datapath2}/bfg_${analdate}_fhr05_ensmean -setenv SFCG06M ${datapath2}/bfg_${analdate}_fhr06_ensmean -setenv SFCG07M ${datapath2}/bfg_${analdate}_fhr07_ensmean -setenv SFCG08M ${datapath2}/bfg_${analdate}_fhr08_ensmean -setenv SFCG09M ${datapath2}/bfg_${analdate}_fhr09_ensmean -setenv SFCGESM $SFCG06Ma - - -# just use ensemble mean surface file for all members -setenv SIGG03 ${datapath2}/sfg_${analdate}_fhr03_${charnanal} -setenv SIGG04 ${datapath2}/sfg_${analdate}_fhr04_${charnanal} -setenv SIGG05 ${datapath2}/sfg_${analdate}_fhr05_${charnanal} -setenv SIGGES ${datapath2}/sfg_${analdate}_fhr06_${charnanal} -setenv SIGG07 ${datapath2}/sfg_${analdate}_fhr07_${charnanal} -setenv SIGG08 ${datapath2}/sfg_${analdate}_fhr08_${charnanal} -setenv SIGG09 ${datapath2}/sfg_${analdate}_fhr09_${charnanal} - -##setenv GBIAS ${datapath}/${analdatem1}/abias -setenv GSATANG ${datapath}/${analdatem1}/satang - -# obs bufr files to use in assimilation. -setenv PREINP "${RUN}.t${hr}z." -setenv PREINP1 "${RUN}.t${hrp1}z." -setenv COMIN "${obs_datapath}/${analdate}/${datdump}" -setenv COMINGES "/global/noscrub/${LOGNAME}/bias_prd09q1o" -setenv GPSBF "${COMIN}/gpsro.${datdump}.${analdate}" -setenv PREPQC "${PREPDATA}/prepqc.${datdump}.${analdate}" -setenv TCVIT "${COMIN}/tcvitl.${datdump}.${analdate}" -setenv B1AMUA "${COMIN}/1bamua.${datdump}.${analdate}" -setenv B1AMUB "${COMIN}/1bamub.${datdump}.${analdate}" -setenv FNTSFA "${COMIN}/sstgrb.${datdump}.${analdate}" -setenv FNACNA "${COMIN}/icegrb.${datdump}.${analdate}" -setenv FNSNOA "${COMIN}/snogrb.${datdump}.${analdate}" -setenv SSMITBF "${COMIN}/ssmit.${datdump}.${analdate}" -setenv SBUVBF "${COMIN}/osbuv8.${datdump}.${analdate}" -setenv AIRSBF "${COMIN}/airsev.${datdump}.${analdate}" -setenv IASIBF "${COMIN}/mtiasi.${datdump}.${analdate}" -setenv B1HRS3 "${COMIN}/1bhrs3.${datdump}.${analdate}" -setenv B1HRS4 "${COMIN}/1bhrs4.${datdump}.${analdate}" -setenv AMSREBF "${COMIN}/amsre.${datdump}.${analdate}" -setenv B1MHS "${COMIN}/1bmhs.${datdump}.${analdate}" -setenv GSNDBF1 "${COMIN}/goesfv.${datdump}.${analdate}" -setenv ABIAS "${COMINGES}/biascr.${datdump}.${analdate}" -setenv GBIAS "${COMINGES}/biascr.${datdump}.${analdate}" - -# check to see if output files already created. -set obsfiles = "${datapath2}/diag_conv_ges.${analdate}_${charnanal} ${datapath2}/sfcanl_${analdate}_${charnanal}" -set filemissing='no' -echo $obsfiles -foreach obsfile ($obsfiles) - if { /bin/test ! -s $obsfile } set filemissing='yes' -end -if ($filemissing == 'yes') then - echo "nanal = ${nanal}" - setenv PGMOUT ${current_logdir}/run_cycle_${charnanal}.out - time sh ${enkfscripts}/drive_gsi >&! ${current_logdir}/run_obs_${charnanal}.out -else - echo "skipping nanal = ${nanal}, output files already created" -endif - -@ nanal = $nanal + 1 -end -echo "waiting at nanal = ${nanal} `date`" -wait -echo "all done `date`" - -if ($charnanal == 'ensmean') then - echo "now that ensmean done, submit ensemble member obs processing" - /bin/tcsh ${enkfscripts}/obsproc_multi.sh -endif - -exit 0 diff --git a/ush/EnKF/sub_gfsctrlhigh.sh b/ush/EnKF/sub_gfsctrlhigh.sh deleted file mode 100755 index 5e59187864..0000000000 --- a/ush/EnKF/sub_gfsctrlhigh.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/tcsh - -source /global/save/${LOGNAME}/enkf/work/scripts_ncep/current.enkfparms - -########################################################################## -# current cycle starts - -set username = `whoami` - -setenv startupenv "${datapath}/analdate.csh" -source $startupenv - -setenv SUB "/u/wx23sm/bin/sub_vapor" -echo "SUB= ${SUB}" -#------------------------------------------------------------------------ -mkdir -p $datapath -mkdir -p $logdir - -echo "BaseDir: ${basedir}" -echo "EnKFBin: ${enkfbin}" -echo "DataPath: ${datapath}" -echo "LogDir: ${logdir}" - -############################################################################ -# Main Program -# Please do not edit the code below; it is not recommended except lines relevant to getsfcensmean.csh. - -env -echo "starting the cycle" - -set ncycles=10 -set ncycle=1 -##while ($ncycle <= $ncycles) -echo "ncycle = " $ncycle "and ncycles = " $ncycles - -# substringing to get yr, mon, day, hr info -setenv yr `echo $analdate | cut -c1-4` -setenv mon `echo $analdate | cut -c5-6` -setenv day `echo $analdate | cut -c7-8` -setenv hr `echo $analdate | cut -c9-10` -setenv ANALHR $hr -# set environment analdate -setenv datapath2 "${datapath}/${analdate}/" -# copy hostfileall to working dir. -##/bin/cp -f ${datapath}/hostfileall ${datapath2} - -# current analysis time. -setenv analdate $analdate -# previous analysis time. -setenv analdatem1 `${incdate} $analdate -$ANALINC` -# next analysis time. -setenv analdatep1 `${incdate} $analdate $ANALINC` -setenv datapathprev "${datapath}/${analdatem1}/" -setenv hrp1 `echo $analdatep1 | cut -c9-10` -setenv hrm1 `echo $analdatem1 | cut -c9-10` -setenv datapathp1 "${datapath}/${analdatep1}/" -setenv datapathm1 "${datapath}/${analdatem1}/" -mkdir -p $datapathp1 - -date -echo "analdate minus 1: $analdatem1" -echo "analdate: $analdate" -echo "analdate plus 1: $analdatep1" - -# make log dir for analdate -setenv current_logdir "${logdir}/ensda_out_${analdate}" -echo "Current LogDir: ${current_logdir}" -mkdir -p ${current_logdir} - -mkdir -p ${datapath}${analdatep1} - -echo "SUBMIT HI-RES GFS CNTRL" -$SUB -a GDAS-T2O -g devonprod -j enkf_a5_gfsctrl -o ${current_logdir}/run_gfsctrl.out -p 64/6/N -q dev -r 1640/1 -t 00:35:00 -u ${LOGNAME} -w +0000 ${enkfscripts}/${ctrl_gfs} - -exit 0 diff --git a/ush/EnKF/test.py b/ush/EnKF/test.py deleted file mode 100755 index 537b107d2d..0000000000 --- a/ush/EnKF/test.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys -import random -n1 = int(sys.argv[1]) -nens = int(sys.argv[2]) -array = random.sample(xrange(n1), nens) -for a1 in array: - print '%s' % (a1) diff --git a/ush/EnKF/test_gdas_enkf_fcst.sh b/ush/EnKF/test_gdas_enkf_fcst.sh deleted file mode 100755 index 60307bf185..0000000000 --- a/ush/EnKF/test_gdas_enkf_fcst.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_enkf_fcst.o%J -#BSUB -e gdas_enkf_fcst.o%J -#BSUB -J gdas_enkf_fcst -#BSUB -n 96 -#BSUB -x -#BSUB -R span[ptile=6] -#BSUB -R affinity[core(4)] -#BSUB -W 02:00 -#BSUB -q devmax2 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export CDATE=2016030212 -export ENSGRP=1 - -export grp=$ENSGRP -if [[ $grp -lt 10 ]]; then - export grp=0$grp -fi - - -############################################################# -# Specify whether the run is production or development -############################################################# -export RUN_ENVIR=para -export PDY=`echo $CDATE | cut -c1-8` -export cyc=`echo $CDATE | cut -c9-10` -export job=gdas_enkf_innovate_obs_grp${grp}_${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=/stmpd3/$LOGNAME/test -export COMROOT=/ptmpd3/$LOGNAME/com - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v13.0.0 -export global_shared_ver=v13.0.0 -export grib_util_ver=v1.0.1 -export prod_util_ver=v1.0.2 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/modulefiles -module load grib_util/$grib_util_ver -module load prod_util/$prod_util_ver - -module unload ics/12.1 -module load ics/14.0.1 - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export MP_EAGER_LIMIT=65536 -export MP_COREFILE_FORMAT=lite -export MP_EUIDEVELOP=min -export MP_EUIDEVICE=sn_all -export MP_EUILIB=us -export MP_MPILIB=mpich2 -export MP_LABELIO=yes -export MP_USE_BULK_XFER=no -export MP_SHARED_MEMORY=yes -export KMP_STACKSIZE=2048m -export NTHREADS_EFCS=${NTHREADS_EFCS:-4} - - -############################################################# -# Set user specific variables -############################################################# -export NWTEST=/global/save/$LOGNAME/svn/gfs/branches -export PARA_CONFIG=$NWTEST/gdas.${gdas_ver}/driver/para_config.gdas_enkf_fcst -export JOBGLOBAL=$NWTEST/gdas.${gdas_ver}/jobs - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_ENKF_FCST - -exit diff --git a/ush/EnKF/test_gdas_enkf_inflate_recenter.sh b/ush/EnKF/test_gdas_enkf_inflate_recenter.sh deleted file mode 100755 index 74194b542a..0000000000 --- a/ush/EnKF/test_gdas_enkf_inflate_recenter.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_enkf_inflate_recenter.o%J -#BSUB -e gdas_enkf_inflate_recenter.o%J -#BSUB -J gdas_enkf_inflate_recenter -#BSUB -q devmax2 -#BSUB -n 80 -#BSUB -R span[ptile=24] -#BSUB -R affinity[core] -#BSUB -x -#BSUB -W 01:00 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export CDATE=2016030212 - -############################################################# -# Specify whether the run is production or development -############################################################# -export RUN_ENVIR=para -export PDY=`echo $CDATE | cut -c1-8` -export cyc=`echo $CDATE | cut -c9-10` -export job=gdas_enkf_inflate_recenter_${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=/stmpd3/$LOGNAME/test -export COMROOT=/ptmpd3/$LOGNAME/com - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v13.0.0 -export global_shared_ver=v13.0.0 -export grib_util_ver=v1.0.1 -export prod_util_ver=v1.0.2 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/lib/modulefiles -module load grib_util/$grib_util_ver -module load prod_util/$prod_util_ver - -module unload ics/12.1 -module load ics/15.0.3 - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export MP_EAGER_LIMIT=65536 -export MP_COREFILE_FORMAT=lite -export MP_EUIDEVELOP=min -export MP_EUIDEVICE=sn_all -export MP_EUILIB=us -export MP_MPILIB=mpich2 -export MP_LABELIO=yes -export MP_USE_BULK_XFER=no -export CHGRESTHREAD=24 -export KMP_STACKSIZE=2048m -export MPICH_ALLTOALL_THROTTLE=0 - - -############################################################# -# Set user specific variables -############################################################# -export NWTEST=/global/save/$LOGNAME/svn/gfs/branches -export PARA_CONFIG=$NWTEST/gdas.${gdas_ver}/driver/para_config.gdas_enkf_inflate_recenter -export JOBGLOBAL=$NWTEST/gdas.${gdas_ver}/jobs - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_ENKF_INFLATE_RECENTER - -exit diff --git a/ush/EnKF/test_gdas_enkf_innovate_obs.sh b/ush/EnKF/test_gdas_enkf_innovate_obs.sh deleted file mode 100755 index 657075bd37..0000000000 --- a/ush/EnKF/test_gdas_enkf_innovate_obs.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_enkf_innovate_obs.o%J -#BSUB -e gdas_enkf_innovate_obs.o%J -#BSUB -J gdas_enkf_innovate_obs -#BSUB -n 144 -#BSUB -x -#BSUB -R span[ptile=12] -#BSUB -R affinity[core(2)] -#BSUB -W 02:30 -#BSUB -q devmax2 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export CDATE=2016030212 -export ENSGRP=1 - -export grp=$ENSGRP -if [[ $grp -lt 10 ]]; then - export grp=0$grp -fi - - -############################################################# -# Specify whether the run is production or development -############################################################# -export RUN_ENVIR=para -export PDY=`echo $CDATE | cut -c1-8` -export cyc=`echo $CDATE | cut -c9-10` -export job=gdas_enkf_innovate_obs_grp${grp}_${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=/stmpd3/$LOGNAME/test -export COMROOT=/ptmpd3/$LOGNAME/com - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v13.0.0 -export global_shared_ver=v13.0.0 -export crtm_ver=v2.2.3 -export grib_util_ver=v1.0.1 -export prod_util_ver=v1.0.2 -export util_shared_ver=v1.0.2 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/lib/modulefiles -module load crtm/${crtm_ver} - -module use /nwprod2/modulefiles -module load grib_util/$grib_util_ver -module load prod_util/$prod_util_ver -module load util_shared/$util_shared_ver - -module unload ics/12.1 -module load ics/15.0.3 - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export MP_EAGER_LIMIT=65536 -export MP_LABELIO=yes -export MP_USE_BULK_XFER=yes -export MP_SINGLE_THREAD=yes -export MP_MPILIB=mpich2 -export MP_SHARED_MEMORY=yes -export MP_USE_TOKEN_FLOW_CONTROL=yes -export FORT_BUFFERED=true -export KMP_STACKSIZE=2048m -export MPICH_ALLTOALL_THROTTLE=0 - -export OMP_NUM_THREADS_CY=24 -export NTHREADS=$OMP_NUM_THREADS_CY -export NTHREADS_GSI=2 -export NTHSTACK=1024000000 - - -############################################################# -# Set user specific variables -############################################################# -export NWTEST=/global/save/$LOGNAME/svn/gfs/branches -export PARA_CONFIG=$NWTEST/gdas.${gdas_ver}/driver/para_config.gdas_enkf_innovate_obs -export JOBGLOBAL=$NWTEST/gdas.${gdas_ver}/jobs - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_ENKF_INNOVATE_OBS - -exit diff --git a/ush/EnKF/test_gdas_enkf_post.sh b/ush/EnKF/test_gdas_enkf_post.sh deleted file mode 100755 index f5fc08ea9b..0000000000 --- a/ush/EnKF/test_gdas_enkf_post.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_enkf_post.o%J -#BSUB -e gdas_enkf_post.o%J -#BSUB -J gdas_enkf_post -#BSUB -q devmax2 -#BSUB -n 81 -#BSUB -R span[ptile=24] -#BSUB -R affinity[core] -#BSUB -x -#BSUB -W 01:00 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export CDATE=2016030212 - -############################################################# -# Specify whether the run is production or development -############################################################# -export RUN_ENVIR=para -export PDY=`echo $CDATE | cut -c1-8` -export cyc=`echo $CDATE | cut -c9-10` -export job=gdas_enkf_post_${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=/stmpd3/$LOGNAME/test -export COMROOT=/ptmpd3/$LOGNAME/com - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v13.0.0 -export global_shared_ver=v13.0.0 -export grib_util_ver=v1.0.1 -export prod_util_ver=v1.0.2 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/modulefiles -module load grib_util/$grib_util_ver -module load prod_util/$prod_util_ver - -module unload ics/12.1 -module load ics/15.0.3 - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export MP_LABELIO=yes -export MP_STDOUTMODE=ordered -export MP_PGMMODEL=mpmd -export POE=YES -export OMP_NUM_THREADS=1 -export CHGRESTHREAD=24 - - -############################################################# -# Set user specific variables -############################################################# -export NWTEST=/global/save/$LOGNAME/svn/gfs/branches -export PARA_CONFIG=$NWTEST/gdas.${gdas_ver}/driver/para_config.gdas_enkf_post -export JOBGLOBAL=$NWTEST/gdas.${gdas_ver}/jobs - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_ENKF_POST - -exit diff --git a/ush/EnKF/test_gdas_enkf_select_obs.sh b/ush/EnKF/test_gdas_enkf_select_obs.sh deleted file mode 100755 index 70dc082d56..0000000000 --- a/ush/EnKF/test_gdas_enkf_select_obs.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_enkf_select_obs.o%J -#BSUB -e gdas_enkf_select_obs.o%J -#BSUB -J gdas_enkf_select_obs -#BSUB -n 144 -#BSUB -x -#BSUB -R span[ptile=12] -#BSUB -R affinity[core(2)] -#BSUB -W 00:30 -#BSUB -q devmax2 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export CDATE=2016030212 - -############################################################# -# Specify whether the run is production or development -############################################################# -export RUN_ENVIR=para -export PDY=`echo $CDATE | cut -c1-8` -export cyc=`echo $CDATE | cut -c9-10` -export job=gdas_enkf_select_obs_${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=/stmpd3/$LOGNAME/test -export COMROOT=/ptmpd3/$LOGNAME/com - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v13.0.0 -export global_shared_ver=v13.0.0 - -export crtm_ver=v2.2.3 -export grib_util_ver=v1.0.1 -export prod_util_ver=v1.0.2 -export util_shared_ver=v1.0.2 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/lib/modulefiles -module load crtm/${crtm_ver} - -module use /nwprod2/modulefiles -module load grib_util/$grib_util_ver -module load prod_util/$prod_util_ver -module load util_shared/$util_shared_ver - -module unload ics/12.1 -module load ics/15.0.3 - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export MP_EAGER_LIMIT=65536 -export MP_LABELIO=yes -export MP_USE_BULK_XFER=yes -export MP_SINGLE_THREAD=yes -export MP_MPILIB=mpich2 -export MP_SHARED_MEMORY=yes -export MP_USE_TOKEN_FLOW_CONTROL=yes -export FORT_BUFFERED=true -export KMP_STACKSIZE=2048m -export MPICH_ALLTOALL_THROTTLE=0 - -export OMP_NUM_THREADS_CY=24 -export NTHREADS=$OMP_NUM_THREADS_CY -export NTHREADS_GSI=2 -export NTHSTACK=1024000000 - - -############################################################# -# Set user specific variables -############################################################# -export NWTEST=/global/save/$LOGNAME/svn/gfs/branches -export PARA_CONFIG=$NWTEST/gdas.${gdas_ver}/driver/para_config.gdas_enkf_select_obs -export JOBGLOBAL=$NWTEST/gdas.${gdas_ver}/jobs - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_ENKF_SELECT_OBS - -exit diff --git a/ush/EnKF/test_gdas_enkf_update.sh b/ush/EnKF/test_gdas_enkf_update.sh deleted file mode 100755 index a3ee47fe59..0000000000 --- a/ush/EnKF/test_gdas_enkf_update.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/ksh - -#BSUB -o gdas_enkf_update.o%J -#BSUB -e gdas_enkf_update.o%J -#BSUB -J gdas_enkf_update -#BSUB -n 240 -#BSUB -x -#BSUB -R span[ptile=6] -#BSUB -R affinity[core(4)] -#BSUB -W 01:00 -#BSUB -q devmax2 -#BSUB -a poe -#BSUB -P GFS-T2O - -set -x - -export CDATE=2016030212 - -############################################################# -# Specify whether the run is production or development -############################################################# -export RUN_ENVIR=para -export PDY=`echo $CDATE | cut -c1-8` -export cyc=`echo $CDATE | cut -c9-10` -export job=gdas_enkf_update_${cyc} -export pid=${pid:-$$} -export jobid=${job}.${pid} -export envir=para -export DATAROOT=/stmpd3/$LOGNAME/test -export COMROOT=/ptmpd3/$LOGNAME/com - - -############################################################# -# Specify versions -############################################################# -export gdas_ver=v13.0.0 -export global_shared_ver=v13.0.0 -export grib_util_ver=v1.0.1 -export prod_util_ver=v1.0.2 -export util_shared_ver=v1.0.2 - - -############################################################# -# Load modules -############################################################# -. /usrx/local/Modules/3.2.9/init/ksh -module use /nwprod2/modulefiles -module load grib_util/$grib_util_ver -module load prod_util/$prod_util_ver -module load util_shared/$util_shared_ver - -module unload ics/12.1 -module load ics/15.0.3 - -module list - - -############################################################# -# WCOSS environment settings -############################################################# -export MP_EAGER_LIMIT=65536 -export MP_EUIDEVELOP=min -export MP_MPILIB=mpich2 -export MP_LABELIO=yes -export MP_USE_BULK_XFER=yes -export MP_SHARED_MEMORY=yes -export MP_SINGLE_THREAD=yes -export MPICH_ALLTOALL_THROTTLE=0 -export KMP_STACKSIZE=2048m - -export NTHREADS_ENKF=4 - - -############################################################# -# Set user specific variables -############################################################# -export NWTEST=/global/save/$LOGNAME/svn/gfs/branches -export PARA_CONFIG=$NWTEST/gdas.${gdas_ver}/driver/para_config.gdas_enkf_update -export JOBGLOBAL=$NWTEST/gdas.${gdas_ver}/jobs - - -############################################################# -# Execute job -############################################################# -$JOBGLOBAL/JGDAS_ENKF_UPDATE - -exit diff --git a/ush/EnKF/verifec.py b/ush/EnKF/verifec.py deleted file mode 100644 index 273df614c2..0000000000 --- a/ush/EnKF/verifec.py +++ /dev/null @@ -1,238 +0,0 @@ -from PyNIO import nio -from spharm import Spharmt, regrid -import numpy as np -from dateutils import dateshift, daterange -import sys, os - -datapath1 = '/lfs0/tmp/whitaker/ensda/ensrf_test2' -runname1 = 'enkf' -datapath2 = '/lfs0/tmp/whitaker/ncepgfs/gsi_test' -runname2 = 'gdas1' -#datapath2 = '/lfs0/tmp/whitaker/ensda/ensrf_test' -#runname2 = 'enkf' - -date1 = sys.argv[1] -date2 = sys.argv[2] -fhr = sys.argv[3] -varshort = sys.argv[4] - -print datapath1 -print datapath2 -print 'fhr = ',fhr - -def getmean(diff,coslats): - meancoslats = coslats.mean() - diffvar = (coslats*diff).mean() - return diffvar/meancoslats - -def getcorr(f,a): - f = f - f.mean(axis=0) - a = a - a.mean(axis=0) - covfa = (f*a).mean(axis=0) - varf = (f**2).mean(axis=0) - vara = (a**2).mean(axis=0) - return covfa/(np.sqrt(varf)*np.sqrt(vara)) - -def getmse(f,a): - return ((f-a)**2).mean(axis=0) - -nlonsin = 800; nlatsin = 400 -nlons = 360; nlats = 181 -ntrunc = 20 -latbound = 20. - -sin = Spharmt(nlonsin,nlatsin) -sout = Spharmt(nlons,nlats) - -delta = 360./nlons -lats = 90.-delta*np.arange(nlats) -coslats = np.cos((np.pi/180.)*lats) -coslats = coslats[:,np.newaxis]*np.ones((nlats,nlons)) -latnh = lats.tolist().index(latbound) -latsh = lats.tolist().index(-latbound) -coslatsnh = coslats[0:latnh+1,:] -coslatssh = coslats[latsh:,:] -coslatstr = coslats[latnh:latsh+1,:] -lons = delta*np.arange(nlons) -lons, lats = np.meshgrid(lons,lats[::-1]) - -filename = varshort -if varshort == 'hgt': - varname = 'HGT_3_ISBL_10' - ecvarname = 'gh_P0_L100_GGA0' -elif varshort == 'mslp': - varname = 'PRMSL_3_MSL_10' - ecvarname = 'msl_P0_L101_GGA0' -elif varshort == 'temp': - varname = 'TMP_3_ISBL_10' - ecvarname = 't_P0_L100_GGA0' -elif varshort == 'uwnd': - varname = 'U_GRD_3_ISBL_10' - ecvarname = 'u_P0_L100_GGA0' - filename = 'uv' -elif varshort == 'vwnd': - varname = 'V_GRD_3_ISBL_10' - ecvarname = 'v_P0_L100_GGA0' - filename = 'uv' -elif varshort in ['chi','psi']: - filename = 'uv' - varnamev = 'V_GRD_3_ISBL_10' - varnameu = 'U_GRD_3_ISBL_10' - ecvarnamev = 'v_P0_L100_GGA0' - ecvarnameu = 'u_P0_L100_GGA0' -else: - print 'unknown variable',varshort - raise SystemExit - -if filename in ['mslp']: - levels = [None] -elif filename == 'hgt': - levels = [1000,925,850,700,500,300,250,200,50] -else: - levels = [1000,925,850,700,500,300,250,200] - -for level in levels: - ecfilename = filename+'.grib' - f = nio.open_file('/p72/reanl/whitaker/'+ecfilename) - lonsin = f.variables['lon_0'][:] - latsin = f.variables['lat_0'][:] - datesin = f.variables['initial_time0'][:] - dates = [] - for date in datesin: - d = date.split('/') - mm = d[0]; dd = d[1]; yyyy = d[2][0:4] - hh = (d[2].split('(')[1]).split(':')[0] - dates.append(yyyy+mm+dd+hh) - if varshort not in ['psi','chi']: - varin = f.variables[ecvarname] - else: - varinu = f.variables[ecvarnameu] - varinv = f.variables[ecvarnamev] - datefcsts = daterange(date1,date2,12) - fcsts_2 = np.zeros((len(datefcsts),nlats,nlons),np.float32) - fcsts_1 = np.zeros((len(datefcsts),nlats,nlons),np.float32) - anals = np.zeros((len(datefcsts),nlats,nlons),np.float32) - if levels[0] is not None: - eclevels = (0.01*f.variables['lv_ISBL0'][:]).tolist() - nlevec = eclevels.index(level) - for ntime,date in enumerate(datefcsts): - dateverif = dateshift(date,int(fhr)) - nt = dates.index(dateverif) - if varshort in ['chi','psi']: - if fhr=='0': - grbfile_1 =\ - os.path.join(os.path.join(datapath1,date),runname1+'.t'+date[8:10]+'z.pgrbanl') - grbfile_2 =\ - os.path.join(os.path.join(datapath2,date),runname2+'.t'+date[8:10]+'z.pgrbanl') - else: - grbfile_1 =\ - os.path.join(os.path.join(datapath1,date),runname1+'.t'+date[8:10]+'z.pgrbf'+fhr) - grbfile_2 =\ - os.path.join(os.path.join(datapath2,date),runname2+'.t'+date[8:10]+'z.pgrbf'+fhr) - f2 = nio.open_file(grbfile_2+'.grib') - levels = f2.variables['lv_ISBL3'][:].tolist() - nlev = levels.index(level) - dat2u = f2.variables[varnameu][nlev] - dat2v = f2.variables[varnamev][nlev] - f2.close() - f1 = nio.open_file(grbfile_1+'.grib') - levels = f1.variables['lv_ISBL3'][:].tolist() - nlev = levels.index(level) - dat1u = f1.variables[varnameu][nlev] - dat1v = f1.variables[varnamev][nlev] - f1.close() - datainu = varinu[nt,nlevec,:,:] - datainv = varinv[nt,nlevec,:,:] - datverifu = regrid(sin,sout,datainu,ntrunc=ntrunc) - datverifv = regrid(sin,sout,datainv,ntrunc=ntrunc) - if varshort == 'psi': - datverif,chi =\ - sout.getpsichi(datverifu,datverifv,ntrunc=ntrunc) - dat2,chi = sout.getpsichi(dat2u,dat2v,ntrunc=ntrunc) - dat1,chi = sout.getpsichi(dat1u,dat1v,ntrunc=ntrunc) - else: - psi,datverif = sout.getpsichi(datverifu,datverifv,ntrunc=ntrunc) - psi,dat2 = sout.getpsichi(dat2u,dat2v,ntrunc=ntrunc) - psi,dat1 = sout.getpsichi(dat1u,dat1v,ntrunc=ntrunc) - else: - if fhr=='0': - grbfile_1 =\ - os.path.join(os.path.join(datapath1,date),runname1+'.t'+date[8:10]+'z.pgrbanl') - grbfile_2 =\ - os.path.join(os.path.join(datapath2,date),runname2+'.t'+date[8:10]+'z.pgrbanl') - else: - grbfile_1 =\ - os.path.join(os.path.join(datapath1,date),runname1+'.t'+date[8:10]+'z.pgrbf'+fhr) - grbfile_2 =\ - os.path.join(os.path.join(datapath2,date),runname2+'.t'+date[8:10]+'z.pgrbf'+fhr) - f2 = nio.open_file(grbfile_2+'.grib') - levels = f2.variables['lv_ISBL3'][:].tolist() - if level is not None: - nlev = levels.index(level) - dat2 = f2.variables[varname][nlev] - else: - dat2 = f2.variables[varname][:] - if ntrunc is not None: - dat2spec = sout.grdtospec(dat2,ntrunc=ntrunc) - dat2 = sout.spectogrd(dat2spec) - f2.close() - f1 = nio.open_file(grbfile_1+'.grib') - if level is not None: - levels = f1.variables['lv_ISBL3'][:].tolist() - nlev = levels.index(level) - dat1 = f1.variables[varname][nlev] - else: - dat1 = f1.variables[varname][:] - if ntrunc is not None: - dat1spec = sout.grdtospec(dat1,ntrunc=ntrunc) - dat1 = sout.spectogrd(dat1spec) - f1.close() - if level is not None: - datain = varin[nt,nlevec,:,:] - else: - datain = varin[nt,:,:] - datverif = regrid(sin,sout,datain,ntrunc=ntrunc) - fcsts_2[ntime] = dat2 - fcsts_1[ntime] = dat1 - anals[ntime] = datverif - corr_2 = getcorr(fcsts_2,anals) - corr_1 = getcorr(fcsts_1,anals) - corrnh = corr_2[0:latnh+1,:] - corrsh = corr_2[latsh:,:] - corrtr = corr_2[latnh:latsh+1,:] - corrg_2 = getmean(corr_2,coslats) - corrnh_2 = getmean(corrnh,coslatsnh) - corrsh_2 = getmean(corrsh,coslatssh) - corrtr_2 = getmean(corrtr,coslatstr) - corrnh = corr_1[0:latnh+1,:] - corrsh = corr_1[latsh:,:] - corrtr = corr_1[latnh:latsh+1,:] - corrg_1 = getmean(corr_1,coslats) - corrnh_1 = getmean(corrnh,coslatsnh) - corrsh_1 = getmean(corrsh,coslatssh) - corrtr_1 = getmean(corrtr,coslatstr) - mse_2 = getmse(fcsts_2,anals) - mse_1 = getmse(fcsts_1,anals) - if varshort in ['psi','chi']: - mse_2 = mse_2/1.e10 - mse_1 = mse_1/1.e10 - msenh = mse_2[0:latnh+1,:] - msesh = mse_2[latsh:,:] - msetr = mse_2[latnh:latsh+1,:] - mseg_2 = np.sqrt(getmean(mse_2,coslats)) - msenh_2 = np.sqrt(getmean(msenh,coslatsnh)) - msesh_2 = np.sqrt(getmean(msesh,coslatssh)) - msetr_2 = np.sqrt(getmean(msetr,coslatstr)) - msenh = mse_1[0:latnh+1,:] - msesh = mse_1[latsh:,:] - msetr = mse_1[latnh:latsh+1,:] - mseg_1 = np.sqrt(getmean(mse_1,coslats)) - msenh_1 = np.sqrt(getmean(msenh,coslatsnh)) - msesh_1 = np.sqrt(getmean(msesh,coslatssh)) - msetr_1 = np.sqrt(getmean(msetr,coslatstr)) - print '%s %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f' %\ - (level,corrnh_1,corrnh_2,corrtr_1,corrtr_2,\ - corrsh_1,corrsh_2,corrg_1,corrg_2) - print '%s %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f' %\ - (level,msenh_1,msenh_2,msetr_1,msetr_2,\ - msesh_1,msesh_2,mseg_1,mseg_2) From f4d12f1018561c766f1a942f9d627aeab43885d7 Mon Sep 17 00:00:00 2001 From: "john.derber" Date: Wed, 2 Mar 2022 17:02:13 +0000 Subject: [PATCH 23/26] GitHub Issue NOAA-EMC/GSI#314. Modify hdraobmod.f90 to fix problem with GNU compiler found by Rahul. --- src/gsi/hdraobmod.f90 | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/gsi/hdraobmod.f90 b/src/gsi/hdraobmod.f90 index fe96c63ab2..00abeb66be 100644 --- a/src/gsi/hdraobmod.f90 +++ b/src/gsi/hdraobmod.f90 @@ -143,6 +143,7 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& character(10) date character(8) subset character(8) c_station_id,id_station + character(8) c_prvstg,c_sprvstg ! character(8) stnid character(8) stntype @@ -198,11 +199,14 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& real(r_double),dimension(2,maxlevs):: levdat real(r_double),dimension(8,maxlevs):: var_jb,obserr real(r_double),dimension(8,maxlevs):: obsdat + real(r_double) :: r_prvstg,r_sprvstg logical newstation,toocold ! equivalence to handle character names + equivalence(r_prvstg,c_prvstg) + equivalence(r_sprvstg,c_sprvstg) equivalence(rstation_id,c_station_id) equivalence(r_station,id_station) @@ -220,6 +224,8 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& print_verbose=.false. if(verbose) print_verbose=.true. + c_prvstg = '88888888' + c_sprvstg = 'HDRAOB' ! Initialize variables @@ -976,8 +982,8 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& cdata_all(19,iout)=stnelev ! station elevation (m) cdata_all(20,iout)=levdat(2,k) ! observation height (m) cdata_all(21,iout)=zz ! terrain height at ob location - cdata_all(22,iout)='88888888' ! provider name - cdata_all(23,iout)='HDRAOB' ! subprovider name + cdata_all(22,iout)=r_prvstg ! provider name + cdata_all(23,iout)=r_sprvstg ! subprovider name cdata_all(24,iout)=2 ! cat cdata_all(25,iout)=var_jb(3,k) ! non linear qc for T if(perturb_obs)cdata_all(nreal,iout)=ran01dom()*perturb_fact ! t perturbation @@ -1075,8 +1081,8 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& cdata_all(19,iout)=dlon_earth_deg ! earth relative longitude (degrees) cdata_all(20,iout)=dlat_earth_deg ! earth relative latitude (degrees) cdata_all(21,iout)=zz ! terrain height at ob location - cdata_all(22,iout)='88888888' ! provider name - cdata_all(23,iout)='HDRAOB' ! subprovider name + cdata_all(22,iout)=r_prvstg ! provider name + cdata_all(23,iout)=r_sprvstg ! subprovider name cdata_all(24,iout)=2 ! cat cdata_all(25,iout)=var_jb(5,k) ! non linear qc parameter cdata_all(26,iout)=one ! hilbert curve weight, modified later @@ -1157,8 +1163,8 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& cdata_all(17,iout)=stnelev ! station elevation (m) cdata_all(18,iout)=levdat(2,k) ! observation height (m) cdata_all(19,iout)=zz ! terrain height at ob location - cdata_all(20,iout)='88888888' ! provider name - cdata_all(21,iout)='HDRAOB' ! subprovider name + cdata_all(20,iout)=r_prvstg ! provider name + cdata_all(21,iout)=r_sprvstg ! subprovider name cdata_all(22,iout)=2 ! cat cdata_all(23,iout)=var_jb(2,k) ! non linear qc b parameter if(perturb_obs)cdata_all(24,iout)=ran01dom()*perturb_fact ! q perturbation @@ -1222,8 +1228,8 @@ subroutine read_hdraob(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& cdata_all(15,iout)=dlat_earth_deg ! earth relative latitude (degrees) cdata_all(16,iout)=stnelev ! station elevation (m) cdata_all(17,iout)=zz ! terrain height at ob location - cdata_all(18,iout)='88888888' ! provider name - cdata_all(19,iout)='HDRAOB' ! subprovider name + cdata_all(18,iout)=r_prvstg ! provider name + cdata_all(19,iout)=r_sprvstg ! subprovider name cdata_all(20,iout)=var_jb(1,k) ! non linear qc b parameter if(perturb_obs)cdata_all(21,iout)=ran01dom()*perturb_fact ! ps perturbation if (twodvar_regional) & From 49fb1ab675b199a451dbb0525c55e8ffd2479379 Mon Sep 17 00:00:00 2001 From: "Xu.Li" Date: Thu, 3 Mar 2022 18:01:37 +0000 Subject: [PATCH 24/26] GitHub Issue NOAA-EMC/GSI#295. GSI scripts and fix file changes to assimilate Metop-C AVHRR radiance. --- scripts/exgdas_efsoi.sh | 4 ++++ scripts/exgdas_efsoi_update.sh | 1 + scripts/exgdas_enkf_update.sh | 1 + scripts/exglobal_atmos_analysis.sh | 1 + scripts/exglobal_diag.sh | 2 +- 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/exgdas_efsoi.sh b/scripts/exgdas_efsoi.sh index 8d9b6bfebe..134e6c30f2 100755 --- a/scripts/exgdas_efsoi.sh +++ b/scripts/exgdas_efsoi.sh @@ -346,6 +346,10 @@ cat > enkf.nml << EOFnml sattypes_rad(68)= 'ahi_himawari8', dsis(68)= 'ahi_himawari8', sattypes_rad(69)= 'abi_g16', dsis(69)= 'abi_g16', sattypes_rad(70)= 'abi_g17', dsis(70)= 'abi_g17', + sattypes_rad(71)= 'iasi_metop-c', dsis(71)= 'iasi_metop-c', + sattypes_rad(72)= 'viirs-m_npp', dsis(72)= 'viirs-m_npp', + sattypes_rad(73)= 'viirs-m_j1', dsis(73)= 'viirs-m_j1', + sattypes_rad(74)= 'avhrr_metop-c', dsis(74)= 'avhrr3_metop-c', $SATOBS_ENKF / &ozobs_enkf diff --git a/scripts/exgdas_efsoi_update.sh b/scripts/exgdas_efsoi_update.sh index 5f178d5d2a..7dbf5dd0de 100755 --- a/scripts/exgdas_efsoi_update.sh +++ b/scripts/exgdas_efsoi_update.sh @@ -365,6 +365,7 @@ cat > enkf.nml << EOFnml sattypes_rad(71)= 'iasi_metop-c', dsis(71)= 'iasi_metop-c', sattypes_rad(72)= 'viirs-m_npp', dsis(72)= 'viirs-m_npp', sattypes_rad(73)= 'viirs-m_j1', dsis(73)= 'viirs-m_j1', + sattypes_rad(74)= 'avhrr_metop-c', dsis(74)= 'avhrr3_metop-c', $SATOBS_ENKF / diff --git a/scripts/exgdas_enkf_update.sh b/scripts/exgdas_enkf_update.sh index cd78a7fe9a..48df376cad 100755 --- a/scripts/exgdas_enkf_update.sh +++ b/scripts/exgdas_enkf_update.sh @@ -352,6 +352,7 @@ cat > enkf.nml << EOFnml sattypes_rad(71)= 'iasi_metop-c', dsis(71)= 'iasi_metop-c', sattypes_rad(72)= 'viirs-m_npp', dsis(72)= 'viirs-m_npp', sattypes_rad(73)= 'viirs-m_j1', dsis(73)= 'viirs-m_j1', + sattypes_rad(74)= 'avhrr_metop-c', dsis(74)= 'avhrr3_metop-c', $SATOBS_ENKF / &ozobs_enkf diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh index 58c544493f..87a0ab4f53 100755 --- a/scripts/exglobal_atmos_analysis.sh +++ b/scripts/exglobal_atmos_analysis.sh @@ -898,6 +898,7 @@ OBS_INPUT:: avhambufr avhrr metop-a avhrr3_metop-a 0.0 4 0 avhpmbufr avhrr n18 avhrr3_n18 0.0 4 0 avhambufr avhrr metop-b avhrr3_metop-b 0.0 4 0 + avhambufr avhrr metop-c avhrr3_metop-c 0.0 4 0 avhpmbufr avhrr n19 avhrr3_n19 0.0 4 0 amsr2bufr amsr2 gcom-w1 amsr2_gcom-w1 0.0 3 0 gmibufr gmi gpm gmi_gpm 0.0 3 0 diff --git a/scripts/exglobal_diag.sh b/scripts/exglobal_diag.sh index 3912c4bb58..12f77f4a97 100755 --- a/scripts/exglobal_diag.sh +++ b/scripts/exglobal_diag.sh @@ -116,7 +116,7 @@ if [ $GENDIAG = "YES" ] ; then diagtype[0]="conv conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_tcp conv_uv conv_spd" diagtype[1]="pcp_ssmi_dmsp pcp_tmi_trmm" diagtype[2]="sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a gome_metop-b omi_aura mls30_aura ompsnp_npp ompstc8_npp ompstc8_n20 ompsnp_n20 ompslp_npp gome_metop-c" - diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_metop-b avhrr_n18 avhrr_n19 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8 abi_g16 abi_g17 amsua_metop-c mhs_metop-c iasi_metop-c avhrr_metop-c" + diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_metop-b avhrr_n18 avhrr_n19 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8 abi_g16 abi_g17 amsua_metop-c mhs_metop-c iasi_metop-c avhrr_metop-c viirs-m_npp viirs-m_j1" diaglist[0]=listcnv diaglist[1]=listpcp From ade0522f3fd864601d8f1604c678d015676c6808 Mon Sep 17 00:00:00 2001 From: Michael Lueken Date: Fri, 4 Mar 2022 12:02:45 +0000 Subject: [PATCH 25/26] GitHub Issue NOAA-EMC/GSI#302. Removal of libsrc from the authoritative repository. --- .gitmodules | 4 - CMakeLists.txt | 2 - cmake/Modules/FindBACIO.cmake | 43 +---- cmake/Modules/FindBUFR.cmake | 44 +---- cmake/Modules/FindCORELIBS.cmake | 217 +++++------------------ cmake/Modules/FindCRTM.cmake | 58 +----- cmake/Modules/FindIP.cmake | 62 +------ cmake/Modules/FindNEMSIO.cmake | 49 +---- cmake/Modules/FindSFCIO.cmake | 48 +---- cmake/Modules/FindSIGIO.cmake | 48 +---- cmake/Modules/FindSP.cmake | 62 +------ cmake/Modules/FindW3EMC.cmake | 87 +-------- cmake/Modules/FindW3NCO.cmake | 64 +------ cmake/Modules/findHelpers.cmake | 173 ------------------ libsrc | 1 - modulefiles/modulefile.ProdGSI.acorn | 33 ---- modulefiles/modulefile.ProdGSI.hera | 1 + modulefiles/modulefile.ProdGSI.jet | 1 + modulefiles/modulefile.ProdGSI.orion | 1 + modulefiles/modulefile.ProdGSI.s4 | 1 + modulefiles/modulefile.ProdGSI.wcoss_d | 1 + util/Conventional_Monitor/CMakeLists.txt | 4 +- util/Correlated_Obs/CMakeLists.txt | 4 +- util/Ozone_Monitor/CMakeLists.txt | 4 +- util/Radiance_Monitor/CMakeLists.txt | 4 +- 25 files changed, 105 insertions(+), 911 deletions(-) delete mode 100644 cmake/Modules/findHelpers.cmake delete mode 160000 libsrc delete mode 100644 modulefiles/modulefile.ProdGSI.acorn diff --git a/.gitmodules b/.gitmodules index f4bfd21ee7..641f07f69e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ [submodule "fix"] path = fix url = gerrit:GSI-fix - -[submodule "libsrc"] - path = libsrc - url = gerrit:GSI-libsrc diff --git a/CMakeLists.txt b/CMakeLists.txt index 9923fc0588..6c8a47a714 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,8 +187,6 @@ project(GSI) # build the WRF I/O libraries if(DEFINED ENV{WRF_IO_LIB}) set(wrflib "$ENV{WRF_IO_LIB}" CACHE INTERNAL "WRFIO library" ) - elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libsrc/wrflib) - add_subdirectory(libsrc/wrflib) else() message("libsrc/wrflib not pulled from git, looking for WRF dependencies locally") find_package( WRF ) diff --git a/cmake/Modules/FindBACIO.cmake b/cmake/Modules/FindBACIO.cmake index 04410f631e..205f7d3157 100644 --- a/cmake/Modules/FindBACIO.cmake +++ b/cmake/Modules/FindBACIO.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{BACIO_VER}) set(BACIO_VER $ENV{BACIO_VER}) STRING(REGEX REPLACE "v" "" BACIO_VER ${BACIO_VER}) @@ -11,45 +10,13 @@ endif() if(NOT BUILD_BACIO ) if(DEFINED ENV{BACIO_LIB4}) set(BACIO_LIBRARY $ENV{BACIO_LIB4} ) - else() - find_library( BACIO_LIBRARY - NAMES libbacio.a libbacio_4.a libbacio_v${BACIO_VER}_4.a - HINTS $ENV{COREPATH}/lib /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/bacio/v${BACIO_VER} - ${COREPATH}/bacio/v${BACIO_VER}/intel - ${COREPATH}/bacio/v${BACIO_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH} - ) - message("Found BACIO library ${BACIO_LIBRARY}") endif() endif() -if( NOT BACIO_LIBRARY ) # didn't find the library, so build it from source - message("Could not find BACIO library, so building from libsrc") - if( DEFINED ENV{BACIO_SRC} ) - set( BACIO_DIR $ENV{BACIO_SRC} CACHE STRING "BACIO Source Directory" ) - else() - findSrc( "bacio" BACIO_VER BACIO_DIR ) - set(BACIOINC "${CMAKE_BINARY_DIR}/include") - endif() - set( libsuffix "_v${BACIO_VER}${debug_suffix}" ) - set( bacio "bacio${libsuffix}") - set( BUILD_BACIO "ON" CACHE INTERNAL "Build Bacio library" ) - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/bacio) - set( BACIO_LIBRARY ${bacio} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${BACIO_LIBRARY} ) - else() - set( CORE_BUILT ${BACIO_LIBRARY} ) - endif() -else( NOT BACIO_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${BACIO_LIBRARY} ) - else() - set( CORE_LIBRARIES ${BACIO_LIBRARY} ) - endif() -endif( NOT BACIO_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${BACIO_LIBRARY} ) +else() + set( CORE_LIBRARIES ${BACIO_LIBRARY} ) +endif() set( BACIO_LIBRARY_PATH ${BACIO_LIBRARY} CACHE STRING "BACIO Library Location" ) diff --git a/cmake/Modules/FindBUFR.cmake b/cmake/Modules/FindBUFR.cmake index a2d70b92bd..ce6da34e71 100644 --- a/cmake/Modules/FindBUFR.cmake +++ b/cmake/Modules/FindBUFR.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{BUFR_VER}) set(BUFR_VER $ENV{BUFR_VER}) STRING(REGEX REPLACE "v" "" BUFR_VER ${BUFR_VER}) @@ -14,47 +13,12 @@ if(NOT BUILD_BUFR ) if(DEFINED ENV{BUFR_LIBd_DA} ) set(BUFR_LIBRARY $ENV{BUFR_LIBd_DA} ) message("BUFR library ${BUFR_LIBRARY} set via Environment variable") - else() - find_library( BUFR_LIBRARY - NAMES libbufr.a libbufr_d_64.a libbufr_i4r8.a libbufr_v${BUFR_VER}_d_64.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/bufr/v${BUFR_VER} - ${COREPATH}/bufr/v${BUFR_VER}/intel - ${COREPATH}/bufr/v${BUFR_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( bufr "bufr_v${BUFR_VER}") - message("Found BUFR library ${BUFR_LIBRARY}") endif() endif() -if( NOT BUFR_LIBRARY ) # didn't find the library, so build it from source - message("Could not find BUFR library, so building from libsrc") - if( NOT DEFINED ENV{BUFR_SRC} ) - findSrc( "bufr" BUFR_VER BUFR_DIR ) - else() - set( BUFR_DIR "$ENV{BUFR_SRC}/libsrc" CACHE STRING "BUFR Source Location") - endif() - set( libsuffix "_v${BUFR_VER}${debug_suffix}" ) - set( BUFR_LIBRARY "${LIBRARY_OUTPUT_PATH}/libbufr${libsuffix}.a" CACHE STRING "BUFR Library" ) - set( bufr "bufr${libsuffix}") - set( BUILD_BUFR "ON" CACHE INTERNAL "Build the BUFR library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/bufr) - set( BUFR_LIBRARY ${bufr} ) - - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${BUFR_LIBRARY} ) - else() - set( CORE_BUILT ${BUFR_LIBRARY} ) - endif() -else( NOT BUFR_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${BUFR_LIBRARY} ) - else() - set( CORE_LIBRARIES ${BUFR_LIBRARY} ) - endif() +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${BUFR_LIBRARY} ) +else() + set( CORE_LIBRARIES ${BUFR_LIBRARY} ) endif() set( BUFR_LIBRARY_PATH ${BUFR_LIBRARY} CACHE STRING "BUFR Library Location" ) diff --git a/cmake/Modules/FindCORELIBS.cmake b/cmake/Modules/FindCORELIBS.cmake index 9aab567113..f653f758dc 100644 --- a/cmake/Modules/FindCORELIBS.cmake +++ b/cmake/Modules/FindCORELIBS.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{BUFR_VER}) set(BUFR_VER $ENV{BUFR_VER}) STRING(REGEX REPLACE "v" "" BUFR_VER ${BUFR_VER}) @@ -39,220 +38,90 @@ if(NOT BUILD_EMC ) if(DEFINED ENV{W3EMC_LIBd} ) set(W3EMC_LIBRARY $ENV{W3EMC_LIBd} ) set(W3EMCINC $ENV{W3EMC_INCd} ) - else() - find_path( W3EMCINC - NAMES mersenne_twister.mod - HINTS - $ENV{COREPATH}/lib/incmod/w3emc_4 - $ENV{COREPATH}/include - /usr/local/jcsda/nwprod_gdas_2014/lib/lib/incmod/w3emc_4 - ${COREPATH}/w3emc/v${W3EMC_VER}/incmod/w3emc_v${W3EMC_VER}_d - ${COREPATH}/w3emc/v${W3EMC_VER}/intel/w3emc_v${W3EMC_VER}_d - ) - find_library( W3EMC_LIBRARY - NAMES libw3emc_4.a libw3emc_i4r8.a libw3emc_v${W3EMC_VER}_d.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/w3emc/v${W3EMC_VER} - ${COREPATH}/w3emc/v${W3EMC_VER}/intel - PATH_SUFFIXES - lib - ) - message("Found W3EMC library ${W3EMC_LIBRARY}") endif() else() - set( libsuffix "_v${W3EMC_VER}${debug_suffix}" ) - set( W3EMC_LIBRARY "${LIBRARY_OUTPUT_PATH}/libw3emc${libsuffix}.a" CACHE STRING "W3EMC Library" ) - set( w3emc "w3emc${libsuffix}") - if( DEFINED ENV{W3EMC_SRC} ) - set( W3EMC_DIR $ENV{W3EMC_SRC} CACHE STRING "W3EMC Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "w3emc" W3EMC_VER W3EMC_DIR ) - endif() - endif() + set( libsuffix "_v${W3EMC_VER}${debug_suffix}" ) + set( W3EMC_LIBRARY "${LIBRARY_OUTPUT_PATH}/libw3emc${libsuffix}.a" CACHE STRING "W3EMC Library" ) + set( w3emc "w3emc${libsuffix}") + if( DEFINED ENV{W3EMC_SRC} ) + set( W3EMC_DIR $ENV{W3EMC_SRC} CACHE STRING "W3EMC Source Directory" ) + endif() endif() if(NOT BUILD_NCO ) if(DEFINED ENV{W3NCO_LIBd} ) set(W3NCO_LIBRARY $ENV{W3NCO_LIBd} ) - else() - find_library( W3NCO_LIBRARY - NAMES libw3nco_v${W3NCO_VER}_d.a libw3nco_d.a libw3nco_i4r8.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/w3nco/v${W3NCO_VER} - ${COREPATH}/w3nco/v${W3NCO_VER}/intel - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - message("Found W3NCO library ${W3NCO_LIBRARY}") endif() else() - if( DEFINED ENV{W3NCO_SRC} ) - set( W3NCO_DIR $ENV{W3NCO_SRC} CACHE STRING "W3NCO Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "w3nco" W3NCO_VER W3NCO_DIR ) - endif() - endif() - set( libsuffix "_v${W3NCO_VER}${debug_suffix}" ) - set( W3NCO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libw3nco${libsuffix}.a" CACHE STRING "W3NCO Library" ) - set( w3nco "w3nco${libsuffix}") + if( DEFINED ENV{W3NCO_SRC} ) + set( W3NCO_DIR $ENV{W3NCO_SRC} CACHE STRING "W3NCO Source Directory" ) + endif() + set( libsuffix "_v${W3NCO_VER}${debug_suffix}" ) + set( W3NCO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libw3nco${libsuffix}.a" CACHE STRING "W3NCO Library" ) + set( w3nco "w3nco${libsuffix}") endif() if(NOT BUILD_BUFR ) if(DEFINED ENV{BUFR_LIBd_DA} ) set(BUFR_LIBRARY $ENV{BUFR_LIBd_DA} ) - else() - find_library( BUFR_LIBRARY - NAMES libbufr.a libbufr_d_64.a libbufr_i4r8.a libbufr_v${BUFR_VER}_d_64.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/bufr/v${BUFR_VER} - ${COREPATH}/bufr/v${BUFR_VER}/intel - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( bufr "bufr_v${BUFR_VER}") - message("Found BUFR library ${BUFR_LIBRARY}") endif() else() - if( DEFINED ENV{BUFR_SRC} ) - set( BUFR_DIR $ENV{BUFR_SRC} CACHE STRING "BUFR Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "bufr" BUFR_VER BUFR_DIR ) - endif() - endif() - set( libsuffix "_v${BUFR_VER}${debug_suffix}" ) - set( BUFR_LIBRARY "${LIBRARY_OUTPUT_PATH}/libbufr${libsuffix}.a" CACHE STRING "BUFR Library" ) - set( bufr "bufr${libsuffix}") + if( DEFINED ENV{BUFR_SRC} ) + set( BUFR_DIR $ENV{BUFR_SRC} CACHE STRING "BUFR Source Directory" ) + endif() + set( libsuffix "_v${BUFR_VER}${debug_suffix}" ) + set( BUFR_LIBRARY "${LIBRARY_OUTPUT_PATH}/libbufr${libsuffix}.a" CACHE STRING "BUFR Library" ) + set( bufr "bufr${libsuffix}") endif() if(NOT BUILD_SFCIO ) if(DEFINED ENV{SFCIO_LIB4} ) set(SFCIO_LIBRARY $ENV{SFCIO_LIB4} ) set(SFCIOINC $ENV{SFCIO_INC4} ) - else() - findInc( sfcio SFCIO_VER SFCIOINC ) - find_library( SFCIO_LIBRARY - NAMES libsfcio.a libsfcio_4.a libsfcio_i4r4.a libsfcio_v${SFCIO_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sfcio/v${SFCIO_VER} - ${COREPATH}/sfcio/v${SFCIO_VER}/intel - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sfcio "sfcio_v${SFCIO_VER}_4") - message("Found SFCIO library ${SFCIO_LIBRARY}") endif() else() - if( DEFINED ENV{SFCIO_SRC} ) - set( SFCIO_DIR $ENV{SFCIO_SRC} CACHE STRING "SFCIO Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "sfcio" SFCIO_VER SFCIO_DIR ) - endif() - endif() - set( libsuffix "_v${SFCIO_VER}${debug_suffix}" ) - set( SFCIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsfcio${libsuffix}.a" CACHE STRING "SFCIO Library" ) - set( sfcio "sfcio${libsuffix}") + if( DEFINED ENV{SFCIO_SRC} ) + set( SFCIO_DIR $ENV{SFCIO_SRC} CACHE STRING "SFCIO Source Directory" ) + endif() + set( libsuffix "_v${SFCIO_VER}${debug_suffix}" ) + set( SFCIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsfcio${libsuffix}.a" CACHE STRING "SFCIO Library" ) + set( sfcio "sfcio${libsuffix}") endif() if(NOT BUILD_SIGIO ) if(DEFINED ENV{SIGIO_LIB4} ) set(SIGIO_LIBRARY $ENV{SIGIO_LIB4} ) set(SIGIOINC $ENV{SIGIO_INC4} ) - else() - findInc( sigio SIGIO_VER SIGIOINC ) - message("SIGIOINC is ${SIGIOINC}") - find_library( SIGIO_LIBRARY - NAMES libsigio.a libsigio_4.a libsigio_i4r4.a libsigio_v${SIGIO_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sigio/v${SIGIO_VER} - ${COREPATH}/sigio/v${SIGIO_VER}/intel - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sigio "sigio_v${SIGIO_VER}_4") - message("Found SIGIO library ${SIGIO_LIBRARY}") endif() else() - if( DEFINED ENV{SIGIO_SRC} ) - set( SIGIO_DIR $ENV{SIGIO_SRC} CACHE STRING "SIGIO Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "sigio" SIGIO_VER SIGIO_DIR ) - endif() - endif() - set( libsuffix "_v${SIGIO_VER}${debug_suffix}" ) - set( SIGIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsigio${libsuffix}.a" CACHE STRING "SIGIO Library" ) - set( sigio "sigio${libsuffix}") - set( CORE_DEPS "${CORE_DEPS} ${baseName}" ) + if( DEFINED ENV{SIGIO_SRC} ) + set( SIGIO_DIR $ENV{SIGIO_SRC} CACHE STRING "SIGIO Source Directory" ) + endif() + set( libsuffix "_v${SIGIO_VER}${debug_suffix}" ) + set( SIGIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsigio${libsuffix}.a" CACHE STRING "SIGIO Library" ) + set( sigio "sigio${libsuffix}") + set( CORE_DEPS "${CORE_DEPS} ${baseName}" ) endif() if(NOT BUILD_NEMSIO ) if(DEFINED ENV{NEMSIO_LIB} ) set(NEMSIO_LIBRARY $ENV{NEMSIO_LIB} ) set(NEMSIOINC $ENV{NEMSIO_INC} ) - else() - findInc( nemsio NEMSIO_VER NEMSIOINC ) - find_library( NEMSIO_LIBRARY - NAMES libnemsio.a libnemsio_v${NEMSIO_VER}.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/nemsio/v${NEMSIO_VER} - ${COREPATH}/nemsio/v${NEMSIO_VER}/intel - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( nemsio "nemsio_v${NEMSIO_VER}") - message("Found NEMSIO library ${NEMSIO_LIBRARY}") endif() else() - if( DEFINED ENV{NEMSIO_SRC} ) - set( NEMSIO_DIR $ENV{NEMSIO_SRC} CACHE STRING "NEMSIO Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "nemsio" NEMSIO_VER NEMSIO_DIR ) - endif() - endif() - set( libsuffix "_v${NEMSIO_VER}${debug_suffix}" ) - set( NEMSIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libnemsio${libsuffix}.a" CACHE STRING "NEMSIO Library" ) - set( nemsio "nemsio${libsuffix}") + if( DEFINED ENV{NEMSIO_SRC} ) + set( NEMSIO_DIR $ENV{NEMSIO_SRC} CACHE STRING "NEMSIO Source Directory" ) + endif() + set( libsuffix "_v${NEMSIO_VER}${debug_suffix}" ) + set( NEMSIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libnemsio${libsuffix}.a" CACHE STRING "NEMSIO Library" ) + set( nemsio "nemsio${libsuffix}") endif() if(NOT BUILD_SP ) if(DEFINED ENV{SP_LIBd} ) set(SP_LIBRARY $ENV{SP_LIBd} ) - else() - find_library( SP_LIBRARY - NAMES libsp_d.a libsp_i4r8.a libsp_v${SP_VER}_d.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sp/v${SP_VER} - ${COREPATH}/sp/v${SP_VER}/intel - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sp "sp_v${SP_VER}_d") - message("Found SP library ${SP_LIBRARY}") endif() else() - if( DEFINED ENV{SP_SRC} ) - set( SP_DIR $ENV{SP_SRC} CACHE STRING "SP Source Directory" ) - else() - if( FIND_SRC ) - findSrc( "sp" SP_VER SP_DIR ) - endif() - endif() - set( libsuffix "_v${SP_VER}${debug_suffix}" ) - set( SP_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsp${libsuffix}.a" CACHE STRING "SP Library" ) - set( sp "sp${libsuffix}") + if( DEFINED ENV{SP_SRC} ) + set( SP_DIR $ENV{SP_SRC} CACHE STRING "SP Source Directory" ) + endif() + set( libsuffix "_v${SP_VER}${debug_suffix}" ) + set( SP_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsp${libsuffix}.a" CACHE STRING "SP Library" ) + set( sp "sp${libsuffix}") endif() if( CORE_LIBRARIES ) diff --git a/cmake/Modules/FindCRTM.cmake b/cmake/Modules/FindCRTM.cmake index ee982c1499..41de09bba9 100644 --- a/cmake/Modules/FindCRTM.cmake +++ b/cmake/Modules/FindCRTM.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{CRTM_VER}) set(CRTM_VER $ENV{CRTM_VER}) STRING(REGEX REPLACE "v" "" CRTM_VER ${CRTM_VER}) @@ -15,60 +14,13 @@ if(NOT BUILD_CRTM ) set(CRTM_LIBRARY $ENV{CRTM_LIB} ) set(CRTMINC $ENV{CRTM_INC} ) message("CRTM library ${CRTM_LIBRARY} set via Environment variable") - else() - findInc( crtm CRTM_VER CRTMINC ) - find_library( CRTM_LIBRARY - NAMES libcrtm_v${CRTM_VER}.a libcrtm.a libCRTM.a - HINTS - /usr/local/jcsda/nwprod_gdas_2014/lib - ${CRTM_BASE} - ${CRTM_BASE}/lib - ${CRTM_BASE}/${CRTM_VER} - ${CRTM_BASE}/${CRTM_VER}/lib - ${CRTM_BASE}/v${CRTM_VER}/intel - ${CRTM_BASE}/v${CRTM_VER}/ips/${COMPILER_VERSION} - ${COREPATH}/v${CRTM_VER}/ips/${COMPILER_VERSION} - ${COREPATH} - ${COREPATH}/lib - $ENV{COREPATH} - $ENV{COREPATH}/lib - $ENV{COREPATH}/include - ${CORECRTM}/crtm/${CRTM_VER} - /nwprod2/lib/crtm/v${CRTM_VER} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( crtm "crtm_v${CRTM_VER}") - message("Found CRTM library ${CRTM_LIBRARY}") endif() endif() -if( NOT CRTM_LIBRARY ) # didn't find the library, so build it from source - message("Could not find CRTM library, so building from libsrc") - if( NOT DEFINED ENV{CRTM_SRC} ) - findSrc( "crtm" CRTM_VER CRTM_DIR ) - set(CRTMINC "${CMAKE_BINARY_DIR}/include") - else() - set( CRTM_DIR "$ENV{CRTM_SRC}/libsrc" CACHE STRING "CRTM Source Location") - set(CRTMINC "${CORECRTM}/crtm/${CRTM_VER}/incmod/crtm_v${CRTM_VER}") - endif() - set( libsuffix "_v${CRTM_VER}${debug_suffix}" ) - set( CRTM_LIBRARY "${LIBRARY_OUTPUT_PATH}/libcrtm${libsuffix}.a" CACHE STRING "CRTM Library" ) - set( crtm "crtm${libsuffix}") - set( BUILD_CRTM "ON" CACHE INTERNAL "Build the CRTM library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/crtm) - set( CRTM_LIBRARY ${crtm} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${CRTM_LIBRARY} ) - else() - set( CORE_BUILT ${CRTM_LIBRARY} ) - endif() -else( NOT CRTM_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${CRTM_LIBRARY} ) - else() - set( CORE_LIBRARIES ${CRTM_LIBRARY} ) - endif() -endif( NOT CRTM_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${CRTM_LIBRARY} ) +else() + set( CORE_LIBRARIES ${CRTM_LIBRARY} ) +endif() if( CORE_INCS ) list( APPEND CORE_INCS ${CRTMINC} ) diff --git a/cmake/Modules/FindIP.cmake b/cmake/Modules/FindIP.cmake index 26ec21704e..baec28d683 100644 --- a/cmake/Modules/FindIP.cmake +++ b/cmake/Modules/FindIP.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{IP_VER}) set(IP_VER $ENV{IP_VER}) STRING(REGEX REPLACE "v" "" IP_VER ${IP_VER}) @@ -14,68 +13,17 @@ if(NOT BUILD_IP ) if(DEFINED ENV{IP_LIBd} ) set(IP_LIBRARY $ENV{IP_LIBd} ) message("IP library ${IP_LIBRARY} set via Environment variable") - else() - find_library( IP_LIBRARY - NAMES libip_d.a libip_i4r8.a libip_v${IP_VER}_d.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/ip/v${IP_VER} - ${COREPATH}/ip/v${IP_VER}/intel - ${COREPATH}/ip/v${IP_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( ip "ip_v${IP_VER}_d") - message("Found IP library ${IP_LIBRARY}") endif() if(DEFINED ENV{IP_LIB4} ) set(IP_4_LIBRARY $ENV{IP_LIB4} ) message("IP 4 library ${IP_4_LIBRARY} set via Environment variable") - else() - find_library( IP_4_LIBRARY - NAMES libip_4.a libip_i4r4.a libip_v${IP_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/ip/v${IP_VER} - ${COREPATH}/ip/v${IP_VER}/intel - ${COREPATH}/ip/v${IP_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( ip "ip_v${IP_VER}_4") - message("Found IP_4 library ${IP_4_LIBRARY}") endif() endif() -if( NOT IP_LIBRARY ) # didn't find the library, so build it from source - message("Could not find IP library, so building from libsrc") - if( NOT DEFINED ENV{IP_SRC} ) - findSrc( "ip" IP_VER IP_DIR ) - else() - set( IP_DIR "$ENV{IP_SRC}/libsrc" CACHE STRING "IP Source Location") - endif() - set( libsuffix "_v${IP_VER}${debug_suffix}" ) - set( IP_LIBRARY "${LIBRARY_OUTPUT_PATH}/libip${libsuffix}.a" CACHE STRING "IP Library" ) - set( IP_4_LIBRARY "${LIBRARY_OUTPUT_PATH}/libip_4${libsuffix}.a" CACHE STRING "IP_4 Library" ) - set( ip "ip${libsuffix}") - set( ip4 "ip_4${libsuffix}") - set( BUILD_IP "ON" CACHE INTERNAL "Build the IP library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/ip) - set( IP_LIBRARY ${ip} ) - set( IP_4_LIBRARY ${ip4} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${IP_LIBRARY} ) - else() - set( CORE_BUILT ${IP_LIBRARY} ) - endif() -else( NOT IP_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${IP_LIBRARY} ) - else() - set( CORE_LIBRARIES ${IP_LIBRARY} ) - endif() -endif( NOT IP_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${IP_LIBRARY} ) +else() + set( CORE_LIBRARIES ${IP_LIBRARY} ) +endif() set( IP_LIBRARY_PATH ${IP_LIBRARY} CACHE STRING "IP Library Location" ) diff --git a/cmake/Modules/FindNEMSIO.cmake b/cmake/Modules/FindNEMSIO.cmake index 1263fc516a..d5550bb530 100644 --- a/cmake/Modules/FindNEMSIO.cmake +++ b/cmake/Modules/FindNEMSIO.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{NEMSIO_VER}) set(NEMSIO_VER $ENV{NEMSIO_VER}) STRING(REGEX REPLACE "v" "" NEMSIO_VER ${NEMSIO_VER}) @@ -15,51 +14,13 @@ if(NOT BUILD_NEMSIO ) set(NEMSIO_LIBRARY $ENV{NEMSIO_LIB} ) set(NEMSIOINC $ENV{NEMSIO_INC} ) message("NEMSIO library ${NEMSIO_LIBRARY} set via Environment variable") - else() - findInc( nemsio NEMSIO_VER NEMSIOINC ) - find_library( NEMSIO_LIBRARY - NAMES libnemsio_v${NEMSIO_VER}.a libnemsio.a libNEMSIO.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/nemsio/v${NEMSIO_VER} - ${COREPATH}/nemsio/v${NEMSIO_VER}/intel - ${COREPATH}/nemsio/v${NEMSIO_VER}//ips/${COMPILER_VERSION}/impi/${COMPILER_VERSION} - ${COREPATH}/nemsio/v${NEMSIO_VER}//ips/${COMPILER_VERSION}/smpi/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( nemsio "nemsio_v${NEMSIO_VER}") - message("Found NEMSIO library ${NEMSIO_LIBRARY}") endif() endif() -if( NOT NEMSIO_LIBRARY ) # didn't find the library, so build it from source - message("Could not find NEMSIO library, so building from libsrc") - if( NOT DEFINED ENV{NEMSIO_SRC} ) - findSrc( "nemsio" NEMSIO_VER NEMSIO_DIR ) - set(NEMSIOINC "${CMAKE_BINARY_DIR}/include") - else() - set( NEMSIO_DIR "$ENV{NEMSIO_SRC}/libsrc" CACHE STRING "NEMSIO Source Location") - set(NEMSIOINC "${CORENEMSIO}/nemsio/${NEMSIO_VER}/incmod/nemsio_v${NEMSIO_VER}") - endif() - set( libsuffix "_v${NEMSIO_VER}${debug_suffix}" ) - set( NEMSIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libnemsio${libsuffix}.a" CACHE STRING "NEMSIO Library" ) - set( nemsio "nemsio${libsuffix}") - set( BUILD_NEMSIO "ON" CACHE INTERNAL "Build the NEMSIO library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/nemsio) - set( NEMSIO_LIBRARY ${nemsio} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${NEMSIO_LIBRARY} ) - else() - set( CORE_BUILT ${NEMSIO_LIBRARY} ) - endif() -else( NOT NEMSIO_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${NEMSIO_LIBRARY} ) - else() - set( CORE_LIBRARIES ${NEMSIO_LIBRARY} ) - endif() -endif( NOT NEMSIO_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${NEMSIO_LIBRARY} ) +else() + set( CORE_LIBRARIES ${NEMSIO_LIBRARY} ) +endif() if( CORE_INCS ) list( APPEND CORE_INCS ${NEMSIOINC} ) diff --git a/cmake/Modules/FindSFCIO.cmake b/cmake/Modules/FindSFCIO.cmake index 09d4366d66..c137e1ca16 100644 --- a/cmake/Modules/FindSFCIO.cmake +++ b/cmake/Modules/FindSFCIO.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{SFCIO_VER}) set(SFCIO_VER $ENV{SFCIO_VER}) STRING(REGEX REPLACE "v" "" SFCIO_VER ${SFCIO_VER}) @@ -19,50 +18,13 @@ if(NOT BUILD_SFCIO ) set(SFCIO_LIBRARY $ENV{SFCIO_LIB} ) set(SFCIOINC $ENV{SFCIO_INC} ) message("SFCIO library ${SFCIO_LIBRARY} set via Environment variable") - else() - findInc( sfcio SFCIO_VER SFCIOINC ) - find_library( SFCIO_LIBRARY - NAMES libsfcio.a libsfcio_4.a libsfcio_i4r4.a libsfcio_v${SFCIO_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sfcio/v${SFCIO_VER} - ${COREPATH}/sfcio/v${SFCIO_VER}/intel - ${COREPATH}/sfcio/v${SFCIO_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sfcio "sfcio_v${SFCIO_VER}") - message("Found SFCIO library ${SFCIO_LIBRARY}") endif() endif() -if( NOT SFCIO_LIBRARY ) # didn't find the library, so build it from source - message("Could not find SFCIO library, so building from libsrc") - if( NOT DEFINED ENV{SFCIO_SRC} ) - findSrc( "sfcio" SFCIO_VER SFCIO_DIR ) - set(SFCIOINC "${CMAKE_BINARY_DIR}/include") - else() - set( SFCIO_DIR "$ENV{SFCIO_SRC}/libsrc" CACHE STRING "SFCIO Source Location") - set(SFCIOINC "${CORESFCIO}/sfcio/${SFCIO_VER}/incmod/sfcio_v${SFCIO_VER}") - endif() - set( libsuffix "_v${SFCIO_VER}${debug_suffix}" ) - set( SFCIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsfcio${libsuffix}.a" CACHE STRING "SFCIO Library" ) - set( sfcio "sfcio${libsuffix}") - set( BUILD_SFCIO "ON" CACHE INTERNAL "Build the SFCIO library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/sfcio) - set( SFCIO_LIBRARY ${sfcio} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${SFCIO_LIBRARY} ) - else() - set( CORE_BUILT ${SFCIO_LIBRARY} ) - endif() -else( NOT SFCIO_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${SFCIO_LIBRARY} ) - else() - set( CORE_LIBRARIES ${SFCIO_LIBRARY} ) - endif() -endif( NOT SFCIO_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${SFCIO_LIBRARY} ) +else() + set( CORE_LIBRARIES ${SFCIO_LIBRARY} ) +endif() if( CORE_INCS ) list( APPEND CORE_INCS ${SFCIOINC} ) diff --git a/cmake/Modules/FindSIGIO.cmake b/cmake/Modules/FindSIGIO.cmake index d504f53a81..026c1f7921 100644 --- a/cmake/Modules/FindSIGIO.cmake +++ b/cmake/Modules/FindSIGIO.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{SIGIO_VER}) set(SIGIO_VER $ENV{SIGIO_VER}) STRING(REGEX REPLACE "v" "" SIGIO_VER ${SIGIO_VER}) @@ -19,50 +18,13 @@ if(NOT BUILD_SIGIO ) set(SIGIO_LIBRARY $ENV{SIGIO_LIB} ) set(SIGIOINC $ENV{SIGIO_INC} ) message("SIGIO library ${SIGIO_LIBRARY} set via Environment variable") - else() - findInc( sigio SIGIO_VER SIGIOINC ) - find_library( SIGIO_LIBRARY - NAMES libsigio.a libsigio_4.a libsigio_i4r4.a libsigio_v${SIGIO_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sigio/v${SIGIO_VER} - ${COREPATH}/sigio/v${SIGIO_VER}/intel - ${COREPATH}/sigio/v${SIGIO_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sigio "sigio_v${SIGIO_VER}") - message("Found SIGIO library ${SIGIO_LIBRARY}") endif() endif() -if( NOT SIGIO_LIBRARY ) # didn't find the library, so build it from source - message("Could not find SIGIO library, so building from libsrc") - if( NOT DEFINED ENV{SIGIO_SRC} ) - findSrc( "sigio" SIGIO_VER SIGIO_DIR ) - set(SIGIOINC "${CMAKE_BINARY_DIR}/include") - else() - set( SIGIO_DIR "$ENV{SIGIO_SRC}/libsrc" CACHE STRING "SIGIO Source Location") - set(SIGIOINC "${CORESIGIO}/sigio/${SIGIO_VER}/incmod/sigio_v${SIGIO_VER}") - endif() - set( libsuffix "_v${SIGIO_VER}${debug_suffix}" ) - set( SIGIO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsigio${libsuffix}.a" CACHE STRING "SIGIO Library" ) - set( sigio "sigio${libsuffix}") - set( BUILD_SIGIO "ON" CACHE INTERNAL "Build the SIGIO library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/sigio) - set( SIGIO_LIBRARY ${sigio} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${SIGIO_LIBRARY} ) - else() - set( CORE_BUILT ${SIGIO_LIBRARY} ) - endif() -else( NOT SIGIO_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${SIGIO_LIBRARY} ) - else() - set( CORE_LIBRARIES ${SIGIO_LIBRARY} ) - endif() -endif( NOT SIGIO_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${SIGIO_LIBRARY} ) +else() + set( CORE_LIBRARIES ${SIGIO_LIBRARY} ) +endif() if( CORE_INCS ) list( APPEND CORE_INCS ${SIGIOINC} ) diff --git a/cmake/Modules/FindSP.cmake b/cmake/Modules/FindSP.cmake index b5fba97341..2844870a93 100644 --- a/cmake/Modules/FindSP.cmake +++ b/cmake/Modules/FindSP.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{SP_VER}) set(SP_VER $ENV{SP_VER}) STRING(REGEX REPLACE "v" "" SP_VER ${SP_VER}) @@ -14,68 +13,17 @@ if(NOT BUILD_SP ) if(DEFINED ENV{SP_LIBd} ) set(SP_LIBRARY $ENV{SP_LIBd} ) message("SP library ${SP_LIBRARY} set via Environment variable") - else() - find_library( SP_LIBRARY - NAMES libsp_d.a libsp_i4r8.a libsp_v${SP_VER}_d.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sp/v${SP_VER} - ${COREPATH}/sp/v${SP_VER}/intel - ${COREPATH}/sp/v${SP_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sp "sp_v${SP_VER}_d") - message("Found SP library ${SP_LIBRARY}") endif() if(DEFINED ENV{SP_LIB4} ) set(SP_4_LIBRARY $ENV{SP_LIB4} ) message("SP library ${SP_4_LIBRARY} set via Environment variable") - else() - find_library( SP_4_LIBRARY - NAMES libsp_4.a libsp_i4r4.a libsp_v${SP_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/sp/v${SP_VER} - ${COREPATH}/sp/v${SP_VER}/intel - ${COREPATH}/sp/v${SP_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - set( sp "sp_v${SP_VER}_4") - message("Found SP_4 library ${SP_4_LIBRARY}") endif() endif() -if( NOT SP_LIBRARY ) # didn't find the library, so build it from source - message("Could not find SP library, so building from libsrc") - if( NOT DEFINED ENV{SP_SRC} ) - findSrc( "sp" SP_VER SP_DIR ) - else() - set( SP_DIR "$ENV{SP_SRC}/libsrc" CACHE STRING "SP Source Location") - endif() - set( libsuffix "_v${SP_VER}${debug_suffix}" ) - set( SP_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsp${libsuffix}.a" CACHE STRING "SP Library" ) - set( SP_4_LIBRARY "${LIBRARY_OUTPUT_PATH}/libsp_4${libsuffix}.a" CACHE STRING "SP_4 Library" ) - set( sp "sp${libsuffix}") - set( sp4 "sp_4${libsuffix}") - set( BUILD_SP "ON" CACHE INTERNAL "Build the SP library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/sp) - set( SP_LIBRARY ${sp} ) - set( SP_4_LIBRARY ${sp4} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${SP_LIBRARY} ) - else() - set( CORE_BUILT ${SP_LIBRARY} ) - endif() -else( NOT SP_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${SP_LIBRARY} ) - else() - set( CORE_LIBRARIES ${SP_LIBRARY} ) - endif() -endif( NOT SP_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${SP_LIBRARY} ) +else() + set( CORE_LIBRARIES ${SP_LIBRARY} ) +endif() set( SP_LIBRARY_PATH ${SP_LIBRARY} CACHE STRING "SP Library Location" ) diff --git a/cmake/Modules/FindW3EMC.cmake b/cmake/Modules/FindW3EMC.cmake index 3cbce42a6d..b87b4e7129 100644 --- a/cmake/Modules/FindW3EMC.cmake +++ b/cmake/Modules/FindW3EMC.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{W3EMC_VER}) set(W3EMC_VER $ENV{W3EMC_VER}) set(W3EMCINC $ENV{W3EMC_INCd} ) @@ -27,89 +26,13 @@ if((NOT BUILD_W3EMC ) AND ( NOT DEFINED W3EMC_LIBRARY )) set(W3EMC4INC $ENV{W3EMC_INC4} ) message("W3EMC library ${W3EMC_LIBRARY} set via Environment variable") message("W3EMC_4 library ${W3EMC_4_LIBRARY} set via Environment variable") - else() - find_path( W3EMCINC - NAMES mersenne_twister.mod - HINTS - $ENV{COREPATH}/lib/incmod/w3emc_d - $ENV{COREPATH}/include - /usr/local/jcsda/nwprod_gdas_2014/lib/incmod/w3emc_d - ${COREPATH}/w3emc/v${W3EMC_VER}/incmod/w3emc_v${W3EMC_VER}_d - ${COREPATH}/w3emc/v${W3EMC_VER}/intel/w3emc_v${W3EMC_VER}_d - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/impi/${COMPILER_VERSION}/include/w3emc_v${W3EMC_VER}_d - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/smpi/${COMPILER_VERSION}/include/w3emc_v${W3EMC_VER}_d - ) - find_path( W3EMC4INC - NAMES mersenne_twister.mod - HINTS - $ENV{COREPATH}/lib/incmod/w3emc_4 - $ENV{COREPATH}/include - /usr/local/jcsda/nwprod_gdas_2014/lib/incmod/w3emc_4 - ${COREPATH}/w3emc/v${W3EMC_VER}/incmod/w3emc_v${W3EMC_VER}_4 - ${COREPATH}/w3emc/v${W3EMC_VER}/intel/w3emc_v${W3EMC_VER}_4 - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/impi/${COMPILER_VERSION}/include/w3emc_v${W3EMC_VER}_4 - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/smpi/${COMPILER_VERSION}/include/w3emc_v${W3EMC_VER}_4 - ) - find_library( W3EMC_LIBRARY - NAMES libw3emc_d.a libw3emc_v${W3EMC_VER}_d.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014 - ${COREPATH}/w3emc/v${W3EMC_VER} - ${COREPATH}/w3emc/v${W3EMC_VER}/intel - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/impi/${COMPILER_VERSION} - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/smpi/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - find_library( W3EMC_4_LIBRARY - NAMES libw3emc_4.a libw3emc_i4r4.a libw3emc_v${W3EMC_VER}_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014 - ${COREPATH}/w3emc/v${W3EMC_VER} - ${COREPATH}/w3emc/v${W3EMC_VER}/intel - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/impi/${COMPILER_VERSION} - ${COREPATH}/w3emc/v${W3EMC_VER}/ips/${COMPILER_VERSION}/smpi/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - message("Found W3EMC_4 library ${W3EMC_4_LIBRARY}") endif() endif() -if( NOT W3EMC_LIBRARY ) # didn't find the library, so build it from source - message("Could not find W3EMC library, so building from libsrc") - if( NOT DEFINED ENV{W3EMC_SRC} ) - findSrc( "w3emc" W3EMC_VER W3EMC_DIR ) - set(W3EMCINC "${CMAKE_BINARY_DIR}/include" CACHE STRING "W3EMC Include Directory") - set(W3EMC4INC "${CMAKE_BINARY_DIR}/include" CACHE STRING "W3EMC4 Include Directory") - else() - set( W3EMC_DIR "$ENV{W3EMC_SRC}/libsrc" CACHE STRING "W3EMC Source Location") - endif() - set( libsuffix "_v${W3EMC_VER}${debug_suffix}" ) - set( W3EMC_LIBRARY "${LIBRARY_OUTPUT_PATH}/libw3emc${libsuffix}.a" CACHE STRING "W3EMC Library" ) - set( w3emc "w3emc${libsuffix}") - set( w3emc4 "w3emc_4${libsuffix}") - set( BUILD_W3EMC "ON" CACHE INTERNAL "Build the W3EMC library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/w3emc) - set( W3EMC_LIBRARY ${w3emc} ) - set( W3EMC_4_LIBRARY ${w3emc} ) - set(W3EMCINC "${CMAKE_BINARY_DIR}/include" CACHE STRING "W3EMC Include Directory") - set(W3EMC4INC ${CMAKE_INCLUDE_4_OUTPUT_DIRECTORY} CACHE STRING "W3EMC4 Include Directory") - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${W3EMC_LIBRARY} ) - list( APPEND CORE_BUILT ${W3EMC_4_LIBRARY} ) - else() - set( CORE_BUILT ${W3EMC_LIBRARY} ) - set( CORE_BUILT ${W3EMC_4_LIBRARY} ) - endif() -else( NOT W3EMC_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${W3EMC_LIBRARY} ) - else() - set( CORE_LIBRARIES ${W3EMC_LIBRARY} ) - endif() -endif( NOT W3EMC_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${W3EMC_LIBRARY} ) +else() + set( CORE_LIBRARIES ${W3EMC_LIBRARY} ) +endif() if( CORE_INCS ) list( APPEND CORE_INCS ${W3EMCINC} ) diff --git a/cmake/Modules/FindW3NCO.cmake b/cmake/Modules/FindW3NCO.cmake index aef2126c8f..0bdc184cc7 100644 --- a/cmake/Modules/FindW3NCO.cmake +++ b/cmake/Modules/FindW3NCO.cmake @@ -3,7 +3,6 @@ # List of include file paths for all required modules for GSI # CORE_LIBRARIES # Full list of libraries required to link GSI executable -include(findHelpers) if(DEFINED ENV{W3NCO_VER}) set(W3NCO_VER $ENV{W3NCO_VER}) STRING(REGEX REPLACE "v" "" W3NCO_VER ${W3NCO_VER}) @@ -16,66 +15,13 @@ if(NOT BUILD_W3NCO ) set(W3NCO_4_LIBRARY $ENV{W3NCO_LIB4} ) message("W3NCO library ${W3NCO_LIBRARY} set via Environment variable") message("W3NCO_4 library ${W3NCO_4_LIBRARY} set via Environment variable") - else() - find_library( W3NCO_LIBRARY - NAMES libw3nco_v${W3NCO_VER}_d.a libw3nco_d.a libw3nco_i4r8.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/w3nco/v${W3NCO_VER} - ${COREPATH}/w3nco/v${W3NCO_VER}/intel - ${COREPATH}/w3nco/v${W3NCO_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - message("Found W3NCO library ${W3NCO_LIBRARY}") - set( w3nco ${W3NCO_LIBRARY}) - - find_library( W3NCO_4_LIBRARY - NAMES libw3nco_v${W3NCO_VER}_4.a libw3nco_4.a - HINTS - $ENV{COREPATH}/lib - /usr/local/jcsda/nwprod_gdas_2014/lib - ${COREPATH}/w3nco/v${W3NCO_VER} - ${COREPATH}/w3nco/v${W3NCO_VER}/intel - ${COREPATH}/w3nco/v${W3NCO_VER}/ips/${COMPILER_VERSION} - PATH_SUFFIXES - lib - ${NO_DEFAULT_PATH}) - message("Found W3NCO_4 library ${W3NCO_4_LIBRARY}") - set( w3nco4 ${W3NCO_4_LIBRARY}) endif() endif() -if( NOT W3NCO_LIBRARY ) # didn't find the library, so build it from source - message("Could not find W3NCO library, so building from libsrc") - if( NOT DEFINED ENV{W3NCO_SRC} ) - findSrc( "w3nco" W3NCO_VER W3NCO_DIR ) - else() - set( W3NCO_DIR "$ENV{W3NCO_SRC}/libsrc" CACHE STRING "W3NCO Source Location") - endif() - set( libsuffix "_v${W3NCO_VER}${debug_suffix}" ) - set( W3NCO_LIBRARY "${LIBRARY_OUTPUT_PATH}/libw3nco${libsuffix}.a" CACHE STRING "W3NCO Library" ) - set( w3nco "w3nco${libsuffix}") - set( w3nco4 "w3nco_4${libsuffix}") - set( BUILD_W3NCO "ON" CACHE INTERNAL "Build the W3NCO library") - add_subdirectory(${CMAKE_SOURCE_DIR}/libsrc/w3nco) - set( W3NCO_LIBRARY ${w3nco} ) - set( W3NCO_4_LIBRARY ${w3nco4} ) - if( CORE_BUILT ) - list( APPEND CORE_BUILT ${W3NCO_LIBRARY} ) - list( APPEND CORE_BUILT ${W3NCO_4_LIBRARY} ) - else() - set( CORE_BUILT ${W3NCO_LIBRARY} ) - set( CORE_BUILT ${W3NCO_4_LIBRARY} ) - endif() -else( NOT W3NCO_LIBRARY ) - if( CORE_LIBRARIES ) - list( APPEND CORE_LIBRARIES ${W3NCO_LIBRARY} ) - else() - set( CORE_LIBRARIES ${W3NCO_LIBRARY} ) - endif() -endif( NOT W3NCO_LIBRARY ) +if( CORE_LIBRARIES ) + list( APPEND CORE_LIBRARIES ${W3NCO_LIBRARY} ) +else() + set( CORE_LIBRARIES ${W3NCO_LIBRARY} ) +endif() -set( W3NCO_DIR ${CMAKE_SOURCE_DIR}/libsrc/w3nco CACHE STRING "W3NCO Source Location") set( W3NCO_LIBRARY_PATH ${W3NCO_LIBRARY} CACHE STRING "W3NCO Library Location" ) diff --git a/cmake/Modules/findHelpers.cmake b/cmake/Modules/findHelpers.cmake deleted file mode 100644 index 028957a0a6..0000000000 --- a/cmake/Modules/findHelpers.cmake +++ /dev/null @@ -1,173 +0,0 @@ -function (findSrc varName version varDir ) - if(EXISTS ${CMAKE_SOURCE_DIR}/libsrc/${varName}) - message("setting source for ${varName} to be in libsrc") - set( ${varDir} "${CMAKE_SOURCE_DIR}/libsrc/${varName}" PARENT_SCOPE) - set( ${varCacheName} "${CMAKE_SOURCE_DIR}/libsrc/${varName}" CACHE STRING "" FORCE ) - else() - set(searchName ${varName}_v${${version}}) - message("searching for source for ${searchName} in ${CRTM_BASE}") - string( TOLOWER ${varName} varNameLower ) - find_path( TMP_DIR - NAMES ${searchName} - HINTS - ${CMAKE_SOURCE_DIR}/../libs - ${CRTM_BASE}/${version} - ${CRTM_BASE}/${varName} - ${CRTM_BASE}/${varName}/${version} - ${CRTM_BASE}/${varNameLower} - ${CRTM_BASE}/${varNameLower}/${version} - ${COREPATH}/sorc - $ENV{${varDir}}/libsrc - $ENV{${varDir}}/lib/sorc - $ENV{CORPATH}/lib/sorc - ${CMAKE_SOURCE_DIR}/libsrc/${varName} - ) - if( NOT TMP_DIR ) - message("didn't find directory") - set(secondSearchName v${${version}}) - find_path( TMP2_DIR - NAMES ${secondSearchName} - HINTS - ${CRTM_BASE}/${varName} - ) - endif() - set( varCacheName "${varDir}_SRC" ) - file(GLOB f_FILES "${TMP_DIR}/${varName}_v${${version}}/*.f*" "${TMP_DIR}/${varName}_v${${version}}/*.F*") - if( f_FILES ) - set( ${varDir} "${TMP_DIR}/${varName}_v${${version}}" PARENT_SCOPE) - set( ${varCacheName} "${TMP_DIR}/${varName}_v${${version}}" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${TMP_DIR}/${varName}_v${${version}}/src/*.f*" "${TMP_DIR}/${varName}_v${${version}}/src/*.F*") - if( f_FILES ) - set( ${varDir} "${TMP_DIR}/${varName}_v${${version}}/src" PARENT_SCOPE) - set( ${varCacheName} "${TMP_DIR}/${varName}_v${${version}}/src" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${TMP_DIR}/${varName}_v${${version}}/libsrc/*.f*" "${TMP_DIR}/${varName}_v${${version}}/src/*.F*") - if( f_FILES ) - set( ${varDir} "${TMP_DIR}/${varName}_v${${version}}/libsrc" PARENT_SCOPE) - set( ${varCacheName} "${TMP_DIR}/${varName}_v${${version}}/libsrc" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${TMP_DIR}/${varName}_v${${version}}/sorc/*.f*" "${TMP_DIR}/${varName}_v${${version}}/sorc/*.F*") - if( f_FILES ) - set( ${varDir} "${TMP_DIR}/${varName}_v${${version}}/sorc" PARENT_SCOPE) - set( ${varCacheName} "${TMP_DIR}/${varName}_v${${version}}/sorc" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${TMP_DIR}/${varName}_v${${version}}/sorc/libsrc/*.f*" - "${TMP_DIR}/${varName}_v${${version}}/sorc/libsrc/*.F*") - if( f_FILES ) - set( ${varDir} "${TMP_DIR}/${varName}_v${${version}}/sorc/libsrc" PARENT_SCOPE) - set( ${varCacheName} "${TMP_DIR}/${varName}_v${${version}}/sorc/libsrc" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${TMP2_DIR}/v${${version}}/src/*.f*" - "${TMP_DIR}/v${${version}}/src/*.F*") - if( f_FILES ) - set( ${varDir} "${TMP2_DIR}/v${${version}}/src" PARENT_SCOPE) - set( ${varCacheName} "${TMP2_DIR}/v${${version}}/src" CACHE STRING "" FORCE ) - endif() - endif() - endif() - endif() - endif() - endif() - if( NOT f_FILES ) # look for source that is of a different version - message("WARNING: Did not find ${${version}} of ${varName}, looking for alternates") - findOtherVersion( TMP_DIR ${varName} srcPath ${version} ) - file(GLOB f_FILES "${srcPath}/*.f*" "${srcPath}/*.F*") - if( f_FILES ) - set( ${varDir} "${srcPath}" PARENT_SCOPE) - set( ${varCacheName} "${srcPath}" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${srcPath}/src/*.f*" "${srcPath}/src/*.F*") - if( f_FILES ) - set( ${varDir} "${srcPath}/src" PARENT_SCOPE) - set( ${varCacheName} "${srcPath}/src" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${srcPath}/libsrc/*.f*" "${srcPath}/src/*.F*") - if( f_FILES ) - set( ${varDir} "${srcPath}/libsrc" PARENT_SCOPE) - set( ${varCacheName} "${srcPath}/libsrc" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${srcPath}/sorc/*.f*" "${srcPath}/sorc/*.F*") - if( f_FILES ) - set( ${varDir} "${srcPath}/sorc" PARENT_SCOPE) - set( ${varCacheName} "${srcPath}/sorc" CACHE STRING "" FORCE ) - else() - file(GLOB f_FILES "${srcPath}/sorc/libsrc/*.f*" - "${srcPath}/sorc/libsrc/*.F*") - if( f_FILES ) - set( ${varDir} "${srcPath}/sorc/libsrc" PARENT_SCOPE) - set( ${varCacheName} "${srcPath}/sorc/libsrc" CACHE STRING "" FORCE ) - endif() - endif() - endif() - endif() - endif() - endif() - endif() -endfunction() - -function (findInc incName version incFile ) - cmake_policy(SET CMP0011 NEW) - cmake_policy(SET CMP0009 NEW) - STRING(COMPARE EQUAL ${incFile} "CRTMINC" USECRTMBASE ) - if(( USECRTMBASE ) AND ( CRTM_BASE )) - execute_process(COMMAND find ${CRTM_BASE} -iname ${incName}_module.mod RESULT_VARIABLE res OUTPUT_VARIABLE INCFILES) -# file(GLOB_RECURSE INCFILES ${CRTM_BASE}/*${CRTM_VER}*/*mod ) -# file(GLOB_RECURSE INCFILES2 ${CRTM_BASE}/crtm/*${CRTM_VER}*/*/*mod ) -# list(APPEND INCFILES ${INCFILES2} ) - else() - if(crayComp) - if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - execute_process(COMMAND find ${COREPATH}/${incName}/v${${version}}/intel -iname ${incName}_module.mod RESULT_VARIABLE res OUTPUT_VARIABLE INCFILES) - else() - execute_process(COMMAND find ${COREPATH}/${incName}/v${${version}}/cray -iname ${incName}_module.mod RESULT_VARIABLE res OUTPUT_VARIABLE INCFILES) - endif() - else() - execute_process(COMMAND find ${COREPATH}/${incName} -iname ${incName}_module.mod RESULT_VARIABLE res OUTPUT_VARIABLE INCFILES) - endif() - if( NOT (INCFILES) ) - execute_process(COMMAND find ${COREPATH}/sorc -iname ${incName}_module.mod RESULT_VARIABLE res OUTPUT_VARIABLE INCFILES) - endif() - endif() -# message("incfiles are ${INCFILES}") - if( INCFILES ) - string(REGEX REPLACE "\n" ";" INCFILES ${INCFILES} ) - endif() - foreach( INC_FILE in ${INCFILES} ) - string(REGEX MATCH ${${version}} MATCHFOUND ${INC_FILE} ) -# message("matchfound is ${MATCHFOUND}, version is ${${version}} for ${INC_FILE}") - if( MATCHFOUND ) - message("found ${INC_FILE}") - string(REGEX REPLACE "${incName}_module.mod" "" INCPATH ${INC_FILE} ) - set( ${incFile} ${INCPATH} PARENT_SCOPE ) - return() - endif() - endforeach() - file(GLOB_RECURSE INCFILES ${COREPATH}/${incName}_module.mod ) - list(LENGTH INCFILES numFiles) - if(numFiles EQUAL 1) - get_filename_component( INCPATH ${INCFILES} DIRECTORY ) - else() - foreach( INC_FILE in ${INCFILES} ) - get_filename_component( INCPATH ${INC_FILE} DIRECTORY ) -# message("WARNING: Did not find explicit version ${${version}} of ${incName} module, using un-versioned path") -# set( ${incFile} ${INCPATH} PARENT_SCOPE ) -# return() - endforeach() - endif() - set( ${incFile} ${INCPATH} PARENT_SCOPE ) -endfunction() - -function (findOtherVersion rootPath srcName srcPath newVer ) - file(GLOB SRCDIRS ${${rootPath}}/${srcName}* ) - foreach( SRC_DIR in ${SRCDIRS} ) - string(REGEX MATCH ${srcName} MATCHFOUND ${SRC_DIR} ) - if( MATCHFOUND ) - set( ${srcPath} ${SRC_DIR} PARENT_SCOPE ) - string(REGEX MATCH "[0-9].[0-9].[0-9]" ALTVER ${SRC_DIR} ) - message("Found ${ALTVER} of ${srcName}. Proceeding with Alternative") - set( ${newVer} ${ALTVER} PARENT_SCOPE ) - return() - endif() - endforeach() -endfunction() diff --git a/libsrc b/libsrc deleted file mode 160000 index 071859a5c7..0000000000 --- a/libsrc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 071859a5c799761be786ccc4d17df6b2d0deb6e0 diff --git a/modulefiles/modulefile.ProdGSI.acorn b/modulefiles/modulefile.ProdGSI.acorn deleted file mode 100644 index 52b4afc341..0000000000 --- a/modulefiles/modulefile.ProdGSI.acorn +++ /dev/null @@ -1,33 +0,0 @@ -#%Module###################################################################### -## NOAA-EMC/GSI -##_____________________________________________________ -proc ModulesHelp { } { -puts stderr "Set environment variables for NOAA-EMC/GSI" -puts stderr "This module initializes the environment " -puts stderr "for the Intel Compiler Suite $version\n" -} -module-whatis " NOAA-EMC/GSI whatis description" - -set COMPILER intel - -# Load modules -module load envvar/1.0 -module load PrgEnv-intel/8.0.0 -module load intel/19.1.3.304 -module load intel/19.1.3.304/cray-mpich/8.1.4 -module load bacio/2.4.1 -module load bufr/11.4.0 -module load crtm/2.3.0 -module load ip/3.3.3 -module load nemsio/2.5.2 -module load prod_util/2.0.4 -module load sfcio/1.4.1 -module load sigio/2.3.2 -module load sp/2.3.3 -module load w3emc/2.7.3 -module load w3nco/2.4.1 - -module load cmake/3.18.4 -module load git/2.29.0 -module load hdf5/1.10.6 -module load netcdf/4.7.4 diff --git a/modulefiles/modulefile.ProdGSI.hera b/modulefiles/modulefile.ProdGSI.hera index aa158d2b89..246eb3cd46 100644 --- a/modulefiles/modulefile.ProdGSI.hera +++ b/modulefiles/modulefile.ProdGSI.hera @@ -42,3 +42,4 @@ module load w3emc/2.7.3 module load bacio/2.4.1 module load crtm/2.3.0 module load netcdf/4.7.4 +module load wrf_io/1.2.0 diff --git a/modulefiles/modulefile.ProdGSI.jet b/modulefiles/modulefile.ProdGSI.jet index 812b46fb0d..1b97300d01 100644 --- a/modulefiles/modulefile.ProdGSI.jet +++ b/modulefiles/modulefile.ProdGSI.jet @@ -42,3 +42,4 @@ module load w3emc/2.7.3 module load bacio/2.4.1 module load crtm/2.3.0 module load netcdf/4.7.4 +module load wrf_io/1.2.0 diff --git a/modulefiles/modulefile.ProdGSI.orion b/modulefiles/modulefile.ProdGSI.orion index 238887a9f5..5c4d35247e 100644 --- a/modulefiles/modulefile.ProdGSI.orion +++ b/modulefiles/modulefile.ProdGSI.orion @@ -47,3 +47,4 @@ module load w3emc/2.7.3 module load bacio/2.4.1 module load crtm/2.3.0 module load netcdf/4.7.4 +module load wrf_io/1.2.0 diff --git a/modulefiles/modulefile.ProdGSI.s4 b/modulefiles/modulefile.ProdGSI.s4 index 78064580e9..6f48ad578f 100644 --- a/modulefiles/modulefile.ProdGSI.s4 +++ b/modulefiles/modulefile.ProdGSI.s4 @@ -29,3 +29,4 @@ module load w3emc/2.7.3 module load bacio/2.4.1 module load crtm/2.3.0 module load netcdf/4.7.4 +module load wrf_io/1.2.0 diff --git a/modulefiles/modulefile.ProdGSI.wcoss_d b/modulefiles/modulefile.ProdGSI.wcoss_d index 81a63ec6ea..30207c297d 100644 --- a/modulefiles/modulefile.ProdGSI.wcoss_d +++ b/modulefiles/modulefile.ProdGSI.wcoss_d @@ -43,3 +43,4 @@ module load w3emc/2.7.3 module load bacio/2.4.1 module load crtm/2.3.0 module load netcdf/4.7.4 +module load wrf_io/1.2.0 diff --git a/util/Conventional_Monitor/CMakeLists.txt b/util/Conventional_Monitor/CMakeLists.txt index d4392dc80e..9b66fa9a7e 100644 --- a/util/Conventional_Monitor/CMakeLists.txt +++ b/util/Conventional_Monitor/CMakeLists.txt @@ -86,8 +86,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) set (CMAKE_Fortran_INC_FLAGS "-I ./ -I ${CORE_INCS} -I ${NETCDF_INCLUDE_DIRS} ") set(BUILD_NCDIAG ON) - set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/libsrc/ncdiag") - add_subdirectory(${PROJECT_SOURCE_DIR}/../../src/ncdiag ${PROJECT_BINARY_DIR}/libsrc/ncdiag) + set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/src/ncdiag/include") + add_subdirectory(src/ncdiag) set(NCDIAG_LIBRARIES ncdiag ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) endif() diff --git a/util/Correlated_Obs/CMakeLists.txt b/util/Correlated_Obs/CMakeLists.txt index 28137ad946..310683be11 100644 --- a/util/Correlated_Obs/CMakeLists.txt +++ b/util/Correlated_Obs/CMakeLists.txt @@ -69,9 +69,9 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) include_directories(${MPI_Fortran_INCLUDE_DIRS} ${MPI_INCLUDE_PATH} "./" ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) link_directories(${MPI_Fortran_LIBRARIES} ${ARCHIVE_OUTPUT_PATH} ) find_package( NetCDF REQUIRED) - set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/libsrc/ncdiag") set(BUILD_NCDIAG ON) - add_subdirectory(${PROJECT_SOURCE_DIR}/../../src/ncdiag ${PROJECT_BINARY_DIR}/libsrc/ncdiag) + set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/src/ncdiag/include") + add_subdirectory(src/ncdiag) set(NCDIAG_LIBRARIES ncdiag ) endif() set(COV_CALC_SRC ${CMAKE_CURRENT_SOURCE_DIR}/cov_calc.f90 ${CMAKE_CURRENT_SOURCE_DIR}/cconstants.f90 ${CMAKE_CURRENT_SOURCE_DIR}/ckinds.f90 ${CMAKE_CURRENT_SOURCE_DIR}/matrix_tools.f90 ${CMAKE_CURRENT_SOURCE_DIR}/obs_tools.f90 ${CMAKE_CURRENT_SOURCE_DIR}/pairs.f90 ${CMAKE_CURRENT_SOURCE_DIR}/readsatobs.f90 ${CMAKE_CURRENT_SOURCE_DIR}/read_diag.f90 ) diff --git a/util/Ozone_Monitor/CMakeLists.txt b/util/Ozone_Monitor/CMakeLists.txt index d130e2bca9..1b4acf7c40 100644 --- a/util/Ozone_Monitor/CMakeLists.txt +++ b/util/Ozone_Monitor/CMakeLists.txt @@ -84,8 +84,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) find_package( W3NCO ) set(BUILD_NCDIAG ON) - set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/libsrc/ncdiag") - add_subdirectory(${PROJECT_SOURCE_DIR}/../../src/ncdiag ${PROJECT_BINARY_DIR}/libsrc/ncdiag) + set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/src/ncdiag/include") + add_subdirectory(src/ncdiag) set(NCDIAG_LIBRARIES ncdiag ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) endif() diff --git a/util/Radiance_Monitor/CMakeLists.txt b/util/Radiance_Monitor/CMakeLists.txt index 707d286e6b..1bc451ea68 100644 --- a/util/Radiance_Monitor/CMakeLists.txt +++ b/util/Radiance_Monitor/CMakeLists.txt @@ -84,8 +84,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) find_package( W3NCO ) set(BUILD_NCDIAG ON) - set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/libsrc/ncdiag") - add_subdirectory(${PROJECT_SOURCE_DIR}/../../src/ncdiag ${PROJECT_BINARY_DIR}/libsrc/ncdiag) + set(NCDIAG_INCS "${PROJECT_BINARY_DIR}/src/ncdiag/include") + add_subdirectory(src/ncdiag) set(NCDIAG_LIBRARIES ncdiag ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) endif() From 82aef047d63d2cc1f56121bc047548bb12cb8394 Mon Sep 17 00:00:00 2001 From: Michael Lueken Date: Tue, 8 Mar 2022 13:42:27 +0000 Subject: [PATCH 26/26] GitHub Issue NOAA-EMC/GSI#295. Update global_satinfo.txt, in fix/rev2, to assimilate Metop-C AVHRR radiance data. --- fix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fix b/fix index 2ff80650bb..6720dce3c1 160000 --- a/fix +++ b/fix @@ -1 +1 @@ -Subproject commit 2ff80650bb769b9c883e758262a63025b99fe2ca +Subproject commit 6720dce3c168ab3a211c265d2a870c20bd220e35