From a64d4ca97cba2b56a8095b988eb210bf15bc29f6 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 2 Aug 2022 14:54:33 -0400 Subject: [PATCH 01/26] Commit GeoVaLs changes for radiances --- src/gsi/crtm_interface.f90 | 5 ++++- src/gsi/setuprad.f90 | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/gsi/crtm_interface.f90 b/src/gsi/crtm_interface.f90 index 2a890156d2..1f16b7a6bc 100644 --- a/src/gsi/crtm_interface.f90 +++ b/src/gsi/crtm_interface.f90 @@ -85,6 +85,7 @@ module crtm_interface public destroy_crtm ! Subroutine destroys initialization for crtm public sensorindex public surface +public atmosphere public isatid ! = 1 index of satellite id public itime ! = 2 index of analysis relative obs time public ilon ! = 3 index of grid relative obs location (x) @@ -125,6 +126,8 @@ module crtm_interface public idtw ! = 35/37 index of d(Tw) public idtc ! = 36/38 index of d(Tc) public itz_tr ! = 37/39 index of d(Tz)/d(Tr) +public n_clouds_fwd_wk +public n_absorbers ! For TMI and GMI public iedge_log ! = 32 ! index, if obs is to be obleted beause of locating near scan edges. @@ -202,6 +205,7 @@ module crtm_interface logical ,save :: mixed_use logical ,save :: use_gfdl_qsat integer(i_kind), parameter :: min_n_absorbers = 2 + integer(i_kind) :: n_absorbers integer(i_kind),save :: iedge_log integer(i_kind),save :: ilzen_ang2,ilazi_ang2,iscan_ang2,iszen_ang2,isazi_ang2 @@ -356,7 +360,6 @@ subroutine init_crtm(init_pass,mype_diaghdr,mype,nchanl,nreal,isis,obstype,radmo ! ...all "additional absorber" variables integer(i_kind) :: j,icount integer(i_kind) :: ig - integer(i_kind) :: n_absorbers logical quiet logical print_verbose diff --git a/src/gsi/setuprad.f90 b/src/gsi/setuprad.f90 index 92767d4391..92695c4fa9 100644 --- a/src/gsi/setuprad.f90 +++ b/src/gsi/setuprad.f90 @@ -281,9 +281,9 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& finish_sst_retrieval,spline_cub use m_dtime, only: dtime_setup, dtime_check use crtm_interface, only: init_crtm,call_crtm,destroy_crtm,sensorindex,surface,& - itime,ilon,ilat,ilzen_ang,ilazi_ang,iscan_ang,iscan_pos,iszen_ang,isazi_ang, & + atmosphere,itime,ilon,ilat,ilzen_ang,ilazi_ang,iscan_ang,iscan_pos,iszen_ang,isazi_ang, & ifrac_sea,ifrac_lnd,ifrac_ice,ifrac_sno,itsavg, & - izz,idomsfc,isfcr,iff10,ilone,ilate, & + izz,idomsfc,isfcr,iff10,ilone,ilate,n_clouds_fwd_wk,n_absorbers, & isst_hires,isst_navy,idata_type,iclr_sky,itref,idtw,idtc,itz_tr use qcmod, only: qc_ssmi,qc_geocsr,qc_ssu,qc_avhrr,qc_goesimg,qc_msu,qc_irsnd,qc_amsua,qc_mhs,qc_atms use crtm_interface, only: ilzen_ang2,iscan_ang2,iszen_ang2,isazi_ang2 @@ -2528,6 +2528,8 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) real(r_single),parameter:: missing = -9.99e9_r_single integer(i_kind),parameter:: imissing = -999999 real(r_kind),dimension(:),allocatable :: predbias_angord + character(128) :: fieldname + integer(i_kind) :: iabsorb, icloud if (adp_anglebc) then allocate(predbias_angord(angord) ) @@ -2703,7 +2705,32 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_data2d("BCPred_angord", sngl(predbias_angord) ) endif end if - + ! GeoVaLs for JEDI/UFO + ! Get GeoVaLs for surface + call nc_diag_metadata("Vegetation_Type", sngl(surface(1)%vegetation_type) ) + call nc_diag_metadata("Lai", sngl(surface(1)%lai) ) + call nc_diag_metadata("Soil_Type", sngl(surface(1)%soil_type) ) + + call nc_diag_metadata("Sfc_Wind_Direction", sngl(surface(1)%wind_direction) ) + call nc_diag_metadata("Sfc_Height", sngl(zsges ) ) ! do we need this for geoval? I think we do not + + ! Get GeoVaLs for atmosphere + call nc_diag_data2d("air_temperature", sngl(atmosphere(1)%temperature) ) ! K + call nc_diag_data2d("air_pressure", sngl(atmosphere(1)%pressure*r100) ) + call nc_diag_data2d("air_pressure_levels", sngl(atmosphere(1)%level_pressure*r100) ) + + ! Get GeoVaLs for atmospheric absorbers + do iabsorb = 1, n_absorbers + write (fieldname, "(A,I0.2)") "atmosphere_absorber_", atmosphere(1)%absorber_id(iabsorb) + call nc_diag_data2d(trim(fieldname), sngl(atmosphere(1)%absorber(:,iabsorb)) ) ! check %absorber_units + enddo + ! Get GeoVaLs for hydrometeors + do icloud = 1, n_clouds_fwd_wk + write (fieldname, "(A,I0.2)") "atmosphere_mass_content_of_cloud_", atmosphere(1)%Cloud(icloud)%Type + call nc_diag_data2d(trim(fieldname), sngl(atmosphere(1)%Cloud(icloud)%Water_Content) ) + write (fieldname, "(A,I0.2)") "effective_radius_of_cloud_particle_", atmosphere(1)%Cloud(icloud)%Type + call nc_diag_data2d(trim(fieldname), sngl(atmosphere(1)%Cloud(icloud)%Effective_Radius) ) + enddo enddo ! if (adp_anglebc) then if (.true.) then From 57dae0ce185fe96fc3c7c3099a24f2feb07aa7e0 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 2 Aug 2022 15:02:17 -0400 Subject: [PATCH 02/26] Write out some geovals for ozone --- src/gsi/setupoz.f90 | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index 24381df447..1971d4343f 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -113,7 +113,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& use state_vectors, only: svars3d, levels use constants, only : zero,half,one,two,tiny_r_kind - use constants, only : rozcon,cg_term,wgtlim,h300,r10 + use constants, only : rozcon,cg_term,wgtlim,h300,r10,r1000,constoz use m_obsdiagNode, only : obs_diag use m_obsdiagNode, only : obs_diags @@ -201,6 +201,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& real(r_kind),dimension(nlevs):: pobs,gross,tnoise real(r_kind),dimension(nreal+nlevs,nobs):: data real(r_kind),dimension(nsig+1)::prsitmp + real(r_kind),dimension(nsig)::ozgestmp ! GeoVaLs for JEDI/UFO real(r_single),dimension(nlevs):: pob4,grs4,err4 real(r_single),dimension(ireal,nobs):: diagbuf real(r_single),allocatable,dimension(:,:,:)::rdiagbuf @@ -409,7 +410,13 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& ozp_omi(nloz_omi) = prsitmp(1) call grdcrd1(ozp_omi(nloz_omi),prsitmp,nsig+1,-1) end if - + + ! GeoVaLs for JEDI/UFO + call tintrp2a1(ges_oz,ozgestmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_prsi, prsitmp,dlat,dlon,dtime,hrdifsig,& + nsig+1,mype,nfldsig) + if (obstype /= 'omieff' .and. obstype /= 'tomseff') then call intrp3oz1(ges_oz,ozges,dlat,dlon,ozp,dtime,& nlevs,mype,doz_dz) @@ -1686,7 +1693,9 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_endind", dhx_dx%end_ind) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif - + ! GeoVaLs for JEDI/UFO + call nc_diag_data2d("mole_fraction_of_ozone_in_air", sngl(ozgestmp*constoz)) + call nc_diag_data2d("air_pressure_levels",sngl(prsitmp*r1000)) if (lobsdiagsave) then do jj=1,miter if (odiag%muse(jj)) then From 674364619457d0baac1408490b0e41bb484c593b Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 2 Aug 2022 15:29:49 -0400 Subject: [PATCH 03/26] Some more ozone changes --- src/gsi/setupoz.f90 | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index 1971d4343f..fca5c778de 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -215,7 +215,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& type(sparr2) :: dhx_dx integer(i_kind) i,nlev,ii,jj,iextra,ibin, kk, nperobs - integer(i_kind) k,j,nz,jc,idia,irdim1,istatus,ioff0 + integer(i_kind) k1,k2,k,j,nz,jc,idia,irdim1,istatus,ioff0 integer(i_kind) ioff,itoss,ikeep,ierror_toq,ierror_poq integer(i_kind) isolz,ifovn,itoqf integer(i_kind) mm1,itime,ilat,ilon,ilate,ilone,itoq,ipoq @@ -581,14 +581,33 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& endif if (netcdf_diag) then + k1 = k + k2 = k - 1 + if(k2 == 0)k2 = 1 + if(k == nlevs)then + k1=nlevs-1 + k2=1 + endif + if (obstype == 'sbuv2' .or. obstype == 'ompsnp' ) then + call nc_diag_metadata("TopLevelPressure",sngl(pobs(k2)*r100)) + call nc_diag_metadata("BottomLevelPressure", & sngl(pobs(k1)*r100)) + else + call nc_diag_metadata("TopLevelPressure",sngl(prsitmp(nsig+1)*r1000) ) + call nc_diag_metadata("BottomLevelPressure", sngl(prsitmp(1)*r1000) ) + endif + call nc_diag_data2d("mole_fraction_of_ozone_in_air", sngl(ozgestmp*constoz)) + call nc_diag_data2d("air_pressure_levels",sngl(prsitmp*r1000)) call nc_diag_metadata("MPI_Task_Number", mype ) call nc_diag_metadata("Latitude", sngl(data(ilate,i)) ) call nc_diag_metadata("Longitude", sngl(data(ilone,i)) ) call nc_diag_metadata("Time", sngl(data(itime,i)-time_offset) ) - call nc_diag_metadata("Reference_Pressure", sngl(pobs(k)) ) + call nc_diag_metadata("Total_Ozone_Error_Flag", sngl(ierror_toq )) + call nc_diag_metadata("Profile_Ozone_Error_Flag", sngl(ierror_poq )) + call nc_diag_metadata("Reference_Pressure", sngl(pobs(k)*r100) ) call nc_diag_metadata("Analysis_Use_Flag", iouse(k) ) call nc_diag_metadata("Observation", sngl(ozobs(k))) call nc_diag_metadata("Inverse_Observation_Error", sngl(errorinv)) + call nc_diag_metadata("Input_Observation_Error", sngl(error(k))) call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(ozone_inv(k))) call nc_diag_metadata("Obs_Minus_Forecast_unadjusted",sngl(ozone_inv(k))) if (obstype == 'gome' .or. obstype == 'omieff' .or. & From 98872e011c88227f461d87e9482c2a1fd9430001 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 2 Aug 2022 15:39:04 -0400 Subject: [PATCH 04/26] Surface pressure changes --- src/gsi/setupps.f90 | 108 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 3 deletions(-) diff --git a/src/gsi/setupps.f90 b/src/gsi/setupps.f90 index 04344a2f7e..d7a69265ef 100644 --- a/src/gsi/setupps.f90 +++ b/src/gsi/setupps.f90 @@ -130,10 +130,11 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa use gridmod, only: nsig,get_ij,twodvar_regional use constants, only: zero,one_tenth,one,half,pi,g_over_rd, & huge_r_kind,tiny_r_kind,two,huge_single, & - r1000,wgtlim,tiny_single,r10,three + r1000,r100,wgtlim,tiny_single,r10,three use jfunc, only: jiter,last,jiterstart,miter use qcmod, only: dfact,dfact1,npres_print,vqc,nvqc use guess_grids, only: hrdifsig,ges_lnprsl,nfldsig,ntguessig + use guess_grids, only: geop_hgtl, ges_prsi, ges_tsen use convinfo, only: nconvtype,cermin,cermax,cgross,cvar_b,cvar_pg,ictype,icsubtype use convinfo, only: ibeta,ikapa @@ -181,6 +182,9 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa real(r_kind) cg_t,cvar,wgt,rat_err2,qcgross real(r_kind),dimension(nobs):: dup real(r_kind),dimension(nsig):: prsltmp + real(r_kind),dimension(nsig):: zges, prsltmp2, tvgestmp, tsentmp, qtmp, utmp, vtmp + real(r_kind) :: tgges,roges + real(r_kind),dimension(nsig+1):: prsitmp real(r_kind),dimension(nele,nobs):: data real(r_single),allocatable,dimension(:,:)::rdiagbuf @@ -190,6 +194,7 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa integer(i_kind) i,j,nchar,nreal,ii,jj,k,l,mm1 integer(i_kind) itype,isubtype integer(i_kind) ibb,ikk,idddd + integer(i_kind) msges logical,dimension(nobs):: luse,muse integer(i_kind),dimension(nobs):: ioid ! initial (pre-distribution) obs ID @@ -214,6 +219,8 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa real(r_kind),allocatable,dimension(:,:,: ) :: ges_ps real(r_kind),allocatable,dimension(:,:,: ) :: ges_z real(r_kind),allocatable,dimension(:,:,:,:) :: ges_tv + real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q + real(r_kind),allocatable,dimension(:,:,:,:) :: ges_u, ges_v type(sparr2) :: dhx_dx integer(i_kind) :: ps_ind, nnz, nind @@ -411,6 +418,28 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa call tintrp2a1(ges_lnprsl,prsltmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) +! interpolate geopotential height to location + call tintrp2a1(geop_hgtl, zges, dlat, dlon, dtime, hrdifsig, nsig, mype, nfldsig) + prsltmp2 = exp(prsltmp) ! pressure on model layers + ! pressure on interfaces + call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,nsig+1,mype,nfldsig) + ! virtual temperature profile + call tintrp2a1(ges_tv,tvgestmp,dlat,dlon,dtime,hrdifsig,nsig,mype,nfldsig) + ! sensible temperature profile + call tintrp2a1(ges_tsen,tsentmp,dlat,dlon,dtime,hrdifsig,nsig,mype,nfldsig) + ! specific humidity + call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,nsig,mype,nfldsig) + ! winds + call tintrp2a1(ges_u,utmp,dlat,dlon,dtime,hrdifsig,nsig,mype,nfldsig) + call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,nsig,mype,nfldsig) + ! landmask + msges = 0 + if(itype == 180 .or. itype == 182 .or. itype == 183 .or. itype == 199) then !sea + msges=0 + elseif(itype == 181 .or. itype == 187 .or. itype == 188) then !land + msges=1 + endif + ! Convert pressure to grid coordinates pgesorig = psges @@ -765,6 +794,61 @@ subroutine init_vars_ write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) endif +! get q ... + varname='q' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_q))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_q(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_q(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_q(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif + +! get u ... + varname='u' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_u))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_u(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_u(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_u(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif +! get v ... + varname='v' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_v))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_v(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_v(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_v(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif else write(6,*) trim(myname), ': inconsistent vector sizes (nfldsig,size(metguess_bundle) ',& nfldsig,size(gsi_metguess_bundle) @@ -946,8 +1030,23 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_endind", dhx_dx%end_ind) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif - - call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(exp(prsltmp)*r1000)) + ! geovals for JEDI UFO + call nc_diag_metadata("surface_geopotential_height", sngl(zsges)) + call nc_diag_metadata("surface_pressure", sngl(pgesorig*r100)) + !call nc_diag_metadata("surface_roughness", sngl()) + !call nc_diag_metadata("surface_height", sngl()) + !call nc_diag_metadata("skin_temperature", sngl(tgges)) + !call nc_diag_metadata("2m_temperature", sngl(tgges)) + !call nc_diag_metadata("2m_specific_humidity", sngl()) + call nc_diag_metadata("landmask", sngl(msges)) + call nc_diag_data2d("geopotential_height", sngl(zsges+zges)) + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) + call nc_diag_data2d("virtual_temperature", sngl(tvgestmp)) + call nc_diag_data2d("air_temperature", sngl(tsentmp)) + call nc_diag_data2d("specific_humidity", sngl(qtmp)) + call nc_diag_data2d("northward_wind", sngl(utmp)) + call nc_diag_data2d("eastward_wind", sngl(vtmp)) end subroutine contents_netcdf_diag_ @@ -955,6 +1054,9 @@ subroutine final_vars_ if(allocated(ges_tv)) deallocate(ges_tv) if(allocated(ges_z )) deallocate(ges_z ) if(allocated(ges_ps)) deallocate(ges_ps) + if(allocated(ges_q)) deallocate(ges_q) + if(allocated(ges_u)) deallocate(ges_u) + if(allocated(ges_v)) deallocate(ges_v) end subroutine final_vars_ end subroutine setupps From 528b0364b9fe7c011200ff6b45e560ca7a4508a7 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 2 Aug 2022 15:53:00 -0400 Subject: [PATCH 05/26] Ozone fixes --- src/gsi/setupoz.f90 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index fca5c778de..081817c97b 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -113,7 +113,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& use state_vectors, only: svars3d, levels use constants, only : zero,half,one,two,tiny_r_kind - use constants, only : rozcon,cg_term,wgtlim,h300,r10,r1000,constoz + use constants, only : rozcon,cg_term,wgtlim,h300,r10,r100,r1000,constoz use m_obsdiagNode, only : obs_diag use m_obsdiagNode, only : obs_diags @@ -1074,7 +1074,7 @@ subroutine setupozlev(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& use guess_grids, only : nfldsig,ges_lnprsl,hrdifsig use constants, only : zero,half,one,two,tiny_r_kind,four - use constants, only : cg_term,wgtlim,r10,constoz + use constants, only : cg_term,wgtlim,r10,r100,r1000,constoz use gsi_4dvar, only: nobs_bins,hr_obsbin @@ -1141,6 +1141,8 @@ subroutine setupozlev(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& real(r_kind) dpres,obserror,ozone_inv,preso3l real(r_kind),dimension(nreal+nlevs,nobs):: data real(r_kind),dimension(nsig):: prsltmp + real(r_kind),dimension(nsig+1)::prsitmp + real(r_kind),dimension(nsig)::ozgestmp ! GeoVaLs for JEDI/UFO real(r_single),dimension(ireal,nobs):: diagbuf real(r_single),allocatable,dimension(:,:,:)::rdiagbuf @@ -1299,6 +1301,12 @@ subroutine setupozlev(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& call tintrp2a1(ges_lnprsl,prsltmp,dlat,dlon,dtime,hrdifsig, & nsig,mype,nfldsig) + ! GeoVaLs for JEDI/UFO + call tintrp2a1(ges_oz,ozgestmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_prsi, prsitmp,dlat,dlon,dtime,hrdifsig,& + nsig+1,mype,nfldsig) + ! Get approximate k value of surface by using surface pressure ! for surface check. sfcchk=log(psges) From 7a5ad38448bad46c27143f2da926dcc246fc3c8b Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 2 Aug 2022 15:07:37 -0500 Subject: [PATCH 06/26] Finally fix ozone to build successfully --- src/gsi/setupoz.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index 081817c97b..8bd550c1bb 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -1072,6 +1072,7 @@ subroutine setupozlev(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& use obsmod, only : luse_obsdiag use guess_grids, only : nfldsig,ges_lnprsl,hrdifsig + use guess_grids, only : ges_prsi,ntguessig use constants, only : zero,half,one,two,tiny_r_kind,four use constants, only : cg_term,wgtlim,r10,r100,r1000,constoz From c8b3d1e41f1b468cb47c5472fdec4aaa31b9d00a Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 4 Aug 2022 10:34:40 -0500 Subject: [PATCH 07/26] Add geovals to setupt --- src/gsi/setupt.f90 | 60 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/src/gsi/setupt.f90 b/src/gsi/setupt.f90 index cba794c861..cc51e12829 100644 --- a/src/gsi/setupt.f90 +++ b/src/gsi/setupt.f90 @@ -277,7 +277,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),dimension(npredt):: pred real(r_kind),dimension(npredt):: predcoef real(r_kind) tgges,roges - real(r_kind),dimension(nsig):: tvtmp,qtmp,utmp,vtmp,hsges + real(r_kind),dimension(nsig):: ttmp,tvtmp,qtmp,utmp,vtmp,hsges real(r_kind) u10ges,v10ges,t2ges,q2ges,psges2,f10ges real(r_kind),dimension(34) :: ptablt real(r_single),allocatable,dimension(:,:)::rdiagbuf @@ -333,6 +333,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),allocatable,dimension(:,:,: ) :: ges_ps real(r_kind),allocatable,dimension(:,:,:,:) :: ges_u real(r_kind),allocatable,dimension(:,:,:,:) :: ges_v + real(r_kind),allocatable,dimension(:,:,:,:) :: ges_t real(r_kind),allocatable,dimension(:,:,:,:) :: ges_tv real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q real(r_kind),allocatable,dimension(:,:,: ) :: ges_q2 @@ -654,6 +655,22 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call tintrp2a1(ges_lnprsl,prsltmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) +! GEOVALS for UFO eval + psges2 = psges ! keep in cb + prsltmp2 = exp(prsltmp) + call tintrp2a1(ges_t,ttmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_u,utmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + +! END GEOVALS + drpx=zero if(sfctype .and. .not.twodvar_regional) then drpx=abs(one-((one/exp(dpres-log(psges))))**rd_over_cp)*t0c @@ -1375,6 +1392,24 @@ subroutine init_vars_ write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) endif +! get t ... + varname='t' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_t))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_t(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_t(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_t(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif ! get tv ... varname='tv' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) @@ -1750,8 +1785,15 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif - ! need additional arrays for GeoVaLs for T2 - call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(exp(prsltmp)*r1000)) + ! GEOVALS + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp)) + call nc_diag_data2d("specific_humidity", sngl(qtmp)) + call nc_diag_data2d("eastward_wind", sngl(utmp)) + call nc_diag_data2d("northward_wind", sngl(vtmp)) + call nc_diag_metadata("surface_geopotential_height", sngl(hsges) ) + call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) + ! END GEOVALS end subroutine contents_netcdf_diag_ @@ -1822,13 +1864,21 @@ subroutine contents_netcdf_diagp_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif - ! need additional arrays for GeoVaLs for T2 - call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(exp(prsltmp)*r1000)) + ! GEOVALS + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp)) + call nc_diag_data2d("specific_humidity", sngl(qtmp)) + call nc_diag_data2d("eastward_wind", sngl(utmp)) + call nc_diag_data2d("northward_wind", sngl(vtmp)) + call nc_diag_metadata("surface_geopotential_height", sngl(hsges) ) + call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) + ! END GEOVALS end subroutine contents_netcdf_diagp_ subroutine final_vars_ if(allocated(ges_q )) deallocate(ges_q ) + if(allocated(ges_t)) deallocate(ges_t) if(allocated(ges_tv)) deallocate(ges_tv) if(allocated(ges_v )) deallocate(ges_v ) if(allocated(ges_u )) deallocate(ges_u ) From f1b377a3ea61355b9a1232ee25320fd2ab45da75 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 4 Aug 2022 10:58:57 -0500 Subject: [PATCH 08/26] Some setupt geoval fixes --- src/gsi/setupt.f90 | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/gsi/setupt.f90 b/src/gsi/setupt.f90 index cc51e12829..4be9e3900c 100644 --- a/src/gsi/setupt.f90 +++ b/src/gsi/setupt.f90 @@ -333,7 +333,6 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),allocatable,dimension(:,:,: ) :: ges_ps real(r_kind),allocatable,dimension(:,:,:,:) :: ges_u real(r_kind),allocatable,dimension(:,:,:,:) :: ges_v - real(r_kind),allocatable,dimension(:,:,:,:) :: ges_t real(r_kind),allocatable,dimension(:,:,:,:) :: ges_tv real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q real(r_kind),allocatable,dimension(:,:,: ) :: ges_q2 @@ -658,7 +657,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! GEOVALS for UFO eval psges2 = psges ! keep in cb prsltmp2 = exp(prsltmp) - call tintrp2a1(ges_t,ttmp,dlat,dlon,dtime,hrdifsig,& + call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) @@ -1392,24 +1391,6 @@ subroutine init_vars_ write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) endif -! get t ... - varname='t' - call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) - if (istatus==0) then - if(allocated(ges_t))then - write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' - call stop2(999) - endif - allocate(ges_t(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) - ges_t(:,:,:,1)=rank3 - do ifld=2,nfldsig - call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) - ges_t(:,:,:,ifld)=rank3 - enddo - else - write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus - call stop2(999) - endif ! get tv ... varname='tv' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) @@ -1791,7 +1772,7 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) call nc_diag_data2d("northward_wind", sngl(vtmp)) - call nc_diag_metadata("surface_geopotential_height", sngl(hsges) ) + call nc_diag_metadata("geopotential_height", sngl(hsges) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) ! END GEOVALS @@ -1878,7 +1859,6 @@ end subroutine contents_netcdf_diagp_ subroutine final_vars_ if(allocated(ges_q )) deallocate(ges_q ) - if(allocated(ges_t)) deallocate(ges_t) if(allocated(ges_tv)) deallocate(ges_tv) if(allocated(ges_v )) deallocate(ges_v ) if(allocated(ges_u )) deallocate(ges_u ) From 60aef029d0db774d58c7a422915316097176f05a Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 4 Aug 2022 12:47:13 -0500 Subject: [PATCH 09/26] setupq geovals + compile bugfixes --- src/gsi/setupq.f90 | 78 ++++++++++++++++++++++++++++++++++++++++++++-- src/gsi/setupt.f90 | 4 +-- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/gsi/setupq.f90 b/src/gsi/setupq.f90 index 719b14f750..36f72053d1 100644 --- a/src/gsi/setupq.f90 +++ b/src/gsi/setupq.f90 @@ -155,6 +155,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav 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,ges_qsat + use guess_grids, only: geop_hgtl 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 @@ -235,6 +236,8 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),dimension(34):: ptablq real(r_single),allocatable,dimension(:,:)::rdiagbuf real(r_single),allocatable,dimension(:,:)::rdiagbufp + real(r_kind),dimension(nsig):: prsltmp2, ttmp, qtmp, utmp,vtmp,hsges + real(r_kind) :: psges2 integer(i_kind) i,j,nchar,nreal,ii,l,jj,mm1,itemp,iip @@ -277,6 +280,8 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),allocatable,dimension(:,:,: ) :: ges_ps real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q real(r_kind),allocatable,dimension(:,:,: ) :: ges_q2m + real(r_kind),allocatable,dimension(:,:,:,:) :: ges_u + real(r_kind),allocatable,dimension(:,:,:,:) :: ges_v logical:: l_pbl_pseudo_itype integer(i_kind):: ich0 @@ -506,6 +511,21 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call tintrp2a1(ges_lnprsl,prsltmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) +! GEOVALS for UFO eval + psges2 = psges ! keep in cb + prsltmp2 = exp(prsltmp) + call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_u,utmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + +! END GEOVALS presq=r10*exp(dpres) itype=ictype(ikx) dprpx=zero @@ -1044,6 +1064,42 @@ subroutine init_vars_ call stop2(999) endif endif ! i_use_2mq4b +! get u ... + varname='u' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_u))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_u(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_u(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_u(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif +! get v ... + varname='v' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_v))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_v(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_v(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_v(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif ! get q ... varname='q' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) @@ -1324,7 +1380,15 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif - call nc_diag_data2d("atmosphere_pressure_coordinate",exp(prsltmp)*r1000) + ! GEOVALS + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp)) + call nc_diag_data2d("specific_humidity", sngl(qtmp)) + call nc_diag_data2d("eastward_wind", sngl(utmp)) + call nc_diag_data2d("northward_wind", sngl(vtmp)) + call nc_diag_data2d("geopotential_height", sngl(hsges) ) + call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) + ! END GEOVALS end subroutine contents_netcdf_diag_ @@ -1394,13 +1458,23 @@ subroutine contents_netcdf_diagp_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif - call nc_diag_data2d("atmosphere_pressure_coordinate",exp(prsltmp)*r1000) + ! GEOVALS + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp)) + call nc_diag_data2d("specific_humidity", sngl(qtmp)) + call nc_diag_data2d("eastward_wind", sngl(utmp)) + call nc_diag_data2d("northward_wind", sngl(vtmp)) + call nc_diag_data2d("geopotential_height", sngl(hsges) ) + call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) + ! END GEOVALS end subroutine contents_netcdf_diagp_ subroutine final_vars_ if(allocated(ges_q2m)) deallocate(ges_q2m) if(allocated(ges_q )) deallocate(ges_q ) + if(allocated(ges_u )) deallocate(ges_u ) + if(allocated(ges_v )) deallocate(ges_v ) if(allocated(ges_ps)) deallocate(ges_ps) end subroutine final_vars_ diff --git a/src/gsi/setupt.f90 b/src/gsi/setupt.f90 index 4be9e3900c..eea5483b4f 100644 --- a/src/gsi/setupt.f90 +++ b/src/gsi/setupt.f90 @@ -1772,7 +1772,7 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) call nc_diag_data2d("northward_wind", sngl(vtmp)) - call nc_diag_metadata("geopotential_height", sngl(hsges) ) + call nc_diag_data2d("geopotential_height", sngl(hsges) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) ! END GEOVALS @@ -1851,7 +1851,7 @@ subroutine contents_netcdf_diagp_(odiag) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) call nc_diag_data2d("northward_wind", sngl(vtmp)) - call nc_diag_metadata("surface_geopotential_height", sngl(hsges) ) + call nc_diag_data2d("surface_geopotential_height", sngl(hsges) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) ! END GEOVALS From 942689a60734f4a64bf93492ea417dcee0cefd34 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 6 Sep 2022 10:36:13 -0500 Subject: [PATCH 10/26] More changes --- src/gsi/setupps.f90 | 2 +- src/gsi/setupq.f90 | 6 +++++ src/gsi/setupt.f90 | 6 +++++ src/gsi/setupw.f90 | 54 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/gsi/setupps.f90 b/src/gsi/setupps.f90 index d7a69265ef..7e6499f7dd 100644 --- a/src/gsi/setupps.f90 +++ b/src/gsi/setupps.f90 @@ -1031,7 +1031,7 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val,r_single)) endif ! geovals for JEDI UFO - call nc_diag_metadata("surface_geopotential_height", sngl(zsges)) + call nc_diag_metadata("surface_geometric_height", sngl(zsges)) call nc_diag_metadata("surface_pressure", sngl(pgesorig*r100)) !call nc_diag_metadata("surface_roughness", sngl()) !call nc_diag_metadata("surface_height", sngl()) diff --git a/src/gsi/setupq.f90 b/src/gsi/setupq.f90 index 36f72053d1..b9750dde21 100644 --- a/src/gsi/setupq.f90 +++ b/src/gsi/setupq.f90 @@ -156,6 +156,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav use oneobmod, only: oneobtest,maginnov,magoberr use guess_grids, only: ges_lnprsl,hrdifsig,nfldsig,ges_tsen,ges_prsl,pbl_height,ges_qsat use guess_grids, only: geop_hgtl + use guess_grids, only: ges_prsi 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 @@ -238,6 +239,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_single),allocatable,dimension(:,:)::rdiagbufp real(r_kind),dimension(nsig):: prsltmp2, ttmp, qtmp, utmp,vtmp,hsges real(r_kind) :: psges2 + real(r_kind),dimension(nsig+1):: prsitmp integer(i_kind) i,j,nchar,nreal,ii,l,jj,mm1,itemp,iip @@ -514,6 +516,8 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! GEOVALS for UFO eval psges2 = psges ! keep in cb prsltmp2 = exp(prsltmp) + call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,& + nsig+1,mype,nfldsig) call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& @@ -1382,6 +1386,7 @@ subroutine contents_netcdf_diag_(odiag) ! GEOVALS call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp)) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) @@ -1460,6 +1465,7 @@ subroutine contents_netcdf_diagp_(odiag) ! GEOVALS call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp)) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) diff --git a/src/gsi/setupt.f90 b/src/gsi/setupt.f90 index eea5483b4f..ff09b4b0ea 100644 --- a/src/gsi/setupt.f90 +++ b/src/gsi/setupt.f90 @@ -58,6 +58,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav use guess_grids, only: nfldsig, hrdifsig,ges_lnprsl,& geop_hgtl,ges_tsen,pbl_height + use guess_grids, only: ges_prsi use state_vectors, only: svars3d, levels use constants, only: zero, one, four,t0c,rd_over_cp,three,rd_over_cp_mass,ten @@ -285,6 +286,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),dimension(nsig):: prsltmp2 + real(r_kind),dimension(nsig+1):: prsitmp integer(i_kind) i,j,nchar,nreal,k,ii,iip,jj,l,nn,ibin,idia,idia0,ix,ijb integer(i_kind) mm1,jsig,iqt @@ -657,6 +659,8 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! GEOVALS for UFO eval psges2 = psges ! keep in cb prsltmp2 = exp(prsltmp) + call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,& + nsig+1,mype,nfldsig) call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& @@ -1768,6 +1772,7 @@ subroutine contents_netcdf_diag_(odiag) ! GEOVALS call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp)) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) @@ -1847,6 +1852,7 @@ subroutine contents_netcdf_diagp_(odiag) ! GEOVALS call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp)) call nc_diag_data2d("specific_humidity", sngl(qtmp)) call nc_diag_data2d("eastward_wind", sngl(utmp)) diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index 9f23ab3571..9aecfe3750 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -55,6 +55,8 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav use guess_grids, only: nfldsig,hrdifsig,geop_hgtl,sfcmod_gfs use guess_grids, only: tropprs,sfcmod_mm5 use guess_grids, only: ges_lnprsl,comp_fact10,pbl_height + use guess_grids, only: ges_tsen + use guess_grids, only: ges_prsi use constants, only: zero,half,one,tiny_r_kind,two, & three,rd,grav,four,five,huge_single,r1000,wgtlim,r10,r400 use constants, only: grav_ratio,flattening,deg2rad, & @@ -279,6 +281,10 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind) wdirob,wdirgesin,wdirdiffmax real(r_kind),dimension(34)::ptabluv real(r_single),allocatable,dimension(:,:)::rdiagbuf + real(r_kind),dimension(nsig):: prsltmp2 + real(r_kind),dimension(nsig+1):: prsitmp + real(r_kind),dimension(nsig):: ttmp,qtmp,utmp,vtmp,hsges + real(r_kind) psges2 integer(i_kind) i,nchar,nreal,k,j,l,ii,itype,ijb ! Variables needed for new polar winds QC based on Log Normalized Vector Departure (LNVD) @@ -334,6 +340,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),allocatable,dimension(:,:,: ) :: ges_ps real(r_kind),allocatable,dimension(:,:,: ) :: ges_z + real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q real(r_kind),allocatable,dimension(:,:,:,:) :: ges_u real(r_kind),allocatable,dimension(:,:,:,:) :: ges_v real(r_kind),allocatable,dimension(:,:,:,:) :: ges_tv @@ -585,6 +592,23 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call tintrp2a1(ges_lnprsl,prsltmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) +! GEOVALS for UFO eval + psges2 = psges ! keep in cb + prsltmp2 = exp(prsltmp) + call tintrp2a1(ges_prsi,prsitmp,dlat,dlon,dtime,hrdifsig,& + nsig+1,mype,nfldsig) + call tintrp2a1(ges_tsen,ttmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_u,utmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& + nsig,mype,nfldsig) + +! END GEOVALS ! Type 221=pibal winds contain a mixture of wind observations reported ! by pressure and others by height. Those levels only reported by ! pressure have a missing value (ie, large) value for the reported @@ -1571,6 +1595,24 @@ subroutine init_vars_ write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) endif +! get q ... + varname='q' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) + if (istatus==0) then + if(allocated(ges_q))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_q(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) + ges_q(:,:,:,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) + ges_q(:,:,:,ifld)=rank3 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus + call stop2(999) + endif ! get u ... varname='u' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) @@ -1884,7 +1926,16 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_data2d("v_Observation_Operator_Jacobian_val", real(dhx_dx_v%val,r_single)) endif - call nc_diag_data2d("atmosphere_pressure_coordinate", exp(prsltmp)*r1000) + ! GEOVALS + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp)) + call nc_diag_data2d("specific_humidity", sngl(qtmp)) + call nc_diag_data2d("eastward_wind", sngl(utmp)) + call nc_diag_data2d("northward_wind", sngl(vtmp)) + call nc_diag_data2d("geopotential_height", sngl(hsges) ) + call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) + ! END GEOVALS end subroutine contents_netcdf_diag_ @@ -1892,6 +1943,7 @@ subroutine final_vars_ if(allocated(ges_tv)) deallocate(ges_tv) if(allocated(ges_v )) deallocate(ges_v ) if(allocated(ges_u )) deallocate(ges_u ) + if(allocated(ges_q )) deallocate(ges_q ) if(allocated(ges_z )) deallocate(ges_z ) if(allocated(ges_ps)) deallocate(ges_ps) end subroutine final_vars_ From fe2af902cc117822f3b252ad0a83de8586216d78 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 6 Sep 2022 11:07:40 -0500 Subject: [PATCH 11/26] Add tropopause pressure --- src/gsi/setupw.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index 9aecfe3750..109ebf5df2 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -58,7 +58,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav use guess_grids, only: ges_tsen use guess_grids, only: ges_prsi use constants, only: zero,half,one,tiny_r_kind,two, & - three,rd,grav,four,five,huge_single,r1000,wgtlim,r10,r400 + three,rd,grav,four,five,huge_single,r100,r1000,wgtlim,r10,r400 use constants, only: grav_ratio,flattening,deg2rad, & grav_equator,somigliana,semi_major_axis,eccentricity use jfunc, only: jiter,last,jiterstart,miter @@ -1934,6 +1934,7 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_data2d("eastward_wind", sngl(utmp)) call nc_diag_data2d("northward_wind", sngl(vtmp)) call nc_diag_data2d("geopotential_height", sngl(hsges) ) + call nc_diag_data2d("tropopause_pressure", sngl(trop5*r100) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) ! END GEOVALS From 77ed099f7368d5c52b5d5aab44c8135e4553ed22 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 6 Sep 2022 11:16:47 -0500 Subject: [PATCH 12/26] Fix diag call for trop prs --- src/gsi/setupw.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index 109ebf5df2..01dcf7f718 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -1934,7 +1934,7 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_data2d("eastward_wind", sngl(utmp)) call nc_diag_data2d("northward_wind", sngl(vtmp)) call nc_diag_data2d("geopotential_height", sngl(hsges) ) - call nc_diag_data2d("tropopause_pressure", sngl(trop5*r100) ) + call nc_diag_metadata("tropopause_pressure", sngl(trop5*r100) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) ! END GEOVALS From 95a42723174aa27aa54446dfe663d90361d6d11d Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 13 Sep 2022 11:33:22 -0500 Subject: [PATCH 13/26] Add trop5 to setuprad; isli to setupw --- src/gsi/setuprad.f90 | 2 ++ src/gsi/setupw.f90 | 1 + 2 files changed, 3 insertions(+) diff --git a/src/gsi/setuprad.f90 b/src/gsi/setuprad.f90 index 956d47b49c..82b1fab89a 100644 --- a/src/gsi/setuprad.f90 +++ b/src/gsi/setuprad.f90 @@ -2730,6 +2730,8 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("Sfc_Wind_Direction", sngl(surface(1)%wind_direction) ) call nc_diag_metadata("Sfc_Height", sngl(zsges ) ) ! do we need this for geoval? I think we do not + call nc_diag_metadata("tropopause_pressure", sngl(trop5)) + ! Get GeoVaLs for atmosphere call nc_diag_data2d("air_temperature", sngl(atmosphere(1)%temperature) ) ! K call nc_diag_data2d("air_pressure", sngl(atmosphere(1)%pressure*r100) ) diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index 01dcf7f718..fdbea0e22e 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -1936,6 +1936,7 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_data2d("geopotential_height", sngl(hsges) ) call nc_diag_metadata("tropopause_pressure", sngl(trop5*r100) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) + call nc_diag_metadata("Land_Type_Index", sngl(isli)) ! END GEOVALS end subroutine contents_netcdf_diag_ From 59a34150dc64095bae49ed89816da36a75053539 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 6 Oct 2022 10:42:46 -0500 Subject: [PATCH 14/26] Changes to read_satwind, NOT done or tested --- src/gsi/read_satwnd.f90 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index 874483c86e..0d82c9cc02 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -271,7 +271,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ! Set lower limits for observation errors werrmin=one nsattype=0 - nreal=27 + nreal=33 if(perturb_obs ) nreal=nreal+2 ntread=1 ntmatch=0 @@ -1587,10 +1587,17 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis cdata_all(25,iout)=var_jb ! non linear qc parameter cdata_all(26,iout)=one ! hilbert curve weight cdata_all(27,iout)=obsdat(5) ! AMVQ for GOES-17 mitig.AMVs + ! extra variables for satwind qc for brett + cdata_all(28,iout)=hdrdat(9) ! wind computation method + cdata_all(29,iout)=hdrdat(10) ! satellite zenith angle + cdata_all(30,iout)=hdrdat(1) ! satellite identifier + cdata_all(31,iout)=qcdat(1) ! data provider origin + cdata_all(32,iout)=qcdat(2) ! generating applicattion + cdata_all(33,iout)=qcdat(3) ! percent confidence if(perturb_obs)then - cdata_all(28,iout)=ran01dom()*perturb_fact ! u perturbation - cdata_all(29,iout)=ran01dom()*perturb_fact ! v perturbation + cdata_all(34,iout)=ran01dom()*perturb_fact ! u perturbation + cdata_all(35,iout)=ran01dom()*perturb_fact ! v perturbation endif enddo loop_readsb From 07276f3e9b86ef53914f2621978430874d9d4a78 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 6 Oct 2022 13:12:24 -0500 Subject: [PATCH 15/26] try to build with changes for brett --- src/gsi/read_prepbufr.f90 | 2 +- src/gsi/setupw.f90 | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gsi/read_prepbufr.f90 b/src/gsi/read_prepbufr.f90 index d2cb503926..79b8d5dcf1 100644 --- a/src/gsi/read_prepbufr.f90 +++ b/src/gsi/read_prepbufr.f90 @@ -475,7 +475,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& if(tob)then nreal=25 else if(uvob) then - nreal=27 + nreal=33 else if(spdob) then nreal=24 else if(psob) then diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index fdbea0e22e..98af0618ac 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -1938,6 +1938,14 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) call nc_diag_metadata("Land_Type_Index", sngl(isli)) ! END GEOVALS + ! extra fields for AMV QC + call nc_diag_metadata("wind_computation_method", sngl(data(28,i))) + call nc_diag_metadata("satellite_zenith_angle", sngl(data(29,i))) + call nc_diag_metadata("satellite_identifier", sngl(data(30,i))) + call nc_diag_metadata("data_provider_origin", sngl(data(31,i))) + call nc_diag_metadata("generating_application", sngl(data(32,i))) + call nc_diag_metadata("percent_confidence", sngl(data(33,i))) + ! end extra AMV QC fields end subroutine contents_netcdf_diag_ From 3adfc2d97b60b28cf342dedc3dacd19565028d98 Mon Sep 17 00:00:00 2001 From: Andrew Collard <40322596+ADCollard@users.noreply.github.com> Date: Thu, 6 Oct 2022 15:51:19 -0400 Subject: [PATCH 16/26] trop5 is in kPa - convert to hPa (#12) --- src/gsi/setuprad.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gsi/setuprad.f90 b/src/gsi/setuprad.f90 index 82b1fab89a..6a81368250 100644 --- a/src/gsi/setuprad.f90 +++ b/src/gsi/setuprad.f90 @@ -2730,7 +2730,7 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("Sfc_Wind_Direction", sngl(surface(1)%wind_direction) ) call nc_diag_metadata("Sfc_Height", sngl(zsges ) ) ! do we need this for geoval? I think we do not - call nc_diag_metadata("tropopause_pressure", sngl(trop5)) + call nc_diag_metadata("tropopause_pressure", sngl(trop5*10.0_r_kind)) ! trop5 is in kPa - convert to hPa ! Get GeoVaLs for atmosphere call nc_diag_data2d("air_temperature", sngl(atmosphere(1)%temperature) ) ! K From 9ef78b4d334d764cc363aab32732283434d7acec Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Fri, 7 Oct 2022 08:42:08 -0500 Subject: [PATCH 17/26] able to compile first round attempt for brett --- src/gsi/read_satwnd.f90 | 6 +++--- src/gsi/setupw.f90 | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index 0d82c9cc02..009411da07 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -1591,9 +1591,9 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis cdata_all(28,iout)=hdrdat(9) ! wind computation method cdata_all(29,iout)=hdrdat(10) ! satellite zenith angle cdata_all(30,iout)=hdrdat(1) ! satellite identifier - cdata_all(31,iout)=qcdat(1) ! data provider origin - cdata_all(32,iout)=qcdat(2) ! generating applicattion - cdata_all(33,iout)=qcdat(3) ! percent confidence + cdata_all(31,iout)=qifn ! QI without forecast + cdata_all(32,iout)=qify ! QI with forecast + cdata_all(33,iout)=ee ! expected error if(perturb_obs)then cdata_all(34,iout)=ran01dom()*perturb_fact ! u perturbation diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index 98af0618ac..6c08d1bcf5 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -1942,9 +1942,9 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_metadata("wind_computation_method", sngl(data(28,i))) call nc_diag_metadata("satellite_zenith_angle", sngl(data(29,i))) call nc_diag_metadata("satellite_identifier", sngl(data(30,i))) - call nc_diag_metadata("data_provider_origin", sngl(data(31,i))) - call nc_diag_metadata("generating_application", sngl(data(32,i))) - call nc_diag_metadata("percent_confidence", sngl(data(33,i))) + call nc_diag_metadata("QI_without_forecast_info", sngl(data(31,i))) + call nc_diag_metadata("QI_with_forecast_info", sngl(data(32,i))) + call nc_diag_metadata("expected_error", sngl(data(33,i))) ! end extra AMV QC fields end subroutine contents_netcdf_diag_ From f9a35ccb191e54be5cc9aefb96c4322ac773da60 Mon Sep 17 00:00:00 2001 From: Andrew Collard Date: Fri, 7 Oct 2022 11:17:13 -0500 Subject: [PATCH 18/26] Convert tropopause pressure to Pa not hPA --- src/gsi/setuprad.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gsi/setuprad.f90 b/src/gsi/setuprad.f90 index 6a81368250..552e357cde 100644 --- a/src/gsi/setuprad.f90 +++ b/src/gsi/setuprad.f90 @@ -275,7 +275,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& use gridmod, only: nsig,regional,get_ij use satthin, only: super_val1 use constants, only: quarter,half,tiny_r_kind,zero,one,deg2rad,rad2deg,one_tenth, & - two,three,cg_term,wgtlim,r100,r10,r0_01,r_missing + two,three,cg_term,wgtlim,r100,r1000,r10,r0_01,r_missing use jfunc, only: jiter,miter,jiterstart use sst_retrieval, only: setup_sst_retrieval,avhrr_sst_retrieval,& finish_sst_retrieval,spline_cub @@ -2730,7 +2730,7 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("Sfc_Wind_Direction", sngl(surface(1)%wind_direction) ) call nc_diag_metadata("Sfc_Height", sngl(zsges ) ) ! do we need this for geoval? I think we do not - call nc_diag_metadata("tropopause_pressure", sngl(trop5*10.0_r_kind)) ! trop5 is in kPa - convert to hPa + call nc_diag_metadata("tropopause_pressure", sngl(trop5*r1000)) ! trop5 is in kPa - convert to Pa for JEDI ! Get GeoVaLs for atmosphere call nc_diag_data2d("air_temperature", sngl(atmosphere(1)%temperature) ) ! K From 06e8a855769d331088c6dbcbb5797f349e9935ed Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Fri, 14 Oct 2022 14:46:21 -0500 Subject: [PATCH 19/26] Changes for seviri and satwinds --- src/gsi/read_prepbufr.f90 | 2 +- src/gsi/read_satwnd.f90 | 7 ++++--- src/gsi/setuprad.f90 | 1 + src/gsi/setupw.f90 | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/gsi/read_prepbufr.f90 b/src/gsi/read_prepbufr.f90 index 79b8d5dcf1..3157d5ccf6 100644 --- a/src/gsi/read_prepbufr.f90 +++ b/src/gsi/read_prepbufr.f90 @@ -475,7 +475,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& if(tob)then nreal=25 else if(uvob) then - nreal=33 + nreal=34 else if(spdob) then nreal=24 else if(psob) then diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index 009411da07..af9357814f 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -271,7 +271,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ! Set lower limits for observation errors werrmin=one nsattype=0 - nreal=33 + nreal=34 if(perturb_obs ) nreal=nreal+2 ntread=1 ntmatch=0 @@ -1594,10 +1594,11 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis cdata_all(31,iout)=qifn ! QI without forecast cdata_all(32,iout)=qify ! QI with forecast cdata_all(33,iout)=ee ! expected error + cdata_all(34,iout)=pct1 if(perturb_obs)then - cdata_all(34,iout)=ran01dom()*perturb_fact ! u perturbation - cdata_all(35,iout)=ran01dom()*perturb_fact ! v perturbation + cdata_all(35,iout)=ran01dom()*perturb_fact ! u perturbation + cdata_all(36,iout)=ran01dom()*perturb_fact ! v perturbation endif enddo loop_readsb diff --git a/src/gsi/setuprad.f90 b/src/gsi/setuprad.f90 index 6a81368250..bf965ebd4a 100644 --- a/src/gsi/setuprad.f90 +++ b/src/gsi/setuprad.f90 @@ -2632,6 +2632,7 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("SST_Cool_layer_tdrop", sngl(data_s(idtc,n)) ) ! dt_cool at zob call nc_diag_metadata("SST_dTz_dTfound", sngl(data_s(itz_tr,n)) ) ! d(Tz)/d(Tr) + call nc_diag_metadata("standard_deviation_clear_bt", sngl(tb_obs_sdv(ich_diag(i)))) ! needed for seviri qc call nc_diag_metadata("Observation", sngl(tb_obs0(ich_diag(i))) ) ! observed brightness temperature (K) call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(tbcnob(ich_diag(i))) ) ! observed - simulated Tb with no bias correction (K) call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(tbc0(ich_diag(i) )) ) ! observed - simulated Tb with bias corrrection (K) diff --git a/src/gsi/setupw.f90 b/src/gsi/setupw.f90 index 6c08d1bcf5..de31e39a86 100644 --- a/src/gsi/setupw.f90 +++ b/src/gsi/setupw.f90 @@ -1945,6 +1945,7 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_metadata("QI_without_forecast_info", sngl(data(31,i))) call nc_diag_metadata("QI_with_forecast_info", sngl(data(32,i))) call nc_diag_metadata("expected_error", sngl(data(33,i))) + call nc_diag_metadata("coefficient_of_variation", sngl(data(34,i))) ! end extra AMV QC fields end subroutine contents_netcdf_diag_ From 9bcca0887087713bd1d3353e2a43905dfdb069f8 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 9 Feb 2023 15:17:47 -0600 Subject: [PATCH 20/26] comment out duplicate check for ps error --- src/gsi/setupps.f90 | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/gsi/setupps.f90 b/src/gsi/setupps.f90 index 7e6499f7dd..6a6b4f72f3 100644 --- a/src/gsi/setupps.f90 +++ b/src/gsi/setupps.f90 @@ -305,26 +305,26 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa hr_offset=min_offset/60.0_r_kind ! Check for duplicate observations at same location dup=one - do k=1,nobs - do l=k+1,nobs - if(data(ilat,k) == data(ilat,l) .and. & - data(ilon,k) == data(ilon,l) .and. & - data(ier,k) < r1000 .and. data(ier,l) < r1000 .and. & - muse(k) .and. muse(l))then - if(l_closeobs) then - if(abs(data(itime,k)-hr_offset) Date: Fri, 23 Jun 2023 12:55:58 -0500 Subject: [PATCH 21/26] Add QC flags for ozone data --- src/gsi/read_ozone.f90 | 7 +++++-- src/gsi/setupoz.f90 | 13 +++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/gsi/read_ozone.f90 b/src/gsi/read_ozone.f90 index 43dd16d5c8..c7062abbcf 100644 --- a/src/gsi/read_ozone.f90 +++ b/src/gsi/read_ozone.f90 @@ -624,7 +624,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & call makegrids(rmesh,ithin,n_tbin=n_tbin) ! Set dependent variables and allocate arrays - nreal=14 +! nreal=14 !orig + nreal=15 !emily (add AFBO) nloz=0 nchanl=1 nozdat=nreal+nchanl @@ -753,7 +754,9 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ozout(12,itx)=hdrozo2(2) ! aerosol index ozout(13,itx)=hdrozo2(3) ! ascending/descending ozout(14,itx)=hdrozo2(7) ! scan position - ozout(15,itx)=totoz + ozout(15,itx)=hdrozo2(8) ! AFBO !emily + ozout(16,itx)=totoz !emily +!orig ozout(15,itx)=totoz ! End of loop over observations end do read_loop2 diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index 8bd550c1bb..cce8970ee0 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -218,7 +218,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& integer(i_kind) k1,k2,k,j,nz,jc,idia,irdim1,istatus,ioff0 integer(i_kind) ioff,itoss,ikeep,ierror_toq,ierror_poq integer(i_kind) isolz,ifovn,itoqf - integer(i_kind) mm1,itime,ilat,ilon,ilate,ilone,itoq,ipoq + integer(i_kind) mm1,itime,ilat,ilon,ilate,ilone,itoq,ipoq,iafbo !emily integer(i_kind),dimension(iint,nobs):: idiagbuf integer(i_kind),dimension(nlevs):: ipos,iouse,ikeepk @@ -253,6 +253,9 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& call init_vars_ mm1=mype+1 + + write(6,*)'emily checking: you are here ...', myname, obstype + ! !********************************************************************************* ! Initialize arrays @@ -346,7 +349,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& isolz=8 ! index of solar zenith angle (gome and omi only) itoqf=9 ! index of row anomaly (omi only) ifovn=14 ! index of scan position (gome and omi only) - + iafbo=15 ! index of algorithm flag for best ozone (for omi, ompsnm, and ompstc8) !emily ! If requested, save data for diagnostic ouput if(ozone_diagsave)ii=0 @@ -623,6 +626,11 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& else call nc_diag_metadata("Row_Anomaly_Index", sngl(rmiss) ) endif +!>>emily + if (obstype == 'omi' .or. obstype == 'ompstc8' .or. obstype == 'ompsnm') then + call nc_diag_metadata("Algorithm_Flag_For_Best_Ozone", sngl(data(iafbo,i))) + endif +!< Date: Fri, 13 Oct 2023 10:47:13 -0500 Subject: [PATCH 22/26] Merged with develop --- .github/pull_request_template.md | 41 + .github/workflows/gcc.yml | 47 +- .github/workflows/intel.yml | 49 +- .gitmodules | 5 +- CMakeLists.txt | 5 + ci/spack.yaml | 8 +- fix | 2 +- modulefiles/gsi_common.lua | 8 +- modulefiles/gsi_gaea | 3 - modulefiles/gsi_hera.gnu.lua | 2 + modulefiles/gsi_hera.intel.lua | 2 + modulefiles/gsi_jet.lua | 24 +- modulefiles/gsi_orion.lua | 2 + modulefiles/gsi_s4.lua | 2 + modulefiles/gsi_wcoss2.lua | 9 +- modulefiles/gsi_wcoss_cray | 57 - modulefiles/gsi_wcoss_dell_p3.lua | 37 - regression/CMakeLists.txt | 13 +- regression/arw_binary.sh | 313 --- regression/arw_netcdf.sh | 316 --- regression/global_3dvar.sh | 305 +++ regression/global_4denvar.sh | 327 +++ regression/global_4denvar_T126.sh | 420 ---- regression/global_4dvar.sh | 338 +++ regression/global_4dvar_T62.sh | 439 ---- regression/global_C96_fv3aero.sh | 334 --- regression/global_C96_fv3aerorad.sh | 305 --- regression/global_T62.sh | 457 ---- regression/global_T62_ozonly.sh | 435 ---- regression/global_enkf.sh | 189 ++ regression/global_enkf_T62.sh | 180 -- regression/global_fv3_4denvar_C192.sh | 425 ---- regression/global_fv3_4denvar_T126.sh | 437 ---- regression/global_hybrid_T126.sh | 370 --- regression/global_lanczos_T62.sh | 404 ---- regression/global_nemsio_T62.sh | 419 ---- regression/hwrf_nmm_d2.sh | 8 +- regression/hwrf_nmm_d3.sh | 8 +- regression/multi_regression.sh | 39 +- regression/netcdf_fv3_regional.sh | 9 - regression/nmm_binary.sh | 320 --- regression/nmm_netcdf.sh | 317 --- regression/nmmb_nems_4denvar.sh | 247 -- regression/regression_driver.sh | 8 +- regression/regression_namelists.sh | 1949 +++++---------- regression/regression_namelists_db.sh | 2176 +++-------------- regression/regression_nl_update.sh | 25 +- regression/regression_param.sh | 576 +---- regression/regression_test.sh | 110 +- regression/regression_test_enkf.sh | 53 +- regression/regression_var.sh | 210 +- regression/rrfs_3denvar_glbens.sh | 291 +++ src/enkf/controlvec.f90 | 33 +- src/enkf/enkf.f90 | 41 +- src/enkf/gridinfo_fv3reg.f90 | 7 +- src/enkf/gridinfo_gfs.f90 | 2 +- src/enkf/gridio_fv3reg.f90 | 181 +- src/enkf/gridio_gfs.f90 | 819 ++++++- src/enkf/innovstats.f90 | 2 +- src/enkf/loadbal.f90 | 293 ++- src/enkf/mpi_readobs.f90 | 2 +- src/enkf/params.f90 | 29 +- src/enkf/readconvobs.f90 | 8 +- src/enkf/statevec.f90 | 4 +- src/gsi/adjtest.f90 | 30 +- src/gsi/adjtest_obs.f90 | 1 + src/gsi/aeroinfo.f90 | 8 +- src/gsi/aircraftinfo.f90 | 2 +- src/gsi/apply_scaledepwgts.f90 | 163 ++ src/gsi/atms_spatial_average_mod.f90 | 2 +- src/gsi/bicg.f90 | 10 +- src/gsi/bicglanczos.F90 | 11 +- src/gsi/bkerror.f90 | 7 +- src/gsi/calctends_no_tl.f90 | 13 +- src/gsi/chemmod.f90 | 7 +- src/gsi/class_get_fv3_regional_ensperts.f90 | 2 +- src/gsi/class_get_pseudo_ensperts.f90 | 2 +- src/gsi/class_get_wrf_mass_ensperts.f90 | 4 +- src/gsi/class_get_wrf_nmm_ensperts.f90 | 2 +- src/gsi/compact_diffs.f90 | 62 +- src/gsi/constants.f90 | 2 +- src/gsi/control2state.f90 | 646 ++++- src/gsi/control2state_ad.f90 | 441 ---- src/gsi/control_vectors.f90 | 169 +- src/gsi/convthin.f90 | 95 +- src/gsi/convthin_time.f90 | 114 +- src/gsi/correlated_obsmod.F90 | 99 +- src/gsi/cplr_get_fv3_regional_ensperts.f90 | 534 ++++- src/gsi/cplr_get_pseudo_ensperts.f90 | 28 +- src/gsi/cplr_get_wrf_mass_ensperts.f90 | 16 +- src/gsi/cplr_get_wrf_nmm_ensperts.f90 | 14 +- src/gsi/cplr_gfs_ensmod.f90 | 499 ++-- src/gsi/cplr_gfs_nstmod.f90 | 262 +- src/gsi/cwhydromod.f90 | 73 +- src/gsi/deter_sfc_mod.f90 | 7 +- src/gsi/en_perts_io.f90 | 17 +- src/gsi/ens_spread_mod.f90 | 4 +- src/gsi/ensctl2model.f90 | 38 +- src/gsi/ensctl2model_ad.f90 | 59 +- src/gsi/ensctl2state.f90 | 4 +- src/gsi/ensctl2state_ad.f90 | 4 +- src/gsi/evaljgrad.f90 | 2 + src/gsi/general_read_gfsatm.f90 | 2361 +++++++++++-------- src/gsi/general_specmod.f90 | 31 + src/gsi/genqsat.f90 | 6 +- src/gsi/genstats_gps.f90 | 95 +- src/gsi/gesinfo.F90 | 10 +- src/gsi/get_gefs_ensperts_dualres.f90 | 196 +- src/gsi/get_gefs_for_regional.f90 | 12 +- src/gsi/get_nmmb_ensperts.f90 | 8 +- src/gsi/getsiga.f90 | 1 + src/gsi/gridmod.F90 | 11 +- src/gsi/gsi_dbzOper.F90 | 23 +- src/gsi/gsi_files.cmake | 2 +- src/gsi/gsi_rfv3io_mod.f90 | 811 ++++++- src/gsi/gsimod.F90 | 129 +- src/gsi/hybrid_ensemble_isotropic.F90 | 1463 ++++++++---- src/gsi/hybrid_ensemble_parameters.f90 | 113 +- src/gsi/intall.f90 | 41 +- src/gsi/intgps.f90 | 19 +- src/gsi/intjcmod.f90 | 19 +- src/gsi/intjo.f90 | 3 - src/gsi/intpm2_5.f90 | 131 +- src/gsi/intrad.f90 | 226 +- src/gsi/intrw.f90 | 6 +- src/gsi/intsst.f90 | 38 +- src/gsi/intt.f90 | 61 +- src/gsi/jfunc.f90 | 10 +- src/gsi/jgrad.f90 | 1 + src/gsi/lightinfo.f90 | 12 +- src/gsi/m_pm2_5Node.F90 | 2 +- src/gsi/m_radNode.F90 | 7 +- src/gsi/m_rerank.f90 | 218 +- src/gsi/ncepgfs_io.f90 | 4 +- src/gsi/netcdfgfs_io.f90 | 37 +- src/gsi/obs_sensitivity.f90 | 1 + src/gsi/obsmod.F90 | 13 +- src/gsi/pcgsoi.f90 | 92 +- src/gsi/pvqc.f90 | 4 +- src/gsi/q_diag.f90 | 4 +- src/gsi/qcmod.f90 | 339 ++- src/gsi/radinfo.f90 | 8 +- src/gsi/read_atms.f90 | 4 +- src/gsi/read_bufrtovs.f90 | 34 +- src/gsi/read_dbz_nc.f90 | 8 +- src/gsi/read_diag.f90 | 4 +- src/gsi/read_files.f90 | 8 +- src/gsi/read_gps.f90 | 70 +- src/gsi/read_iasi.f90 | 69 +- src/gsi/read_obs.F90 | 15 +- src/gsi/read_ozone.f90 | 50 +- src/gsi/read_prepbufr.f90 | 44 +- src/gsi/read_satwnd.f90 | 21 +- src/gsi/satthin.F90 | 3 +- src/gsi/setupbend.f90 | 133 +- src/gsi/setupcldtot.F90 | 2 +- src/gsi/setupdbz.f90 | 56 +- src/gsi/setupoz.f90 | 76 +- src/gsi/setuppcp.f90 | 3 +- src/gsi/setuppm2_5.f90 | 113 +- src/gsi/setupps.f90 | 2 - src/gsi/setupq.f90 | 258 +- src/gsi/setuprad.f90 | 574 +++-- src/gsi/setuprw.f90 | 4 +- src/gsi/setupt.f90 | 203 +- src/gsi/setupw.f90 | 93 +- src/gsi/state_vectors.f90 | 101 +- src/gsi/statsconv.f90 | 1801 +++++++------- src/gsi/statslight.f90 | 70 +- src/gsi/statsrad.f90 | 8 +- src/gsi/stpcalc.f90 | 365 ++- src/gsi/stpgps.f90 | 42 +- src/gsi/stpjo.f90 | 3 - src/gsi/stppm2_5.f90 | 102 +- src/gsi/stprad.f90 | 278 ++- src/gsi/stprw.f90 | 5 +- src/gsi/stpsst.f90 | 17 +- src/gsi/stpt.f90 | 19 +- src/gsi/stub_get_pseudo_ensperts.f90 | 2 +- src/gsi/stub_get_wrf_mass_ensperts.f90 | 4 +- src/gsi/stub_get_wrf_nmm_ensperts.f90 | 2 +- src/gsi/stub_wrf_binary_interface.f90 | 8 + src/gsi/stub_wrf_netcdf_interface.f90 | 5 +- src/gsi/update_guess.f90 | 12 +- src/gsi/vqc_int.f90 | 4 +- src/gsi/vqc_stp.f90 | 2 +- src/gsi/write_incr.f90 | 22 +- src/gsi/xhat_vordivmod.f90 | 14 +- ush/build.sh | 16 +- ush/build_4nco_global.sh | 3 + ush/detect_machine.sh | 10 - ush/module-setup.sh | 24 - ush/prune_4nco_global.sh | 107 +- ush/sub_jet | 3 +- ush/sub_orion | 168 ++ ush/sub_wcoss | 343 --- ush/sub_wcoss2 | 176 ++ ush/sub_wcoss_c | 299 --- ush/sub_wcoss_d | 345 --- 199 files changed, 13485 insertions(+), 17259 deletions(-) create mode 100644 .github/pull_request_template.md delete mode 100644 modulefiles/gsi_wcoss_cray delete mode 100644 modulefiles/gsi_wcoss_dell_p3.lua delete mode 100755 regression/arw_binary.sh delete mode 100755 regression/arw_netcdf.sh create mode 100755 regression/global_3dvar.sh create mode 100755 regression/global_4denvar.sh delete mode 100755 regression/global_4denvar_T126.sh create mode 100755 regression/global_4dvar.sh delete mode 100755 regression/global_4dvar_T62.sh delete mode 100755 regression/global_C96_fv3aero.sh delete mode 100755 regression/global_C96_fv3aerorad.sh delete mode 100755 regression/global_T62.sh delete mode 100755 regression/global_T62_ozonly.sh create mode 100755 regression/global_enkf.sh delete mode 100755 regression/global_enkf_T62.sh delete mode 100755 regression/global_fv3_4denvar_C192.sh delete mode 100755 regression/global_fv3_4denvar_T126.sh delete mode 100755 regression/global_hybrid_T126.sh delete mode 100755 regression/global_lanczos_T62.sh delete mode 100755 regression/global_nemsio_T62.sh delete mode 100755 regression/nmm_binary.sh delete mode 100755 regression/nmm_netcdf.sh delete mode 100755 regression/nmmb_nems_4denvar.sh create mode 100755 regression/rrfs_3denvar_glbens.sh create mode 100644 src/gsi/apply_scaledepwgts.f90 delete mode 100644 src/gsi/control2state_ad.f90 create mode 100755 ush/sub_orion delete mode 100755 ush/sub_wcoss create mode 100755 ush/sub_wcoss2 delete mode 100755 ush/sub_wcoss_c delete mode 100755 ush/sub_wcoss_d diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..81e205fd2a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,41 @@ + + + +**Description** + + + + + + + + +**Type of change** + +Please delete options that are not relevant. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] This change requires a documentation update + +**How Has This Been Tested?** + + + + + +**Checklist** + +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] New and existing tests pass with my changes +- [ ] Any dependent changes have been merged and published \ No newline at end of file diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml index b3379ea03d..6ba8ef3295 100644 --- a/.github/workflows/gcc.yml +++ b/.github/workflows/gcc.yml @@ -1,5 +1,5 @@ name: GCC Linux Build -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] # Use custom shell with -l so .bash_profile is sourced # without having to do it in manually every step @@ -8,20 +8,11 @@ defaults: shell: bash -leo pipefail {0} env: - cache_key: gcc3 # The number (#) following the cache_key "gcc" is to flush Action cache. + cache_key: gcc CC: gcc-10 FC: gfortran-10 CXX: g++-10 -# A note on flushing Action cache and relevance to "cache_key" above. -# There is no way to flush the Action cache, and hence a number (#) is appended -# to the "cache_key" (gcc). -# If the dependencies change, increment this number and a new cache will be -# generated by the dependency build step "setup" -# There is a Github issue to force clear the cache. -# See discussion on: -# https://stackoverflow.com/questions/63521430/clear-cache-in-github-actions - # The jobs are split into: # 1. a dependency build step (setup), and # 2. a GSI build step (build) @@ -33,26 +24,28 @@ jobs: runs-on: ubuntu-latest steps: + # Checkout the GSI to get the ci/spack.yaml file + - name: checkout-gsi + if: steps.cache-env.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + path: GSI + # Cache spack, compiler and dependencies - name: cache-env id: cache-env - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | spack ~/.spack - key: spack-${{ runner.os }}-${{ env.cache_key }} - - - name: checkout-gsi # This is for getting spack.yaml - if: steps.cache-env.outputs.cache-hit != 'true' - uses: actions/checkout@v2 - with: - path: GSI + key: spack-${{ runner.os }}-${{ env.cache_key }}-${{ hashFiles('GSI/ci/spack.yaml') }} # Install dependencies using Spack - name: install-dependencies-with-spack if: steps.cache-env.outputs.cache-hit != 'true' run: | + sudo apt-get install cmake git clone -c feature.manyFiles=true https://github.com/NOAA-EMC/spack.git source spack/share/spack/setup-env.sh spack env create gsi-env GSI/ci/spack.yaml @@ -61,7 +54,8 @@ jobs: spack external find spack add mpich@3.4.2 spack concretize - spack install --dirty -v + spack install -v --fail-fast --dirty + spack clean -a build: needs: setup @@ -69,27 +63,28 @@ jobs: steps: - name: checkout-gsi - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: GSI - name: cache-env id: cache-env - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | spack ~/.spack - key: spack-${{ runner.os }}-${{ env.cache_key }} + key: spack-${{ runner.os }}-${{ env.cache_key }}-${{ hashFiles('GSI/ci/spack.yaml') }} - name: build-gsi run: | source spack/share/spack/setup-env.sh spack env activate gsi-env - export CC=mpicc - export FC=mpif90 cd GSI mkdir -p build && cd build - cmake -DCMAKE_INSTALL_PREFIX=../install -DGSI_MODE=Regional -DENKF_MODE=GFS -DBUILD_REG_TESTING=OFF -DBUILD_NCDIAG=OFF .. + cmake -DCMAKE_INSTALL_PREFIX=../install -DGSI_MODE=Regional -DENKF_MODE=GFS -DBUILD_REG_TESTING=OFF .. make -j2 VERBOSE=1 make install + env: + CC: mpicc + FC: mpif90 diff --git a/.github/workflows/intel.yml b/.github/workflows/intel.yml index 98ae864d4e..d48c00a21e 100644 --- a/.github/workflows/intel.yml +++ b/.github/workflows/intel.yml @@ -1,5 +1,5 @@ name: Intel Linux Build -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] # Use custom shell with -l so .bash_profile is sourced which loads intel/oneapi/setvars.sh # without having to do it in manually every step @@ -9,22 +9,13 @@ defaults: # Set I_MPI_CC/F90 so Intel MPI wrapper uses icc/ifort instead of gcc/gfortran env: - cache_key: intel3 # The number (#) following the cache_key "intel" is to flush Action cache. + cache_key: intel CC: icc FC: ifort CXX: icpc I_MPI_CC: icc I_MPI_F90: ifort -# A note on flushing Action cache and relevance to "cache_key" above. -# There is no way to flush the Action cache, and hence a number (#) is appended -# to the "cache_key" (intel). -# If the dependencies change, increment this number and a new cache will be -# generated by the dependency build step "setup" -# There is a Github issue to force clear the cache. -# See discussion on: -# https://stackoverflow.com/questions/63521430/clear-cache-in-github-actions - # The jobs are split into: # 1. a dependency build step (setup), and # 2. a GSI build step (build) @@ -36,16 +27,23 @@ jobs: runs-on: ubuntu-latest steps: + # Checkout the GSI to get the ci/spack.yaml file + - name: checkout-gsi + if: steps.cache-env.outputs.cache-hit != 'true' + uses: actions/checkout@v3 + with: + path: GSI + # Cache spack, compiler and dependencies - name: cache-env id: cache-env - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | spack ~/.spack /opt/intel - key: spack-${{ runner.os }}-${{ env.cache_key }} + key: spack-${{ runner.os }}-${{ env.cache_key }}-${{ hashFiles('GSI/ci/spack.yaml') }} - name: install-intel-compilers if: steps.cache-env.outputs.cache-hit != 'true' @@ -55,18 +53,15 @@ jobs: echo "deb https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list sudo apt-get update sudo apt-get install intel-oneapi-dev-utilities intel-oneapi-mpi-devel intel-oneapi-openmp intel-oneapi-compiler-fortran intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic + sudo apt-get clean echo "source /opt/intel/oneapi/setvars.sh" >> ~/.bash_profile - - name: checkout-gsi # This is for getting spack.yaml - if: steps.cache-env.outputs.cache-hit != 'true' - uses: actions/checkout@v2 - with: - path: GSI - # Install dependencies using Spack - name: install-dependencies-with-spack if: steps.cache-env.outputs.cache-hit != 'true' run: | + sudo mv /usr/local/ /usr_local_mv + sudo apt-get install cmake git clone -c feature.manyFiles=true https://github.com/NOAA-EMC/spack.git source spack/share/spack/setup-env.sh spack env create gsi-env GSI/ci/spack.yaml @@ -75,7 +70,8 @@ jobs: spack external find spack add intel-oneapi-mpi spack concretize - spack install --dirty -v + spack install -v --fail-fast --dirty + spack clean -a build: needs: setup @@ -83,7 +79,7 @@ jobs: steps: - name: checkout-gsi - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: GSI @@ -93,22 +89,23 @@ jobs: - name: cache-env id: cache-env - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | spack ~/.spack /opt/intel - key: spack-${{ runner.os }}-${{ env.cache_key }} + key: spack-${{ runner.os }}-${{ env.cache_key }}-${{ hashFiles('GSI/ci/spack.yaml') }} - name: build-gsi run: | source spack/share/spack/setup-env.sh spack env activate gsi-env - export CC=mpiicc - export FC=mpiifort cd GSI mkdir -p build && cd build - cmake -DCMAKE_INSTALL_PREFIX=../install -DGSI_MODE=Regional -DENKF_MODE=GFS -DBUILD_REG_TESTING=OFF -DBUILD_NCDIAG=OFF .. + cmake -DCMAKE_INSTALL_PREFIX=../install -DGSI_MODE=Regional -DENKF_MODE=GFS -DBUILD_REG_TESTING=OFF .. make -j2 VERBOSE=1 make install + env: + CC: mpiicc + FC: mpiifort diff --git a/.gitmodules b/.gitmodules index 641f07f69e..54b65a3275 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "fix"] - path = fix - url = gerrit:GSI-fix + path = fix + url = https://github.com/NOAA-EMC/GSI-fix + branch = develop diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ec0bb414d..ac2a6a71c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,11 @@ message(STATUS "BUILD_REG_TESTING ...... ${BUILD_REG_TESTING}") # Build components add_subdirectory(src) +# Download and copy binary fix files if submodule has been cloned +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/fix/CMakeLists.txt) + add_subdirectory(fix) +endif() + if(BUILD_REG_TESTING) add_subdirectory(regression) endif() diff --git a/ci/spack.yaml b/ci/spack.yaml index c9ab0f3bcc..a831de16ad 100644 --- a/ci/spack.yaml +++ b/ci/spack.yaml @@ -2,11 +2,13 @@ spack: packages: all: - compiler: [intel, gcc] + compiler: + - intel + - gcc@10:10 specs: - netcdf-c@4.7.4 - netcdf-fortran@4.5.3 - - bufr@11.5.0 + - bufr@11.7.0 - bacio@2.4.1 - w3emc@2.9.2 - sp@2.3.3 @@ -16,7 +18,7 @@ spack: - nemsio@2.5.2 - wrf-io@1.2.0 - ncio@1.1.2 - - crtm@2.3.0 + - crtm@2.4.0 - gsi-ncdiag@1.0.0 view: true concretizer: diff --git a/fix b/fix index 023f81d4ba..6a42a29dbb 160000 --- a/fix +++ b/fix @@ -1 +1 @@ -Subproject commit 023f81d4ba631d235156172e04a529a4bf273617 +Subproject commit 6a42a29dbbc9fca3453cc9e829601185555890b9 diff --git a/modulefiles/gsi_common.lua b/modulefiles/gsi_common.lua index 06b3870d00..55ffd750e0 100644 --- a/modulefiles/gsi_common.lua +++ b/modulefiles/gsi_common.lua @@ -4,7 +4,7 @@ Load common modules to build GSI on all machines local netcdf_ver=os.getenv("netcdf_ver") or "4.7.4" -local bufr_ver=os.getenv("bufr_ver") or "11.5.0" +local bufr_ver=os.getenv("bufr_ver") or "11.7.0" local bacio_ver=os.getenv("bacio_ver") or "2.4.1" local w3emc_ver=os.getenv("w3emc_ver") or "2.9.1" local sp_ver=os.getenv("sp_ver") or "2.3.3" @@ -14,7 +14,7 @@ local sfcio_ver=os.getenv("sfcio_ver") or "1.4.1" local nemsio_ver=os.getenv("nemsio_ver") or "2.5.2" local wrf_io_ver=os.getenv("wrf_io_ver") or "1.2.0" local ncio_ver=os.getenv("ncio_ver") or "1.1.2" -local crtm_ver=os.getenv("crtm_ver") or "2.3.0" +local crtm_ver=os.getenv("crtm_ver") or "2.4.0" local ncdiag_ver=os.getenv("ncdiag_ver") or "1.0.0" load(pathJoin("netcdf", netcdf_ver)) @@ -29,6 +29,8 @@ load(pathJoin("sfcio", sfcio_ver)) load(pathJoin("nemsio", nemsio_ver)) load(pathJoin("wrf_io", wrf_io_ver)) load(pathJoin("ncio", ncio_ver)) -load(pathJoin("crtm", crtm_ver)) +--load(pathJoin("crtm", crtm_ver)) +local crtm_base="/work/noaa/da/eliu/JEDI-GDAS/crtm-v2.4.0/install" +setenv("crtm_ROOT", crtm_base) load(pathJoin("ncdiag",ncdiag_ver)) diff --git a/modulefiles/gsi_gaea b/modulefiles/gsi_gaea index 91089895a1..641f3d0fcf 100644 --- a/modulefiles/gsi_gaea +++ b/modulefiles/gsi_gaea @@ -52,9 +52,6 @@ module load sigio-intel-sandybridge/2.0.1 module load sp-intel-sandybridge/2.0.2 module load w3nco-intel-sandybridge/2.0.6 module load w3emc-intel-sandybridge/2.2.0 -module load crtm-intel/2.2.4 -#setenv CRTM_INC /lustre/f1/pdata/ncep_shared/NCEPLIBS/lib/crtm/v2.2.4/intel/include/crtm_v2.2.4 -#setenv CRTM_LIB /lustre/f1/pdata/ncep_shared/NCEPLIBS/lib/crtm/v2.2.4/intel/libcrtm_v2.2.4.a module load bacio-intel-sandybridge/2.0.2 setenv CRAYOS_VERSION $::env(CRAYPE_VERSION) #setenv CRAYOS_VERSION ${CRAYPE_VERSION} diff --git a/modulefiles/gsi_hera.gnu.lua b/modulefiles/gsi_hera.gnu.lua index 425eaa0e88..4f0253ba4d 100644 --- a/modulefiles/gsi_hera.gnu.lua +++ b/modulefiles/gsi_hera.gnu.lua @@ -20,4 +20,6 @@ load(pathJoin("prod_util", prod_util_ver)) pushenv("MKLROOT", "/apps/oneapi/mkl/2022.0.2") +pushenv("GSI_BINARY_SOURCE_DIR", "/scratch1/NCEPDEV/global/glopara/fix/gsi/20230601") + whatis("Description: GSI environment on Hera with GNU Compilers") diff --git a/modulefiles/gsi_hera.intel.lua b/modulefiles/gsi_hera.intel.lua index 5512906d06..62a915ef72 100644 --- a/modulefiles/gsi_hera.intel.lua +++ b/modulefiles/gsi_hera.intel.lua @@ -26,4 +26,6 @@ load(pathJoin("prod_util", prod_util_ver)) pushenv("CFLAGS", "-xHOST") pushenv("FFLAGS", "-xHOST") +pushenv("GSI_BINARY_SOURCE_DIR", "/scratch1/NCEPDEV/global/glopara/fix/gsi/20230601") + whatis("Description: GSI environment on Hera with Intel Compilers") diff --git a/modulefiles/gsi_jet.lua b/modulefiles/gsi_jet.lua index df05f29476..a769deca6f 100644 --- a/modulefiles/gsi_jet.lua +++ b/modulefiles/gsi_jet.lua @@ -1,24 +1,32 @@ help([[ ]]) -load("cmake/3.20.1") +prepend_path("MODULEPATH", "/mnt/lfs4/HFIP/hfv3gfs/role.epic/hpc-stack/libs/intel-18.0.5.274/modulefiles/stack") -prepend_path("MODULEPATH", "/contrib/anaconda/modulefiles") +local hpc_ver=os.getenv("hpc_ver") or "1.2.0" +local hpc_intel_ver=os.getenv("hpc_intel_ver") or "18.0.5.274" +local hpc_impi_ver=os.getenv("hpc_impi_ver") or "2018.4.274" +local cmake_ver=os.getenv("cmake_ver") or "3.20.1" +local anaconda_ver=os.getenv("anaconda_ver") or "5.3.1" +local prod_util_ver=os.getenv("prod_util_ver") or "1.2.2" -load("anaconda/5.3.1") +load(pathJoin("hpc", hpc_ver)) +load(pathJoin("hpc-intel", hpc_intel_ver)) +load(pathJoin("hpc-impi", hpc_impi_ver)) +load(pathJoin("cmake", cmake_ver)) -prepend_path("MODULEPATH", "/lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack") +prepend_path("MODULEPATH", "/contrib/anaconda/modulefiles") -load("hpc/1.1.0") -load("hpc-intel/18.0.5.274") -load("hpc-impi/2018.4.274") +load(pathJoin("anaconda", anaconda_ver)) load("gsi_common") -local prod_util_ver=os.getenv("prod_util_ver") or "1.2.2" load(pathJoin("prod_util", prod_util_ver)) pushenv("CFLAGS", "-axSSE4.2,AVX,CORE-AVX2") pushenv("FFLAGS", "-axSSE4.2,AVX,CORE-AVX2") + +pushenv("GSI_BINARY_SOURCE_DIR", "/mnt/lfs4/HFIP/hfv3gfs/glopara/git/fv3gfs/fix/gsi/20230601") + whatis("Description: GSI environment on Jet with Intel Compilers") diff --git a/modulefiles/gsi_orion.lua b/modulefiles/gsi_orion.lua index 32f3db4261..fb3df720e4 100644 --- a/modulefiles/gsi_orion.lua +++ b/modulefiles/gsi_orion.lua @@ -23,4 +23,6 @@ load(pathJoin("prod_util", prod_util_ver)) pushenv("CFLAGS", "-xHOST") pushenv("FFLAGS", "-xHOST") +pushenv("GSI_BINARY_SOURCE_DIR", "/work/noaa/global/glopara/fix/gsi/20230601") + whatis("Description: GSI environment on Orion with Intel Compilers") diff --git a/modulefiles/gsi_s4.lua b/modulefiles/gsi_s4.lua index 7084abc8da..24b1f5962d 100644 --- a/modulefiles/gsi_s4.lua +++ b/modulefiles/gsi_s4.lua @@ -23,4 +23,6 @@ load(pathJoin("prod_util", prod_util_ver)) pushenv("CFLAGS", "-march=ivybridge") pushenv("FFLAGS", "-march=ivybridge") +pushenv("GSI_BINARY_SOURCE_DIR", "/data/prod/glopara/fix/gsi/20230601") + whatis("Description: GSI environment on S4 with Intel Compilers") diff --git a/modulefiles/gsi_wcoss2.lua b/modulefiles/gsi_wcoss2.lua index 63b67b2910..1872f89d17 100644 --- a/modulefiles/gsi_wcoss2.lua +++ b/modulefiles/gsi_wcoss2.lua @@ -19,14 +19,7 @@ load(pathJoin("python", python_ver)) load(pathJoin("prod_util", prod_util_ver)) load("gsi_common") -unload("ncio") -unload("ncdiag") -pushenv("HPC_OPT", "/apps/ops/para/libs") -prepend_path("MODULEPATH", "/apps/ops/para/libs/modulefiles/compiler/intel/19.1.3.304") -prepend_path("MODULEPATH", "/apps/ops/para/libs/modulefiles/mpi/intel/19.1.3.304/cray-mpich/8.1.7") - -load("ncio/1.1.2") -load("ncdiag/1.0.0") +pushenv("GSI_BINARY_SOURCE_DIR", "/lfs/h2/emc/global/noscrub/emc.global/FIX/fix/gsi/20230601") whatis("Description: GSI environment on WCOSS2") diff --git a/modulefiles/gsi_wcoss_cray b/modulefiles/gsi_wcoss_cray deleted file mode 100644 index 6d98a926f8..0000000000 --- a/modulefiles/gsi_wcoss_cray +++ /dev/null @@ -1,57 +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 - -setenv FFLAGS_COM "-fp-model strict" -setenv LDFLAGS_COM " " - -set WRF_SHARED_VER v1.1.0 -set WRF_SHARED_ROOT /gpfs/hps/nco/ops/nwprod/wrf_shared -setenv WRF_SHARED_PATH ${WRF_SHARED_ROOT}.${WRF_SHARED_VER}-${COMPILER} - -# Loading ncep environment -module load ncep/1.0 -module load prod_util/1.1.2 - -# Loading Intel Compiler Suite -module load PrgEnv-intel/5.2.82 -module unload intel/15.0.3.187 -module load intel/18.1.163 - -# Loading pe environment -module load craype-sandybridge -module load cray-mpich/7.2.0 - -module load cmake/3.16.2 - -# Loading netcdf modules -module load HDF5-parallel-intel-sandybridge/1.10.6 -module load NetCDF-intel-sandybridge/4.7.4 - -# Loading nceplibs modules -module load bufr-intel/11.3.0 -module load ip-intel/3.0.2 -module load nemsio-intel/2.2.4 -module load sfcio-intel/1.0.0 -module load sigio-intel/2.1.0 -module load sp-intel/2.0.3 -module load w3nco-intel/2.2.0 -module load w3emc-intel/2.4.0 -module load bacio-intel/2.0.3 -module load crtm-intel/2.3.0 - -# Loading python -module load python/3.6.3 - -# Compiler flags specific to this platform -setenv CFLAGS "-xHOST" -setenv FFLAGS "-xHOST" - diff --git a/modulefiles/gsi_wcoss_dell_p3.lua b/modulefiles/gsi_wcoss_dell_p3.lua deleted file mode 100644 index dacdcda50d..0000000000 --- a/modulefiles/gsi_wcoss_dell_p3.lua +++ /dev/null @@ -1,37 +0,0 @@ -help([[ -]]) - -local hpc_ver=os.getenv("hpc_ver") or "1.1.0" -local hpc_ips_ver=os.getenv("hpc_ips_ver") or "18.0.1.163" -local hpc_impi_ver=os.getenv("hpc_impi_ver") or "18.0.1" -local cmake_ver=os.getenv("cmake_ver") or "3.20.0" -local lsf_ver=os.getenv("lsf_ver") or "10.1" -local jasper_ver=os.getenv("jasper_ver") or "2.0.22" -local zlib_ver=os.getenv("zlib_ver") or "1.2.11" -local png_ver=os.getenv("png_ver") or "1.6.35" -local python_ver=os.getenv("python_ver") or "3.6.3" -local prod_util_ver=os.getenv("prod_util_ver") or "1.2.2" - -load(pathJoin("python", python_ver)) -load(pathJoin("lsf", lsf_ver)) - -prepend_path("MODULEPATH", "/usrx/local/nceplibs/dev/hpc-stack/libs/hpc-stack/modulefiles/stack") - -load(pathJoin("hpc", hpc_ver)) -load(pathJoin("hpc-ips", hpc_ips_ver)) -load(pathJoin("hpc-impi", hpc_impi_ver)) - -load(pathJoin("cmake", cmake_ver)) - -load(pathJoin("jasper", jasper_ver)) -load(pathJoin("zlib", zlib_ver)) -load(pathJoin("png", png_ver)) - -load("gsi_common") - -load(pathJoin("prod_util", prod_util_ver)) - -pushenv("CFLAGS", "-xHOST") -pushenv("FFLAGS", "-xHOST") - -whatis("Description: GSI environment on WCOSS Dell") diff --git a/regression/CMakeLists.txt b/regression/CMakeLists.txt index 5082de2a0b..cfbce04b40 100644 --- a/regression/CMakeLists.txt +++ b/regression/CMakeLists.txt @@ -38,19 +38,14 @@ endif() # GSI regression test names list(APPEND GSI_REG_TEST_NAMES - global_T62 global_T62_ozonly global_4dvar_T62 global_4denvar_T126 - global_fv3_4denvar_T126 global_fv3_4denvar_C192 global_lanczos_T62 - arw_netcdf arw_binary nmm_binary nmm_netcdf - nmmb_nems_4denvar - hwrf_nmm_d2 hwrf_nmm_d3 - rtma - netcdf_fv3_regional - global_C96_fv3aero global_C96_fv3aerorad + global_3dvar global_4dvar global_4denvar + hwrf_nmm_d2 hwrf_nmm_d3 rtma + rrfs_3denvar_glbens netcdf_fv3_regional ) # EnKF regression test names list(APPEND ENKF_REG_TEST_NAMES - global_enkf_T62 + global_enkf ) # Add GSI regression tests to list of tests diff --git a/regression/arw_binary.sh b/regression/arw_binary.sh deleted file mode 100755 index d2b5bf2d7b..0000000000 --- a/regression/arw_binary.sh +++ /dev/null @@ -1,313 +0,0 @@ - -set -x - -# Set analysis date -#adate=$adate_regional_arw_binary - -# Set guess/analysis (i/o) file format. Two -# option are available: binary or netcdf -io_format=binary -##io_format=netcdf - -if [[ "$io_format" = "binary" ]]; then - NETCDF=.false. - FORMAT=binary -elif [[ "$io_format" = "netcdf" ]]; then - NETCDF=.true. - FORMAT=netcdf -else - echo "***ERROR*** INVALID io_format = $io_format" - exit -fi - -# Set experiment name - -exp=$jobname - -# Set path/file for gsi executable -#gsiexec=$updat - -# Set resoltion and other dependent parameters -#export JCAP=62 -export LEVS=60 -export JCAP_B=$JCAP -if [[ "$io_format" = "binary" ]]; then - export LEVS=50 -elif [[ "$io_format" = "netcdf" ]]; then - export LEVS=30 -fi -export DELTIM=1200 - -# Set runtime and save directories -tmpdir=$tmpdir/tmpreg_arw_binary/${exp} -savdir=$savdir/outreg/arw_binary/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -CLEAN=NO -ncp=/bin/cp - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -prefixo=ndas.t18z -prefixa=ndas.t18z -suffix=tm06.bufr_d - -#datobs=$datobs_arw_binary/$adate -#datges=$datobs - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -chgrp rstprod $tmpdir -chmod 750 $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$arw_binary_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh arw_binary -else - . $scripts/regression_namelists_db.sh arw_binary -fi -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (regional only) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/anavinfo_arw_binary -if [[ "$io_format" = "binary" ]]; then - berror=$fixgsi/$endianness/nam_glb_berror.f77.gcv -elif [[ "$io_format" = "netcdf" ]]; then - berror=$fixgsi/$endianness/nam_glb_berror.f77.gcv -fi -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/nam_regional_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/nam_global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/nam_global_pcpinfo.txt -ozinfo=$fixgsi/nam_global_ozinfo.txt -errtable=$fixgsi/nam_errtable.r3dv -convinfo=$fixgsi/nam_regional_convinfo_reg_test.txt -mesonetuselist=$fixgsi/nam_mesonet_uselist.txt - -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf -### - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $errtable ./errtable -$ncp $mesonetuselist ./mesonetuselist -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $arw_binary_obs/${prefixo}.prepbufr.tm06 ./prepbufr -$ncp $arw_binary_obs/${prefixo}.satwnd.$suffix ./satwndbufr -$ncp $arw_binary_obs/${prefixo}.1bhrs3.$suffix ./hirs3bufr -$ncp $arw_binary_obs/${prefixo}.1bhrs4.$suffix ./hirs4bufr -$ncp $arw_binary_obs/${prefixo}.1bamua.$suffix ./amsuabufr -$ncp $arw_binary_obs/${prefixo}.1bamub.$suffix ./amsubbufr -$ncp $arw_binary_obs/${prefixo}.1bmhs.$suffix ./mhsbufr -$ncp $arw_binary_obs/${prefixo}.goesfv.$suffix ./gsnd1bufr -$ncp $arw_binary_obs/${prefixo}.airsev.$suffix ./airsbufr -$ncp $arw_binary_obs/${prefixo}.radwnd.$suffix ./radarbufr -if [[ "$io_format" = "netcdf" ]]; then - $ncp $arw_binary_obs/${prefixo}.nexrad.$suffix ./l2rwbufr -fi - -# Copy bias correction, sigma, and surface files -# -# *** NOTE: The regional gsi analysis is written to (over) -# the input guess field file (wrf_inout) -# -$ncp $arw_binary_obs/${prefixa}.satbias.tm06 ./satbias_in -$ncp $arw_binary_obs/${prefixa}.satang.tm06 ./satbias_angle -if [[ "$io_format" = "binary" ]]; then - $ncp $arw_binary_ges/wrfinput_d01_2010-07-24_12:00:00 ./wrf_inout -elif [[ "$io_format" = "netcdf" ]]; then - $ncp $arw_binary_ges/wrfinput_d01_arw_netcdf ./wrf_inout -fi - -cp wrf_inout wrf_ges - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# Save output -mkdir -p $savdir -chgrp rstprod $savdir -chmod 750 $savdir - -cat stdout fort.2* > $savdir/stdout.anl.${arw_binary_adate} -$ncp wrf_inout $savdir/wrfanl.${arw_binary_adate} -$ncp satbias_out $savdir/biascr.${arw_binary_adate} - -# If desired, copy guess file to unique filename in $savdir -$ncp wrf_ges $savdir/wrfges.${arw_binary_adate} - -# 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. -# - -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g10 sndr_g12 sndr_g08_prep sndr_g10_prep sndr_g12_prep sndrd1_g08 sndrd2_g08 sndrd3_g08 sndrd4_g08 sndrd1_g10 sndrd2_g10 sndrd3_g10 sndrd4_g10 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 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_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" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${arw_binary_adate} - compress diag_${type}_${string}.${arw_binary_adate} - $ncp diag_${type}_${string}.${arw_binary_adate}.Z $savdir/ - fi - done -done - -exit diff --git a/regression/arw_netcdf.sh b/regression/arw_netcdf.sh deleted file mode 100755 index 555625e9b6..0000000000 --- a/regression/arw_netcdf.sh +++ /dev/null @@ -1,316 +0,0 @@ - -set -x - -# Set analysis date -#adate=$adate_regional - -# Set guess/analysis (i/o) file format. Two -# option are available: binary or netcdf -##io_format=binary -io_format=netcdf - -if [[ "$io_format" = "binary" ]]; then - NETCDF=.false. - FORMAT=binary -elif [[ "$io_format" = "netcdf" ]]; then - NETCDF=.true. - FORMAT=netcdf -else - echo "***ERRROR*** INVALID io_format = $io_format" - exit -fi - -# Set experiment name - -exp=$jobname - -# Set path/file for gsi executable -#gsiexec=$updat - -# Set resoltion and other dependent parameters -#export JCAP=62 -export LEVS=60 -export JCAP_B=$JCAP -if [[ "$io_format" = "binary" ]]; then - export LEVS=50 -elif [[ "$io_format" = "netcdf" ]]; then - export LEVS=30 -fi -export DELTIM=1200 - -# Set runtime and save directories -tmpdir=$tmpdir/tmpreg_arw_netcdf/${exp} -savdir=$savdir/outreg/arw_netcdf/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -CLEAN=NO -ncp=/bin/cp - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -sdate=`echo $arw_netcdf_adate |cut -c1-8` -odate=`date +%Y%m%d%H -d "${arw_netcdf_adate:0:8} ${arw_netcdf_adate:8:2} + 6 hours"` -hha=`echo $arw_netcdf_adate | cut -c9-10` -hho=`echo $odate | cut -c9-10` -prefixo=ndas.t${hho}z -prefixa=ndas.t${hha}z -suffix=tm06.bufr_d - -#datobs=$datobs_arw_netcdf/$adate_regional_arw_netcdf -#datges=$datobs - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -chgrp rstprod $tmpdir -chmod 750 $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$arw_netcdf_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh arw_netcdf -else - . $scripts/regression_namelists_db.sh arw_netcdf -fi -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (regional only) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/anavinfo_arw_netcdf -if [[ "$io_format" = "binary" ]]; then - berror=$fixgsi/$endianness/nam_glb_berror.f77.gcv -elif [[ "$io_format" = "netcdf" ]]; then - berror=$fixgsi/$endianness/nam_glb_berror.f77.gcv -fi -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/nam_regional_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/nam_global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/nam_global_pcpinfo.txt -ozinfo=$fixgsi/nam_global_ozinfo.txt -errtable=$fixgsi/nam_errtable.r3dv -convinfo=$fixgsi/nam_regional_convinfo_reg_test.txt -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -mesonetuselist=$fixgsi/nam_mesonet_uselist.txt - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $errtable ./errtable -$ncp $mesonetuselist ./mesonetuselist -#### -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $arw_netcdf_obs/${prefixo}.prepbufr.tm06 ./prepbufr -$ncp $arw_netcdf_obs/${prefixo}.satwnd.$suffix ./satwndbufr -$ncp $arw_netcdf_obs/${prefixo}.1bhrs3.$suffix ./hirs3bufr -$ncp $arw_netcdf_obs/${prefixo}.1bhrs4.$suffix ./hirs4bufr -$ncp $arw_netcdf_obs/${prefixo}.1bamua.$suffix ./amsuabufr -$ncp $arw_netcdf_obs/${prefixo}.1bamub.$suffix ./amsubbufr -$ncp $arw_netcdf_obs/${prefixo}.1bmhs.$suffix ./mhsbufr -$ncp $arw_netcdf_obs/${prefixo}.goesfv.$suffix ./gsnd1bufr -$ncp $arw_netcdf_obs/${prefixo}.airsev.$suffix ./airsbufr -$ncp $arw_netcdf_obs/${prefixo}.radwnd.$suffix ./radarbufr -if [[ "$io_format" = "netcdf" ]]; then - $ncp $arw_netcdf_obs/${prefixo}.nexrad.$suffix ./l2rwbufr -fi - -# Copy bias correction, sigma, and surface files -# -# *** NOTE: The regional gsi analysis is written to (over) -# the input guess field file (wrf_inout) -# -$ncp $arw_netcdf_obs/${prefixo}.satbias.tm06 ./satbias_in -$ncp $arw_netcdf_obs/${prefixo}.satang.tm06 ./satbias_angle -if [[ "$io_format" = "binary" ]]; then - $ncp $arw_netcdf_ges/wrfinput_d01_arw_binary ./wrf_inout -elif [[ "$io_format" = "netcdf" ]]; then - $ncp $arw_netcdf_ges/wrfout_d01_2008-05-11_12:00:00 ./wrf_inout -fi -cp wrf_inout wrf_ges - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# Save output -mkdir -p $savdir -chgrp rstprod $savdir -chmod 750 $savdir - -cat stdout fort.2* > $savdir/stdout.anl.${arw_netcdf_adate} -$ncp wrf_inout $savdir/wrfanl.${arw_netcdf_adate} -$ncp satbias_out $savdir/biascr.${arw_netcdf_adate} - -# If desired, copy guess file to unique filename in $savdir -$ncp wrf_ges $savdir/wrfges.${arw_netcdf_adate} - -# 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. -# - -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g10 sndr_g12 sndr_g08_prep sndr_g10_prep sndr_g12_prep sndrd1_g08 sndrd2_g08 sndrd3_g08 sndrd4_g08 sndrd1_g10 sndrd2_g10 sndrd3_g10 sndrd4_g10 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 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_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" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${arw_netcdf_adate} - compress diag_${type}_${string}.${arw_netcdf_adate} - $ncp diag_${type}_${string}.${arw_netcdf_adate}.Z $savdir/ - fi - done -done - -exit diff --git a/regression/global_3dvar.sh b/regression/global_3dvar.sh new file mode 100755 index 0000000000..56f78ad384 --- /dev/null +++ b/regression/global_3dvar.sh @@ -0,0 +1,305 @@ +set -x + +# Set experiment name and analysis date + +exp=$jobname + +# Set the JCAP resolution which you want. +export JCAP=48 +export LEVS=127 +export JCAP_B=$JCAP + +# Set runtime directories +tmpdir=$tmpdir/$tmpregdir/${exp} + +# Specify GSI fixed field and data directories. +fixcrtm=${fixcrtm:-$CRTM_FIX} + + +# Set variables used in script +UNCOMPRESS=gunzip +CLEAN=NO +ncp=/bin/cp +nln="/bin/ln -fs" + + +# Given the requested resolution, set dependent resolution parameters +if [[ "$JCAP" = "96" ]]; then + export LONA=384 + export LATA=192 + export DELTIM=1200 +elif [[ "$JCAP" = "48" ]]; then + export LONA=192 + export LATA=96 + export DELTIM=1200 +else + echo "INVALID JCAP = $JCAP" + exit +fi +export NLON=$LONA +export NLAT=$((${LATA}+2)) + + +# Given the analysis date, compute the date from which the +# first guess comes. Extract cycle and set prefix and suffix +# for guess and observation data files +gdate=`date +%Y%m%d%H -d "${global_adate:0:8} ${global_adate:8:2} - 6 hours"` +PDYa=`echo $global_adate | cut -c1-8` +cyca=`echo $global_adate | cut -c9-10` +PDYg=`echo $gdate | cut -c1-8` +cycg=`echo $gdate | cut -c9-10` + +dumpobs=gdas +prefix_obs=${dumpobs}.t${cyca}z +prefix_ges=gdas.t${cycg}z +prefix_ens=gdas.t${cycg}z +suffix=tm00.bufr_d + +dumpges=gdas +COMROOTgfs=$casesdir/gfs/prod +datobs=$COMROOTgfs/$dumpobs.$PDYa/${cyca}/atmos +datges=$COMROOTgfs/$dumpges.$PDYg/${cycg}/atmos +datens=$COMROOTgfs/enkfgdas.$PDYg/${cycg}/atmos + + +# Set up $tmpdir +rm -rf $tmpdir +mkdir -p $tmpdir +cd $tmpdir + +# Make gsi namelist + +. $scripts/regression_nl_update.sh + +SETUP="$SETUP_update" +GRIDOPTS="$GRIDOPTS_update" +BKGVERR="$BKGVERR_update" +ANBKGERR="$ANBKERR_update" +JCOPTS="$JCOPTS_update" +STRONGOPTS="$STRONGOPTS_update" +OBSQC="$OBSQC_update" +OBSINPUT="$OBSINPUT_update" +SUPERRAD="$SUPERRAD_update" +SINGLEOB="$SINGLEOB_update" + +if [ "$debug" = ".false." ]; then + . $scripts/regression_namelists.sh global_3dvar +else + . $scripts/regression_namelists_db.sh global_3dvar +fi + +cat << EOF > gsiparm.anl + +$gsi_namelist + +EOF + +# Set fixed files +# berror = forecast model background error statistics +# specoef = CRTM spectral coefficients +# trncoef = CRTM transmittance coefficients +# emiscoef = CRTM coefficients for IR sea surface emissivity model +# aerocoef = CRTM coefficients for aerosol effects +# cldcoef = CRTM coefficients for cloud effects +# satinfo = text file with information about assimilation of brightness temperatures +# satangl = angle dependent bias correction file (fixed in time) +# pcpinfo = text file with information about assimilation of prepcipitation rates +# ozinfo = text file with information about assimilation of ozone data +# errtable = text file with obs error for conventional data (optional) +# convinfo = text file with information about assimilation of conventional data +# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) +# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) +# aeroinfo = text file with information about assimilation of aerosol data + +anavinfo=$fixgsi/global_anavinfo.l${LEVS}.txt +berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 +locinfo=$fixgsi/global_hybens_info.l${LEVS}.txt +satinfo=$fixgsi/global_satinfo.txt +scaninfo=$fixgsi/global_scaninfo.txt +satangl=$fixgsi/global_satangbias.txt +pcpinfo=$fixgsi/global_pcpinfo.txt +ozinfo=$fixgsi/global_ozinfo.txt +convinfo=$fixgsi/global_convinfo.txt +vqcdat=$fixgsi/vqctp001.dat +insituinfo=$fixgsi/global_insituinfo.txt +errtable=$fixgsi/prepobs_errtable.global +aeroinfo=$fixgsi/global_aeroinfo.txt +atmsbeaminfo=$fixgsi/atms_beamwidth.txt +cloudyinfo=$fixgsi/cloudy_radiance_info.txt + +emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin +emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin +emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin +emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin +emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin +emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin +emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin +emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin +emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin +aercoef=$fixcrtm/AerosolCoeff.bin +cldcoef=$fixcrtm/CloudCoeff.bin +#cldcoef=$fixcrtm/CloudCoeff.GFDLFV3.-109z-1.bin # use with crtm/2.4.0 + +# Only need this file for single obs test +bufrtable=$fixgsi/prepobs_prep.bufrtable + +# Only need this file for sst retrieval +bftab_sst=$fixgsi/bufrtab.012 + +# Copy executable and fixed files to $tmpdir +if [[ $exp == *"updat"* ]]; then + $ncp $gsiexec_updat ./gsi.x +elif [[ $exp == *"contrl"* ]]; then + $ncp $gsiexec_contrl ./gsi.x +fi + +$ncp $anavinfo ./anavinfo +$ncp $berror ./berror_stats +$ncp $locinfo ./hybens_info +$ncp $satinfo ./satinfo +$ncp $scaninfo ./scaninfo +$ncp $pcpinfo ./pcpinfo +$ncp $ozinfo ./ozinfo +$ncp $convinfo ./convinfo +$ncp $vqcdat ./vqctp001.dat +$ncp $insituinfo ./insituinfo +$ncp $errtable ./errtable +$ncp $aeroinfo ./aeroinfo +$ncp $atmsbeaminfo ./atms_beamwidth.txt +$ncp $cloudyinfo ./cloudy_radiance_info.txt + +$ncp $bufrtable ./prepobs_prep.bufrtable +$ncp $bftab_sst ./bftab_sstphr + +#If using correlated error, get the covariance files +if grep -q "Rcov" $anavinfo ; +then + if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; + then + $ncp ${fixgsi}/Rcov* $tmpdir + +# Correlated error utlizes mkl lapack. Found it necesary to fix the +# number of mkl threads to ensure reproducible results independent +# of the job configuration. + export MKL_NUM_THREADS=1 + + else + echo "Warning: Satellite error covariance files are missing." + echo "Check for the required Rcov files in " $ANAVINFO + exit 1 + fi +fi + +# Copy CRTM coefficient files based on entries in satinfo file +export CRTM_PATH="./crtm_coeffs/" +mkdir -p ${CRTM_PATH} +for file in `awk '{if($1!~"!"){print $1}}' satinfo | sort | uniq` ;do + $nln $fixcrtm/${file}.SpcCoeff.bin ${CRTM_PATH}/${file}.SpcCoeff.bin + $nln $fixcrtm/${file}.TauCoeff.bin ${CRTM_PATH}/${file}.TauCoeff.bin +done +$nln $fixcrtm/amsua_metop-a_v2.SpcCoeff.bin ${CRTM_PATH}/amsua_metop-a_v2.SpcCoeff.bin + +$nln $emiscoef_IRwater ${CRTM_PATH}Nalli.IRwater.EmisCoeff.bin +$nln $emiscoef_IRice ${CRTM_PATH}NPOESS.IRice.EmisCoeff.bin +$nln $emiscoef_IRsnow ${CRTM_PATH}NPOESS.IRsnow.EmisCoeff.bin +$nln $emiscoef_IRland ${CRTM_PATH}NPOESS.IRland.EmisCoeff.bin +$nln $emiscoef_VISice ${CRTM_PATH}NPOESS.VISice.EmisCoeff.bin +$nln $emiscoef_VISland ${CRTM_PATH}NPOESS.VISland.EmisCoeff.bin +$nln $emiscoef_VISsnow ${CRTM_PATH}NPOESS.VISsnow.EmisCoeff.bin +$nln $emiscoef_VISwater ${CRTM_PATH}NPOESS.VISwater.EmisCoeff.bin +$nln $emiscoef_MWwater ${CRTM_PATH}FASTEM6.MWwater.EmisCoeff.bin +$nln $aercoef ${CRTM_PATH}AerosolCoeff.bin +$nln $cldcoef ${CRTM_PATH}CloudCoeff.bin + +# Copy observational data +$nln $datobs/${prefix_obs}.prepbufr ./prepbufr +$nln $datobs/${prefix_obs}.prepbufr.acft_profiles ./prepbufr_profl +$nln $datobs/${prefix_obs}.nsstbufr ./nsstbufr +$nln $datobs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl +$nln $datobs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr +$nln $datobs/${prefix_obs}.satwnd.${suffix} ./satwndbufr +$nln $datobs/${prefix_obs}.hdob.${suffix} ./hdobbufr + +$nln $datobs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr +$nln $datobs/${prefix_obs}.gome.${suffix} ./gomebufr +$nln $datobs/${prefix_obs}.omi.${suffix} ./omibufr +$nln $datobs/${prefix_obs}.mls.${suffix} ./mlsbufr +$nln $datobs/${prefix_obs}.ompsn8.${suffix} ./ompsnpbufr +$nln $datobs/${prefix_obs}.ompst8.${suffix} ./ompstcbufr +$nln $datobs/${prefix_obs}.ompslp.${suffix} ./ompslpbufr + +$nln $datobs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr +$nln $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db +$nln $datobs/${prefix_obs}.airsev.${suffix} ./airsbufr +$nln $datobs/${prefix_obs}.sevcsr.${suffix} ./seviribufr +$nln $datobs/${prefix_obs}.saphir.${suffix} ./saphirbufr +$nln $datobs/${prefix_obs}.avcsam.${suffix} ./avhambufr +$nln $datobs/${prefix_obs}.avcspm.${suffix} ./avhpmbufr +$nln $datobs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr +$nln $datobs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr +$nln $datobs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr +$nln $datobs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears +$nln $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db +$nln $datobs/${prefix_obs}.mtiasi.${suffix} ./iasibufr +$nln $datobs/${prefix_obs}.esiasi.${suffix} ./iasibufrears +$nln $datobs/${prefix_obs}.iasidb.${suffix} ./iasibufr_db +$nln $datobs/${prefix_obs}.crisf4.${suffix} ./crisfsbufr +$nln $datobs/${prefix_obs}.escrsf.${suffix} ./crisfsbufrears +$nln $datobs/${prefix_obs}.crsfdb.${suffix} ./crisfsbufr_db +$nln $datobs/${prefix_obs}.ahicsr.${suffix} ./ahibufr +$nln $datobs/${prefix_obs}.gsrcsr.${suffix} ./abibufr +$nln $datobs/${prefix_obs}.sstvcw.${suffix} ./sstviirs + +$nln $datobs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr +$nln $datobs/${prefix_obs}.1bmsu.${suffix} ./msubufr +$nln $datobs/${prefix_obs}.gmi1cr.${suffix} ./gmibufr +$nln $datobs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr +$nln $datobs/${prefix_obs}.ssmisu.${suffix} ./ssmisbufr +$nln $datobs/${prefix_obs}.1bamua.${suffix} ./amsuabufr +$nln $datobs/${prefix_obs}.esamua.${suffix} ./amsuabufrears +$nln $datobs/${prefix_obs}.amuadb.${suffix} ./amsuabufr_db +$nln $datobs/${prefix_obs}.1bamub.${suffix} ./amsubbufr +$nln $datobs/${prefix_obs}.esamub.${suffix} ./amsubbufrears +$nln $datobs/${prefix_obs}.amubdb.${suffix} ./amsubbufr_db +$nln $datobs/${prefix_obs}.atms.${suffix} ./atmsbufr +$nln $datobs/${prefix_obs}.atmsdb.${suffix} ./atmsbufr_db +$nln $datobs/${prefix_obs}.esatms.${suffix} ./atmsbufrears + +# Do not process +## $nln $datobs/${prefix_obs}.amsre.${suffix} ./amsrebufr +## $nln $datobs/${prefix_obs}.amsr2.tm00.bufr_d ./amsr2bufr + +# Copy bias correction, atmospheric and surface files +$nln $datges/${prefix_ges}.abias ./satbias_in +$nln $datges/${prefix_ges}.abias_pc ./satbias_pc +$nln $datges/${prefix_ges}.abias_air ./aircftbias_in +$nln $datges/${prefix_ges}.radstat ./radstat.gdas + +member=mem001 +$nln $datens/$member/${prefix_ges}.sfcf003.nc ./sfcf03 +$nln $datens/$member/${prefix_ges}.sfcf006.nc ./sfcf06 +$nln $datens/$member/${prefix_ges}.sfcf009.nc ./sfcf09 + +$nln $datens/$member/${prefix_ges}.atmf003.nc ./sigf03 +$nln $datens/$member/${prefix_ges}.atmf006.nc ./sigf06 +$nln $datens/$member/${prefix_ges}.atmf009.nc ./sigf09 + +$nln $datens/${prefix_ens}.sfcf006.ensmean.nc ./sfcf06_anlgrid + + +listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` +for type in $listdiag; do + diag_file=`echo $type | cut -d',' -f1` + fname=`echo $diag_file | cut -d'.' -f1` + date=`echo $diag_file | cut -d'.' -f2` + $UNCOMPRESS $diag_file + fnameanl=$(echo $fname|sed 's/_ges//g') + mv ${fname}.${date} $fnameanl +done + +# Run GSI +echo "run gsi now" +eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" +rc=$? + +exit $rc diff --git a/regression/global_4denvar.sh b/regression/global_4denvar.sh new file mode 100755 index 0000000000..7212b819e9 --- /dev/null +++ b/regression/global_4denvar.sh @@ -0,0 +1,327 @@ +set -x + +# Set experiment name and analysis date + +exp=$jobname + +# Set the JCAP resolution which you want. +export JCAP=48 +export LEVS=127 +export JCAP_B=96 + +# Set ensemble size +export NMEM_ENKF=10 + +# Set runtime directories +tmpdir=$tmpdir/$tmpregdir/${exp} + +# Specify GSI fixed field and data directories. +fixcrtm=${fixcrtm:-$CRTM_FIX} + + +# Set variables used in script +UNCOMPRESS=gunzip +CLEAN=NO +ncp=/bin/cp +nln="/bin/ln -fs" + + +# Given the requested resolution, set dependent resolution parameters +if [[ "$JCAP" = "96" ]]; then + export LONA=384 + export LATA=192 + export DELTIM=1200 +elif [[ "$JCAP" = "48" ]]; then + export LONA=192 + export LATA=96 + export DELTIM=1200 +else + echo "INVALID JCAP = $JCAP" + exit +fi +export NLON=$LONA +export NLAT=$((${LATA}+2)) + + +# Given the analysis date, compute the date from which the +# first guess comes. Extract cycle and set prefix and suffix +# for guess and observation data files +gdate=`date +%Y%m%d%H -d "${global_adate:0:8} ${global_adate:8:2} - 6 hours"` +PDYa=`echo $global_adate | cut -c1-8` +cyca=`echo $global_adate | cut -c9-10` +PDYg=`echo $gdate | cut -c1-8` +cycg=`echo $gdate | cut -c9-10` + +dumpobs=gdas +prefix_obs=${dumpobs}.t${cyca}z +prefix_ges=gdas.t${cycg}z +prefix_ens=gdas.t${cycg}z +suffix=tm00.bufr_d + +dumpges=gdas +COMROOTgfs=$casesdir/gfs/prod +datobs=$COMROOTgfs/$dumpobs.$PDYa/${cyca}/atmos +datges=$COMROOTgfs/$dumpges.$PDYg/${cycg}/atmos +datens=$COMROOTgfs/enkfgdas.$PDYg/${cycg}/atmos + + +# Set up $tmpdir +rm -rf $tmpdir +mkdir -p $tmpdir +cd $tmpdir + +# Make gsi namelist + +SETUP="" +GRIDOPTS="" +BKGVERR="" +ANBKGERR="" +JCOPTS="" +STRONGOPTS="" +OBSQC="" +OBSINPUT="" +SUPERRAD="" +SINGLEOB="" + +if [ "$debug" = ".false." ]; then + . $scripts/regression_namelists.sh global_4denvar +else + . $scripts/regression_namelists_db.sh global_4denvar +fi + +cat << EOF > gsiparm.anl + +$gsi_namelist + +EOF + +# Set fixed files +# berror = forecast model background error statistics +# specoef = CRTM spectral coefficients +# trncoef = CRTM transmittance coefficients +# emiscoef = CRTM coefficients for IR sea surface emissivity model +# aerocoef = CRTM coefficients for aerosol effects +# cldcoef = CRTM coefficients for cloud effects +# satinfo = text file with information about assimilation of brightness temperatures +# satangl = angle dependent bias correction file (fixed in time) +# pcpinfo = text file with information about assimilation of prepcipitation rates +# ozinfo = text file with information about assimilation of ozone data +# errtable = text file with obs error for conventional data (optional) +# convinfo = text file with information about assimilation of conventional data +# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) +# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) +# aeroinfo = text file with information about assimilation of aerosol data + +anavinfo=$fixgsi/global_anavinfo.l${LEVS}.txt +berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 +locinfo=$fixgsi/global_hybens_info.l${LEVS}.txt +satinfo=$fixgsi/global_satinfo.txt +scaninfo=$fixgsi/global_scaninfo.txt +satangl=$fixgsi/global_satangbias.txt +pcpinfo=$fixgsi/global_pcpinfo.txt +ozinfo=$fixgsi/global_ozinfo.txt +convinfo=$fixgsi/global_convinfo.txt +vqcdat=$fixgsi/vqctp001.dat +insituinfo=$fixgsi/global_insituinfo.txt +errtable=$fixgsi/prepobs_errtable.global +aeroinfo=$fixgsi/global_aeroinfo.txt +atmsbeaminfo=$fixgsi/atms_beamwidth.txt +cloudyinfo=$fixgsi/cloudy_radiance_info.txt + +emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin +emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin +emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin +emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin +emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin +emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin +emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin +emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin +emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin +aercoef=$fixcrtm/AerosolCoeff.bin +cldcoef=$fixcrtm/CloudCoeff.bin +#cldcoef=$fixcrtm/CloudCoeff.GFDLFV3.-109z-1.bin # use with crtm/2.4.0 + +# Only need this file for single obs test +bufrtable=$fixgsi/prepobs_prep.bufrtable + +# Only need this file for sst retrieval +bftab_sst=$fixgsi/bufrtab.012 + +# Copy executable and fixed files to $tmpdir +if [[ $exp == *"updat"* ]]; then + $ncp $gsiexec_updat ./gsi.x +elif [[ $exp == *"contrl"* ]]; then + $ncp $gsiexec_contrl ./gsi.x +fi + +$ncp $anavinfo ./anavinfo +$ncp $berror ./berror_stats +$ncp $locinfo ./hybens_info +$ncp $satinfo ./satinfo +$ncp $scaninfo ./scaninfo +$ncp $pcpinfo ./pcpinfo +$ncp $ozinfo ./ozinfo +$ncp $convinfo ./convinfo +$ncp $vqcdat ./vqctp001.dat +$ncp $insituinfo ./insituinfo +$ncp $errtable ./errtable +$ncp $aeroinfo ./aeroinfo +$ncp $atmsbeaminfo ./atms_beamwidth.txt +$ncp $cloudyinfo ./cloudy_radiance_info.txt + +$ncp $bufrtable ./prepobs_prep.bufrtable +$ncp $bftab_sst ./bftab_sstphr + +#If using correlated error, get the covariance files +if grep -q "Rcov" $anavinfo ; +then + if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; + then + $ncp ${fixgsi}/Rcov* $tmpdir + +# Correlated error utlizes mkl lapack. Found it necesary to fix the +# number of mkl threads to ensure reproducible results independent +# of the job configuration. + export MKL_NUM_THREADS=1 + + else + echo "Warning: Satellite error covariance files are missing." + echo "Check for the required Rcov files in " $ANAVINFO + exit 1 + fi +fi + +# Copy CRTM coefficient files based on entries in satinfo file +export CRTM_PATH="./crtm_coeffs/" +mkdir -p ${CRTM_PATH} +for file in `awk '{if($1!~"!"){print $1}}' satinfo | sort | uniq` ;do + $nln $fixcrtm/${file}.SpcCoeff.bin ${CRTM_PATH}/${file}.SpcCoeff.bin + $nln $fixcrtm/${file}.TauCoeff.bin ${CRTM_PATH}/${file}.TauCoeff.bin +done +$nln $fixcrtm/amsua_metop-a_v2.SpcCoeff.bin ${CRTM_PATH}/amsua_metop-a_v2.SpcCoeff.bin + +$nln $emiscoef_IRwater ${CRTM_PATH}Nalli.IRwater.EmisCoeff.bin +$nln $emiscoef_IRice ${CRTM_PATH}NPOESS.IRice.EmisCoeff.bin +$nln $emiscoef_IRsnow ${CRTM_PATH}NPOESS.IRsnow.EmisCoeff.bin +$nln $emiscoef_IRland ${CRTM_PATH}NPOESS.IRland.EmisCoeff.bin +$nln $emiscoef_VISice ${CRTM_PATH}NPOESS.VISice.EmisCoeff.bin +$nln $emiscoef_VISland ${CRTM_PATH}NPOESS.VISland.EmisCoeff.bin +$nln $emiscoef_VISsnow ${CRTM_PATH}NPOESS.VISsnow.EmisCoeff.bin +$nln $emiscoef_VISwater ${CRTM_PATH}NPOESS.VISwater.EmisCoeff.bin +$nln $emiscoef_MWwater ${CRTM_PATH}FASTEM6.MWwater.EmisCoeff.bin +$nln $aercoef ${CRTM_PATH}AerosolCoeff.bin +$nln $cldcoef ${CRTM_PATH}CloudCoeff.bin + +# Copy observational data +$nln $datobs/${prefix_obs}.prepbufr ./prepbufr +$nln $datobs/${prefix_obs}.prepbufr.acft_profiles ./prepbufr_profl +$nln $datobs/${prefix_obs}.nsstbufr ./nsstbufr +$nln $datobs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl +$nln $datobs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr +$nln $datobs/${prefix_obs}.satwnd.${suffix} ./satwndbufr +$nln $datobs/${prefix_obs}.hdob.${suffix} ./hdobbufr + +$nln $datobs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr +$nln $datobs/${prefix_obs}.gome.${suffix} ./gomebufr +$nln $datobs/${prefix_obs}.omi.${suffix} ./omibufr +$nln $datobs/${prefix_obs}.mls.${suffix} ./mlsbufr +$nln $datobs/${prefix_obs}.ompsn8.${suffix} ./ompsnpbufr +$nln $datobs/${prefix_obs}.ompst8.${suffix} ./ompstcbufr +$nln $datobs/${prefix_obs}.ompslp.${suffix} ./ompslpbufr + +$nln $datobs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr +$nln $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db +$nln $datobs/${prefix_obs}.airsev.${suffix} ./airsbufr +$nln $datobs/${prefix_obs}.sevcsr.${suffix} ./seviribufr +$nln $datobs/${prefix_obs}.saphir.${suffix} ./saphirbufr +$nln $datobs/${prefix_obs}.avcsam.${suffix} ./avhambufr +$nln $datobs/${prefix_obs}.avcspm.${suffix} ./avhpmbufr +$nln $datobs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr +$nln $datobs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr +$nln $datobs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr +$nln $datobs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears +$nln $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db +$nln $datobs/${prefix_obs}.mtiasi.${suffix} ./iasibufr +$nln $datobs/${prefix_obs}.esiasi.${suffix} ./iasibufrears +$nln $datobs/${prefix_obs}.iasidb.${suffix} ./iasibufr_db +$nln $datobs/${prefix_obs}.crisf4.${suffix} ./crisfsbufr +$nln $datobs/${prefix_obs}.escrsf.${suffix} ./crisfsbufrears +$nln $datobs/${prefix_obs}.crsfdb.${suffix} ./crisfsbufr_db +$nln $datobs/${prefix_obs}.ahicsr.${suffix} ./ahibufr +$nln $datobs/${prefix_obs}.gsrcsr.${suffix} ./abibufr +$nln $datobs/${prefix_obs}.sstvcw.${suffix} ./sstviirs + +$nln $datobs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr +$nln $datobs/${prefix_obs}.1bmsu.${suffix} ./msubufr +$nln $datobs/${prefix_obs}.gmi1cr.${suffix} ./gmibufr +$nln $datobs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr +$nln $datobs/${prefix_obs}.ssmisu.${suffix} ./ssmisbufr +$nln $datobs/${prefix_obs}.1bamua.${suffix} ./amsuabufr +$nln $datobs/${prefix_obs}.esamua.${suffix} ./amsuabufrears +$nln $datobs/${prefix_obs}.amuadb.${suffix} ./amsuabufr_db +$nln $datobs/${prefix_obs}.1bamub.${suffix} ./amsubbufr +$nln $datobs/${prefix_obs}.esamub.${suffix} ./amsubbufrears +$nln $datobs/${prefix_obs}.amubdb.${suffix} ./amsubbufr_db +$nln $datobs/${prefix_obs}.atms.${suffix} ./atmsbufr +$nln $datobs/${prefix_obs}.atmsdb.${suffix} ./atmsbufr_db +$nln $datobs/${prefix_obs}.esatms.${suffix} ./atmsbufrears + +# Do not process +## $nln $datobs/${prefix_obs}.amsre.${suffix} ./amsrebufr +## $nln $datobs/${prefix_obs}.amsr2.tm00.bufr_d ./amsr2bufr + +# Copy bias correction, atmospheric and surface files +$nln $datges/${prefix_ges}.abias ./satbias_in +$nln $datges/${prefix_ges}.abias_pc ./satbias_pc +$nln $datges/${prefix_ges}.abias_air ./aircftbias_in +$nln $datges/${prefix_ges}.radstat ./radstat.gdas + +$nln $datges/${prefix_ges}.sfcf003.nc ./sfcf03 +$nln $datges/${prefix_ges}.sfcf004.nc ./sfcf04 +$nln $datges/${prefix_ges}.sfcf005.nc ./sfcf05 +$nln $datges/${prefix_ges}.sfcf006.nc ./sfcf06 +$nln $datges/${prefix_ges}.sfcf007.nc ./sfcf07 +$nln $datges/${prefix_ges}.sfcf008.nc ./sfcf08 +$nln $datges/${prefix_ges}.sfcf009.nc ./sfcf09 + +$nln $datges/${prefix_ges}.atmf003.nc ./sigf03 +$nln $datges/${prefix_ges}.atmf004.nc ./sigf04 +$nln $datges/${prefix_ges}.atmf005.nc ./sigf05 +$nln $datges/${prefix_ges}.atmf006.nc ./sigf06 +$nln $datges/${prefix_ges}.atmf007.nc ./sigf07 +$nln $datges/${prefix_ges}.atmf008.nc ./sigf08 +$nln $datges/${prefix_ges}.atmf009.nc ./sigf09 + +$nln $datens/${prefix_ens}.sfcf006.ensmean.nc ./sfcf06_anlgrid + +export ENS_PATH='./ensemble_data/' +mkdir -p ${ENS_PATH} +flist="03 04 05 06 07 08 09" +for fh in $flist; do + sigens=${prefix_ens}.atmf0${fh}.nc + imem=1 + while [[ $imem -le $NMEM_ENKF ]]; do + member="mem"`printf %03i $imem` + $nln $datens/$member/$sigens ${ENS_PATH}sigf${fh}_ens_${member} + (( imem = $imem + 1 )) + done +done + + +listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` +for type in $listdiag; do + diag_file=`echo $type | cut -d',' -f1` + fname=`echo $diag_file | cut -d'.' -f1` + date=`echo $diag_file | cut -d'.' -f2` + $UNCOMPRESS $diag_file + fnameanl=$(echo $fname|sed 's/_ges//g') + mv $fname.$date $fnameanl +done + +# Run GSI +cd $tmpdir +echo "run gsi now" +eval "$APRUN $tmpdir/gsi.x < gsiparm.anl > stdout 2>&1" +rc=$? + +exit $rc diff --git a/regression/global_4denvar_T126.sh b/regression/global_4denvar_T126.sh deleted file mode 100755 index fd6bbf9b69..0000000000 --- a/regression/global_4denvar_T126.sh +++ /dev/null @@ -1,420 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#basedir=/scratch1/portfolios/NCEPDEV/da/save/Daryl.Kleist -#gsipath=$basedir/gsi/ -#gsiexec=$gsipath/trunk/src/global_gsi.x - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -export JCAP=126 -export LEVS=64 -export JCAP_B=126 -export JCAP_EN=62 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}/${exp} - -# Specify GSI fixed field and data directories. -#fixcrtm=${fixcrtm:-$CRTM_FIX} - -#datobs=/scratch1/portfolios/NCEPDEV/da/noscrub/Daryl.Kleist/CASES/$adate/obs -#datges=/scratch1/portfolios/NCEPDEV/da/noscrub/Daryl.Kleist/CASES/$adate/ges -#datens=/scratch1/portfolios/NCEPDEV/da/noscrub/Daryl.Kleist/CASES/$adate/ens - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "670" ]]; then - export LONA=1344 - export LATA=672 - export DELTIM=100 - export resol=1 -elif [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=384 - export LATA=190 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_4denvar_T126_adate:0:8} ${global_4denvar_T126_adate:8:2} - 6 hours"` -yyg=`echo $gdate | cut -c1-8` -hhg=`echo $gdate | cut -c9-10` -yya=`echo $global_4denvar_T126_adate | cut -c1-8` -hha=`echo $global_4denvar_T126_adate | cut -c9-10` - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_4denvar_T126_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_4denvar_T126_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_4denvar_T126_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_4denvar_T126_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_4denvar_T126 -else - . $scripts/regression_namelists_db.sh global_4denvar_T126 -fi - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -insituinfo=$fixgsi/global_insituinfo.txt -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -anavinfo=$fixgsi/global_anavinfo.l64.txt -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -errtable=$fixgsi/prepobs_errtable.global -hybens_info=$fixgsi/global_hybens_info.l64.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $insituinfo ./insituinfo -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $hybens_info ./hybens_info -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -#if using correlated error, link to the covariance files -#if grep -q "Rcov" $anavinfo ; -#then -# if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; -# then -# $ncp ${fixgsi}/Rcov* . -# else -# echo "Warning: Satellite error covariance files are missing." -# echo "Check for the required Rcov files in " $anavinfo -# exit 1 -# fi -#fi - -# Copy observational data to $tmpdir -$ncp $global_4denvar_T126_datobs/prepqc.gdas.$global_4denvar_T126_adate ./prepbufr -$ncp $global_4denvar_T126_datobs/nsstbufr.gdas.$global_4denvar_T126_adate ./nsstbufr -$ncp $global_4denvar_T126_datobs/prepbufr.acft_profiles.gdas.$global_4denvar_T126_adate ./prepbufr_profl -$ncp $global_4denvar_T126_datobs/satwnd.gdas.$global_4denvar_T126_adate ./satwndbufr -$ncp $global_4denvar_T126_datobs/gpsro.gdas.$global_4denvar_T126_adate ./gpsrobufr -$ncp $global_4denvar_T126_datobs/sptrmm.gdas.$global_4denvar_T126_adate ./tmirrbufr -$ncp $global_4denvar_T126_datobs/osbuv8.gdas.$global_4denvar_T126_adate ./sbuvbufr -$ncp $global_4denvar_T126_datobs/gome.gdas.$global_4denvar_T126_adate ./gomebufr -$ncp $global_4denvar_T126_datobs/omi.gdas.$global_4denvar_T126_adate ./omibufr -$ncp $global_4denvar_T126_datobs/tcvitl.gdas.$global_4denvar_T126_adate ./tcvitl -$ncp $global_4denvar_T126_datobs/goesfv.gdas.$global_4denvar_T126_adate ./gsnd1bufr -$ncp $global_4denvar_T126_datobs/1bamua.gdas.$global_4denvar_T126_adate ./amsuabufr -$ncp $global_4denvar_T126_datobs/1bamub.gdas.$global_4denvar_T126_adate ./amsubbufr -$ncp $global_4denvar_T126_datobs/1bhrs3.gdas.$global_4denvar_T126_adate ./hirs3bufr -$ncp $global_4denvar_T126_datobs/1bhrs4.gdas.$global_4denvar_T126_adate ./hirs4bufr -$ncp $global_4denvar_T126_datobs/airsev.gdas.$global_4denvar_T126_adate ./airsbufr -$ncp $global_4denvar_T126_datobs/mtiasi.gdas.$global_4denvar_T126_adate ./iasibufr -$ncp $global_4denvar_T126_datobs/esamua.gdas.$global_4denvar_T126_adate ./amsuabufrears -$ncp $global_4denvar_T126_datobs/esamub.gdas.$global_4denvar_T126_adate ./amsubbufrears -$ncp $global_4denvar_T126_datobs/eshrs3.gdas.$global_4denvar_T126_adate ./hirs3bufrears -$ncp $global_4denvar_T126_datobs/avcsam.gdas.$global_4denvar_T126_adate ./avhambufr -$ncp $global_4denvar_T126_datobs/avcspm.gdas.$global_4denvar_T126_adate ./avhpmbufr -if [ "$debug" = ".false." ]; then - $ncp $global_4denvar_T126_datobs/esiasi.gdas.$global_4denvar_T126_adate ./iasibufrears -fi -$ncp $global_4denvar_T126_datobs/iasidb.gdas.$global_4denvar_T126_adate ./iasibufr_db -$ncp $global_4denvar_T126_datobs/gmi1cr.gdas.$global_4denvar_T126_adate ./gmibufr -$ncp $global_4denvar_T126_datobs/saphir.gdas.$global_4denvar_T126_adate ./saphirbufr -$ncp $global_4denvar_T126_datobs/cris.gdas.$global_4denvar_T126_adate ./crisbufr -$ncp $global_4denvar_T126_datobs/crisdb.gdas.$global_4denvar_T126_adate ./crisbufr_db -$ncp $global_4denvar_T126_datobs/crisf4.gdas.$global_4denvar_T126_adate ./crisfsbufr -$ncp $global_4denvar_T126_datobs/crisf4db.gdas.$global_4denvar_T126_adate ./crisfsbufr_db -$ncp $global_4denvar_T126_datobs/sevcsr.gdas.$global_4denvar_T126_adate ./seviribufr -$ncp $global_4denvar_T126_datobs/atms.gdas.$global_4denvar_T126_adate ./atmsbufr -$ncp $global_4denvar_T126_datobs/atmsdb.gdas.$global_4denvar_T126_adate ./atmsbufr_db -$ncp $global_4denvar_T126_datobs/ssmisu.gdas.$global_4denvar_T126_adate ./ssmisbufr -$ncp $global_4denvar_T126_datobs/abicsr.gdas.$global_4denvar_T126_adate ./abibufr -$ncp $global_4denvar_T126_datobs/ahicsr.gdas.$global_4denvar_T126_adate ./ahibufr - - -# Copy bias correction, atmospheric and surface files -$ncp $global_4denvar_T126_datges/biascr.gdas.$gdate ./satbias_in -$ncp $global_4denvar_T126_datges/biascr_pc.gdas.${gdate} ./satbias_pc -$ncp $global_4denvar_T126_datges/aircraft_t_bias.gdas.$gdate ./aircftbias_in -$ncp $global_4denvar_T126_datges/radstat.gdas.$gdate ./radstat.gdas - -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - -$ncp $global_4denvar_T126_datges/sfnf03.gdas.$gdate ./sfcf03 -$ncp $global_4denvar_T126_datges/sfnf04.gdas.$gdate ./sfcf04 -$ncp $global_4denvar_T126_datges/sfnf05.gdas.$gdate ./sfcf05 -$ncp $global_4denvar_T126_datges/sfnf06.gdas.$gdate ./sfcf06 -$ncp $global_4denvar_T126_datges/sfnf07.gdas.$gdate ./sfcf07 -$ncp $global_4denvar_T126_datges/sfnf08.gdas.$gdate ./sfcf08 -$ncp $global_4denvar_T126_datges/sfnf09.gdas.$gdate ./sfcf09 - -$ncp $global_4denvar_T126_datges/nsnf03.gdas.$gdate ./nstf03 -$ncp $global_4denvar_T126_datges/nsnf04.gdas.$gdate ./nstf04 -$ncp $global_4denvar_T126_datges/nsnf05.gdas.$gdate ./nstf05 -$ncp $global_4denvar_T126_datges/nsnf06.gdas.$gdate ./nstf06 -$ncp $global_4denvar_T126_datges/nsnf07.gdas.$gdate ./nstf07 -$ncp $global_4denvar_T126_datges/nsnf08.gdas.$gdate ./nstf08 -$ncp $global_4denvar_T126_datges/nsnf09.gdas.$gdate ./nstf09 - -$ncp $global_4denvar_T126_datges/gfngm3.gdas.$global_4denvar_T126_adate ./sigf03 -$ncp $global_4denvar_T126_datges/gfngm2.gdas.$global_4denvar_T126_adate ./sigf04 -$ncp $global_4denvar_T126_datges/gfngm1.gdas.$global_4denvar_T126_adate ./sigf05 -$ncp $global_4denvar_T126_datges/gfnges.gdas.$global_4denvar_T126_adate ./sigf06 -$ncp $global_4denvar_T126_datges/gfngp1.gdas.$global_4denvar_T126_adate ./sigf07 -$ncp $global_4denvar_T126_datges/gfngp2.gdas.$global_4denvar_T126_adate ./sigf08 -$ncp $global_4denvar_T126_datges/gfngp3.gdas.$global_4denvar_T126_adate ./sigf09 - -$ncp $global_4denvar_T126_datges/sfcgcy.gdas.$global_4denvar_T126_adate ./sfcgcy - -list="001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020" - -for file in $list; do -## ln -s $global_4denvar_T126_datges=/sigf06s_${gdate}_mem${file}_t${JCAP_EN} ./sigf06_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr03s_mem${file} ./sigf03_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr04s_mem${file} ./sigf04_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr05s_mem${file} ./sigf05_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr06s_mem${file} ./sigf06_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr07s_mem${file} ./sigf07_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr08s_mem${file} ./sigf08_ens_mem${file} - ln -s $global_4denvar_T126_datges/sfg_${gdate}_fhr09s_mem${file} ./sigf09_ens_mem${file} -done - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc diff --git a/regression/global_4dvar.sh b/regression/global_4dvar.sh new file mode 100755 index 0000000000..cac0d28e6b --- /dev/null +++ b/regression/global_4dvar.sh @@ -0,0 +1,338 @@ +set -x + +# Set experiment name and analysis date + +exp=$jobname + +# Set the JCAP resolution which you want. +export JCAP=48 +export LEVS=127 +export JCAP_B=48 + +# Set runtime directories +tmpdir=$tmpdir/$tmpregdir/${exp} + +# Specify GSI fixed field and data directories. +fixcrtm=${fixcrtm:-$CRTM_FIX} + + +# Set variables used in script +UNCOMPRESS=gunzip +CLEAN=NO +ncp=/bin/cp +nln="/bin/ln -fs" + + +# Given the requested resolution, set dependent resolution parameters +if [[ "$JCAP" = "96" ]]; then + export LONA=384 + export LATA=192 + export DELTIM=1200 +elif [[ "$JCAP" = "48" ]]; then + export LONA=192 + export LATA=96 + export DELTIM=1200 +else + echo "INVALID JCAP = $JCAP" + exit +fi +export NLON=$LONA +export NLAT=$((${LATA}+2)) + + +# Given the analysis date, compute the date from which the +# first guess comes. Extract cycle and set prefix and suffix +# for guess and observation data files +gdate=`date +%Y%m%d%H -d "${global_adate:0:8} ${global_adate:8:2} - 6 hours"` +PDYa=`echo $global_adate | cut -c1-8` +cyca=`echo $global_adate | cut -c9-10` +PDYg=`echo $gdate | cut -c1-8` +cycg=`echo $gdate | cut -c9-10` + +dumpobs=gdas +prefix_obs=${dumpobs}.t${cyca}z +prefix_ges=gdas.t${cycg}z +prefix_ens=gdas.t${cycg}z +suffix=tm00.bufr_d + +dumpges=gdas +COMROOTgfs=$casesdir/gfs/prod +datobs=$COMROOTgfs/$dumpobs.$PDYa/${cyca}/atmos +datges=$COMROOTgfs/$dumpges.$PDYg/${cycg}/atmos +datens=$COMROOTgfs/enkfgdas.$PDYg/${cycg}/atmos + + +# Set up $tmpdir +rm -rf $tmpdir +mkdir -p $tmpdir +cd $tmpdir + +# Make gsi namelist + +SETUP="" +GRIDOPTS="" +BKGVERR="" +ANBKGERR="" +JCOPTS="" +STRONGOPTS="" +OBSQC="" +OBSINPUT="" +SUPERRAD="" +SINGLEOB="" + + +# Set fixed files +# berror = forecast model background error statistics +# specoef = CRTM spectral coefficients +# trncoef = CRTM transmittance coefficients +# emiscoef = CRTM coefficients for IR sea surface emissivity model +# aerocoef = CRTM coefficients for aerosol effects +# cldcoef = CRTM coefficients for cloud effects +# satinfo = text file with information about assimilation of brightness temperatures +# satangl = angle dependent bias correction file (fixed in time) +# pcpinfo = text file with information about assimilation of prepcipitation rates +# ozinfo = text file with information about assimilation of ozone data +# errtable = text file with obs error for conventional data (optional) +# convinfo = text file with information about assimilation of conventional data +# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) +# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) +# aeroinfo = text file with information about assimilation of aerosol data + +anavinfo=$fixgsi/global_anavinfo_qlqi.l${LEVS}.txt +berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 +locinfo=$fixgsi/global_hybens_info.l${LEVS}.txt +satinfo=$fixgsi/global_satinfo.txt +scaninfo=$fixgsi/global_scaninfo.txt +satangl=$fixgsi/global_satangbias.txt +pcpinfo=$fixgsi/global_pcpinfo.txt +ozinfo=$fixgsi/global_ozinfo.txt +convinfo=$fixgsi/global_convinfo.txt +vqcdat=$fixgsi/vqctp001.dat +insituinfo=$fixgsi/global_insituinfo.txt +errtable=$fixgsi/prepobs_errtable.global +aeroinfo=$fixgsi/global_aeroinfo.txt +atmsbeaminfo=$fixgsi/atms_beamwidth.txt +cloudyinfo=$fixgsi/cloudy_radiance_info.txt + +emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin +emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin +emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin +emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin +emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin +emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin +emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin +emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin +emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin +aercoef=$fixcrtm/AerosolCoeff.bin +cldcoef=$fixcrtm/CloudCoeff.bin +#cldcoef=$fixcrtm/CloudCoeff.GFDLFV3.-109z-1.bin # use with crtm/2.4.0 + +# Only need this file for single obs test +bufrtable=$fixgsi/prepobs_prep.bufrtable + +# Only need this file for sst retrieval +bftab_sst=$fixgsi/bufrtab.012 + +# Copy executable and fixed files to $tmpdir +if [[ $exp == *"updat"* ]]; then + $ncp $gsiexec_updat ./gsi.x +elif [[ $exp == *"contrl"* ]]; then + $ncp $gsiexec_contrl ./gsi.x +fi + +$ncp $anavinfo ./anavinfo +$ncp $berror ./berror_stats +$ncp $locinfo ./hybens_info +$ncp $satinfo ./satinfo +$ncp $scaninfo ./scaninfo +##$ncp $satangl ./satbias_angle +$ncp $pcpinfo ./pcpinfo +$ncp $ozinfo ./ozinfo +$ncp $convinfo ./convinfo +$ncp $vqcdat ./vqctp001.dat +$ncp $insituinfo ./insituinfo +$ncp $errtable ./errtable +$ncp $aeroinfo ./aeroinfo +$ncp $atmsbeaminfo ./atms_beamwidth.txt +$ncp $cloudyinfo ./cloudy_radiance_info.txt + +$ncp $bufrtable ./prepobs_prep.bufrtable +$ncp $bftab_sst ./bftab_sstphr + +#If using correlated error, get the covariance files +if grep -q "Rcov" $anavinfo ; +then + if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; + then + $ncp ${fixgsi}/Rcov* $tmpdir + +# Correlated error utlizes mkl lapack. Found it necesary to fix the +# number of mkl threads to ensure reproducible results independent +# of the job configuration. + export MKL_NUM_THREADS=1 + + else + echo "Warning: Satellite error covariance files are missing." + echo "Check for the required Rcov files in " $ANAVINFO + exit 1 + fi +fi + +# Copy CRTM coefficient files based on entries in satinfo file +export CRTM_PATH="./crtm_coeffs/" +mkdir -p ${CRTM_PATH} +for file in `awk '{if($1!~"!"){print $1}}' satinfo | sort | uniq` ;do + $nln $fixcrtm/${file}.SpcCoeff.bin ${CRTM_PATH}/${file}.SpcCoeff.bin + $nln $fixcrtm/${file}.TauCoeff.bin ${CRTM_PATH}/${file}.TauCoeff.bin +done +$nln $fixcrtm/amsua_metop-a_v2.SpcCoeff.bin ${CRTM_PATH}/amsua_metop-a_v2.SpcCoeff.bin + +$nln $emiscoef_IRwater ${CRTM_PATH}Nalli.IRwater.EmisCoeff.bin +$nln $emiscoef_IRice ${CRTM_PATH}NPOESS.IRice.EmisCoeff.bin +$nln $emiscoef_IRsnow ${CRTM_PATH}NPOESS.IRsnow.EmisCoeff.bin +$nln $emiscoef_IRland ${CRTM_PATH}NPOESS.IRland.EmisCoeff.bin +$nln $emiscoef_VISice ${CRTM_PATH}NPOESS.VISice.EmisCoeff.bin +$nln $emiscoef_VISland ${CRTM_PATH}NPOESS.VISland.EmisCoeff.bin +$nln $emiscoef_VISsnow ${CRTM_PATH}NPOESS.VISsnow.EmisCoeff.bin +$nln $emiscoef_VISwater ${CRTM_PATH}NPOESS.VISwater.EmisCoeff.bin +$nln $emiscoef_MWwater ${CRTM_PATH}FASTEM6.MWwater.EmisCoeff.bin +$nln $aercoef ${CRTM_PATH}AerosolCoeff.bin +$nln $cldcoef ${CRTM_PATH}CloudCoeff.bin + +# Copy observational data +$nln $datobs/${prefix_obs}.prepbufr ./prepbufr +$nln $datobs/${prefix_obs}.prepbufr.acft_profiles ./prepbufr_profl +$nln $datobs/${prefix_obs}.nsstbufr ./nsstbufr +$nln $datobs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl +$nln $datobs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr +$nln $datobs/${prefix_obs}.satwnd.${suffix} ./satwndbufr +$nln $datobs/${prefix_obs}.hdob.${suffix} ./hdobbufr + +$nln $datobs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr +$nln $datobs/${prefix_obs}.gome.${suffix} ./gomebufr +$nln $datobs/${prefix_obs}.omi.${suffix} ./omibufr +$nln $datobs/${prefix_obs}.mls.${suffix} ./mlsbufr +$nln $datobs/${prefix_obs}.ompsn8.${suffix} ./ompsnpbufr +$nln $datobs/${prefix_obs}.ompst8.${suffix} ./ompstcbufr +$nln $datobs/${prefix_obs}.ompslp.${suffix} ./ompslpbufr + +$nln $datobs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr +$nln $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db +$nln $datobs/${prefix_obs}.airsev.${suffix} ./airsbufr +$nln $datobs/${prefix_obs}.sevcsr.${suffix} ./seviribufr +$nln $datobs/${prefix_obs}.saphir.${suffix} ./saphirbufr +$nln $datobs/${prefix_obs}.avcsam.${suffix} ./avhambufr +$nln $datobs/${prefix_obs}.avcspm.${suffix} ./avhpmbufr +$nln $datobs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr +$nln $datobs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr +$nln $datobs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr +$nln $datobs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears +$nln $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db +$nln $datobs/${prefix_obs}.mtiasi.${suffix} ./iasibufr +$nln $datobs/${prefix_obs}.esiasi.${suffix} ./iasibufrears +$nln $datobs/${prefix_obs}.iasidb.${suffix} ./iasibufr_db +$nln $datobs/${prefix_obs}.crisf4.${suffix} ./crisfsbufr +$nln $datobs/${prefix_obs}.escrsf.${suffix} ./crisfsbufrears +$nln $datobs/${prefix_obs}.crsfdb.${suffix} ./crisfsbufr_db +$nln $datobs/${prefix_obs}.ahicsr.${suffix} ./ahibufr +$nln $datobs/${prefix_obs}.gsrcsr.${suffix} ./abibufr +$nln $datobs/${prefix_obs}.sstvcw.${suffix} ./sstviirs + +$nln $datobs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr +$nln $datobs/${prefix_obs}.1bmsu.${suffix} ./msubufr +$nln $datobs/${prefix_obs}.gmi1cr.${suffix} ./gmibufr +$nln $datobs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr +$nln $datobs/${prefix_obs}.ssmisu.${suffix} ./ssmisbufr +$nln $datobs/${prefix_obs}.1bamua.${suffix} ./amsuabufr +$nln $datobs/${prefix_obs}.esamua.${suffix} ./amsuabufrears +$nln $datobs/${prefix_obs}.amuadb.${suffix} ./amsuabufr_db +$nln $datobs/${prefix_obs}.1bamub.${suffix} ./amsubbufr +$nln $datobs/${prefix_obs}.esamub.${suffix} ./amsubbufrears +$nln $datobs/${prefix_obs}.amubdb.${suffix} ./amsubbufr_db +$nln $datobs/${prefix_obs}.atms.${suffix} ./atmsbufr +$nln $datobs/${prefix_obs}.atmsdb.${suffix} ./atmsbufr_db +$nln $datobs/${prefix_obs}.esatms.${suffix} ./atmsbufrears + +# Do not process +## $nln $datobs/${prefix_obs}.amsre.${suffix} ./amsrebufr +## $nln $datobs/${prefix_obs}.amsr2.tm00.bufr_d ./amsr2bufr + +# Copy bias correction, atmospheric and surface files +##$nln $datges/${prefix_ges}.abias ./satbias_in +##$nln $datges/${prefix_ges}.abias_pc ./satbias_pc +##$nln $datges/${prefix_ges}.abias_air ./aircftbias_in + + +#$nln $datges/${prefix_ges}.abias.4dvar ./satbias_in +$nln $datges/${prefix_ges}.satang.4dvar ./satbias_angle + +$nln $datges/${prefix_ges}.radstat ./radstat.gdas + +member=mem001 +$nln $datens/$member/${prefix_ges}.sfcf003.nc ./sfcf03 +##$nln $datens/$member/${prefix_ges}.sfcf004.nc ./sfcf04 +##$nln $datens/$member/${prefix_ges}.sfcf005.nc ./sfcf05 +$nln $datens/$member/${prefix_ges}.sfcf006.nc ./sfcf06 +##$nln $datens/$member/${prefix_ges}.sfcf007.nc ./sfcf07 +##$nln $datens/$member/${prefix_ges}.sfcf008.nc ./sfcf08 +$nln $datens/$member/${prefix_ges}.sfcf009.nc ./sfcf09 + +$nln $datens/$member/${prefix_ges}.atmf003.nc ./sigf03 +##$nln $datens/$member/${prefix_ges}.atmf004.nc ./sigf04 +##$nln $datens/$member/${prefix_ges}.atmf005.nc ./sigf05 +$nln $datens/$member/${prefix_ges}.atmf006.nc ./sigf06 +##$nln $datens/$member/${prefix_ges}.atmf007.nc ./sigf07 +##$nln $datens/$member/${prefix_ges}.atmf008.nc ./sigf08 +$nln $datens/$member/${prefix_ges}.atmf009.nc ./sigf09 + +$nln $datens/${prefix_ens}.sfcf006.ensmean.nc ./sfcf06_anlgrid + +listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` +for type in $listdiag; do + diag_file=`echo $type | cut -d',' -f1` + fname=`echo $diag_file | cut -d'.' -f1` + date=`echo $diag_file | cut -d'.' -f2` + $UNCOMPRESS $diag_file + fnameanl=$(echo $fname|sed 's/_ges//g') + mv $fname.$date $fnameanl +done + + +# Run GSI in observer mode +SETUP="l4dvar=.true.,jiterstart=1,lobserver=.true.,iwrtinc=1,nhr_assimilation=6,nhr_obsbin=1," +if [ "$debug" = ".false." ]; then + . $scripts/regression_namelists.sh global_lanczos +else + . $scripts/regression_namelists_db.sh global_lanczos +fi +rm gsiparm.anl +cat << EOF > gsiparm.anl +$gsi_namelist +EOF +cp gsiparm.anl gsiparm.anl.obsvr + +echo "run gsi observer" +eval "$APRUN $tmpdir/gsi.x < gsiparm.anl > stdout.obsvr 2>&1" +ra=$? + +# Run gsi identity model 4dvar under Parallel Operating Environment (poe) on NCEP IBM +rm -f siganl sfcanl.gsi satbias_out fort.2* +rm -rf dir.0* + +# Create namelist for identity model 4dvar run +SETUP="l4dvar=.true.,jiterstart=1,nhr_assimilation=6,nhr_obsbin=1,idmodel=.true.,iwrtinc=1,lanczosave=.true.," +if [ "$debug" = ".false." ]; then + . $scripts/regression_namelists.sh global_lanczos +else + . $scripts/regression_namelists_db.sh global_lanczos +fi +rm gsiparm.anl +cat < gsiparm.anl +$gsi_namelist +EOF + +echo "run gsi 4dvar" +eval "$APRUN $tmpdir/gsi.x < gsiparm.anl > stdout 2>&1" +rb=$? +rc=$((ra+rb)) +exit $rc diff --git a/regression/global_4dvar_T62.sh b/regression/global_4dvar_T62.sh deleted file mode 100755 index 46aed61319..0000000000 --- a/regression/global_4dvar_T62.sh +++ /dev/null @@ -1,439 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#gsiexec=$updat - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -#export JCAP=62 -export LEVS=64 -export JCAP_B=62 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/4dvar_out${JCAP}/sigmap/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_4dvar_T62_adate:0:8} ${global_4dvar_T62_adate:8:2} - 6 hours"` -hha=`echo $global_4dvar_T62_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gdas1.t${hha}z -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gdas${resol}.t${hhg}z -prefix_atm=gdas${resol}.t${hha}z -prefixg=gdas1.t${hhg}z -suffix=tm00.bufr_d - -adate0=`echo $global_4dvar_T62_adate | cut -c1-8` -gdate0=`echo $gdate | cut -c1-8` - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# Make gsi namelist - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_4dvar_T62_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_4dvar_T62_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_4dvar_T62_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_4dvar_T62_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -. $scripts/regression_nl_update.sh - -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -# Set variables for requested minimization (pcgsoi or lanczos) -JCOPTS="ljcpdry=.false.," -OBSQC="noiqc=.false.," -SETUPmin="miter=1,niter(1)=50,niter_no_qc(1)=500," -SETUPlan="" -#export minimization=${minimization:-"pcgsoi"} -#if [ "$minimization" = "lanczos" ]; then -# SETUPlan="lsqrtb=.true.,lcongrad=.true.,ltlint=.true.,ladtest=.true.,lgrtest=.false.," -# HYBENS_GLOBAL=".false." -#fi - -# Create namelist for observer run -export nhr_obsbin=${nhr_obsbin:-1} -SETUPobs="l4dvar=.true.,jiterstart=1,lobserver=.true.,iwrtinc=1,nhr_assimilation=6,nhr_obsbin=$nhr_obsbin," -#SETUP="$SETUPmin $SETUPlan $SETUPobs $SETUP_update" -SETUP="$SETUPmin $SETUPobs $SETUP_update" - -if [ "$minimization" = "lanczos" ]; then - namelist_name=global_lanczos_T62 -else - namelist_name=global_T62 -fi - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh $namelist_name -else - . $scripts/regression_namelists_db.sh $namelist_name -fi -rm gsiparm.anl -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/global_anavinfo.l64.txt -berror=$fixgsi/$endianness/global_berror.l${LEVS}y${NLAT}.f77 -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -ozinfo=$fixgsi/global_ozinfo.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -errtable=$fixgsi/prepobs_errtable.global -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $errtable ./errtable -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#if using correlated error, link to the covariance files -#if grep -q "Rcov" $anavinfo ; -#then -# if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; -# then -# $ncp ${fixgsi}/Rcov* . -# else -# echo "Warning: Satellite error covariance files are missing." -# echo "Check for the required Rcov files in " $anavinfo -# exit 1 -# fi -#fi - -# Adjust data usage flags in convinfo file. -rm new -cp convinfo old -mv convinfo convinfo_original -sed 's/sst 180 0 -1 3.0/sst 180 0 1 3.0/' < old > new -mv new old -sed 's/uv 243 56 1 3.0/uv 243 56 -1 3.0/' < old > new -mv new old -sed 's/uv 253 56 1 3.0/uv 253 56 -1 3.0/' < old > new -mv new convinfo - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $global_4dvar_T62_obs/${prefix_obs}.prepbufr ./prepbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.satwnd.${suffix} ./satwndbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.spssmi.${suffix} ./ssmirrbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.sptrmm.${suffix} ./tmirrbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bamua.${suffix} ./amsuabufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bamub.${suffix} ./amsubbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.1bmsu.${suffix} ./msubufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.airsev.${suffix} ./airsbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.sevcsr.${suffix} ./seviribufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.mtiasi.${suffix} ./iasibufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.amsre.${suffix} ./amsrebufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.ssmis.${suffix} ./ssmisbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.gome.${suffix} ./gomebufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.omi.${suffix} ./omibufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.mlsbufr.${suffix} ./mlsbufr -$ncp $global_4dvar_T62_obs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears -$ncp $global_4dvar_T62_obs/${prefix_obs}.esamua.${suffix} ./amsuabufrears -$ncp $global_4dvar_T62_obs/${prefix_obs}.esamub.${suffix} ./amsubbufrears -$ncp $global_4dvar_T62_obs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl - -# Copy bias correction, atmospheric and surface files -if [ "$minimization" = "lanczos" ]; then - $ncp $global_4dvar_T62_ges/${prefix_tbc}.abias.orig ./satbias_in - $ncp $global_4dvar_T62_ges/${prefix_tbc}.satang.orig ./satbias_angle -else - $ncp $global_4dvar_T62_ges/${prefix_tbc}.abias ./satbias_in - $ncp $global_4dvar_T62_ges/${prefix_tbc}.abias_pc ./satbias_pc - $ncp $global_4dvar_T62_ges/${prefix_tbc}.satang ./satbias_angle - $ncp $global_4dvar_T62_ges/${prefix_tbc}.radstat ./radstat.gdas - - listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` - for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl - done -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - ##$ncp $global_4dvar_T62_ges/${prefix_sfc}.bf03 ./sfcf03 - $ncp $global_4dvar_T62_ges/${prefix_sfc}.bf06 ./sfcf06 - ##$ncp $global_4dvar_T62_ges/${prefix_sfc}.bf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ##$ncp $global_4dvar_T62_ges/${prefix_sfc}.bf03.le ./sfcf03 - $ncp $global_4dvar_T62_ges/${prefix_sfc}.bf06.le ./sfcf06 - ##$ncp $global_4dvar_T62_ges/${prefix_sfc}.bf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - ##$ncp $global_4dvar_T62_obs/${prefix_atm}.sgm3prep ./sigf03 - $ncp $global_4dvar_T62_obs/${prefix_atm}.sgesprep ./sigf06 - ##$ncp $global_4dvar_T62_obs/${prefix_atm}.sgp3prep ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ##$ncp $global_4dvar_T62_obs/${prefix_atm}.sgm3prep.le ./sigf03 - $ncp $global_4dvar_T62_obs/${prefix_atm}.sgesprep.le ./sigf06 - ##$ncp $global_4dvar_T62_obs/${prefix_atm}.sgp3prep.le ./sigf09 -fi - -# Run gsi observer -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout.obsvr 2>&1" - -# Run gsi identity model 4dvar under Parallel Operating Environment (poe) on NCEP IBM -rm -f siganl sfcanl.gsi satbias_out fort.2* -rm -rf dir.0* - -# Create namelist for identity model 4dvar run -SETUP4dv="l4dvar=.true.,jiterstart=1,nhr_assimilation=6,nhr_obsbin=$nhr_obsbin,idmodel=.true.,iwrtinc=1,lanczosave=.true.," -#SETUP="$SETUPmin $SETUPlan $SETUP4dv $SETUP_update" -SETUP="$SETUPmin $SETUP4dv $SETUP_update" - -if [ "$minimization" = "lanczos" ]; then - namelist_name=global_lanczos_T62 -else - namelist_name=global_T62 -fi - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh $namelist_name -else - . $scripts/regression_namelists_db.sh $namelist_name -fi -rm gsiparm.anl -cat << EOF > gsiparm.anl -$gsi_namelist -EOF - -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc diff --git a/regression/global_C96_fv3aero.sh b/regression/global_C96_fv3aero.sh deleted file mode 100755 index 438cd6dc0e..0000000000 --- a/regression/global_C96_fv3aero.sh +++ /dev/null @@ -1,334 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -export LEVS=64 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/outC96_fv3aero/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -PDY=`echo $global_C96_fv3aero_adate | cut -c1-8` -cyc=`echo $global_C96_fv3aero_adate | cut -c9-10` -gdate=`date +%Y%m%d%H -d "${global_C96_fv3aero_adate:0:8} ${global_C96_fv3aero_adate:8:2} - 6 hours"` -gPDY=`echo $gdate | cut -c1-8` -gcyc=`echo $gdate | cut -c9-10` -hha=`echo $global_C96_fv3aero_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gfs.t${hha}z. -prefix_prep=$prefix_obs -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gfsC96.t${hhg}z -prefix_atm=gfsC96.t${hhg}z -suffix_obs=gdas.${global_C96_fv3aero_adate} -suffix_bias=gdas.${gdate} - -datobs=$global_C96_fv3aero_obs/gfs.$PDY/$cyc -datanl=$global_C96_fv3aero_obs/gfs.$PDY/$cyc -datges=$global_C96_fv3aero_ges/gfs.$gPDY/$gcyc - - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aero_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aero_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aero_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aero_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -. $scripts/regression_namelists.sh global_C96_fv3aero - -##! l4dvar=.false.,nhr_assimilation=6,nhr_obsbin=6, -##! lsqrtb=.true.,lcongrad=.false.,ltlint=.true., -##! idmodel=.true.,lwrtinc=.false., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/Big_Endian/fv3aero_berror.l64y194.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -anavinfo=$fixgsi/anavinfo_fv3aero -aeroinfo=$fixgsi/aeroinfo_fv3aero -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -hybens_info=$fixgsi/global_hybens_info.l64.txt -errtable=$fixgsi/prepobs_errtable.global -atmsbeaminfo=$fixgsi/atms_beamwidth.txt - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -mkdir ./crtm_coeffs -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./crtm_coeffs/Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./crtm_coeffs/NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./crtm_coeffs/NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./crtm_coeffs/NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./crtm_coeffs/NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./crtm_coeffs/NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./crtm_coeffs/NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./crtm_coeffs/NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./crtm_coeffs/FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./crtm_coeffs/AerosolCoeff.bin -$ncp $cldcoef ./crtm_coeffs/CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $aeroinfo ./aeroinfo -$ncp $hybens_info ./hybens_info -$ncp $atmsbeaminfo ./atms_beamwidth.txt - -# Copy CRTM coefficient files -$ncp $fixcrtm/v.modis_aqua.SpcCoeff.bin ./crtm_coeffs/v.modis_aqua.SpcCoeff.bin -$ncp $fixcrtm/v.modis_aqua.TauCoeff.bin ./crtm_coeffs/v.modis_aqua.TauCoeff.bin -$ncp $fixcrtm/v.modis_terra.SpcCoeff.bin ./crtm_coeffs/v.modis_terra.SpcCoeff.bin -$ncp $fixcrtm/v.modis_terra.TauCoeff.bin ./crtm_coeffs/v.modis_terra.TauCoeff.bin - -# Copy observational data to $tmpdir -ln -s -f $datobs/${prefix_obs}modisaod.tm00.bufr ./modisaodbufr - - -# Copy bias correction, atmospheric and surface files -ln -s -f $datges/gfs.t18z.abias ./satbias_in -ln -s -f $datges/gfs.t18z.abias_pc ./satbias_pc -#ln -s -f $datges/gfs.t18z.radstat ./radstat.gdas - -if [[ "$endianness" = "Big_Endian" ]]; then - ln -s -f $datges/${prefix_sfc}.sfcf03 ./sfcf03 - ln -s -f $datges/${prefix_sfc}.sfcf06 ./sfcf06 - ln -s -f $datges/${prefix_sfc}.sfcf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $datges/${prefix_sfc}.sfcf03.le ./sfcf03 - ln -s -f $datges/${prefix_sfc}.sfcf06.le ./sfcf06 - ln -s -f $datges/${prefix_sfc}.sfcf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - ln -s -f $datges/${prefix_atm}.sigf03 ./sigf03 - ln -s -f $datges/${prefix_atm}.sigf06 ./sigf06 - ln -s -f $datges/${prefix_atm}.sigf09 ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $datges/${prefix_atm}.sigf03.le ./sigf03 - ln -s -f $datges/${prefix_atm}.sigf06.le ./sigf06 - ln -s -f $datges/${prefix_atm}.sigf09.le ./sigf09 -fi - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - - - - -# 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. -# - - -echo "Time before diagnostic loop is `date` " -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="modis_aod_terra modis_aod_aqua" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${global_T62_adate} - compress diag_${type}_${string}.${global_T62_adate} - $ncp diag_${type}_${string}.${global_T62_adate}.Z $savdir/ - fi - done -done -echo "Time after diagnostic loop is `date` " - - - -# If requested, clean up $tmpdir -if [[ "$CLEAN" = "YES" ]];then - if [[ $rc -eq 0 ]];then - rm -rf $tmpdir - cd $tmpdir - cd ../ - rmdir $tmpdir - fi -fi - - -# End of script -exit diff --git a/regression/global_C96_fv3aerorad.sh b/regression/global_C96_fv3aerorad.sh deleted file mode 100755 index 6e990be1be..0000000000 --- a/regression/global_C96_fv3aerorad.sh +++ /dev/null @@ -1,305 +0,0 @@ -set -x -# Set experiment name and analysis date - -exp=$jobname - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -export LEVS=64 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/outC96_fv3aerorad/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp -ncpl="ln -fs" - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -PDY=`echo $global_C96_fv3aerorad_adate | cut -c1-8` -cyc=`echo $global_C96_fv3aerorad_adate | cut -c9-10` -gdate=`date +%Y%m%d%H -d "${global_C96_fv3aerorad_adate:0:8} ${global_C96_fv3aerorad_adate:8:2} - 6 hours"` -gPDY=`echo $gdate | cut -c1-8` -gcyc=`echo $gdate | cut -c9-10` -hha=`echo $global_C96_fv3aerorad_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gfs.t${hha}z -prefix_prep=$prefix_obs -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gfsC96.t${hhg}z -prefix_atm=gfsC96.t${hhg}z -prefix_aer=gfsC96.t${hhg}z -suffix_obs=tm00.bufr_d - -datobs=$global_C96_fv3aerorad_obs/gfs.$PDY/$cyc -datanl=$global_C96_fv3aerorad_obs/gfs.$PDY/$cyc -datges=$global_C96_fv3aerorad_ges/gfs.$gPDY/$gcyc - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aerorad_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aerorad_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aerorad_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_C96_fv3aerorad_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -. $scripts/regression_namelists.sh global_C96_fv3aerorad - -##! l4dvar=.false.,nhr_assimilation=6,nhr_obsbin=6, -##! lsqrtb=.true.,lcongrad=.false.,ltlint=.true., -##! idmodel=.true.,lwrtinc=.false., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/Big_Endian/global_berror.l64y194.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/fv3aerorad_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -anavinfo=$fixgsi/anavinfo_fv3aerorad -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -hybens_info=$fixgsi/global_hybens_info.l64.txt -errtable=$fixgsi/prepobs_errtable.global -atmsbeaminfo=$fixgsi/atms_beamwidth.txt - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -mkdir ./crtm_coeffs -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./crtm_coeffs/Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./crtm_coeffs/NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./crtm_coeffs/NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./crtm_coeffs/NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./crtm_coeffs/NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./crtm_coeffs/NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./crtm_coeffs/NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./crtm_coeffs/NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./crtm_coeffs/FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./crtm_coeffs/AerosolCoeff.bin -$ncp $cldcoef ./crtm_coeffs/CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $aeroinfo ./aeroinfo -$ncp $hybens_info ./hybens_info -$ncp $atmsbeaminfo ./atms_beamwidth.txt - -# Copy CRTM coefficient files -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./crtm_coeffs - $ncp $fixcrtm/${file}.TauCoeff.bin ./crtm_coeffs -done - -# Copy observational data to $tmpdir -$ncpl $datobs/${prefix_obs}.prepbufr ./prepbufr -$ncpl $datobs/${prefix_obs}.prepbufr.acft_profiles ./prepbufr_profl -$ncpl $datobs/${prefix_obs}.nsstbufr ./nsstbufr -$ncpl $datobs/${prefix_obs}.airsev.${suffix_obs} ./airsbufr -$ncpl $datobs/${prefix_obs}.mtiasi.${suffix_obs} ./iasibufr -$ncpl $datobs/${prefix_obs}.cris.${suffix_obs} ./crisbufr - -# Copy bias correction, atmospheric and surface files -$ncpl $datges/gfs.t18z.abias ./satbias_in -$ncpl $datges/gfs.t18z.abias_pc ./satbias_pc -$ncpl $datges/gfs.t18z.abias_air ./aircftbias_in -#$ncpl $datges/gfs.t18z.radstat ./radstat.gdas - -if [[ "$endianness" = "Big_Endian" ]]; then - ln -s -f $datges/${prefix_sfc}.sfcf03 ./sfcf03 - ln -s -f $datges/${prefix_sfc}.sfcf06 ./sfcf06 - ln -s -f $datges/${prefix_sfc}.sfcf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $datges/${prefix_sfc}.sfcf03.le ./sfcf03 - ln -s -f $datges/${prefix_sfc}.sfcf06.le ./sfcf06 - ln -s -f $datges/${prefix_sfc}.sfcf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - ln -s -f $datges/${prefix_atm}.sigf03 ./sigf03 - ln -s -f $datges/${prefix_atm}.sigf06 ./sigf06 - ln -s -f $datges/${prefix_atm}.sigf09 ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $datges/${prefix_atm}.sigf03.le ./sigf03 - ln -s -f $datges/${prefix_atm}.sigf06.le ./sigf06 - ln -s -f $datges/${prefix_atm}.sigf09.le ./sigf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - $ncpl $datges/${prefix_aer}.sigf03 ./aerf03 - $ncpl $datges/${prefix_aer}.sigf06 ./aerf06 - $ncpl $datges/${prefix_aer}.sigf09 ./aerf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - $ncpl $datges/${prefix_aer}.sigf03.le ./aerf03 - $ncpl $datges/${prefix_aer}.sigf06.le ./aerf06 - $ncpl $datges/${prefix_aer}.sigf09.le ./aerf09 -fi - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# If requested, clean up $tmpdir -if [[ "$CLEAN" = "YES" ]];then - if [[ $rc -eq 0 ]];then - rm -rf $tmpdir - cd $tmpdir - cd ../ - rmdir $tmpdir - fi -fi - - -# End of script -exit diff --git a/regression/global_T62.sh b/regression/global_T62.sh deleted file mode 100755 index 06c0ddeacb..0000000000 --- a/regression/global_T62.sh +++ /dev/null @@ -1,457 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#basedir=/scratch1/portfolios/NCEPDEV/da/save/Michael.Lueken -#gsiexec=$gsiexec -#gsiexec=$basedir/EXP-port/src/global_gsi.x - - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -#export JCAP=62 -export LEVS=64 -export JCAP_B=$JCAP - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -#datobs=$datobs -#datobs=/scratch1/portfolios/NCEPDEV/da/noscrub/Michael.Lueken/CASES/sigmap/$adate -#datges=$datges -#datges=/scratch1/portfolios/NCEPDEV/da/noscrub/Michael.Lueken/CASES/sigmap/$adate - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=256 - export LATA=128 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_T62_adate:0:8} ${global_T62_adate:8:2} - 6 hours"` -hha=`echo $global_T62_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gdas1.t${hha}z. -prefix_prep=$prefix_obs -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gdas${resol}.t${hhg}z -prefix_atm=gdas${resol}.t${hha}z -suffix_obs=gdas.${global_T62_adate} -suffix_bias=gdas.${gdate} - - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_T62 -else - . $scripts/regression_namelists_db.sh global_T62 -fi - -##! l4dvar=.false.,nhr_assimilation=6,nhr_obsbin=6, -##! lsqrtb=.true.,lcongrad=.false.,ltlint=.true., -##! idmodel=.true.,lwrtinc=.false., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/$endianness/global_berror.l${LEVS}y${NLAT}.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -anavinfo=$fixgsi/global_anavinfo.l64.txt -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -hybens_info=$fixgsi/global_hybens_info.l64.txt -errtable=$fixgsi/prepobs_errtable.global -atmsbeaminfo=$fixgsi/atms_beamwidth.txt -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $hybens_info ./hybens_info -$ncp $atmsbeaminfo ./atms_beamwidth.txt - -#### -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv -### - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#if using correlated error, link to the covariance files -#if grep -q "Rcov" $anavinfo ; -#then -# if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; -# then -# $ncp ${fixgsi}/Rcov* . -# else -# echo "Warning: Satellite error covariance files are missing." -# echo "Check for the required Rcov files in " $anavinfo -# exit 1 -# fi -#fi - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - - -# Copy observational data to $tmpdir -ln -s -f $global_T62_obs/prepqc.${suffix_obs} ./prepbufr -ln -s -f $global_T62_obs/satwnd.${suffix_obs} ./satwndbufr -ln -s -f $global_T62_obs/gpsro.${suffix_obs} ./gpsrobufr -ln -s -f $global_T62_obs/spssmi.${suffix_obs} ./ssmirrbufr -ln -s -f $global_T62_obs/sptrmm.${suffix_obs} ./tmirrbufr -ln -s -f $global_T62_obs/gome.${suffix_obs} ./gomebufr -ln -s -f $global_T62_obs/omi.${suffix_obs} ./omibufr -ln -s -f $global_T62_obs/mls.${suffix_obs} ./mlsbufr -ln -s -f $global_T62_obs/osbuv8.${suffix_obs} ./sbuvbufr -ln -s -f $global_T62_obs/goesfv.${suffix_obs} ./gsnd1bufr -ln -s -f $global_T62_obs/1bamua.${suffix_obs} ./amsuabufr -ln -s -f $global_T62_obs/1bamub.${suffix_obs} ./amsubbufr -ln -s -f $global_T62_obs/1bhrs2.${suffix_obs} ./hirs2bufr -ln -s -f $global_T62_obs/1bhrs3.${suffix_obs} ./hirs3bufr -ln -s -f $global_T62_obs/1bhrs4.${suffix_obs} ./hirs4bufr -ln -s -f $global_T62_obs/1bmhs.${suffix_obs} ./mhsbufr -ln -s -f $global_T62_obs/1bmsu.${suffix_obs} ./msubufr -ln -s -f $global_T62_obs/airsev.${suffix_obs} ./airsbufr -ln -s -f $global_T62_obs/sevcsr.${suffix_obs} ./seviribufr -ln -s -f $global_T62_obs/mtiasi.${suffix_obs} ./iasibufr -ln -s -f $global_T62_obs/esamua.${suffix_obs} ./amsuabufrears -ln -s -f $global_T62_obs/esamub.${suffix_obs} ./amsubbufrears -ln -s -f $global_T62_obs/eshrs3.${suffix_obs} ./hirs3bufrears -ln -s -f $global_T62_obs/ssmit.${suffix_obs} ./ssmitbufr -ln -s -f $global_T62_obs/amsre.${suffix_obs} ./amsrebufr -ln -s -f $global_T62_obs/ssmis.${suffix_obs} ./ssmisbufr -ln -s -f $global_T62_obs/atms.${suffix_obs} ./atmsbufr -ln -s -f $global_T62_obs/cris.${suffix_obs} ./crisbufr -ln -s -f $global_T62_obs/crisf4.${suffix_obs} ./crisfsbufr -ln -s -f $global_T62_obs/tcvitl.${suffix_obs} ./tcvitl - - -# Copy bias correction, atmospheric and surface files -ln -s -f $global_T62_ges/biascr.${suffix_bias} ./satbias_in -ln -s -f $global_T62_ges/biascr_pc.${suffix_bias} ./satbias_pc -ln -s -f $global_T62_ges/radstat.${suffix_bias} ./radstat.gdas - -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - -if [[ "$endianness" = "Big_Endian" ]]; then - ln -s -f $global_T62_ges/${prefix_sfc}.bf03 ./sfcf03 - ln -s -f $global_T62_ges/${prefix_sfc}.bf06 ./sfcf06 - ln -s -f $global_T62_ges/${prefix_sfc}.bf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $global_T62_ges/${prefix_sfc}.bf03.le ./sfcf03 - ln -s -f $global_T62_ges/${prefix_sfc}.bf06.le ./sfcf06 - ln -s -f $global_T62_ges/${prefix_sfc}.bf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - ln -s -f $global_T62_obs/${prefix_atm}.sgm3prep ./sigf03 - ln -s -f $global_T62_obs/${prefix_atm}.sgesprep ./sigf06 - ln -s -f $global_T62_obs/${prefix_atm}.sgp3prep ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $global_T62_obs/${prefix_atm}.sgm3prep.le ./sigf03 - ln -s -f $global_T62_obs/${prefix_atm}.sgesprep.le ./sigf06 - ln -s -f $global_T62_obs/${prefix_atm}.sgp3prep.le ./sigf09 -fi - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? - -exit $rc - - - - -# 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. -# - - -echo "Time before diagnostic loop is `date` " -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g11 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 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 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 gome_metop-a omi_aura 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_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16 iasi_metop-a" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${global_T62_adate} - compress diag_${type}_${string}.${global_T62_adate} - $ncp diag_${type}_${string}.${global_T62_adate}.Z $savdir/ - fi - done -done -echo "Time after diagnostic loop is `date` " - - - -# If requested, clean up $tmpdir -if [[ "$CLEAN" = "YES" ]];then - if [[ $rc -eq 0 ]];then - rm -rf $tmpdir - cd $tmpdir - cd ../ - rmdir $tmpdir - fi -fi - - -# End of script -exit diff --git a/regression/global_T62_ozonly.sh b/regression/global_T62_ozonly.sh deleted file mode 100755 index 6f2119fd3c..0000000000 --- a/regression/global_T62_ozonly.sh +++ /dev/null @@ -1,435 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#basedir=/scratch1/portfolios/NCEPDEV/da/save/Michael.Lueken -#gsiexec=$gsiexec -#gsiexec=$basedir/EXP-port/src/global_gsi.x - - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -#export JCAP=62 -export LEVS=64 -export JCAP_B=$JCAP - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}_ozonly/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -#datobs=$datobs -#datobs=/scratch1/portfolios/NCEPDEV/da/noscrub/Michael.Lueken/CASES/sigmap/$adate -#datges=$datges -#datges=/scratch1/portfolios/NCEPDEV/da/noscrub/Michael.Lueken/CASES/sigmap/$adate - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=256 - export LATA=128 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_T62_adate:0:8} ${global_T62_adate:8:2} - 6 hours"` -hha=`echo $global_T62_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gdas1.t${hha}z. -prefix_prep=$prefix_obs -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gdas${resol}.t${hhg}z -prefix_atm=gdas${resol}.t${hha}z -suffix_obs=gdas.${global_T62_adate} -suffix_bias=gdas.${gdate} - - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_T62_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -. $scripts/regression_namelists.sh global_T62_ozonly - -##! l4dvar=.false.,nhr_assimilation=6,nhr_obsbin=6, -##! lsqrtb=.true.,lcongrad=.false.,ltlint=.true., -##! idmodel=.true.,lwrtinc=.false., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/$endianness/global_berror.l${LEVS}y${NLAT}.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -anavinfo=$fixgsi/global_anavinfo_ozonly.l64.txt -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -hybens_info=$fixgsi/global_hybens_info.l64.txt -errtable=$fixgsi/prepobs_errtable.global -atmsbeaminfo=$fixgsi/atms_beamwidth.txt - -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $hybens_info ./hybens_info -$ncp $atmsbeaminfo ./atms_beamwidth.txt -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - - -# Copy observational data to $tmpdir -ln -s -f $global_T62_obs/prepqc.${suffix_obs} ./prepbufr -#ln -s -f $global_T62_obs/${prefix_obs}satwnd.${suffix} ./satwndbufr -#ln -s -f $global_T62_obs/${prefix_obs}gpsro.${suffix} ./gpsrobufr -#ln -s -f $global_T62_obs/${prefix_obs}spssmi.${suffix} ./ssmirrbufr -#ln -s -f $global_T62_obs/${prefix_obs}sptrmm.${suffix} ./tmirrbufr -ln -s -f $global_T62_obs/gome.${suffix_obs} ./gomebufr -ln -s -f $global_T62_obs/omi.${suffix_obs} ./omibufr -ln -s -f $global_T62_obs/mls.${suffix_obs} ./mlsbufr -ln -s -f $global_T62_obs/osbuv8.${suffix_obs} ./sbuvbufr -#ln -s -f $global_T62_obs/${prefix_obs}goesfv.${suffix} ./gsnd1bufr -#ln -s -f $global_T62_obs/${prefix_obs}1bamua.${suffix} ./amsuabufr -#ln -s -f $global_T62_obs/${prefix_obs}1bamub.${suffix} ./amsubbufr -#ln -s -f $global_T62_obs/${prefix_obs}1bhrs2.${suffix} ./hirs2bufr -#ln -s -f $global_T62_obs/${prefix_obs}1bhrs3.${suffix} ./hirs3bufr -#ln -s -f $global_T62_obs/${prefix_obs}1bhrs4.${suffix} ./hirs4bufr -#ln -s -f $global_T62_obs/${prefix_obs}1bmhs.${suffix} ./mhsbufr -#ln -s -f $global_T62_obs/${prefix_obs}1bmsu.${suffix} ./msubufr -#ln -s -f $global_T62_obs/${prefix_obs}airsev.${suffix} ./airsbufr -#ln -s -f $global_T62_obs/${prefix_obs}sevcsr.${suffix} ./seviribufr -#ln -s -f $global_T62_obs/${prefix_obs}mtiasi.${suffix} ./iasibufr -#ln -s -f $global_T62_obs/${prefix_obs}esamua.${suffix} ./amsuabufrears -#ln -s -f $global_T62_obs/${prefix_obs}esamub.${suffix} ./amsubbufrears -#ln -s -f $global_T62_obs/${prefix_obs}eshrs3.${suffix} ./hirs3bufrears -#ln -s -f $global_T62_obs/${prefix_obs}ssmit.${suffix} ./ssmitbufr -#ln -s -f $global_T62_obs/${prefix_obs}amsre.${suffix} ./amsrebufr -#ln -s -f $global_T62_obs/${prefix_obs}ssmis.${suffix} ./ssmisbufr -#ln -s -f $global_T62_obs/${prefix_obs}syndata.tcvitals.tm00 ./tcvitl - - -# Copy bias correction, atmospheric and surface files -ln -s -f $global_T62_ges/biascr.${suffix_bias} ./satbias_in -ln -s -f $global_T62_ges/biascr_pc.${suffix_bias} ./satbias_pc -ln -s -f $global_T62_ges/radstat.${suffix_bias} ./radstat.gdas - -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - -if [[ "$endianness" = "Big_Endian" ]]; then -# ln -s -f $global_T62_ges/${prefix_sfc}.bf03 ./sfcf03 - ln -s -f $global_T62_ges/${prefix_sfc}.bf06 ./sfcf06 -# ln -s -f $global_T62_ges/${prefix_sfc}.bf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $global_T62_ges/${prefix_sfc}.bf03.le ./sfcf03 - ln -s -f $global_T62_ges/${prefix_sfc}.bf06.le ./sfcf06 - ln -s -f $global_T62_ges/${prefix_sfc}.bf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then -# ln -s -f $global_T62_obs/${prefix_atm}.sgm3prep ./sigf03 - ln -s -f $global_T62_obs/${prefix_atm}.sgesprep ./sigf06 -# ln -s -f $global_T62_obs/${prefix_atm}.sgp3prep ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - ln -s -f $global_T62_obs/${prefix_atm}.sgm3prep.le ./sigf03 - ln -s -f $global_T62_obs/${prefix_atm}.sgesprep.le ./sigf06 - ln -s -f $global_T62_obs/${prefix_atm}.sgp3prep.le ./sigf09 -fi - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - - - - -# 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. -# - - -echo "Time before diagnostic loop is `date` " -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g11 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 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 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 gome_metop-a omi_aura 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_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16 iasi_metop-a" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${global_T62_adate} - compress diag_${type}_${string}.${global_T62_adate} - $ncp diag_${type}_${string}.${global_T62_adate}.Z $savdir/ - fi - done -done -echo "Time after diagnostic loop is `date` " - - - -# If requested, clean up $tmpdir -if [[ "$CLEAN" = "YES" ]];then - if [[ $rc -eq 0 ]];then - rm -rf $tmpdir - cd $tmpdir - cd ../ - rmdir $tmpdir - fi -fi - - -# End of script -exit diff --git a/regression/global_enkf.sh b/regression/global_enkf.sh new file mode 100755 index 0000000000..e458c5830d --- /dev/null +++ b/regression/global_enkf.sh @@ -0,0 +1,189 @@ + +set -x + +# Set experiment name and analysis date + +exp=$jobname + + +# Set the JCAP resolution which you want. +export JCAP=48 +export LEVS=127 +export NMEM_ENKF=10 + +# Set runtime and save directories +tmpdir=$tmpdir/$tmpregdir/${exp} + +# Specify EnKf fixed field and data directories. +export DATA=$tmpdir + +# Set variables used in script +# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) +# ncp is cp replacement, currently keep as /bin/cp + +UNCOMPRESS=gunzip +CLEAN=NO +ncp=/bin/cp +nln="/bin/ln -fs" + + +# Given the requested resolution, set dependent resolution parameters +if [[ "$JCAP" = "96" ]]; then + export LONA=384 + export LATA=192 + export DELTIM=1200 +elif [[ "$JCAP" = "48" ]]; then + export LONA=192 + export LATA=96 + export DELTIM=1200 +else + echo "INVALID JCAP = $JCAP" + exit +fi + + +# Given the analysis date, compute the date from which the +# first guess comes. Extract cycle and set prefix and suffix +# for guess and observation data files +gdate=`date +%Y%m%d%H -d "${global_adate:0:8} ${global_adate:8:2} - 6 hours"` +PDYa=`echo $global_adate | cut -c1-8` +cyca=`echo $global_adate | cut -c9-10` +PDYg=`echo $gdate | cut -c1-8` +cycg=`echo $gdate | cut -c9-10` + +dumpobs=gdas +prefix_obs=${dumpobs}.t${cyca}z +prefix_ges=gdas.t${cycg}z +prefix_ens=gdas.t${cycg}z +suffix=tm00.bufr_d + +dumpges=gdas +COMROOTgfs=$casesdir/gfs/prod +datobs=$COMROOTgfs/enkfgdas.$PDYa/${cyca}/atmos +datges=$COMROOTgfs/$dumpges.$PDYg/${cycg}/atmos +datens=$COMROOTgfs/enkfgdas.$PDYg/${cycg}/atmos + + +# Set up $tmpdir +rm -rf $tmpdir +mkdir -p $tmpdir +cd $tmpdir + +# Make enkf namelist +export USE_CORRELATED_OBERRS=${USE_CORRELATED_OBERRS:-"NO"} +export NMEM_ENKF=${NMEM_ENKF:-10} +export NAM_ENKF="smoothparm=35," +export SATOBS_ENKF=${SATOBS_ENKF:-""} +export OZOBS_ENKF=${OZOBS_ENKF:-""} +export use_correlated_oberrs=${use_correlated_oberrs:-".false."} +if [ $USE_CORRELATED_OBERRS == "YES" ]; then + export use_correlated_oberrs=".true." +fi +export imp_physics=${imp_physics:-"11"} +export lupp=${lupp:-".true."} +export corrlength=${corrlength:-1250} +export lnsigcutoff=${lnsigcutoff:-2.75} +export analpertwt=${analpertwt:-0.85} +export readin_localization_enkf=".false." +export readin_localization_enkf=${readin_localization_enkf:-".true."} +export reducedgrid=${reducedgrid:-".true."} +export letkf_flag=${letkf_flag:-".true."} +export getkf=${getkf:-".true."} +export denkf=${denkf:-".true."} +export nobsl_max=${nobsl_max:-10000} +export lobsdiag_forenkf=${lobsdiag_forenkf:-".true."} +export write_spread_diag=${write_spread_diag:-".false."} +export cnvw_option=${cnvw_option:-".false."} +export netcdf_diag=${netcdf_diag:-".true."} +export modelspace_vloc=${modelspace_vloc:-".true."} # if true, 'vlocal_eig.dat' is needed +export IAUFHRS_ENKF=${IAUFHRS_ENKF:-'3,6,9'} +export DO_CALC_INCREMENT=${DO_CALC_INCREMENT:-"NO"} +export INCREMENTS_TO_ZERO="'liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc'" +export use_gfs_ncio=".true." +export use_gfs_nemsio=".false." +export paranc=${paranc:-".true."} +if [ $DO_CALC_INCREMENT = "YES" ]; then + export write_fv3_incr=".false." +else + export write_fv3_incr=".true." + export WRITE_INCR_ZERO="incvars_to_zero= $INCREMENTS_TO_ZERO," +fi + + +. $scripts/regression_namelists.sh global_enkf + +cat << EOF > enkf.nml + +$gsi_namelist + +EOF + +# Set fixed files +# anavinfo = text file with information about control vector +# satinfo = text file with information about assimilation of brightness temperatures +# satangl = angle dependent bias correction file (fixed in time) +# scaninfo = text file with scan angle information +# ozinfo = text file with information about assimilation of ozone data +# convinfo = text file with information about assimilation of conventional data +# hybens_info = text file with localization informztion + +satangl=$fixgsi/global_satangbias.txt +scaninfo=$fixgsi/global_scaninfo.txt +satinfo=$fixgsi/global_satinfo.txt +convinfo=$fixgsi/global_convinfo_reg_test.txt +ozinfo=$fixgsi/global_ozinfo.txt +hybens_info=$fixgsi/global_hybens_info.l${LEVS}.txt +anavinfo=$fixgsi/global_anavinfo.l${LEVS}.txt +vlocaleig=$fixgsi/vlocal_eig_l${LEVS}.dat + + +# Copy executable and fixed files to $tmpdir +if [[ $exp == *"updat"* ]]; then + $ncp $enkfexec_updat ./enkf.x +elif [[ $exp == *"contrl"* ]]; then + $ncp $enkfexec_contrl ./enkf.x +fi + +$ncp $satangl ./satbias_angle +$ncp $scaninfo ./scaninfo +$ncp $satinfo ./satinfo +$ncp $ozinfo ./ozinfo +$ncp $convinfo ./convinfo +$ncp $vlocaleig ./vlocal_eig.dat +$ncp $hybens_info ./hybens_info +$ncp $anavinfo ./anavinfo + + +# Copy ensemble data to $tmpdir +list="cnvstat oznstat radstat" + +for type in $list; do + $ncp $datobs/${prefix_obs}.${type}.ensmean ./${type}_ensmean + tar -xvf ${type}_ensmean +done + +nfhrs=`echo $IAUFHRS_ENKF | sed 's/,/ /g'` +for fhr in $nfhrs; do + for imem in $(seq 1 $NMEM_ENKF); do + memchar="mem"$(printf %03i $imem) + $nln $datens/$memchar/${prefix_ens}.atmf00${fhr}.nc sfg_${global_adate}_fhr0${fhr}_${memchar} + if [ $cnvw_option = ".true." ]; then + $nln $datens/$memchar/${prefix_ens}sfcf00${fhr}.nc sfgsfc_${global_adate}_fhr0${fhr}_${memchar} + fi + (( imem = $imem + 1 )) + done + $nln $datens/${prefix_ens}.atmf00${fhr}.ensmean.nc sfg_${global_adate}_fhr0${fhr}_ensmean + if [ $cnvw_option = ".true." ]; then + $nln $datens/${prefix_ens}.sfcf00${fhr}.ensmean.nc sfgsfc_${global_adate}_fhr0${fhr}_ensmean + fi +done + +$nln $datobs/${prefix_obs}.abias_int ./satbias_in + + +cd $tmpdir +echo "run enkf now" +rm stdout stderr +eval "$APRUN $tmpdir/enkf.x 1>stdout 2>stderr" +rc=$? +exit $rc diff --git a/regression/global_enkf_T62.sh b/regression/global_enkf_T62.sh deleted file mode 100755 index 3ddc18ba0c..0000000000 --- a/regression/global_enkf_T62.sh +++ /dev/null @@ -1,180 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -export JCAP=62 -export LEVS=64 -export NMEM_ENKF=20 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}_enkf/${exp} - -# Specify EnKf fixed field and data directories. -export DATA=$tmpdir - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=256 - export LATA=128 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi - - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -export adate=$global_enkf_T62_adate -gdate=`date +%Y%m%d%H -d "${global_enkf_T62_adate:0:8} ${global_enkf_T62_adate:8:2} - 6 hours"` -yyg=`echo $gdate | cut -c1-8` -hhg=`echo $gdate | cut -c9-10` -yya=`echo $global_enkf_T62_adate | cut -c1-8` -hha=`echo $global_enkf_T62_adate | cut -c9-10` - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - - -# Make enkf namelist - -. $scripts/regression_nl_update.sh - -export NAM_ENKF="$SETUP_enkf" - - -. $scripts/regression_namelists.sh global_enkf_T62 - -cat << EOF > enkf.nml - -$gsi_namelist - -EOF - -# Set fixed files -# anavinfo = text file with information about control vector -# satinfo = text file with information about assimilation of brightness temperatures -# satangl = angle dependent bias correction file (fixed in time) -# scaninfo = text file with scan angle information -# ozinfo = text file with information about assimilation of ozone data -# convinfo = text file with information about assimilation of conventional data -# hybens_info = text file with localization informztion - -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -ozinfo=$fixgsi/global_ozinfo.txt -hybens_info=$fixgsi/global_hybens_info.l64.txt -anavinfo=$fixgsi/global_anavinfo.l64.txt -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - - - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $enkfexec_updat ./enkf.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $enkfexec_contrl ./enkf.x -fi - -$ncp $satangl ./satbias_angle -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $hybens_info ./hybens_info -$ncp $anavinfo ./anavinfo - -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - -# Copy ensemble data to $tmpdir -list="cnvstat oznstat radstat" - -for type in $list; do - $ncp $global_enkf_T62_datobs/${type}_${adate}_ensmean ./${type}_ensmean - tar -xvf ${type}_ensmean -done -imem=1 -while [[ $imem -le $NMEM_ENKF ]]; do - member="_mem"`printf %03i $imem` - list="cnvstat oznstat radstat" - for type in $list; do - $ncp $global_enkf_T62_datobs/${type}_${adate}${member} ./${type}${member} - tar -xvf ${type}${member} - done - sigens=$global_enkf_T62_datges/sfg_${gdate}_fhr06s${member} - $ncp $sigens sfg_${global_enkf_T62_adate}_fhr06${member} - (( imem = $imem + 1 )) -done - - -# Copy bias correction, atmospheric and surface files -$ncp $global_enkf_T62_datges/biascr_int_${gdate}_ensmean ./satbias_in -$ncp $global_enkf_T62_datges/satang.gdas.$gdate ./satbias_ang.in - -$ncp $global_enkf_T62_datges/sfg_${gdate}_fhr06_ensmean ./sfg_${global_enkf_T62_adate}_fhr06_ensmean -$ncp $global_enkf_T62_datges/bfg_${gdate}_fhr06_ensmean ./bfg_${global_enkf_T62_adate}_fhr06_ensmean - -cd $tmpdir -echo "run enkf now" -\rm stdout stderr -eval "$APRUN $tmpdir/enkf.x 1>stdout 2>stderr" -rc=$? -exit $rc diff --git a/regression/global_fv3_4denvar_C192.sh b/regression/global_fv3_4denvar_C192.sh deleted file mode 100755 index 27c6f2798d..0000000000 --- a/regression/global_fv3_4denvar_C192.sh +++ /dev/null @@ -1,425 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#basedir=/scratch1/portfolios/NCEPDEV/da/save/Daryl.Kleist -#gsipath=$basedir/gsi/ -#gsiexec=$gsipath/trunk/src/global_gsi.x - -# Set the JCAP resolution which you want. -export JCAP=190 -export LEVS=127 -export JCAP_B=382 -export JCAP_EN=190 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp -ncpl="ln -fs" - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "670" ]]; then - export LONA=1344 - export LATA=672 - export DELTIM=100 - export resol=1 -elif [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "190" ]]; then - export LONA=384 - export LATA=192 - export DELTIM=400 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=384 - export LATA=190 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - -# Size of ensemble -ENS_NUM_ANAL=20 -ENSBEG=1 -ENSEND=20 - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -PDY=`echo $global_fv3_4denvar_C192_adate | cut -c1-8` -cyc=`echo $global_fv3_4denvar_C192_adate | cut -c9-10` -GDATE=`date +%Y%m%d%H -d "${global_fv3_4denvar_C192_adate:0:8} ${global_fv3_4denvar_C192_adate:8:2} - 6 hours"` -gPDY=`echo $GDATE | cut -c1-8` -gcyc=`echo $GDATE | cut -c9-10` - -dumpobs=gdas -prefix_obs=${dumpobs}.t${cyc}z -prefix_ges=gdas.t${gcyc}z -prefix_ens=gdas.t${gcyc}z -suffix=tm00.bufr_d - -datobs=$global_fv3_4denvar_C192_datobs/gdas.$PDY/$cyc -datanl=$global_fv3_4denvar_C192_datobs/gdas.$PDY/$cyc -datges=$global_fv3_4denvar_C192_datges/gdas.$gPDY/$gcyc -datens=$global_fv3_4denvar_C192_datges/enkfgdas.$gPDY/$gcyc - - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_C192_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_C192_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_C192_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_C192_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_fv3_4denvar_C192 -else - . $scripts/regression_namelists_db.sh global_fv3_4denvar_C192 -fi - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/global_anavinfo.l${LEVS}.txt -berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 -locinfo=$fixgsi/global_hybens_info.l${LEVS}.txt -satinfo=$fixgsi/global_satinfo.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/global_satangbias.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -ozinfo=$fixgsi/global_ozinfo.txt -convinfo=$fixgsi/global_convinfo.txt -vqcdat=$fixgsi/vqctp001.dat -insituinfo=$fixgsi/global_insituinfo.txt -errtable=$fixgsi/prepobs_errtable.global -aeroinfo=$fixgsi/global_aeroinfo.txt -atmsbeaminfo=$fixgsi/atms_beamwidth.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $locinfo ./hybens_info -$ncp $satinfo ./satinfo -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $insituinfo ./insituinfo -$ncp $errtable ./errtable -$ncp $aeroinfo ./aeroinfo -$ncp $atmsbeaminfo ./atms_beamwidth.txt -$ncp $cloudyinfo ./cloudy_radiance_info.txt - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#If using correlated error, get the covariance files -if grep -q "Rcov" $anavinfo ; -then - if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; - then - $ncp ${fixgsi}/Rcov* $tmpdir/ - -# Correlated error utlizes mkl lapack. Found it necesary to fix the -# number of mkl threads to ensure reproducible results independent -# of the job configuration. - export MKL_NUM_THREADS=1 - - else - echo "Warning: Satellite error covariance files are missing." - echo "Check for the required Rcov files in " $anavinfo - exit 1 - fi -fi - -# Copy CRTM coefficient files based on entries in satinfo file -mkdir -p crtm_coeffs -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./crtm_coeffs/ - $ncp $fixcrtm/${file}.TauCoeff.bin ./crtm_coeffs/ -done - -$ncp $emiscoef_IRwater ./crtm_coeffs/Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./crtm_coeffs/NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./crtm_coeffs/NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./crtm_coeffs/NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./crtm_coeffs/NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./crtm_coeffs/NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./crtm_coeffs/NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./crtm_coeffs/NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./crtm_coeffs/FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./crtm_coeffs/AerosolCoeff.bin -$ncp $cldcoef ./crtm_coeffs/CloudCoeff.bin - - -# Copy observational data to $DATA -$ncpl $datanl/${prefix_obs}.prepbufr ./prepbufr -$ncpl $datanl/${prefix_obs}.prepbufr.acft_profiles ./prepbufr_profl -$ncpl $datanl/${prefix_obs}.nsstbufr ./nsstbufr -$ncpl $datobs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr -$ncpl $datobs/${prefix_obs}.satwnd.${suffix} ./satwndbufr -$ncpl $datobs/${prefix_obs}.spssmi.${suffix} ./ssmirrbufr -$ncpl $datobs/${prefix_obs}.sptrmm.${suffix} ./tmirrbufr -$ncpl $datobs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr -$ncpl $datobs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr -$ncpl $datobs/${prefix_obs}.1bamua.${suffix} ./amsuabufr -$ncpl $datobs/${prefix_obs}.1bamub.${suffix} ./amsubbufr -$ncpl $datobs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr -$ncpl $datobs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr -$ncpl $datobs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr -$ncpl $datobs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr -$ncpl $datobs/${prefix_obs}.1bmsu.${suffix} ./msubufr -$ncpl $datobs/${prefix_obs}.airsev.${suffix} ./airsbufr -$ncpl $datobs/${prefix_obs}.sevcsr.${suffix} ./seviribufr -$ncpl $datobs/${prefix_obs}.mtiasi.${suffix} ./iasibufr -$ncpl $datobs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr -$ncpl $datobs/${prefix_obs}.ssmisu.${suffix} ./ssmisbufr -$ncpl $datobs/${prefix_obs}.gome.${suffix} ./gomebufr -$ncpl $datobs/${prefix_obs}.omi.${suffix} ./omibufr -$ncpl $datobs/${prefix_obs}.mls.${suffix} ./mlsbufr -$ncpl $datobs/${prefix_obs}.ompsn8.${suffix} ./ompsnpbufr -$ncpl $datobs/${prefix_obs}.ompst8.${suffix} ./ompstcbufr -$ncpl $datobs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears -$ncpl $datobs/${prefix_obs}.esamua.${suffix} ./amsuabufrears -$ncpl $datobs/${prefix_obs}.esamub.${suffix} ./amsubbufrears -$ncpl $datobs/${prefix_obs}.atms.${suffix} ./atmsbufr -$ncpl $datobs/${prefix_obs}.cris.${suffix} ./crisbufr -$ncpl $datobs/${prefix_obs}.crisf4.${suffix} ./crisfsbufr -$ncpl $datobs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl -$ncpl $datobs/${prefix_obs}.avcsam.${suffix} ./avhambufr -$ncpl $datobs/${prefix_obs}.avcspm.${suffix} ./avhpmbufr -$ncpl $datobs/${prefix_obs}.saphir.${suffix} ./saphirbufr -$ncpl $datobs/${prefix_obs}.gmi1cr.${suffix} ./gmibufr -if [ "$debug" = ".false." ]; then - $ncpl $datobs/${prefix_obs}.esiasi.${suffix} ./iasibufrears -fi -$ncpl $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db -$ncpl $datobs/${prefix_obs}.amuadb.${suffix} ./amsuabufr_db -$ncpl $datobs/${prefix_obs}.amubdb.${suffix} ./amsubbufr_db -$ncpl $datobs/${prefix_obs}.iasidb.${suffix} ./iasibufr_db -$ncpl $datobs/${prefix_obs}.crisdb.${suffix} ./crisbufr_db -$ncpl $datobs/${prefix_obs}.atmsdb.${suffix} ./atmsbufr_db -$ncpl $datobs/${prefix_obs}.escris.${suffix} ./crisbufrears -$ncpl $datobs/${prefix_obs}.esatms.${suffix} ./atmsbufrears - -# Copy bias correction, atmospheric and surface files -$ncpl $datges/${prefix_ges}.abias ./satbias_in -$ncpl $datges/${prefix_ges}.abias_pc ./satbias_pc -$ncpl $datges/${prefix_ges}.abias_air ./aircftbias_in - -flist="03 04 05 06 07 08 09" -for fh in $flist; do - $ncpl $datges/${prefix_ges}.sfcf0$fh.nc ./sfcf$fh - $ncpl $datges/${prefix_ges}.atmf0$fh.nc ./sigf$fh -done - - -ensemble_path="./ensemble_data/" -mkdir -p $ensemble_path -enkf_suffix="" -flist="03 04 05 06 07 08 09" -for fh in $flist; do - sigens=${prefix_ens}.atmf0${fh}${enkf_suffix}.nc - - imem=$ENSBEG - imemloc=1 - while [[ $imem -le $ENSEND ]]; do - member="mem"`printf %03i $imem` - memloc="mem"`printf %03i $imemloc` - $ncpl $datens/$member/$sigens ${ensemble_path}sigf${fh}_ens_${memloc} - (( imem = $imem + 1 )) - (( imemloc = $imemloc + 1 )) - done -done - -$ncpl $datens/${prefix_ens}.sfcf006.ensmean.nc ./sfcf06_anlgrid - -$ncpl $datges/${prefix_ges}.radstat ./radstat.gdas -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc diff --git a/regression/global_fv3_4denvar_T126.sh b/regression/global_fv3_4denvar_T126.sh deleted file mode 100755 index 3bcff2b674..0000000000 --- a/regression/global_fv3_4denvar_T126.sh +++ /dev/null @@ -1,437 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#basedir=/scratch1/portfolios/NCEPDEV/da/save/Daryl.Kleist -#gsipath=$basedir/gsi/ -#gsiexec=$gsipath/trunk/src/global_gsi.x - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -export JCAP=62 -export LEVS=64 -export JCAP_B=126 -export JCAP_EN=62 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp -ncpl="ln -fs" - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "670" ]]; then - export LONA=1344 - export LATA=672 - export DELTIM=100 - export resol=1 -elif [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=384 - export LATA=190 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - -# Size of ensemble -ENS_NUM_ANAL=20 -ENSBEG=1 -ENSEND=20 - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -PDY=`echo $global_fv3_4denvar_T126_adate | cut -c1-8` -cyc=`echo $global_fv3_4denvar_T126_adate | cut -c9-10` -GDATE=`date +%Y%m%d%H -d "${global_fv3_4denvar_T126_adate:0:8} ${global_fv3_4denvar_T126_adate:8:2} - 6 hours"` -gPDY=`echo $GDATE | cut -c1-8` -gcyc=`echo $GDATE | cut -c9-10` - -dumpobs=gdas -prefix_obs=${dumpobs}.t${cyc}z -prefix_ges=gdas.t${gcyc}z -prefix_ens=gdas.t${gcyc}z -suffix=tm00.bufr_d - -datobs=$global_fv3_4denvar_T126_datobs/gdas.$PDY/$cyc -datanl=$global_fv3_4denvar_T126_datobs/gdas.$PDY/$cyc -datges=$global_fv3_4denvar_T126_datges/gdas.$gPDY/$gcyc -datens=$global_fv3_4denvar_T126_datges/enkfgdas.$gPDY/$gcyc - - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_T126_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_T126_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_T126_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_fv3_4denvar_T126_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_fv3_4denvar_T126 -else - . $scripts/regression_namelists_db.sh global_fv3_4denvar_T126 -fi - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -insituinfo=$fixgsi/global_insituinfo.txt -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -anavinfo=$fixgsi/global_anavinfo.l64.txt -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -errtable=$fixgsi/prepobs_errtable.global -hybens_info=$fixgsi/global_hybens_info.l64.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $insituinfo ./insituinfo -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $hybens_info ./hybens_info -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#if using correlated error, link to the covariance files -if grep -q "Rcov" $anavinfo ; -then - if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; - then - $ncp ${fixgsi}/Rcov* . - -# Correlated error utlizes mkl lapack. Found it necesary to fix the -# number of mkl threads to ensure reproducible results independent -# of the job configuration. - export MKL_NUM_THREADS=1 - - else - echo "Warning: Satellite error covariance files are missing." - echo "Check for the required Rcov files in " $anavinfo - exit 1 - fi -fi - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $DATA -$ncpl $datanl/${prefix_obs}.prepbufr ./prepbufr -$ncpl $datanl/${prefix_obs}.prepbufr.acft_profiles ./prepbufr_profl -$ncpl $datanl/${prefix_obs}.nsstbufr ./nsstbufr -$ncpl $datobs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr -$ncpl $datobs/${prefix_obs}.satwnd.${suffix} ./satwndbufr -$ncpl $datobs/${prefix_obs}.spssmi.${suffix} ./ssmirrbufr -$ncpl $datobs/${prefix_obs}.sptrmm.${suffix} ./tmirrbufr -$ncpl $datobs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr -$ncpl $datobs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr -$ncpl $datobs/${prefix_obs}.1bamua.${suffix} ./amsuabufr -$ncpl $datobs/${prefix_obs}.1bamub.${suffix} ./amsubbufr -$ncpl $datobs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr -$ncpl $datobs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr -$ncpl $datobs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr -$ncpl $datobs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr -$ncpl $datobs/${prefix_obs}.1bmsu.${suffix} ./msubufr -$ncpl $datobs/${prefix_obs}.airsev.${suffix} ./airsbufr -$ncpl $datobs/${prefix_obs}.sevcsr.${suffix} ./seviribufr -$ncpl $datobs/${prefix_obs}.mtiasi.${suffix} ./iasibufr -$ncpl $datobs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr -$ncpl $datobs/${prefix_obs}.ssmisu.${suffix} ./ssmisbufr -$ncpl $datobs/${prefix_obs}.gome.${suffix} ./gomebufr -$ncpl $datobs/${prefix_obs}.omi.${suffix} ./omibufr -$ncpl $datobs/${prefix_obs}.mls.${suffix} ./mlsbufr -$ncpl $datobs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears -$ncpl $datobs/${prefix_obs}.esamua.${suffix} ./amsuabufrears -$ncpl $datobs/${prefix_obs}.esamub.${suffix} ./amsubbufrears -$ncpl $datobs/${prefix_obs}.atms.${suffix} ./atmsbufr -$ncpl $datobs/${prefix_obs}.cris.${suffix} ./crisbufr -$ncpl $datobs/${prefix_obs}.crisf4.${suffix} ./crisfsbufr -$ncpl $datobs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl -$ncpl $datobs/${prefix_obs}.avcsam.${suffix} ./avhambufr -$ncpl $datobs/${prefix_obs}.avcspm.${suffix} ./avhpmbufr -$ncpl $datobs/${prefix_obs}.saphir.${suffix} ./saphirbufr -$ncpl $datobs/${prefix_obs}.gmi1cr.${suffix} ./gmibufr -if [ "$debug" = ".false." ]; then - $ncpl $datobs/${prefix_obs}.esiasi.${suffix} ./iasibufrears -fi -$ncpl $datobs/${prefix_obs}.hrs3db.${suffix} ./hirs3bufr_db -$ncpl $datobs/${prefix_obs}.amuadb.${suffix} ./amsuabufr_db -$ncpl $datobs/${prefix_obs}.amubdb.${suffix} ./amsubbufr_db -$ncpl $datobs/${prefix_obs}.iasidb.${suffix} ./iasibufr_db -$ncpl $datobs/${prefix_obs}.crisdb.${suffix} ./crisbufr_db -$ncpl $datobs/${prefix_obs}.atmsdb.${suffix} ./atmsbufr_db -$ncpl $datobs/${prefix_obs}.escris.${suffix} ./crisbufrears -$ncpl $datobs/${prefix_obs}.esatms.${suffix} ./atmsbufrears - -# Copy bias correction, atmospheric and surface files -$ncpl $datges/${prefix_ges}.abias ./satbias_in -$ncpl $datges/${prefix_ges}.abias_pc ./satbias_pc -$ncpl $datges/${prefix_ges}.abias_air ./aircftbias_in - -flist="03 04 05 06 07 08 09" -for fh in $flist; do - $ncpl $datges/${prefix_ges}.sfcf0$fh.nemsio ./sfcf$fh - $ncpl $datges/${prefix_ges}.atmf0$fh.nemsio ./sigf$fh -done - - -ensemble_path="./ensemble_data/" -mkdir -p $ensemble_path -enkf_suffix="s" -flist="03 04 05 06 07 08 09" -for fh in $flist; do - sigens=${prefix_ens}.atmf0${fh}${enkf_suffix}.nemsio - - imem=$ENSBEG - imemloc=1 - while [[ $imem -le $ENSEND ]]; do - member="mem"`printf %03i $imem` - memloc="mem"`printf %03i $imemloc` - $ncpl $datens/$member/$sigens ${ensemble_path}sigf${fh}_ens_${memloc} - (( imem = $imem + 1 )) - (( imemloc = $imemloc + 1 )) - done -done - -$ncpl $datens/${prefix_ens}.sfcf006.ensmean.nemsio ./sfcf06_anlgrid - -$ncpl $datges/${prefix_ges}.radstat ./radstat.gdas -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc diff --git a/regression/global_hybrid_T126.sh b/regression/global_hybrid_T126.sh deleted file mode 100755 index 6472a84911..0000000000 --- a/regression/global_hybrid_T126.sh +++ /dev/null @@ -1,370 +0,0 @@ - -set -x - -# Set experiment name and analysis date - -exp=$jobname - -# Set path/file for gsi executable -#basedir=/scratch1/portfolios/NCEPDEV/da/save/Daryl.Kleist -#gsipath=$basedir/gsi/ -#gsiexec=$gsipath/trunk/src/global_gsi.x - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -export JCAP=126 -export LEVS=64 -export JCAP_B=126 -export JCAP_EN=62 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/out${JCAP}/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -#datobs=/scratch1/portfolios/NCEPDEV/da/noscrub/Daryl.Kleist/CASES/$adate/obs -#datges=/scratch1/portfolios/NCEPDEV/da/noscrub/Daryl.Kleist/CASES/$adate/ges -#datens=/scratch1/portfolios/NCEPDEV/da/noscrub/Daryl.Kleist/CASES/$adate/ens - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "574" ]]; then - export LONA=1152 - export LATA=576 - export DELTIM=120 - export resol=1 -elif [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "126" ]]; then - export LONA=256 - export LATA=128 - export DELTIM=600 - export resol=2 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_hybrid_T126_adate:0:8} ${global_hybrid_T126_adate:8:2} - 6 hours"` -yyg=`echo $gdate | cut -c1-8` -hhg=`echo $gdate | cut -c9-10` -yya=`echo $global_hybrid_T126_adate | cut -c1-8` -hha=`echo $global_hybrid_T126_adate | cut -c9-10` - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_hybrid_T126_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_hybrid_T126_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_hybrid_T126_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$global_hybrid_T126_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_hybrid_T126 -else - . $scripts/regression_namelists_db.sh global_hybrid_T126 -fi - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -berror=$fixgsi/Big_Endian/global_berror.l${LEVS}y${NLAT}.f77 - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satangl=$fixgsi/global_satangbias.txt -scaninfo=$fixgsi/global_scaninfo.txt -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -anavinfo=$fixgsi/global_anavinfo.l64.txt -ozinfo=$fixgsi/global_ozinfo.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -errtable=$fixgsi/prepobs_errtable.global -hybens_info=$fixgsi/global_hybens_info.l64.txt - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $scaninfo ./scaninfo -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $errtable ./errtable -$ncp $anavinfo ./anavinfo -$ncp $hybens_info ./hybens_info -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#if using correlated error, link to the covariance files -#if grep -q "Rcov" $anavinfo ; -#then -# if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; -# then -# $ncp ${fixgsi}/Rcov* . -# else -# echo "Warning: Satellite error covariance files are missing." -# echo "Check for the required Rcov files in " $anavinfo -# exit 1 -# fi -#fi - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - - -# Copy observational data to $tmpdir -$ncp $global_hybrid_T126_datobs/prepqc.gdas.$global_hybrid_T126_adate ./prepbufr -$ncp $global_hybrid_T126_datobs/prepbufr.acft_profiles.gdas.$global_hybrid_T126_adate ./prepbufr_profl -$ncp $global_hybrid_T126_datobs/satwnd.gdas.$global_hybrid_T126_adate ./satwndbufr -$ncp $global_hybrid_T126_datobs/gpsro.gdas.$global_hybrid_T126_adate ./gpsrobufr -$ncp $global_hybrid_T126_datobs/sptrmm.gdas.$global_hybrid_T126_adate ./tmirrbufr -$ncp $global_hybrid_T126_datobs/osbuv8.gdas.$global_hybrid_T126_adate ./sbuvbufr -$ncp $global_hybrid_T126_datobs/gome.gdas.$global_hybrid_T126_adate ./gomebufr -$ncp $global_hybrid_T126_datobs/omi.gdas.$global_hybrid_T126_adate ./omibufr -$ncp $global_hybrid_T126_datobs/tcvitl.gdas.$global_hybrid_T126_adate ./tcvitl -$ncp $global_hybrid_T126_datobs/goesfv.gdas.$global_hybrid_T126_adate ./gsnd1bufr -$ncp $global_hybrid_T126_datobs/1bamua.gdas.$global_hybrid_T126_adate ./amsuabufr -$ncp $global_hybrid_T126_datobs/1bamub.gdas.$global_hybrid_T126_adate ./amsubbufr -$ncp $global_hybrid_T126_datobs/1bhrs3.gdas.$global_hybrid_T126_adate ./hirs3bufr -$ncp $global_hybrid_T126_datobs/1bhrs4.gdas.$global_hybrid_T126_adate ./hirs4bufr -$ncp $global_hybrid_T126_datobs/airsev.gdas.$global_hybrid_T126_adate ./airsbufr -$ncp $global_hybrid_T126_datobs/mtiasi.gdas.$global_hybrid_T126_adate ./iasibufr -$ncp $global_hybrid_T126_datobs/esamua.gdas.$global_hybrid_T126_adate ./amsuabufrears -$ncp $global_hybrid_T126_datobs/esamub.gdas.$global_hybrid_T126_adate ./amsubbufrears -$ncp $global_hybrid_T126_datobs/eshrs3.gdas.$global_hybrid_T126_adate ./hirs3bufrears - -# Copy bias correction, atmospheric and surface files -$ncp $global_hybrid_T126_datges/biascr.gdas.$gdate ./satbias_in -$ncp $global_hybrid_T126_datges/biascr_pc.gdas.${gdate} ./satbias_pc -$ncp $global_hybrid_T126_datges/aircraft_t_bias.gdas.$global_hybrid_T126_adate ./aircftbias_in -$ncp $global_hybrid_T126_datges/radstat.gdas.$gdate ./radstat.gdas - -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - -$ncp $global_hybrid_T126_datges/sfcf03.gdas.$gdate ./sfcf03 -$ncp $global_hybrid_T126_datges/sfcf06.gdas.$gdate ./sfcf06 -$ncp $global_hybrid_T126_datges/sfcf09.gdas.$gdate ./sfcf09 - -$ncp $global_hybrid_T126_datges/siggm3.gdas.$global_hybrid_T126_adate ./sigf03 -$ncp $global_hybrid_T126_datges/sigges.gdas.$global_hybrid_T126_adate ./sigf06 -$ncp $global_hybrid_T126_datges/siggp3.gdas.$global_hybrid_T126_adate ./sigf09 - -list="001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020" - -for file in $list; do -## ln -s $global_hybrid_T126_datges/sigf06s_${gdate}_mem${file}_t${JCAP_EN} ./sigf06_ens_mem${file} - ln -s $global_hybrid_T126_datges/sfg_${gdate}_fhr06s_mem${file} ./sigf06_ens_mem${file} -done - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc diff --git a/regression/global_lanczos_T62.sh b/regression/global_lanczos_T62.sh deleted file mode 100755 index 55014a58f0..0000000000 --- a/regression/global_lanczos_T62.sh +++ /dev/null @@ -1,404 +0,0 @@ - -set -x - -# Set experiment name and analysis date -exp=$jobname - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -#export JCAP=62 -export LEVS=64 -export JCAP_B=62 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/lanczos_out${JCAP}/sigmap/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -CLEAN=NO -ncp=/bin/cp - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_lanczos_T62_adate:0:8} ${global_lanczos_T62_adate:8:2} - 6 hours"` -hha=`echo $global_lanczos_T62_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gdas1.t${hha}z -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gdas${resol}.t${hhg}z -prefix_atm=gdas${resol}.t${hha}z -prefixg=gdas1.t${hhg}z -suffix=tm00.bufr_d - -adate0=`echo $global_lanczos_T62_adate | cut -c1-8` -gdate0=`echo $gdate | cut -c1-8` - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# Make gsi namelist - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_lanczos_T62_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_lanczos_T62_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_lanczos_T62_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_lanczos_T62_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_lanczos_T62 -else - . $scripts/regression_namelists_db.sh global_lanczos_T62 -fi - -##! l4dvar=.false.,nhr_assimilation=6,nhr_obsbin=6, -##! lsqrtb=.true.,lcongrad=.false.,ltlint=.true., -##! idmodel=.true.,lwrtinc=.false., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/global_anavinfo.l64.txt -berror=$fixgsi/$endianness/global_berror.l${LEVS}y${NLAT}.f77 -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -ozinfo=$fixgsi/global_ozinfo.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -errtable=$fixgsi/prepobs_errtable.global - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $errtable ./errtable -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#if using correlated error, link to the covariance files -#if grep -q "Rcov" $anavinfo ; -#then -# if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; -# then -# $ncp ${fixgsi}/Rcov* . -# else -# echo "Warning: Satellite error covariance files are missing." -# echo "Check for the required Rcov files in " $anavinfo -# exit 1 -# fi -#fi - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $global_lanczos_T62_obs/${prefix_obs}.prepbufr ./prepbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.satwnd.${suffix} ./satwndbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.spssmi.${suffix} ./ssmirrbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.sptrmm.${suffix} ./tmirrbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bamua.${suffix} ./amsuabufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bamub.${suffix} ./amsubbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.1bmsu.${suffix} ./msubufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.airsev.${suffix} ./airsbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.sevcsr.${suffix} ./seviribufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.mtiasi.${suffix} ./iasibufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.amsre.${suffix} ./amsrebufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.ssmis.${suffix} ./ssmisbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.gome.${suffix} ./gomebufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.omi.${suffix} ./omibufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.mlsbufr.${suffix} ./mlsbufr -$ncp $global_lanczos_T62_obs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears -$ncp $global_lanczos_T62_obs/${prefix_obs}.esamua.${suffix} ./amsuabufrears -$ncp $global_lanczos_T62_obs/${prefix_obs}.esamub.${suffix} ./amsubbufrears -$ncp $global_lanczos_T62_obs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl - -# Copy bias correction, atmospheric and surface files -$ncp $global_lanczos_T62_ges/${prefix_tbc}.abias.orig ./satbias_in -$ncp $global_lanczos_T62_ges/${prefix_tbc}.satang.orig ./satbias_angle - -if [[ "$endianness" = "Big_Endian" ]]; then - $ncp $global_lanczos_T62_ges/${prefix_sfc}.bf03 ./sfcf03 - $ncp $global_lanczos_T62_ges/${prefix_sfc}.bf06 ./sfcf06 - $ncp $global_lanczos_T62_ges/${prefix_sfc}.bf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - $ncp $global_lanczos_T62_ges/${prefix_sfc}.bf03.le ./sfcf03 - $ncp $global_lanczos_T62_ges/${prefix_sfc}.bf06.le ./sfcf06 - $ncp $global_lanczos_T62_ges/${prefix_sfc}.bf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - $ncp $global_lanczos_T62_obs/${prefix_atm}.sgm3prep ./sigf03 - $ncp $global_lanczos_T62_obs/${prefix_atm}.sgesprep ./sigf06 - $ncp $global_lanczos_T62_obs/${prefix_atm}.sgp3prep ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - $ncp $global_lanczos_T62_obs/${prefix_atm}.sgm3prep.le ./sigf03 - $ncp $global_lanczos_T62_obs/${prefix_atm}.sgesprep.le ./sigf06 - $ncp $global_lanczos_T62_obs/${prefix_atm}.sgp3prep.le ./sigf09 -fi - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# Save output -mkdir -p $savdir - -cat stdout fort.2* > $savdir/stdout.anl.${adate} -$ncp siganl $savdir/siganl.${adate} -$ncp sfcanl.gsi $savdir/sfcanl.${adate} -$ncp satbias_out $savdir/biascr.${adate} -$ncp sfcf06 $savdir/sfcf06.${gdate} -$ncp sigf06 $savdir/sigf06.${gdate} - -# 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. -# - -echo "Time before diagnostic loop is `date` " -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g11 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 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 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a omi_aura 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_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10" - for type in $listall; do - count=`ls ${tmpdir}/dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${adate} - compress diag_${type}_${string}.${adate} - $ncp diag_${type}_${string}.${adate}.Z $savdir/ - fi - done -done -echo "Time after diagnostic loop is `date` " - -exit diff --git a/regression/global_nemsio_T62.sh b/regression/global_nemsio_T62.sh deleted file mode 100755 index 8278bb3655..0000000000 --- a/regression/global_nemsio_T62.sh +++ /dev/null @@ -1,419 +0,0 @@ - -set -x - -# Set experiment name and analysis date -exp=$jobname - -# Set the JCAP resolution which you want. -# All resolutions use LEVS=64 -#export JCAP=62 -export LEVS=64 -export JCAP_B=62 - -# Set runtime and save directories -tmpdir=$tmpdir/$tmpregdir/${exp} -savdir=$savdir/nemsio_out${JCAP}/sigmap/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - -# Given the requested resolution, set dependent resolution parameters -if [[ "$JCAP" = "382" ]]; then - export LONA=768 - export LATA=384 - export DELTIM=180 - export resol=1 -elif [[ "$JCAP" = "62" ]]; then - export LONA=192 - export LATA=94 - export DELTIM=1200 - export resol=2 -else - echo "INVALID JCAP = $JCAP" - exit -fi -export NLAT=$((${LATA}+2)) - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -gdate=`date +%Y%m%d%H -d "${global_nemsio_T62_adate:0:8} ${global_nemsio_T62_adate:8:2} - 6 hours"` -hha=`echo $global_nemsio_T62_adate | cut -c9-10` -hhg=`echo $gdate | cut -c9-10` -prefix_obs=gdas1.t${hha}z -prefix_tbc=gdas1.t${hhg}z -prefix_sfc=gdas${resol}.t${hhg}z -prefix_atm=gdas${resol}.t${hha}z -prefixg=gdas1.t${hhg}z -suffix=tm00.bufr_d - -adate0=`echo $global_nemsio_T62_adate | cut -c1-8` -gdate0=`echo $gdate | cut -c1-8` - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -cd $tmpdir -rm -rf core* - -# Make gsi namelist - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_nemsio_T62_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - while [ ! -s $co2 ] ; do - ((yyyy-=1)) - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - done - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi -#CH4 file decision -ICH4=${ICH4:-0} -if [ $ICH4 -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - ch4dir=${CH4DIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_nemsio_T62_adate}|cut -c1-4) - rm ./ch4globaldata.txt - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - while [ ! -s $ch4 ] ; do - ((yyyy-=1)) - ch4=$ch4dir/global_ch4_esrlctm_$yyyy.txt - done - if [ -s $ch4 ] ; then - $ncp $ch4 ./ch4globaldata.txt - fi - if [ ! -s ./ch4globaldata.txt ] ; then - echo "\./ch4globaldata.txt" not created - exit 1 - fi -fi -IN2O=${IN2O:-0} -if [ $IN2O -gt 0 ] ; then -# # Copy ch4 files to $tmpdir - n2odir=${N2ODIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_nemsio_T62_adate}|cut -c1-4) - rm ./n2oglobaldata.txt - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - while [ ! -s $n2o ] ; do - ((yyyy-=1)) - n2o=$n2odir/global_n2o_esrlctm_$yyyy.txt - done - if [ -s $n2o ] ; then - $ncp $n2o ./n2oglobaldata.txt - fi - if [ ! -s ./n2oglobaldata.txt ] ; then - echo "\./n2oglobaldata.txt" not created - exit 1 - fi -fi -ICO=${ICO:-0} -if [ $ICO -gt 0 ] ; then -# # Copy CO files to $tmpdir - codir=${CODIR:-$fix_file} - yyyy=$(echo ${CDATE:-$global_nemsio_T62_adate}|cut -c1-4) - rm ./coglobaldata.txt - co=$codir/global_co_esrlctm_$yyyy.txt - while [ ! -s $co ] ; do - ((yyyy-=1)) - co=$codir/global_co_esrlctm_$yyyy.txt - done - if [ -s $co ] ; then - $ncp $co ./coglobaldata.txt - fi - if [ ! -s ./coglobaldata.txt ] ; then - echo "\./coglobaldata.txt" not created - exit 1 - fi -fi - -SETUPnems="use_gfs_nemsio=.true.," - -. $scripts/regression_nl_update.sh - -SETUP="$SETUPnems $SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh global_T62 -else - . $scripts/regression_namelists_db.sh global_T62 -fi - -##! l4dvar=.false.,nhr_assimilation=6,nhr_obsbin=6, -##! lsqrtb=.true.,lcongrad=.false.,ltlint=.true., -##! idmodel=.true.,lwrtinc=.false., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (optional) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/global_anavinfo.l64.txt -berror=$fixgsi/$endianness/global_berror.l${LEVS}y${NLAT}.f77 -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/global_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/global_pcpinfo.txt -ozinfo=$fixgsi/global_ozinfo.txt -convinfo=$fixgsi/global_convinfo_reg_test.txt -vqcdat=$fixgsi/vqctp001.dat -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -errtable=$fixgsi/prepobs_errtable.global - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $vqcdat ./vqctp001.dat -$ncp $errtable ./errtable -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -#if using correlated error, link to the covariance files -#if grep -q "Rcov" $anavinfo ; -#then -# if ls ${fixgsi}/Rcov* 1> /dev/null 2>&1; -# then -# $ncp ${fixgsi}/Rcov* . -# else -# echo "Warning: Satellite error covariance files are missing." -# echo "Check for the required Rcov files in " $anavinfo -# exit 1 -# fi -#fi - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $global_nemsio_T62_obs/${prefix_obs}.prepbufr ./prepbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.satwnd.${suffix} ./satwndbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.gpsro.${suffix} ./gpsrobufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.spssmi.${suffix} ./ssmirrbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.sptrmm.${suffix} ./tmirrbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.osbuv8.${suffix} ./sbuvbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.goesfv.${suffix} ./gsnd1bufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bamua.${suffix} ./amsuabufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bamub.${suffix} ./amsubbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bhrs2.${suffix} ./hirs2bufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bhrs3.${suffix} ./hirs3bufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bhrs4.${suffix} ./hirs4bufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bmhs.${suffix} ./mhsbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.1bmsu.${suffix} ./msubufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.airsev.${suffix} ./airsbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.sevcsr.${suffix} ./seviribufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.mtiasi.${suffix} ./iasibufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.ssmit.${suffix} ./ssmitbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.amsre.${suffix} ./amsrebufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.ssmis.${suffix} ./ssmisbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.gome.${suffix} ./gomebufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.omi.${suffix} ./omibufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.mlsbufr.${suffix} ./mlsbufr -$ncp $global_nemsio_T62_obs/${prefix_obs}.eshrs3.${suffix} ./hirs3bufrears -$ncp $global_nemsio_T62_obs/${prefix_obs}.esamua.${suffix} ./amsuabufrears -$ncp $global_nemsio_T62_obs/${prefix_obs}.esamub.${suffix} ./amsubbufrears -$ncp $global_nemsio_T62_obs/${prefix_obs}.syndata.tcvitals.tm00 ./tcvitl - -# Copy bias correction, atmospheric and surface files -$ncp $global_nemsio_T62_obs/${prefix_tbc}.abias ./satbias_in -$ncp $global_nemsio_T62_obs/${prefix_tbc}.abias_pc ./satbias_pc -$ncp $global_nemsio_T62_obs/${prefix_tbc}.satang ./satbias_angle -$ncp $global_nemsio_T62_obs/${prefix_tbc}.radstat ./radstat.gdas - -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - -if [[ "$endianness" = "Big_Endian" ]]; then - $ncp $global_nemsio_T62_ges/${prefix_sfc}.bf03 ./sfcf03 - $ncp $global_nemsio_T62_ges/${prefix_sfc}.bf06 ./sfcf06 - $ncp $global_nemsio_T62_ges/${prefix_sfc}.bf09 ./sfcf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - $ncp $global_nemsio_T62_ges/${prefix_sfc}.bf03.le ./sfcf03 - $ncp $global_nemsio_T62_ges/${prefix_sfc}.bf06.le ./sfcf06 - $ncp $global_nemsio_T62_ges/${prefix_sfc}.bf09.le ./sfcf09 -fi - -if [[ "$endianness" = "Big_Endian" ]]; then - $ncp $global_nemsio_T62_ges/${prefix_atm}.sgm3prep ./sigf03 - $ncp $global_nemsio_T62_ges/${prefix_atm}.sgesprep ./sigf06 - $ncp $global_nemsio_T62_ges/${prefix_atm}.sgp3prep ./sigf09 -elif [[ "$endianness" = "Little_Endian" ]]; then - $ncp $global_nemsio_T62_ges/${prefix_atm}.sgm3prep.le ./sigf03 - $ncp $global_nemsio_T62_ges/${prefix_atm}.sgesprep.le ./sigf06 - $ncp $global_nemsio_T62_ges/${prefix_atm}.sgp3prep.le ./sigf09 -fi - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# Save output -mkdir -p $savdir - -cat stdout fort.2* > $savdir/stdout.anl.${adate} -$ncp siganl $savdir/siganl.${adate} -$ncp sfcanl.gsi $savdir/sfcanl.${adate} -$ncp satbias_out $savdir/biascr.${adate} -$ncp sfcf06 $savdir/sfcf06.${gdate} -$ncp sigf06 $savdir/sigf06.${gdate} - -# 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. -# - -echo "Time before diagnostic loop is `date` " -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g11 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 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 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a omi_aura 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_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10" - for type in $listall; do - count=`ls ${tmpdir}/dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${adate} - compress diag_${type}_${string}.${adate} - $ncp diag_${type}_${string}.${adate}.Z $savdir/ - fi - done -done -echo "Time after diagnostic loop is `date` " - -exit diff --git a/regression/hwrf_nmm_d2.sh b/regression/hwrf_nmm_d2.sh index ba7ae25521..2b4d2e1bfe 100755 --- a/regression/hwrf_nmm_d2.sh +++ b/regression/hwrf_nmm_d2.sh @@ -266,7 +266,7 @@ $ncp $hwrf_nmm_ges/gdas1.t${hhg}z.sf06 ./gfs_sigf06 $ncp $hwrf_nmm_ges/gdas1.t${hhg}z.sf09 ./gfs_sigf09 # Copy ensemble forecast files for hybrid analysis -export ENSEMBLE_SIZE_REGIONAL=80 +export ENSEMBLE_SIZE_REGIONAL=10 >filelist06 n=1 while [[ $n -le ${ENSEMBLE_SIZE_REGIONAL} ]]; do @@ -314,9 +314,9 @@ esac for type in $listall; do count=`ls dir.*/${type}_${loop}* | wc -l` if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${global_T62_adate} - compress diag_${type}_${string}.${global_T62_adate} - $ncp diag_${type}_${string}.${global_T62_adate}.Z $savdir/ + cat dir.*/${type}_${loop}* > diag_${type}_${string}.${hwrf_nmm_adate} + compress diag_${type}_${string}.${hwrf_nmm_adate} + $ncp diag_${type}_${string}.${hwrf_nmm_adate}.Z $savdir/ fi done done diff --git a/regression/hwrf_nmm_d3.sh b/regression/hwrf_nmm_d3.sh index bde43050a8..7b6746b741 100755 --- a/regression/hwrf_nmm_d3.sh +++ b/regression/hwrf_nmm_d3.sh @@ -264,7 +264,7 @@ $ncp $hwrf_nmm_ges/gdas1.t${hhg}z.sf06 ./gfs_sigf06 $ncp $hwrf_nmm_ges/gdas1.t${hhg}z.sf09 ./gfs_sigf09 # Copy ensemble forecast files for hybrid analysis -export ENSEMBLE_SIZE_REGIONAL=80 +export ENSEMBLE_SIZE_REGIONAL=10 >filelist06 n=1 while [[ $n -le ${ENSEMBLE_SIZE_REGIONAL} ]]; do @@ -312,9 +312,9 @@ esac for type in $listall; do count=`ls dir.*/${type}_${loop}* | wc -l` if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${global_T62_adate} - compress diag_${type}_${string}.${global_T62_adate} - $ncp diag_${type}_${string}.${global_T62_adate}.Z $savdir/ + cat dir.*/${type}_${loop}* > diag_${type}_${string}.${hwrf_nmm_adate} + compress diag_${type}_${string}.${hwrf_nmm_adate} + $ncp diag_${type}_${string}.${hwrf_nmm_adate}.Z $savdir/ fi done done diff --git a/regression/multi_regression.sh b/regression/multi_regression.sh index 106bfcf3ad..b850863d69 100755 --- a/regression/multi_regression.sh +++ b/regression/multi_regression.sh @@ -1,43 +1,24 @@ #!/bin/sh --login -regtests_all="global_T62 - global_T62_ozonly - global_4dvar_T62 - global_4denvar_T126 - global_fv3_4denvar_T126 - global_fv3_4denvar_C192 - global_lanczos_T62 - arw_netcdf - arw_binary - nmm_binary - nmm_netcdf - nmmb_nems_4denvar +regtests_all="global_3dvar + global_4dvar + global_4denvar netcdf_fv3_regional + rrfs_3denvar_glbens hwrf_nmm_d2 hwrf_nmm_d3 rtma - global_enkf_T62 - global_C96_fv3aero - global_C96_fv3aerorad" + global_enkf" -regtests_debug="global_T62 - global_4dvar_T62 - global_4denvar_T126 - global_fv3_4denvar_T126 - global_fv3_4denvar_C192 - global_lanczos_T62 - arw_netcdf - arw_binary - nmm_binary - nmm_netcdf - nmmb_nems_4denvar +regtests_debug="global_3dvar + global_4dvar + global_4denvar netcdf_fv3_regional + rrfs_3denvar_glbens hwrf_nmm_d2 hwrf_nmm_d3 rtma - global_enkf_T62 - global_C96_fv3aero - global_C96_fv3aerorad" + global_enkf" # Choose which regression test to run; by default, run all regtests=${1:-$regtests_all} diff --git a/regression/netcdf_fv3_regional.sh b/regression/netcdf_fv3_regional.sh index db5ecb920a..747794fae0 100755 --- a/regression/netcdf_fv3_regional.sh +++ b/regression/netcdf_fv3_regional.sh @@ -7,15 +7,6 @@ set -x # Set experiment name exp=$jobname -#TM=00 -#TM2=03 -#tmmark=tm${TM} - - -# Set path/file for gsi executable -#gsiexec=/meso/save/Wanshu.Wu/Code/trunk/trunk_40320/src/global_gsi_org -#gsiexec=/da/save/Michael.Lueken/trunk/src/global_gsi.x - # Set runtime and save directories tmpdir=$tmpdir/tmpreg_netcdf_fv3_regional/${exp} savdir=$savdir/outreg_netcdf_fv3_regional/${exp} diff --git a/regression/nmm_binary.sh b/regression/nmm_binary.sh deleted file mode 100755 index abd4507283..0000000000 --- a/regression/nmm_binary.sh +++ /dev/null @@ -1,320 +0,0 @@ - -set -x - -# Set analysis date -#adate=$adate_regional_nmm_binary - -# Set guess/analysis (i/o) file format. Two -# option are available: binary or netcdf -io_format=binary -##io_format=netcdf - -if [[ "$io_format" = "binary" ]]; then - NETCDF=.false. - FORMAT=binary -elif [[ "$io_format" = "netcdf" ]]; then - NETCDF=.true. - FORMAT=netcdf -else - echo "***ERRROR*** INVALID io_format = $io_format" - exit -fi - -# Set experiment name -exp=$jobname - -# Set path/file for gsi executable -#gsiexec=$updat - -# Set resoltion and other dependent parameters -#export JCAP=62 -export LEVS=60 -export JCAP_B=62 -if [[ "$io_format" = "binary" ]]; then - export LEVS=60 -elif [[ "$io_format" = "netcdf" ]]; then - export LEVS=45 -fi -export DELTIM=1200 - -# Set runtime and save directories -tmpdir=$tmpdir/tmpreg_nmm_binary/${exp} -savdir=$savdir/outreg/nmm_binary/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -CLEAN=NO -ncp=/bin/cp - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -sdate=`echo $nmm_binary_adate |cut -c1-8` -odate=`date +%Y%m%d%H -d "${nmm_binary_adate:0:8} ${nmm_binary_adate:8:2} + 12 hours"` -hha=`echo $nmm_binary_adate | cut -c9-10` -hho=`echo $odate | cut -c9-10` -prefixo=ndas.t${hho}z -prefixa=ndas.t${hha}z -suffix=tm12.bufr_d - -#datobs=$datobs_nmm_binary/$adate -#datges=$datobs - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -chgrp rstprod $tmpdir -chmod 750 $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$nmm_binary_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh nmm_binary -else - . $scripts/regression_namelists_db.sh nmm_binary -fi -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (regional only) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/anavinfo_ndas_binary -if [[ "$io_format" = "binary" ]]; then - berror=$fixgsi/$endianness/nam_nmmstat_na.gcv -elif [[ "$io_format" = "netcdf" ]]; then - berror=$fixgsi/$endianness/nam_glb_berror.f77.gcv -fi -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/nam_regional_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/nam_global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/nam_global_pcpinfo.txt -ozinfo=$fixgsi/nam_global_ozinfo.txt -errtable=$fixgsi/nam_errtable.r3dv -convinfo=$fixgsi/nam_regional_convinfo_reg_test.txt -### add 9 tables - -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf - -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -### - -mesonetuselist=$fixgsi/nam_mesonet_uselist.txt - - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $errtable ./errtable -$ncp $mesonetuselist ./mesonetuselist -#### -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $nmm_binary_obs/${prefixo}.prepbufr.tm12 ./prepbufr -$ncp $nmm_binary_obs/${prefixo}.satwnd.$suffix ./satwndbufr -$ncp $nmm_binary_obs/${prefixo}.gpsro.$suffix ./gpsrobufr -$ncp $nmm_binary_obs/${prefixo}.1bhrs3.$suffix ./hirs3bufr -$ncp $nmm_binary_obs/${prefixo}.1bhrs4.$suffix ./hirs4bufr -$ncp $nmm_binary_obs/${prefixo}.1bamua.$suffix ./amsuabufr -$ncp $nmm_binary_obs/${prefixo}.1bamub.$suffix ./amsubbufr -$ncp $nmm_binary_obs/${prefixo}.1bmhs.$suffix ./mhsbufr -$ncp $nmm_binary_obs/${prefixo}.goesfv.$suffix ./gsnd1bufr -$ncp $nmm_binary_obs/${prefixo}.airsev.$suffix ./airsbufr -$ncp $nmm_binary_obs/${prefixo}.radwnd.$suffix ./radarbufr -$ncp $nmm_binary_obs/${prefixo}.nexrad.$suffix ./l2rwbufr - -# Copy bias correction, sigma, and surface files -# -# *** NOTE: The regional gsi analysis is written to (over) -# the input guess field file (wrf_inout) -# -$ncp $nmm_binary_obs/${prefixo}.satbias.tm12 ./satbias_in -$ncp $nmm_binary_obs/${prefixo}.satang.tm12 ./satbias_angle -if [[ "$io_format" = "binary" ]]; then - $ncp $nmm_binary_ges/${prefixo}.wrfinput_d01.init ./wrf_inout -elif [[ "$io_format" = "netcdf" ]]; then - $ncp $nmm_binary_ges/wrfinput_d01_nmm_netcdf ./wrf_inout -fi -cp wrf_inout wrf_ges - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# Save output -mkdir -p $savdir -chgrp rstprod $savdir -chmod 750 $savdir - -cat stdout fort.2* > $savdir/stdout.anl.${nmm_binary_adate} -$ncp wrf_inout $savdir/wrfanl.${nmm_binary_adate} -$ncp satbias_out $savdir/biascr.${nmm_binary_adate} - -# If desired, copy guess file to unique filename in $savdir -$ncp wrf_ges $savdir/wrfges.${nmm_binary_adate} - -# 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. -# - -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g10 sndr_g12 sndr_g08_prep sndr_g10_prep sndr_g12_prep sndrd1_g08 sndrd2_g08 sndrd3_g08 sndrd4_g08 sndrd1_g10 sndrd2_g10 sndrd3_g10 sndrd4_g10 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 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_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" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${nmm_binary_adate} - compress diag_${type}_${string}.${nmm_binary_adate} - $ncp diag_${type}_${string}.${nmm_binary_adate}.Z $savdir/ - fi - done -done - -exit diff --git a/regression/nmm_netcdf.sh b/regression/nmm_netcdf.sh deleted file mode 100755 index a1e6879104..0000000000 --- a/regression/nmm_netcdf.sh +++ /dev/null @@ -1,317 +0,0 @@ - -set -x - -# Set experiment name and analysis date -exp=$jobname - -# Set analysis date -#adate=$adate_regional - -# Set guess/analysis (i/o) file format. Two -# option are available: binary or netcdf -##io_format=binary -io_format=netcdf - -if [[ "$io_format" = "binary" ]]; then - NETCDF=.false. - FORMAT=binary -elif [[ "$io_format" = "netcdf" ]]; then - NETCDF=.true. - FORMAT=netcdf -else - echo "***ERRROR*** INVALID io_format = $io_format" - exit -fi - -# Set experiment name -#exp=$exp1_nmm_netcdf_updat - -# Set path/file for gsi executable -#gsiexec=$updat - -# Set resoltion and other dependent parameters -#export JCAP=62 -export LEVS=60 -export JCAP_B=$JCAP -if [[ "$io_format" = "binary" ]]; then - export LEVS=60 -elif [[ "$io_format" = "netcdf" ]]; then - export LEVS=45 -fi -export DELTIM=1200 - -# Set runtime and save directories -tmpdir=$tmpdir/tmpreg_nmm_netcdf/${exp} -savdir=$savdir/outreg/nmm_netcdf/${exp} - -# Specify GSI fixed field and data directories. -fixcrtm=${fixcrtm:-$CRTM_FIX} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -CLEAN=NO -ncp=/bin/cp - -# Given the analysis date, compute the date from which the -# first guess comes. Extract cycle and set prefix and suffix -# for guess and observation data files -sdate=`echo $nmm_netcdf_adate |cut -c1-8` -odate=`date +%Y%m%d%H -d "${nmm_netcdf_adate:0:8} ${nmm_netcdf_adate:8:2} + 12 hours"` -hha=`echo $nmm_netcdf_adate | cut -c9-10` -hho=`echo $odate | cut -c9-10` -prefixo=ndas.t${hho}z -prefixa=ndas.t${hha}z -suffix=tm12.bufr_d - -#datobs=$datobs_nmm_netcdf/$adate -#datges=$datges_nmm_netcdf/$adate - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -chgrp rstprod $tmpdir -chmod 750 $tmpdir -cd $tmpdir -rm -rf core* - -# CO2 namelist and file decisions -ICO2=${ICO2:-0} -if [ $ICO2 -gt 0 ] ; then - # Copy co2 files to $tmpdir - co2dir=${CO2DIR:-$fixgsi} - yyyy=$(echo ${CDATE:-$nmm_netcdf_adate}|cut -c1-4) - rm ./global_co2_data.txt - co2=$co2dir/global_co2.gcmscl_$yyyy.txt - if [ -s $co2 ] ; then - $ncp $co2 ./global_co2_data.txt - fi - if [ ! -s ./global_co2_data.txt ] ; then - echo "\./global_co2_data.txt" not created - exit 1 - fi -fi - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh nmm_netcdf -else - . $scripts/regression_namelists_db.sh nmm_netcdf -fi -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -# Set fixed files -# berror = forecast model background error statistics -# specoef = CRTM spectral coefficients -# trncoef = CRTM transmittance coefficients -# emiscoef = CRTM coefficients for IR sea surface emissivity model -# aerocoef = CRTM coefficients for aerosol effects -# cldcoef = CRTM coefficients for cloud effects -# satinfo = text file with information about assimilation of brightness temperatures -# cloudyinfo = text file with information about assimilation of cloudy radiance -# satangl = angle dependent bias correction file (fixed in time) -# atmsbeamdat = data required for atms spatial averaging -# pcpinfo = text file with information about assimilation of prepcipitation rates -# ozinfo = text file with information about assimilation of ozone data -# errtable = text file with obs error for conventional data (regional only) -# convinfo = text file with information about assimilation of conventional data -# bufrtable= text file ONLY needed for single obs test (oneobstest=.true.) -# bftab_sst= bufr table for sst ONLY needed for sst retrieval (retrieval=.true.) - -anavinfo=$fixgsi/anavinfo_ndas_netcdf -if [[ "$io_format" = "binary" ]]; then - berror=$fixgsi/$endianness/nam_nmmstat_na.gcv -elif [[ "$io_format" = "netcdf" ]]; then - berror=$fixgsi/$endianness/nam_glb_berror.f77.gcv -fi -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/nam_regional_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -satangl=$fixgsi/nam_global_satangbias.txt -atmsbeamdat=$fixgsi/atms_beamwidth.txt -pcpinfo=$fixgsi/nam_global_pcpinfo.txt -ozinfo=$fixgsi/nam_global_ozinfo.txt -errtable=$fixgsi/nam_errtable.r3dv -convinfo=$fixgsi/nam_regional_convinfo_reg_test.txt -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -mesonetuselist=$fixgsi/nam_mesonet_uselist.txt - - -# Only need this file for single obs test -bufrtable=$fixgsi/prepobs_prep.bufrtable - -# Only need this file for sst retrieval -bftab_sst=$fixgsi/bufrtab.012 - - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -$ncp $anavinfo ./anavinfo -$ncp $berror ./berror_stats -$ncp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -$ncp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -$ncp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -$ncp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -$ncp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -$ncp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -$ncp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -$ncp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -$ncp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -$ncp $aercoef ./AerosolCoeff.bin -$ncp $cldcoef ./CloudCoeff.bin -$ncp $satangl ./satbias_angle -$ncp $atmsbeamdat ./atms_beamwidth.txt -$ncp $satinfo ./satinfo -$ncp $cloudyinfo ./cloudy_radiance_info.txt -$ncp $scaninfo ./scaninfo -$ncp $pcpinfo ./pcpinfo -$ncp $ozinfo ./ozinfo -$ncp $convinfo ./convinfo -$ncp $errtable ./errtable -$ncp $mesonetuselist ./mesonetuselist -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - - -$ncp $bufrtable ./prepobs_prep.bufrtable -$ncp $bftab_sst ./bftab_sstphr - -# Copy CRTM coefficient files based on entries in satinfo file -for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do - $ncp $fixcrtm/${file}.SpcCoeff.bin ./ - $ncp $fixcrtm/${file}.TauCoeff.bin ./ -done - -# Copy observational data to $tmpdir -$ncp $nmm_netcdf_obs/${prefixo}.prepbufr.tm12 ./prepbufr -$ncp $nmm_netcdf_obs/${prefixo}.satwnd.$suffix ./satwndbufr -$ncp $nmm_netcdf_obs/${prefixo}.1bhrs3.$suffix ./hirs3bufr -$ncp $nmm_netcdf_obs/${prefixo}.1bhrs4.$suffix ./hirs4bufr -$ncp $nmm_netcdf_obs/${prefixo}.1bamua.$suffix ./amsuabufr -$ncp $nmm_netcdf_obs/${prefixo}.1bamub.$suffix ./amsubbufr -$ncp $nmm_netcdf_obs/${prefixo}.1bmhs.$suffix ./mhsbufr -$ncp $nmm_netcdf_obs/${prefixo}.goesfv.$suffix ./gsnd1bufr -$ncp $nmm_netcdf_obs/${prefixo}.airsev.$suffix ./airsbufr -$ncp $nmm_netcdf_obs/${prefixo}.radwnd.$suffix ./radarbufr -$ncp $nmm_netcdf_obs/${prefixo}.nexrad.$suffix ./l2rwbufr - -# Copy bias correction and atmosphere/surface guess files -# -# *** NOTE: The regional gsi analysis is written to (over) -# the input guess field file (wrf_inout) -# -$ncp $nmm_netcdf_obs/${prefixa}.satbias.tm03 ./satbias_in -$ncp $nmm_netcdf_obs/${prefixa}.satang.tm03 ./satbias_angle -if [[ "$io_format" = "binary" ]]; then - $ncp $nmm_netcdf_ges/${prefixa}.wrfrst_d01.tm12 ./wrf_inout -elif [[ "$io_format" = "netcdf" ]]; then - $ncp $nmm_netcdf_ges/wrfinput_d01_nmm_netcdf ./wrf_inout -fi -cp wrf_inout wrf_ges - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc - -# Save output -mkdir -p $savdir -chgrp rstprod $savdir -chmod 750 $savdir - -cat stdout fort.2* > $savdir/stdout.anl.${nmm_netcdf_adate} -$ncp wrf_inout $savdir/wrfanl.${nmm_netcdf_adate} -$ncp satbias_out $savdir/biascr.${nmm_netcdf_adate} - -# If desired, copy guess file to unique filename in $savdir -$ncp wrf_ges $savdir/wrfges.${nmm_netcdf_adate} - -# 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. -# - -cd $tmpdir -loops="01 03" -for loop in $loops; do - -case $loop in - 01) string=ges;; - 03) string=anl;; - *) string=$loop;; -esac - -# Collect diagnostic files for obs types (groups) below - listall="hirs2_n14 msu_n14 sndr_g08 sndr_g10 sndr_g12 sndr_g08_prep sndr_g10_prep sndr_g12_prep sndrd1_g08 sndrd2_g08 sndrd3_g08 sndrd4_g08 sndrd1_g10 sndrd2_g10 sndrd3_g10 sndrd4_g10 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 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_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" - for type in $listall; do - count=`ls dir.*/${type}_${loop}* | wc -l` - if [[ $count -gt 0 ]]; then - cat dir.*/${type}_${loop}* > diag_${type}_${string}.${nmm_netcdf_adate} - compress diag_${type}_${string}.${nmm_netcdf_adate} - $ncp diag_${type}_${string}.${nmm_netcdf_adate}.Z $savdir/ - fi - done -done - -exit diff --git a/regression/nmmb_nems_4denvar.sh b/regression/nmmb_nems_4denvar.sh deleted file mode 100755 index 56c23a2140..0000000000 --- a/regression/nmmb_nems_4denvar.sh +++ /dev/null @@ -1,247 +0,0 @@ - -set -x - -# Set analysis date -#adate=2015061000 - -# Set experiment name -exp=$jobname - -#TM=00 -#TM2=03 -#tmmark=tm${TM} - - -# Set path/file for gsi executable -#gsiexec=/meso/save/Wanshu.Wu/Code/trunk/trunk_40320/src/global_gsi_org -#gsiexec=/da/save/Michael.Lueken/trunk/src/global_gsi.x - -# Set runtime and save directories -tmpdir=$tmpdir/tmpreg_nmmb_nems_4denvar/${exp} -savdir=$savdir/outreg_nmmb_nems_4denvar/${exp} - -# Set variables used in script -# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) -# ncp is cp replacement, currently keep as /bin/cp - -UNCOMPRESS=gunzip -CLEAN=NO -ncp=/bin/cp - - -# Set up $tmpdir -rm -rf $tmpdir -mkdir -p $tmpdir -chgrp rstprod $tmpdir -chmod 750 $tmpdir -cd $tmpdir - -#FIXnam=/da/save/Michael.Lueken/trunk/fix -fixcrtm=${fixcrtm:-$CRTM_FIX} - -berror=$fixgsi/nam_nmm_berror.f77.gcv -anavinfo=$fixgsi/anavinfo_nems_nmmb - - -# Make gsi namelist - -. $scripts/regression_nl_update.sh - -SETUP="$SETUP_update" -GRIDOPTS="$GRIDOPTS_update" -BKGVERR="$BKGVERR_update" -ANBKGERR="$ANBKERR_update" -JCOPTS="$JCOPTS_update" -STRONGOPTS="$STRONGOPTS_update" -OBSQC="$OBSQC_update" -OBSINPUT="$OBSINPUT_update" -SUPERRAD="$SUPERRAD_update" -HYBRID_ENSEMBLE='ensemble_path="",' -SINGLEOB="$SINGLEOB_update" - -if [ "$debug" = ".false." ]; then - . $scripts/regression_namelists.sh nems_nmmb_4denvar -else - . $scripts/regression_namelists_db.sh nems_nmmb_4denvar -fi - -# dmesh(1)=120.0,time_window_max=1.5,ext_sonde=.true., - -cat << EOF > gsiparm.anl - -$gsi_namelist - -EOF - -emiscoef_IRwater=$fixcrtm/Nalli.IRwater.EmisCoeff.bin -emiscoef_IRice=$fixcrtm/NPOESS.IRice.EmisCoeff.bin -emiscoef_IRland=$fixcrtm/NPOESS.IRland.EmisCoeff.bin -emiscoef_IRsnow=$fixcrtm/NPOESS.IRsnow.EmisCoeff.bin -emiscoef_VISice=$fixcrtm/NPOESS.VISice.EmisCoeff.bin -emiscoef_VISland=$fixcrtm/NPOESS.VISland.EmisCoeff.bin -emiscoef_VISsnow=$fixcrtm/NPOESS.VISsnow.EmisCoeff.bin -emiscoef_VISwater=$fixcrtm/NPOESS.VISwater.EmisCoeff.bin -emiscoef_MWwater=$fixcrtm/FASTEM6.MWwater.EmisCoeff.bin -aercoef=$fixcrtm/AerosolCoeff.bin -cldcoef=$fixcrtm/CloudCoeff.bin -satinfo=$fixgsi/nam_regional_satinfo.txt -cloudyinfo=$fixgsi/cloudy_radiance_info.txt -scaninfo=$fixgsi/global_scaninfo.txt -pcpinfo=$fixgsi/nam_global_pcpinfo.txt -ozinfo=$fixgsi/nam_global_ozinfo.txt -errtable=$fixgsi/nam_errtable.r3dv -convinfo=$fixgsi/nam_regional_convinfo.txt -mesonetuselist=$fixgsi/nam_mesonet_uselist.txt -stnuselist=$fixgsi/nam_mesonet_stnuselist.txt -qdaylist=$fixgsi/rtma_q_day_rejectlist -qnightlist=$fixgsi/rtma_q_night_rejectlist -tdaylist=$fixgsi/rtma_t_day_rejectlist -tnightlist=$fixgsi/rtma_t_night_rejectlist -wbinuselist=$fixgsi/rtma_wbinuselist -locinfo=$fixgsi/nam_hybens_d01_locinfo -### add 9 tables -errtable_pw=$fixgsi/prepobs_errtable_pw.global -errtable_ps=$fixgsi/prepobs_errtable_ps.global_nqcf -errtable_t=$fixgsi/prepobs_errtable_t.global_nqcf -errtable_q=$fixgsi/prepobs_errtable_q.global_nqcf -errtable_uv=$fixgsi/prepobs_errtable_uv.global_nqcf -btable_ps=$fixgsi/nqc_b_ps.global_nqcf -btable_t=$fixgsi/nqc_b_t.global_nqcf -btable_q=$fixgsi/nqc_b_q.global_nqcf -btable_uv=$fixgsi/nqc_b_uv.global_nqcf - -# add vertical profile of localization and beta_s,beta_e weights for hybrid ensemble runs -hybens_info=$fixgsi/nam_hybens_d01_info - - -# Copy executable and fixed files to $tmpdir -if [[ $exp == *"updat"* ]]; then - $ncp $gsiexec_updat ./gsi.x -elif [[ $exp == *"contrl"* ]]; then - $ncp $gsiexec_contrl ./gsi.x -fi - -cp $anavinfo ./anavinfo -cp $berror ./berror_stats -cp $errtable ./errtable -cp $emiscoef_IRwater ./Nalli.IRwater.EmisCoeff.bin -cp $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin -cp $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin -cp $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin -cp $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin -cp $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin -cp $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin -cp $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin -cp $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin -cp $aercoef ./AerosolCoeff.bin -cp $cldcoef ./CloudCoeff.bin -cp $satinfo ./satinfo -cp $cloudyinfo ./cloudy_radiance_info.txt -cp $scaninfo ./scaninfo -cp $pcpinfo ./pcpinfo -cp $ozinfo ./ozinfo -cp $convinfo ./convinfo -cp $mesonetuselist ./mesonetuselist -cp $stnuselist ./mesonet_stnuselist -cp $qdaylist ./q_day_rejectlist -cp $qnightlist ./q_night_rejectlist -cp $tdaylist ./t_day_rejectlist -cp $tnightlist ./t_night_rejectlist -cp $wbinuselist ./wbinuselist -#cp $locinfo ./hybens_info -#add 9 tables for new varqc -$ncp $errtable_pw ./errtable_pw -$ncp $errtable_ps ./errtable_ps -$ncp $errtable_t ./errtable_t -$ncp $errtable_q ./errtable_q -$ncp $errtable_uv ./errtable_uv -$ncp $btable_ps ./btable_ps -$ncp $btable_t ./btable_t -$ncp $btable_q ./btable_q -$ncp $btable_uv ./btable_uv - -$ncp $hybens_info ./hybens_info - - -###### crtm coeff's ####################### -set +x -for file in `awk '{if($1!~"!"){print $1}}' satinfo | sort | uniq` ;do - cp $fixcrtm/${file}.SpcCoeff.bin ./ - cp $fixcrtm/${file}.TauCoeff.bin ./ -done -set -x - -PDY=`echo $adate | cut -c1-8` -CYC=`echo $adate | cut -c9-10` - -#datdir=/meso/noscrub/Wanshu.Wu/CASE/$adate - -cp $nmmb_nems_4denvar_obs/nam.t00z.radwnd.tm00.bufr_d ./radarbufr -cp $nmmb_nems_4denvar_obs/nam.t00z.nexrad.tm00.bufr_d ./l2rwbufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.prepbufr ./prepbufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.mtiasi.tm00.bufr_d ./iasibufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.gpsro.tm00.bufr_d ./gpsrobufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.1bamua.tm00.bufr_d ./amsuabufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.esamua.tm00.bufr_d ./amsuabufrears -cp $nmmb_nems_4denvar_obs/gdas1.t00z.1bmhs.tm00.bufr_d ./mhsbufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.1bhrs4.tm00.bufr_d ./hirs4bufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.goesfv.tm00.bufr_d ./gsnd1bufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.airsev.tm00.bufr_d ./airsbufr -cp $nmmb_nems_4denvar_obs/gdas1.t00z.satwnd.tm00.bufr_d ./satwndbufr - - cp $nmmb_nems_4denvar_ges/wrf_inout03 . - cp $nmmb_nems_4denvar_ges/wrf_inout06 . - cp $nmmb_nems_4denvar_ges/wrf_inout09 . - -cp $nmmb_nems_4denvar_ges/ndas.t00z.satbiaspc.tm03 ./satbias_pc -cp $nmmb_nems_4denvar_ges/ndas.t00z.satbiasc.tm03 ./satbias_in -cp $nmmb_nems_4denvar_ges/ndas.t00z.radstat.tm03 ./radstat.gdas - -listdiag=`tar xvf radstat.gdas | cut -d' ' -f2 | grep _ges` -for type in $listdiag; do - diag_file=`echo $type | cut -d',' -f1` - fname=`echo $diag_file | cut -d'.' -f1` - date=`echo $diag_file | cut -d'.' -f2` - $UNCOMPRESS $diag_file - fnameanl=$(echo $fname|sed 's/_ges//g') - mv $fname.$date $fnameanl -done - -cp $nmmb_nems_4denvar_ges/rtma2p5.t00z.w_rejectlist ./w_rejectlist -cp $nmmb_nems_4denvar_ges/rtma2p5.t00z.t_rejectlist ./t_rejectlist -cp $nmmb_nems_4denvar_ges/rtma2p5.t00z.p_rejectlist ./p_rejectlist -cp $nmmb_nems_4denvar_ges/rtma2p5.t00z.q_rejectlist ./q_rejectlist - -##### connect with gefs ensemble ################# -#gdate=`date +%Y%m%d%H -d "${adate:0:8} ${adate:8:2} - 6 hours"` -#cycg=`echo $gdate | cut -c9-10` -ls $nmmb_nems_4denvar_ges/sfg_2015060918_fhr06_ensmean > filelist06 -#typeset -Z2 nsum - nsum=1 - while [[ $nsum -lt 10 ]]; do - ls $nmmb_nems_4denvar_ges/sfg_2015060918_fhr06s_mem00$nsum >> filelist06 - nsum=`expr $nsum + 1` - done -ls $nmmb_nems_4denvar_ges/sfg_2015060918_fhr03_ensmean > filelist03 - nsum=1 - while [[ $nsum -lt 10 ]]; do - ls $nmmb_nems_4denvar_ges/sfg_2015060918_fhr03s_mem00$nsum >> filelist03 - nsum=`expr $nsum + 1` - done -ls $nmmb_nems_4denvar_ges/sfg_2015060918_fhr09_ensmean > filelist09 - nsum=1 - while [[ $nsum -lt 10 ]]; do - ls $nmmb_nems_4denvar_ges/sfg_2015060918_fhr09s_mem00$nsum >> filelist09 - nsum=`expr $nsum + 1` - done - - -##### connect with gdas for ozges ################ - cp $nmmb_nems_4denvar_ges/gdas1.t18z.sf06 ./gfs_sigf06 - -# Run GSI -cd $tmpdir -echo "run gsi now" -eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" -rc=$? -exit $rc diff --git a/regression/regression_driver.sh b/regression/regression_driver.sh index 08f0154819..e1d3b18dc7 100755 --- a/regression/regression_driver.sh +++ b/regression/regression_driver.sh @@ -5,6 +5,11 @@ set -x # regression test to launch export regtest=$1 +# option to set local values with a config file +if [ -d "$config_path" ]; then + source $config_path/local_vars.sh +fi + # source the necessary files to setup if [ "$#" -eq 2 ]; then export regdir=$2 @@ -42,7 +47,6 @@ for jn in `seq ${RSTART} ${REND}`; do $scripts/regression_wait.sh ${job[$jn]} ${rcname} $check_resource rc=$? if [ $rc -ne 0 ]; then - rm -f ${rcname} exit 1 fi done @@ -51,7 +55,7 @@ if [ "$debug" == ".false." ]; then export scripts=${scripts_updat:-$scripts} - if [ $regtest = 'global_enkf_T62' ]; then + if [ $regtest = 'global_enkf' ]; then /bin/sh $scripts/regression_test_enkf.sh ${job[1]} ${job[2]} ${job[3]} ${job[4]} ${tmpregdir} ${result} ${scaling[1]} ${scaling[2]} ${scaling[3]} else /bin/sh $scripts/regression_test.sh ${job[1]} ${job[2]} ${job[3]} ${job[4]} ${tmpregdir} ${result} ${scaling[1]} ${scaling[2]} ${scaling[3]} diff --git a/regression/regression_namelists.sh b/regression/regression_namelists.sh index 2d0e10f3df..824c6f0719 100755 --- a/regression/regression_namelists.sh +++ b/regression/regression_namelists.sh @@ -2,28 +2,39 @@ regtest=$1 case $regtest in - global_T62) + global_3dvar) # Define namelist for global run (pcgsoi minimization) export gsi_namelist=" &SETUP - miter=2,niter(1)=100,niter(2)=150, - niter_no_qc(1)=50,niter_no_qc(2)=0, + miter=2,niter(1)=5,niter(2)=10, + niter_no_qc(1)=2,niter_no_qc(2)=0, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=82,qoption=2,cwoption=3, - factqmin=5.0,factqmax=5.0,deltim=$DELTIM, + qoption=2, + gencode=0,factqmin=0.5,factqmax=0.0002,deltim=$DELTIM, iguess=-1, oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=12,gpstop=50., + use_pbl=.false.,use_compress=.true.,nsig_ext=45,gpstop=50., + commgpstop=45.,commgpserrinf=1.0, use_gfs_nemsio=.false.,lrun_subdirs=.true., + use_readin_anl_sfcmask=.true., + crtm_coeffs_path='./crtm_coeffs/', + newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., + diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,thin4d=.true.,cwoption=3, + verbose=.false.,imp_physics=11,lupp=.true., + binary_diag=.false.,netcdf_diag=.true., + lobsdiag_forenkf=.false., + nhr_anal=3,6,9,nhr_obsbin=3, + optconv=0.05,cao_check=.true.,ta2tb=.false., + tzr_qc=1,sfcnst_comb=.true., write_fv3_incr=.true.,incvars_to_zero= 'liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc',incvars_zero_strat='sphum_inc','liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc',incvars_efold=5, use_gfs_ncio=.true., $SETUP / &GRIDOPTS JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS + regional=.false., + $GRIDOPTS / &BKGERR vs=0.7, @@ -31,109 +42,143 @@ export gsi_namelist=" hswgt=0.45,0.3,0.25, bw=0.0,norsp=4, bkgv_flowdep=.true.,bkgv_rewgtfct=1.5, + bkgv_write=.false., + cwcoveqqcov=.false., $BKGVERR / &ANBKGERR anisotropic=.false., - $ANBKGERR + $ANBKGERR / &JCOPTS ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7, + ljc4tlevs=.true., $JCOPTS / &STRONGOPTS - tlnmc_option=1,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.true.,baldiag_inc=.true., + tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, + 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.,njqc=.false.,vqc=.true., + dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.04, + use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.false.,nvqc=.true.,hub_norm=.true., + aircraft_t_bc=.true.,biaspredt=1.0e5,upd_aircraft=.true.,cleanup_tail=.true., + tcp_width=70.0,tcp_ermax=7.35, $OBSQC / &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,time_window_max=3.0, + dmesh(1)=1450.0,dmesh(2)=1500.0,dmesh(3)=1000.0,dmesh(4)=500.0,time_window_max=3.0, $OBSINPUT / OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null l3rw 0.0 0 0 - l2rwbufr rw null l2rw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 1 - amsuabufr amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis_las f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis_uas f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis_img f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis_env f16 ssmis_f16 0.0 1 0 - gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 0 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 0 - iasibufr iasi metop-b iasi_metop-b 0.0 1 0 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 0 - atmsbufr atms n20 atms_n20 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 - mlsbufr mls30 aura mls30_aura 0.0 0 0 - oscatbufr uv null uv 0.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 - abibufr abi g16 abi_g16 0.0 1 0 - ahibufr ahi himawari8 ahi_himawari8 0.0 1 0 +! dfile dtype dplat dsis dval dthin dsfcalc + prepbufr ps null ps 0.0 0 0 + prepbufr t null t 0.0 0 0 + prepbufr_profl t null t 0.0 0 0 + hdobbufr t null t 0.0 0 0 + prepbufr q null q 0.0 0 0 + prepbufr_profl q null q 0.0 0 0 + hdobbufr q null q 0.0 0 0 + prepbufr pw null pw 0.0 0 0 + prepbufr uv null uv 0.0 0 0 + prepbufr_profl uv null uv 0.0 0 0 + satwndbufr uv null uv 0.0 0 0 + hdobbufr uv null uv 0.0 0 0 + prepbufr spd null spd 0.0 0 0 + hdobbufr spd null spd 0.0 0 0 + prepbufr dw null dw 0.0 0 0 + radarbufr rw null rw 0.0 0 0 + nsstbufr sst nsst sst 0.0 0 0 + gpsrobufr gps_bnd null gps 0.0 0 0 + sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 + sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 + sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 + hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 + hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 + gimgrbufr goes_img g11 imgr_g11 0.0 1 0 + gimgrbufr goes_img g12 imgr_g12 0.0 1 0 + airsbufr airs aqua airs_aqua 0.0 1 1 + amsuabufr amsua n15 amsua_n15 0.0 1 1 + amsuabufr amsua n18 amsua_n18 0.0 1 1 + amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 + airsbufr amsua aqua amsua_aqua 0.0 1 1 + amsubbufr amsub n17 amsub_n17 0.0 1 1 + mhsbufr mhs n18 mhs_n18 0.0 1 1 + mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 + ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 + amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 + amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 + amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 + ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 + ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 + ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 + gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 + gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 + gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 + gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 + gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 + gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 + gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 + gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 + gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 + gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 + gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 + gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 + iasibufr iasi metop-a iasi_metop-a 0.0 1 1 + gomebufr gome metop-a gome_metop-a 0.0 2 0 + omibufr omi aura omi_aura 0.0 2 0 + sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 + hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 + amsuabufr amsua n19 amsua_n19 0.0 1 1 + mhsbufr mhs n19 mhs_n19 0.0 1 1 + tcvitl tcp null tcp 0.0 0 0 + seviribufr seviri m08 seviri_m08 0.0 1 0 + seviribufr seviri m09 seviri_m09 0.0 1 0 + seviribufr seviri m10 seviri_m10 0.0 1 0 + seviribufr seviri m11 seviri_m11 0.0 1 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 1 + amsuabufr amsua metop-b amsua_metop-b 0.0 1 1 + mhsbufr mhs metop-b mhs_metop-b 0.0 1 1 + iasibufr iasi metop-b iasi_metop-b 0.0 1 1 + gomebufr gome metop-b gome_metop-b 0.0 2 0 + atmsbufr atms npp atms_npp 0.0 1 1 + atmsbufr atms n20 atms_n20 0.0 1 1 + crisbufr cris npp cris_npp 0.0 1 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 + crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 + gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 + gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 + gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 + gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 1 0 + gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 + gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 + gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 + 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 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 1 0 + saphirbufr saphir meghat saphir_meghat 0.0 3 0 + ahibufr ahi himawari8 ahi_himawari8 0.0 1 0 + abibufr abi g16 abi_g16 0.0 1 0 + abibufr abi g17 abi_g17 0.0 1 0 + rapidscatbufr uv null uv 0.0 0 0 + ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 + ompslpbufr ompslp npp ompslp_npp 0.0 0 0 + ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 + ompsnpbufr ompsnp n20 ompsnp_n20 0.0 0 0 + ompstcbufr ompstc8 n20 ompstc8_n20 0.0 2 0 + 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 abibufr abi g18 abi_g18 0.0 1 0 ahibufr ahi himawari9 ahi_himawari9 0.0 1 0 atmsbufr atms n21 atms_n21 0.0 1 1 @@ -144,127 +189,33 @@ OBS_INPUT:: gomebufr gome metop-c gome_metop-c 0.0 2 0 :: &SUPEROB_RADAR - $SUPERRAD + $SUPERRAD / - &LAG_DATA + &LAG_DATA + / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_GLOBAL}, - n_ens=${ENSEMBLE_SIZE_GLOBAL}, - uv_hyb_ens=${HYBENS_UV_GLOBAL}, - beta_s0=${BETA_S0_GLOBAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_GLOBAL}, - s_ens_v=${HYBENS_VER_SCALE_GLOBAL}, - generate_ens=${GENERATE_ENS_GLOBAL}, - aniso_a_en=${HYBENS_ANISO_GLOBAL}, - nlon_ens=${LONA}, - nlat_ens=${NLAT}, - jcap_ens=${JCAP}, - jcap_ens_test=${JCAP}, + &HYBRID_ENSEMBLE + $HYBRIDENSEMBLE / - &RAPIDREFRESH_CLDSURF + &RAPIDREFRESH_CLDSURF dfi_radar_latent_heat_time_period=30.0, + / - &CHEM + &CHEM + + / + &NST + nst_gsi=3,nstinfo=4,zsea1=0,zsea2=0,fac_dtl=1,fac_tsl=1, / &SINGLEOB_TEST maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${adate}, + oblat=5.,oblon=180.,obpres=850.,obdattim=2022110900, obhourset=0., - $SINGLEOB - / - &NST - / -" -;; - - global_T62_ozonly) - -# Define namelist for global run (ozone analysis) - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=100,niter(2)=150, - niter_no_qc(1)=999,niter_no_qc(2)=999, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=82,qoption=2, - print_diag_pcg=.true., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - vs=0.7, - hzscl=0.588,1.25,2.0, - hswgt=0.45,0.3,0.25, - bw=0.0,norsp=4, - bkgv_flowdep=.true.,bkgv_rewgtfct=1.5, - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - $JCOPTS - / - &STRONGOPTS - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02,blacklst=.true., - use_poq7=.true.,njqc=.false.,vqc=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=180.0,dmesh(2)=145.0,dmesh(3)=240.0,dmesh(4)=160.0,dmesh(5)=180.0,dmesh(6)=150.0,time_window_max=3.0, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - mlsbufr mls30 aura mls30_aura 0.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 - ompsnpbufr ompsnp n20 ompsnp_n20 0.0 0 0 - ompstcbufr ompstc8 n20 ompstc8_n20 0.0 2 0 - ompsnpbufr ompsnp n21 ompsnp_n21 0.0 0 0 - ompstcbufr ompstc8 n21 ompstc8_n21 0.0 2 0 - ompslpbufr ompslp npp ompslp_npp 0.0 0 0 - gomebufr gome metop-c gome_metop-c 0.0 2 0 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - / - &CHEM - / - &SINGLEOB_TEST - $SINGLEOB - / - &NST / " ;; - global_lanczos_T62) + global_lanczos) # Define namelist for global run (lanczos minimization) @@ -279,8 +230,9 @@ export gsi_namelist=" iguess=-1, oneobtest=.false.,retrieval=.false.,l_foto=.false., use_pbl=.false.,use_compress=.false.,nsig_ext=10,gpstop=30., + crtm_coeffs_path='./crtm_coeffs/', lsqrtb=.true.,lcongrad=.true.,ltlint=.true.,ladtest=.true.,lgrtest=.false., - use_gfs_nemsio=.false.,lrun_subdirs=.true., + use_gfs_nemsio=.false.,lrun_subdirs=.true.,use_gfs_ncio=.true., $SETUP / &GRIDOPTS @@ -310,7 +262,7 @@ export gsi_namelist=" $STRONGOPTS / &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, + dfact=0.75,dfact1=3.0,noiqc=.false.,oberrflg=.false.,c_varqc=0.02, use_poq7=.true.,njqc=.false.,vqc=.true., $OBSQC / @@ -426,6 +378,7 @@ OBS_INPUT:: &NST / " + ;; global_hybrid_T126) @@ -587,7 +540,7 @@ OBS_INPUT:: $LAGDATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=20,beta_s0=0.25,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.7,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, + l_hyb_ens=.true.,n_ens=$ENS_NUM_ANAL,beta_s0=0.25,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.7,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, nlat_ens=96,nlon_ens=192,ANISO_A_EN=.false.,jcap_ens_test=62,oz_univ_static=.true.,readin_localization=.true., write_ens_sprd=.false., $HYBRID_ENSEMBLE @@ -609,61 +562,77 @@ OBS_INPUT:: " ;; - global_4denvar_T126 ) + global_4denvar ) # Define namelist for global hybrid run -export gsi_namelist=" +export gsi_namelist=" &SETUP - miter=1,niter(1)=5,niter(2)=150, - niter_no_qc(1)=50,niter_no_qc(2)=0, - use_gfs_nemsio=.true., - l4densvar=.true.,ens_nstarthr=3,nhr_obsbin=1,lwrite4danl=.true., - tzr_qc=1, + miter=2,niter(1)=5,niter(2)=10, + niter_no_qc(1)=2,niter_no_qc(2)=0, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2,cwoption=3, - gencode=82,factqmin=0.1,factqmax=0.1,deltim=$DELTIM, + qoption=2, + gencode=0,factqmin=0.5,factqmax=0.0002,deltim=$DELTIM, iguess=-1, oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_prepb_satwnd=.false., - nhr_assimilation=6,lrun_subdirs=.true., + use_pbl=.false.,use_compress=.true.,nsig_ext=45,gpstop=50., + commgpstop=45.,commgpserrinf=1.0, + use_gfs_nemsio=.false.,lrun_subdirs=.true., + use_readin_anl_sfcmask=.true., + crtm_coeffs_path='./crtm_coeffs/', + newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., + diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,thin4d=.true.,cwoption=3, + verbose=.false.,imp_physics=11,lupp=.true., + binary_diag=.false.,netcdf_diag=.true., + lobsdiag_forenkf=.false., + nhr_anal=3,6,9,nhr_obsbin=1, + l4densvar=.true.,ens_nstarthr=3,nhr_assimilation=6,lwrite4danl=.true., + optconv=0.05,cao_check=.true.,ta2tb=.false., + tzr_qc=1,sfcnst_comb=.true., + write_fv3_incr=.true.,incvars_to_zero= 'liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc', + incvars_zero_strat='sphum_inc','liq_wat_inc','icmr_inc','rwmr_inc','snmr_inc','grle_inc',incvars_efold=5, use_gfs_ncio=.true., $SETUP / &GRIDOPTS - JCAP_B=$JCAP_B,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS + JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, + regional=.false., + $GRIDOPTS / &BKGERR + 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, bkgv_write=.false., + cwcoveqqcov=.false., $BKGVERR / &ANBKGERR anisotropic=.false., - $ANBKGERR + $ANBKGERR / &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=2.5e7,ljc4tlevs=.true., + ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7, + ljc4tlevs=.true., $JCOPTS / &STRONGOPTS tlnmc_option=3,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.true.,baldiag_inc=.true., + + 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.,njqc=.false.,vqc=.true.,aircraft_t_bc=.true.,biaspredt=1000.0,upd_aircraft=.true., + dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.04, + use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.false.,nvqc=.true.,hub_norm=.true., + aircraft_t_bc=.true.,biaspredt=1.0e5,upd_aircraft=.true.,cleanup_tail=.true., + tcp_width=70.0,tcp_ermax=7.35, $OBSQC / &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,time_window_max=3.0, + dmesh(1)=1450.0,dmesh(2)=1500.0,dmesh(3)=1000.0,dmesh(4)=500.0,time_window_max=3.0, $OBSINPUT / OBS_INPUT:: @@ -671,19 +640,21 @@ OBS_INPUT:: prepbufr ps null ps 0.0 0 0 prepbufr t null t 0.0 0 0 prepbufr_profl t null t 0.0 0 0 + hdobbufr t null t 0.0 0 0 prepbufr q null q 0.0 0 0 prepbufr_profl q null q 0.0 0 0 + hdobbufr q null q 0.0 0 0 prepbufr pw null pw 0.0 0 0 prepbufr uv null uv 0.0 0 0 prepbufr_profl uv null uv 0.0 0 0 satwndbufr uv null uv 0.0 0 0 + hdobbufr uv null uv 0.0 0 0 prepbufr spd null spd 0.0 0 0 + hdobbufr spd null spd 0.0 0 0 prepbufr dw null dw 0.0 0 0 radarbufr rw null rw 0.0 0 0 nsstbufr sst nsst sst 0.0 0 0 gpsrobufr gps_bnd null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 @@ -706,200 +677,6 @@ OBS_INPUT:: ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 - ssmisbufr ssmis f19 ssmis_f19 0.0 1 0 - gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 1 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 1 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 1 - iasibufr iasi metop-b iasi_metop-b 0.0 1 1 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 - gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 - gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 - gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - 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 - 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 - rapidscatbufr uv null uv 0.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 - abibufr abi g16 abi_g16 0.0 1 0 - ahibufr ahi himawari8 ahi_himawari8 0.0 1 0 - abibufr abi g18 abi_g18 0.0 1 0 - ahibufr ahi himawari9 ahi_himawari9 0.0 1 0 - atmsbufr atms n21 atms_n21 0.0 1 1 - crisfsbufr cris-fsr n21 cris-fsr_n21 0.0 1 0 - sstviirs viirs-m j2 viirs-m_j2 0.0 4 0 - ompsnpbufr ompsnp n21 ompsnp_n21 0.0 0 0 - ompstcbufr ompstc8 n21 ompstc8_n21 0.0 2 0 - gomebufr gome metop-c gome_metop-c 0.0 2 0 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - $LAGDATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=20,beta_s0=0.25,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.7,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, - nlat_ens=96,nlon_ens=192,ANISO_A_EN=.false.,jcap_ens_test=62,oz_univ_static=.true.,readin_localization=.true., - write_ens_sprd=.false., - $HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_4denvar_T670_adate}, - obhourset=0., - $SINGLEOB - / - &NST - nst_gsi=3,nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=5, - $NST - / -" -;; - - global_fv3_4denvar_T126 ) - -# Define namelist for global hybrid run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=5,niter(2)=5, - niter_no_qc(1)=2,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=82,factqmin=0.5,factqmax=0.005,deltim=1200, - iguess=-1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=12,gpstop=50., - use_gfs_nemsio=.true.,lrun_subdirs=.true.,use_readin_anl_sfcmask=.true., - newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., - diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,thin4d=.true.,cwoption=3, - verbose=.false.,imp_physics=11,lupp=.true.,binary_diag=.false.,netcdf_diag=.true., - l4densvar=.true.,ens_nstarthr=3,nhr_obsbin=1,nhr_assimilation=6,lwrite4danl=.false., tzr_qc=1,sfcnst_comb=.true., - $SETUP - / - &GRIDOPTS - JCAP_B=$JCAP_B,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - 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, - bkgv_write=.false., - cwcoveqqcov=.false., - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=2.5e7,ljc4tlevs=.true., - $JCOPTS - / - &STRONGOPTS - tlnmc_option=3,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.false.,baldiag_inc=.false., - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.04, - use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.true., - aircraft_t_bc=.true.,biaspredt=1000.0,upd_aircraft=.true.,cleanup_tail=.true. - $OBSQC - / - &OBS_INPUT - dmesh(1)=1450.0,dmesh(2)=1500.0,dmesh(3)=1000.0,time_window_max=3.0, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr_profl t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr_profl q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr_profl uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - nsstbufr sst nsst sst 0.0 0 0 - gpsrobufr gps_bnd null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 1 - amsuabufr amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 - ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 - ssmisbufr ssmis f19 ssmis_f19 0.0 1 0 gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 @@ -944,14 +721,28 @@ 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-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 + gmibufr gmi gpm gmi_gpm 0.0 1 0 saphirbufr saphir meghat saphir_meghat 0.0 3 0 - abibufr abi g16 abi_g16 0.0 1 0 ahibufr ahi himawari8 ahi_himawari8 0.0 1 0 + abibufr abi g16 abi_g16 0.0 1 0 + abibufr abi g17 abi_g17 0.0 1 0 rapidscatbufr uv null uv 0.0 0 0 + ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 + ompslpbufr ompslp npp ompslp_npp 0.0 0 0 + ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 + ompsnpbufr ompsnp n20 ompsnp_n20 0.0 0 0 + ompstcbufr ompstc8 n20 ompstc8_n20 0.0 2 0 + 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 abibufr abi g18 abi_g18 0.0 1 0 ahibufr ahi himawari9 ahi_himawari9 0.0 1 0 atmsbufr atms n21 atms_n21 0.0 1 1 @@ -962,32 +753,32 @@ OBS_INPUT:: gomebufr gome metop-c gome_metop-c 0.0 2 0 :: &SUPEROB_RADAR - $SUPERRAD + $SUPERRAD / - &LAG_DATA - $LAGDATA + &LAG_DATA + / - &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=20,beta_s0=0.125,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.8,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, - nlat_ens=96,nlon_ens=192,ANISO_A_EN=.false.,jcap_ens_test=62,oz_univ_static=.false.,readin_localization=.true.,ensemble_path='./ensemble_data/', - ens_fast_read=.true.,write_ens_sprd=.false., + &HYBRID_ENSEMBLE + l_hyb_ens=.true.,n_ens=$NMEM_ENKF,beta_s0=0.125,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.8, + generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=48,nlat_ens=98,nlon_ens=192, + ANISO_A_EN=.false.,jcap_ens_test=48,oz_univ_static=.false.,readin_localization=.true., + ensemble_path='./ensemble_data/',ens_fast_read=.true.,write_ens_sprd=.false., $HYBRID_ENSEMBLE / - &RAPIDREFRESH_CLDSURF + &RAPIDREFRESH_CLDSURF dfi_radar_latent_heat_time_period=30.0, + / - &CHEM - + &CHEM + + / + &NST + nst_gsi=3,nstinfo=4,zsea1=0,zsea2=0,fac_dtl=1,fac_tsl=1, / &SINGLEOB_TEST maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_4denvar_T670_adate}, + oblat=5.,oblon=180.,obpres=850.,obdattim=2022110900, obhourset=0., - $SINGLEOB - / - &NST - nst_gsi=3,nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=0, - $NST / " ;; @@ -1541,469 +1332,25 @@ OBS_INPUT:: amsrebufr amsre_low aqua amsre_aqua 0.0 4 1 amsrebufr amsre_mid aqua amsre_aqua 0.0 4 1 amsrebufr amsre_hig aqua amsre_aqua 0.0 4 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 4 1 - gsnd1bufr sndrd1 g12 sndrD1_g12 1.5 5 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 1.5 5 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 1.5 5 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 1.5 5 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 1.5 5 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 1.5 5 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 1.5 5 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 1.5 5 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 1.5 5 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 1.5 5 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 1.5 5 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 1.5 5 0 - iasibufr iasi metop-a iasi_metop-a 20.0 1 1 - gomebufr gome metop-a gome_metop-a 1.0 6 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - oscatbufr uv null uv 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 1.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 1.0 6 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - / - &NST - / -" -;; - - nmm_binary) - -# Define namelist for nmm binary run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=50,niter(2)=50, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.true.,wrf_mass_regional=.false.,diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=$NETCDF, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - / - &ANBKGERR - anisotropic=.false.,an_vs=1.0,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, - / - &JCOPTS - / - &STRONGOPTS - nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 1.0 0 0 - prepbufr t null t 1.0 0 0 - prepbufr q null q 1.0 0 0 - prepbufr uv null uv 1.0 0 0 - satwndbufr uv null uv 1.0 0 0 - prepbufr spd null spd 1.0 0 0 - radarbufr rw null l3rw 1.0 0 0 - l2rwbufr rw null l2rw 1.0 0 0 - prepbufr dw null dw 1.0 0 0 - prepbufr sst null sst 1.0 0 0 - prepbufr pw null pw 1.0 0 0 - gpsrobufr $gps_dtype null gps 1.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 1.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 1.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 1.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 1.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 1.0 0 0 - omi omi aura omi_aura 1.0 6 0 - hirs2bufr hirs2 n14 hirs2_n14 6.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 6.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 20.0 1 1 - msubufr msu n14 msu_n14 2.0 2 1 - amsuabufr amsua n15 amsua_n15 10.0 2 1 - amsuabufr amsua n16 amsua_n16 0.0 2 1 - amsuabufr amsua n17 amsua_n17 0.0 2 1 - amsuabufr amsua n18 amsua_n18 10.0 2 1 - amsuabufr amsua metop-a amsua_metop-a 10.0 2 1 - airsbufr amsua aqua amsua_aqua 5.0 2 1 - amsubbufr amsub n15 amsub_n15 3.0 3 1 - amsubbufr amsub n16 amsub_n16 3.0 3 1 - amsubbufr amsub n17 amsub_n17 3.0 3 1 - mhsbufr mhs n18 mhs_n18 3.0 3 1 - mhsbufr mhs metop-a mhs_metop-a 3.0 3 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 4 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 4 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 4 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 4 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 4 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 4 1 - gsnd1bufr sndrd1 g12 sndrD1_g12 1.5 5 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 1.5 5 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 1.5 5 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 1.5 5 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 1.5 5 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 1.5 5 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 1.5 5 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 1.5 5 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 1.5 5 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 1.5 5 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 1.5 5 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 1.5 5 0 - iasibufr iasi metop-a iasi_metop-a 20.0 1 1 - gomebufr gome metop-a gome_metop-a 1.0 6 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - oscatbufr uv null uv 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 1.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 1.0 6 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - / - &NST - / -" -;; - - nmm_netcdf) - -# Define namelist for nmm netcdf run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=50,niter(2)=50, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.true.,wrf_mass_regional=.false.,diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=$NETCDF, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - / - &ANBKGERR - anisotropic=.false.,an_vs=1.0,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, - / - &JCOPTS - / - &STRONGOPTS - nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 1.0 0 0 - prepbufr t null t 1.0 0 0 - prepbufr q null q 1.0 0 0 - prepbufr uv null uv 1.0 0 0 - satwndbufr uv null uv 1.0 0 0 - prepbufr spd null spd 1.0 0 0 - radarbufr rw null l3rw 1.0 0 0 - l2rwbufr rw null l2rw 1.0 0 0 - prepbufr dw null dw 1.0 0 0 - prepbufr sst null sst 1.0 0 0 - prepbufr pw null pw 1.0 0 0 - gpsrobufr $gps_dtype null gps 1.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 1.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 1.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 1.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 1.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 1.0 0 0 - omi omi aura omi_aura 1.0 6 0 - hirs2bufr hirs2 n14 hirs2_n14 6.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 6.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 6.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 20.0 1 1 - msubufr msu n14 msu_n14 2.0 2 1 - amsuabufr amsua n15 amsua_n15 10.0 2 1 - amsuabufr amsua n16 amsua_n16 0.0 2 1 - amsuabufr amsua n17 amsua_n17 0.0 2 1 - amsuabufr amsua n18 amsua_n18 10.0 2 1 - amsuabufr amsua metop-a amsua_metop-a 10.0 2 1 - airsbufr amsua aqua amsua_aqua 5.0 2 1 - amsubbufr amsub n15 amsub_n15 3.0 3 1 - amsubbufr amsub n16 amsub_n16 3.0 3 1 - amsubbufr amsub n17 amsub_n17 3.0 3 1 - mhsbufr mhs n18 mhs_n18 3.0 3 1 - mhsbufr mhs metop-a mhs_metop-a 3.0 3 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 4 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 4 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 4 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 4 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 4 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 4 1 - gsnd1bufr sndrd1 g12 sndrD1_g12 1.5 5 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 1.5 5 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 1.5 5 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 1.5 5 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 1.5 5 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 1.5 5 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 1.5 5 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 1.5 5 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 1.5 5 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 1.5 5 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 1.5 5 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 1.5 5 0 - iasibufr iasi metop-a iasi_metop-a 20.0 1 1 - gomebufr gome metop-a gome_metop-a 1.0 6 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - oscatbufr uv null uv 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 1.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 1.0 6 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - / - &NST - / -" -;; - - netcdf_fv3_regional) - -# Define namelist for netcdf fv3 run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=50,niter(2)=50,niter_no_qc(1)=20, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - newpc4pred=.true., adp_anglebc=.true., angord=4, - diag_precon=.true., step_start=1.e-3, - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - fv3_regional=.true.,grid_ratio_fv3_regional=3.0, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=0.6,bw=0.,fstat=.false., - / - &ANBKGERR - anisotropic=.false., - / - &JCOPTS - / - &STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02, - vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5,ext_sonde=.true., - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - gpsrobufr gps_bnd null gps_bnd 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 0 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 0 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs281_aqua 0.0 1 0 - msubufr msu n14 msu_n14 0.0 1 0 - amsuabufr amsua n15 amsua_n15 0.0 1 0 - amsuabufr amsua n16 amsua_n16 0.0 1 0 - amsuabufr amsua n17 amsua_n17 0.0 1 0 - amsuabufr amsua n18 amsua_n18 0.0 1 0 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 0 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 0 - airsbufr amsua aqua amsua_aqua 0.0 1 0 - amsubbufr amsub n15 amsub_n15 0.0 1 0 - amsubbufr amsub n16 amsub_n16 0.0 1 0 - amsubbufr amsub n17 amsub_n17 0.0 1 0 - mhsbufr mhs n18 mhs_n18 0.0 1 0 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 0 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 0 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f14 ssmi_f14 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 0 - gomebufr gome metop-a gome_metop-a 0.0 1 0 - iasibufr iasi metop-b iasi_metop-b 0.0 1 0 - omibufr omi aura omi_aura 0.0 1 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 1 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 0 - amsuabufr amsua n19 amsua_n19 0.0 1 0 - mhsbufr mhs n19 mhs_n19 0.0 1 0 - tcvitl tcp null tcp 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - atmsbufr atms npp atms_npp 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 - prepbufr mta_cld null mta_cld 1.0 0 0 - prepbufr gos_ctp null gos_ctp 1.0 0 0 - lgycldbufr larccld null larccld 1.0 0 0 + ssmisbufr ssmis f16 ssmis_f16 0.0 4 1 + gsnd1bufr sndrd1 g12 sndrD1_g12 1.5 5 0 + gsnd1bufr sndrd2 g12 sndrD2_g12 1.5 5 0 + gsnd1bufr sndrd3 g12 sndrD3_g12 1.5 5 0 + gsnd1bufr sndrd4 g12 sndrD4_g12 1.5 5 0 + gsnd1bufr sndrd1 g11 sndrD1_g11 1.5 5 0 + gsnd1bufr sndrd2 g11 sndrD2_g11 1.5 5 0 + gsnd1bufr sndrd3 g11 sndrD3_g11 1.5 5 0 + gsnd1bufr sndrd4 g11 sndrD4_g11 1.5 5 0 + gsnd1bufr sndrd1 g13 sndrD1_g13 1.5 5 0 + gsnd1bufr sndrd2 g13 sndrD2_g13 1.5 5 0 + gsnd1bufr sndrd3 g13 sndrD3_g13 1.5 5 0 + gsnd1bufr sndrd4 g13 sndrD4_g13 1.5 5 0 + iasibufr iasi metop-a iasi_metop-a 20.0 1 1 + gomebufr gome metop-a gome_metop-a 1.0 6 0 + mlsbufr mls30 aura mls30_aura 1.0 0 0 + oscatbufr uv null uv 1.0 0 0 + ompsnpbufr ompsnp npp ompsnp_npp 1.0 0 0 + ompstcbufr ompstc8 npp ompstc8_npp 1.0 6 0 :: &SUPEROB_RADAR del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., @@ -2012,6 +1359,19 @@ OBS_INPUT:: &LAG_DATA / &HYBRID_ENSEMBLE + l_hyb_ens=${HYBENS_REGIONAL}, + n_ens=${ENSEMBLE_SIZE_REGIONAL}, + uv_hyb_ens=${HYBENS_UV_REGIONAL}, + beta_s0=${BETA_S0_REGIONAL}, + readin_beta=.false., + s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, + s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, + generate_ens=${GENERATE_ENS_REGIONAL}, + aniso_a_en=${HYBENS_ANISO_REGIONAL}, + nlon_ens=${NLON_ENS_REGIONAL}, + nlat_ens=${NLAT_ENS_REGIONAL}, + jcap_ens=${JCAP_ENS_REGIONAL}, + jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, / &RAPIDREFRESH_CLDSURF dfi_radar_latent_heat_time_period=30.0, @@ -2019,218 +1379,257 @@ OBS_INPUT:: &CHEM / &SINGLEOB_TEST + maginnov=0.1,magoberr=0.1,oneob_type='t', + oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, + obhourset=0., / &NST / " ;; - nems_nmmb) -# Define namelist for nems nmmb run + rrfs_3denvar_glbens) + +# Define namelist for rrfs 3d hybrid envar run with global ensembles export gsi_namelist=" &SETUP - miter=2,niter(1)=50,niter(2)=50,niter_no_qc(1)=20, + miter=2,niter(1)=25,niter(2)=25, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, + qoption=2,print_obs_para=.true.,diag_radardbz=.false., + if_model_dbz=.false., static_gsi_nopcp_dbz=0.0, + rmesh_dbz=4.0,rmesh_vr=4.0,zmesh_dbz=1000.0,zmesh_vr=1000.0, + missing_to_nopcp=.false.,radar_no_thinning=.true., + gencode=78,factqmin=0.0,factqmax=0.0, iguess=-1, + lread_obs_save=.false.,lread_obs_skip=.false., oneobtest=.false.,retrieval=.false., nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30.,preserve_restart_date=.true., - use_gfs_ozone=.true.,check_gfs_ozone_date=.true.,regional_ozone=.true., - lrun_subdirs=.true., - $SETUP + use_pbl=.false.,use_prepb_satwnd=.false., + newpc4pred=.true.,adp_anglebc=.true.,angord=4, + passive_bc=.true.,use_edges=.false.,emiss_bc=.true., + diag_precon=.true.,step_start=1.e-3, + l4densvar=.false.,nhr_obsbin=3, + use_gfs_nemsio=.false.,use_gfs_ncio=.true.,reset_bad_radbc=.true., + netcdf_diag=.false.,binary_diag=.true., + l_obsprvdiag=.false., / &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.false.,wrf_mass_regional=.false.,nems_nmmb_regional=.true.,diagnostic_reg=.false., - nmmb_reference_grid='H',grid_ratio_nmmb=1.412, - filled_grid=.false.,half_grid=.true.,netcdf=.false., + fv3_regional=.true.,grid_ratio_fv3_regional=2.0,nvege_type=20, + fv3_io_layout_y=1, / &BKGERR - hzscl=0.373,0.746,1.50, - vs=0.6,bw=0.,fstat=.false., - / + vs=1.0, + hzscl=0.7,1.4,2.80, + bw=0.,fstat=.true., + usenewgfsberror=.true., +/ &ANBKGERR anisotropic=.false., / &JCOPTS / &STRONGOPTS - nstrong=0,nvmodes_keep=8,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., / &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02, - vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., + dfact=0.75,dfact1=3.0,noiqc=.false.,c_varqc=0.02,vadfile='prepbufr', + vadwnd_l2rw_qc=.true., / &OBS_INPUT - dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5,ext_sonde=.true., + dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=30,time_window_max=1.5,time_window_rad=1.0,ext_sonde=.true., / OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 1.0 0 0 - prepbufr t null t 1.0 0 0 - prepbufr q null q 1.0 0 0 - prepbufr pw null pw 1.0 0 0 - satwndbufr uv null uv 1.0 0 0 - prepbufr uv null uv 1.0 0 0 - prepbufr spd null spd 1.0 0 0 - prepbufr dw null dw 1.0 0 0 - radarbufr rw null l3rw 1.0 0 0 - l2rwbufr rw null l2rw 1.0 0 0 - prepbufr sst null sst 1.0 0 0 - gpsrobufr $gps_dtype null gps 1.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 1.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 1.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 1.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 1.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 1.0 0 0 - hirs2bufr hirs2 n14 hirs2_n14 6.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 6.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 6.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 20.0 1 1 - msubufr msu n14 msu_n14 2.0 2 1 - amsuabufr amsua n15 amsua_n15 10.0 2 1 - amsuabufr amsua n16 amsua_n16 0.0 2 1 - amsuabufr amsua n17 amsua_n17 0.0 2 1 - amsuabufr amsua n18 amsua_n18 10.0 2 1 - amsuabufr amsua metop-a amsua_metop-a 10.0 2 1 - airsbufr amsua aqua amsua_aqua 5.0 2 1 - amsubbufr amsub n15 amsub_n15 3.0 3 1 - amsubbufr amsub n16 amsub_n16 3.0 3 1 - amsubbufr amsub n17 amsub_n17 3.0 3 1 - mhsbufr mhs n18 mhs_n18 3.0 3 1 - mhsbufr mhs metop-a mhs_metop-a 3.0 3 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 4 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 4 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 4 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 4 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 4 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 4 1 - gsnd1bufr sndrd1 g12 sndrD1_g12 1.5 5 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 1.5 5 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 1.5 5 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 1.5 5 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 1.5 5 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 1.5 5 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 1.5 5 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 1.5 5 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 1.5 5 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 1.5 5 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 1.5 5 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 1.5 5 0 - iasibufr iasi metop-a iasi_metop-a 20.0 1 1 - gomebufr gome metop-a gome_metop-a 1.0 6 0 - omibufr omi aura omi_aura 1.0 6 0 - sbuvbufr sbuv2 n19 sbuv8_n19 1.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 6.0 1 1 - amsuabufr amsua n19 amsua_n19 10.0 2 1 - mhsbufr mhs n19 mhs_n19 3.0 3 1 - tcvitl tcp null tcp 1.0 0 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - oscatbufr uv null uv 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 1.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 1.0 6 0 +! dfile dtype dplat dsis dval dthin dsfcalc + dbzobs.nc dbz null dbz 1.0 0 0 + prepbufr ps null ps 1.0 0 0 + prepbufr t null t 1.0 0 0 + prepbufr q null q 1.0 0 0 + prepbufr pw null pw 1.0 0 0 + satwndbufr uv null uv 1.0 0 0 + prepbufr uv null uv 1.0 0 0 + prepbufr spd null spd 1.0 0 0 + prepbufr dw null dw 1.0 0 0 + l2rwbufr rw null l2rw 1.0 0 0 + prepbufr sst null sst 1.0 0 0 + gpsrobufr gps_ref null gps 1.0 0 0 + ssmirrbufr pcp_ssmi dmsp pcp_ssmi 1.0 -1 0 + tmirrbufr pcp_tmi trmm pcp_tmi 1.0 -1 0 + sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 + sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 + sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 + hirs3bufr hirs3 n16 hirs3_n16 0.0 1 0 + hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 + hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 2 0 + hirs4bufr hirs4 n18 hirs4_n18 0.0 1 0 + hirs4bufr hirs4 n19 hirs4_n19 0.0 2 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 2 0 + gimgrbufr goes_img g11 imgr_g11 0.0 1 0 + gimgrbufr goes_img g12 imgr_g12 0.0 1 0 + airsbufr airs aqua airs_aqua 0.0 2 0 + amsuabufr amsua n15 amsua_n15 0.0 2 0 + amsuabufr amsua n18 amsua_n18 0.0 2 0 + amsuabufr amsua n19 amsua_n19 0.0 2 0 + amsuabufr amsua metop-a amsua_metop-a 0.0 2 0 + amsuabufr amsua metop-b amsua_metop-b 0.0 2 0 + airsbufr amsua aqua amsua_aqua 0.0 2 0 + amsubbufr amsub n17 amsub_n17 0.0 1 0 + mhsbufr mhs n18 mhs_n18 0.0 2 0 + mhsbufr mhs n19 mhs_n19 0.0 2 0 + mhsbufr mhs metop-a mhs_metop-a 0.0 2 0 + mhsbufr mhs metop-b mhs_metop-b 0.0 2 0 + ssmitbufr ssmi f13 ssmi_f13 0.0 2 0 + ssmitbufr ssmi f14 ssmi_f14 0.0 2 0 + ssmitbufr ssmi f15 ssmi_f15 0.0 2 0 + amsrebufr amsre_low aqua amsre_aqua 0.0 2 0 + amsrebufr amsre_mid aqua amsre_aqua 0.0 2 0 + amsrebufr amsre_hig aqua amsre_aqua 0.0 2 0 + ssmisbufr ssmis f16 ssmis_f16 0.0 2 0 + ssmisbufr ssmis f17 ssmis_f17 0.0 2 0 + ssmisbufr ssmis f18 ssmis_f18 0.0 2 0 + ssmisbufr ssmis f19 ssmis_f19 0.0 2 0 + gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 + gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 + gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 + gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 + gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 + gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 + gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 + gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 + gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 + gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 + gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 + gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 + gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 2 0 + gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 2 0 + gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 2 0 + gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 2 0 + iasibufr iasi metop-a iasi_metop-a 0.0 2 0 + gomebufr gome metop-a gome_metop-a 0.0 2 0 + atmsbufr atms npp atms_npp 0.0 2 0 + atmsbufr atms n20 atms_n20 0.0 2 0 + crisbufr cris npp cris_npp 0.0 2 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 2 0 + crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 2 0 + abibufr abi g16 abi_g16 0.0 2 0 + mlsbufr mls30 aura mls30_aura 0.0 0 0 + oscatbufr uv null uv 0.0 0 0 + prepbufr mta_cld null mta_cld 1.0 0 0 + prepbufr gos_ctp null gos_ctp 1.0 0 0 + refInGSI rad_ref null rad_ref 1.0 0 0 + lghtInGSI lghtn null lghtn 1.0 0 0 + larcInGSI larccld null larccld 1.0 0 0 :: &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., + del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., l2superob_only=.false., / &LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - full_ensemble=.true.,pwgtflg=.true., + l_hyb_ens=${ifhyb}, + uv_hyb_ens=.true., + q_hyb_ens=.false., + aniso_a_en=.false.,generate_ens=.false., + n_ens=${nummem}, + beta_s0=0.15,s_ens_h=110,s_ens_v=3, + regional_ensemble_option=1, + pseudo_hybens = .false., + grid_ratio_ens = 3, + l_ens_in_diff_time=.true., + ensemble_path='', + i_en_perts_io=1, + jcap_ens=574, + fv3sar_bg_opt=0, + readin_localization=.true., + ens_fast_read=.false., / &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, + dfi_radar_latent_heat_time_period=20.0, + metar_impact_radius=10.0, + metar_impact_radius_lowCloud=4.0, + l_gsd_terrain_match_surfTobs=.true., + l_sfcobserror_ramp_t=.true., + l_sfcobserror_ramp_q=.true., + l_PBL_pseudo_SurfobsT=.false., + l_PBL_pseudo_SurfobsQ=.false., + l_PBL_pseudo_SurfobsUV=.false., + pblH_ration=0.4, + pps_press_incr=40.0, + l_gsd_limit_ocean_q=.true., + l_pw_hgt_adjust=.true., + l_limit_pw_innov=.true., + max_innov_pct=0.1, + l_cleanSnow_WarmTs=.true., + r_cleanSnow_WarmTs_threshold=5.0, + l_conserve_thetaV=.true., + i_conserve_thetaV_iternum=3, + l_gsd_soilTQ_nudge=.false., + l_cld_bld=.true., + l_numconc=.true., + l_closeobs=.true., + cld_bld_hgt=1200.0, + build_cloud_frac_p=0.50, + clear_cloud_frac_p=0.10, + iclean_hydro_withRef_allcol=1, + i_use_2mQ4B=2, + i_use_2mT4B=1, + i_gsdcldanal_type=0, + i_gsdsfc_uselist=1, + i_lightpcp=1, + i_sfct_gross=1, + i_coastline=3, + i_gsdqc=2, / &CHEM / + &NST + / &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, + maginnov=1.0,magoberr=0.8,oneob_type='t', + oblat=38.,oblon=279.,obpres=500.,obdattim=2020040500, obhourset=0., / - &NST - / " ;; + netcdf_fv3_regional) - nems_nmmb_4denvar) - -# Define namelist for 4DEnVar nems nmmb run +# Define namelist for netcdf fv3 run export gsi_namelist=" &SETUP miter=2,niter(1)=50,niter(2)=50,niter_no_qc(1)=20, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0, - iguess=-1,use_gfs_ozone=.true., - oneobtest=.false.,retrieval=.false., - nhr_assimilation=6,l_foto=.false., - use_pbl=.false.,gpstop=30., - print_diag_pcg=.true., + qoption=2, + factqmin=0.0,factqmax=0.0,deltim=$DELTIM, + iguess=-1, newpc4pred=.true., adp_anglebc=.true., angord=4, - passive_bc=.false., use_edges=.false., emiss_bc=.true., diag_precon=.true., step_start=1.e-3, - l4densvar=.true.,nhr_obsbin=3,ens_nstarthr=3, + nhr_assimilation=3,l_foto=.false., + use_pbl=.false.,use_compress=.false.,gpstop=30., + lrun_subdirs=.true., $SETUP / &GRIDOPTS - wrf_nmm_regional=.false.,wrf_mass_regional=.false.,nems_nmmb_regional=.true.,diagnostic_reg=.false., - nmmb_reference_grid='H',grid_ratio_nmmb=3.0, - filled_grid=.false.,half_grid=.false.,netcdf=.false., - $GRIDOPTS + fv3_regional=.true.,grid_ratio_fv3_regional=3.0, / &BKGERR hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - $BKGERR + vs=0.6,bw=0.,fstat=.false., / &ANBKGERR anisotropic=.false., - $ANBKGERR / &JCOPTS - $JCOPTS / &STRONGOPTS - nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - $STRONGOPTS / &OBSQC dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02, vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., - $OBSQC / &OBS_INPUT - dmesh(1)=120.0,time_window_max=3.0,ext_sonde=.true., - $OBS_INPUT + dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5,ext_sonde=.true., / OBS_INPUT:: ! dfile dtype dplat dsis dval dthin dsfcalc @@ -2241,8 +1640,7 @@ OBS_INPUT:: prepbufr uv null uv 0.0 0 0 prepbufr spd null spd 0.0 0 0 prepbufr dw null dw 0.0 0 0 - radarbufr rw null l3rw 0.0 0 0 - l2rwbufr rw null l2rw 0.0 0 0 + radarbufr rw null rw 0.0 0 0 prepbufr sst null sst 0.0 0 0 gpsrobufr gps_bnd null gps_bnd 0.0 0 0 ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 @@ -2255,43 +1653,36 @@ OBS_INPUT:: hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 hirs4bufr hirs4 n18 hirs4_n18 0.0 1 0 hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 gsndrbufr sndr g11 sndr_g11 0.0 1 0 gsndrbufr sndr g12 sndr_g12 0.0 1 0 gimgrbufr goes_img g11 imgr_g11 0.0 1 0 gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 0 + airsbufr airs aqua airs281_aqua 0.0 1 0 msubufr msu n14 msu_n14 0.0 1 0 amsuabufr amsua n15 amsua_n15 0.0 1 0 amsuabufr amsua n16 amsua_n16 0.0 1 0 amsuabufr amsua n17 amsua_n17 0.0 1 0 amsuabufr amsua n18 amsua_n18 0.0 1 0 amsuabufr amsua metop-a amsua_metop-a 0.0 1 0 + amsuabufr amsua metop-b amsua_metop-b 0.0 1 0 airsbufr amsua aqua amsua_aqua 0.0 1 0 amsubbufr amsub n15 amsub_n15 0.0 1 0 amsubbufr amsub n16 amsub_n16 0.0 1 0 amsubbufr amsub n17 amsub_n17 0.0 1 0 mhsbufr mhs n18 mhs_n18 0.0 1 0 mhsbufr mhs metop-a mhs_metop-a 0.0 1 0 + mhsbufr mhs metop-b mhs_metop-b 0.0 1 0 ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 + ssmitbufr ssmi f14 ssmi_f14 0.0 1 0 ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 iasibufr iasi metop-a iasi_metop-a 0.0 1 0 gomebufr gome metop-a gome_metop-a 0.0 1 0 + iasibufr iasi metop-b iasi_metop-b 0.0 1 0 omibufr omi aura omi_aura 0.0 1 0 sbuvbufr sbuv2 n19 sbuv8_n19 0.0 1 0 hirs4bufr hirs4 n19 hirs4_n19 0.0 1 0 @@ -2299,50 +1690,35 @@ OBS_INPUT:: mhsbufr mhs n19 mhs_n19 0.0 1 0 tcvitl tcp null tcp 0.0 0 0 satwndbufr uv null uv 0.0 0 0 + atmsbufr atms npp atms_npp 0.0 1 0 + crisbufr cris npp cris_npp 0.0 1 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 + seviribufr seviri m08 seviri_m08 0.0 1 0 + seviribufr seviri m09 seviri_m09 0.0 1 0 + seviribufr seviri m10 seviri_m10 0.0 1 0 + seviribufr seviri m11 seviri_m11 0.0 1 0 gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 1 0 + prepbufr mta_cld null mta_cld 1.0 0 0 + prepbufr gos_ctp null gos_ctp 1.0 0 0 + lgycldbufr larccld null larccld 1.0 0 0 :: &SUPEROB_RADAR del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., l2superob_only=.false., - $SUPEROB_RADAR / &LAG_DATA - $LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true., - readin_beta=.true., - n_ens=10, - uv_hyb_ens=.true., - beta_s0=0.25, - s_ens_h=800, - s_ens_v=5, - generate_ens=.false., - regional_ensemble_option=1, - aniso_a_en=.false., - nlon_ens=0, - nlat_ens=0, - jcap_ens=0, - jcap_ens_test=0, - full_ensemble=.true.,pwgtflg=.true., - $HYBRID_ENSEMBLE / &RAPIDREFRESH_CLDSURF - $RAPIDREFRESH_CLDSURF + dfi_radar_latent_heat_time_period=30.0, / &CHEM - $CHEM / &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=2015031300, - obhourset=0., - $SINGLEOB_TEST / &NST / @@ -2578,7 +1954,7 @@ OBS_INPUT:: &LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=80,uv_hyb_ens=.true.,beta_s0=0.2, + l_hyb_ens=.true.,n_ens=10,uv_hyb_ens=.true.,beta_s0=0.2, readin_beta=.true., s_ens_h=300,s_ens_v=-0.5,readin_localization=.false., generate_ens=.false.,regional_ensemble_option=1,grid_ratio_ens=1, @@ -2747,7 +2123,7 @@ OBS_INPUT:: &LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=80,uv_hyb_ens=.true.,beta_s0=0.2, + l_hyb_ens=.true.,n_ens=10,uv_hyb_ens=.true.,beta_s0=0.2, readin_beta=.true., s_ens_h=150,s_ens_v=-0.5,readin_localization=.false., generate_ens=.false.,regional_ensemble_option=1,grid_ratio_ens=1, @@ -2770,94 +2146,119 @@ OBS_INPUT:: " ;; - global_enkf_T62) + global_enkf) # Define namelist for global enkf run export gsi_namelist=" &nam_enkf - datestring=${adate},datapath='${DATA}/', - analpertwtnh=0.85,analpertwtsh=0.85,analpertwttr=0.85, + datestring=${global_adate},datapath='${DATA}/', + analpertwtnh=${analpertwt},analpertwtsh=${analpertwt},analpertwttr=${analpertwt}, covinflatemax=1.e2,covinflatemin=1,pseudo_rh=.true.,iassim_order=0, - corrlengthnh=2000,corrlengthsh=2000,corrlengthtr=2000, - lnsigcutoffnh=2.0,lnsigcutoffsh=2.0,lnsigcutofftr=2.0, - lnsigcutoffpsnh=2.0,lnsigcutoffpssh=2.0,lnsigcutoffpstr=2.0, - lnsigcutoffsatnh=2.0,lnsigcutoffsatsh=2.0,lnsigcutoffsattr=2.0, + corrlengthnh=${corrlength},corrlengthsh=${corrlength},corrlengthtr=${corrlength}, + lnsigcutoffnh=${lnsigcutoff},lnsigcutoffsh=${lnsigcutoff},lnsigcutofftr=${lnsigcutoff}, + lnsigcutoffpsnh=${lnsigcutoff},lnsigcutoffpssh=${lnsigcutoff},lnsigcutoffpstr=${lnsigcutoff}, + lnsigcutoffsatnh=${lnsigcutoff},lnsigcutoffsatsh=${lnsigcutoff},lnsigcutoffsattr=${lnsigcutoff}, obtimelnh=1.e30,obtimelsh=1.e30,obtimeltr=1.e30, - saterrfact=1.0,numiter=1, + saterrfact=1.0,numiter=0, sprd_tol=1.e30,paoverpb_thresh=0.98, nlons=$LONA,nlats=$LATA,nlevs=$LEVS,nanals=$NMEM_ENKF, - deterministic=.true.,sortinc=.true.,lupd_satbiasc=$lupd_satbiasc, + deterministic=.true.,sortinc=.true.,lupd_satbiasc=.false., reducedgrid=.true.,readin_localization=.true., + use_gfs_nemsio=${use_gfs_nemsio},use_gfs_ncio=${use_gfs_ncio},imp_physics=$imp_physics,lupp=$lupp, + univaroz=.false.,adp_anglebc=.true.,angord=4,use_edges=.false.,emiss_bc=.true., + letkf_flag=${letkf_flag},nobsl_max=${nobsl_max},denkf=${denkf},getkf=${getkf}., + nhr_anal=${IAUFHRS_ENKF},nhr_state=${IAUFHRS_ENKF},use_qsatensmean=.true., + lobsdiag_forenkf=$lobsdiag_forenkf, + write_spread_diag=$write_spread_diag, + modelspace_vloc=$modelspace_vloc, + use_correlated_oberrs=${use_correlated_oberrs}, + netcdf_diag=$netcdf_diag,cnvw_option=$cnvw_option, + paranc=$paranc,write_fv3_incr=$write_fv3_incr, + $WRITE_INCR_ZERO $NAM_ENKF / &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_n18', dsis(20)= 'avhrr3_n18', - sattypes_rad(21)= 'avhrr3_metop-a',dsis(21)= 'avhrr3_metop-a', - sattypes_rad(22)= 'avhrr3_n19', dsis(22)= 'avhrr3_n19', - 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_g11', - 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)= 'seviri_m08', dsis(50)= 'seviri_m08', - sattypes_rad(51)= 'seviri_m09', dsis(51)= 'seviri_m09', - sattypes_rad(52)= 'seviri_m10', dsis(52)= 'seviri_m10', - sattypes_rad(53)= 'amsua_metop-b', dsis(53)= 'amsua_metop-b', - sattypes_rad(54)= 'hirs4_metop-b', dsis(54)= 'hirs4_metop-b', - sattypes_rad(55)= 'mhs_metop-b', dsis(55)= 'mhs_metop-b', - sattypes_rad(56)= 'iasi_metop-b', dsis(56)= 'iasi_metop-b', - sattypes_rad(57)= 'avhrr3_metop-b',dsis(57)= 'avhrr3_metop-b', - sattypes_rad(58)= 'atms_npp', dsis(58)= 'atms_npp', - sattypes_rad(59)= 'atms_n20', dsis(59)= 'atms_n20', - sattypes_rad(60)= 'cris_npp', dsis(60)= 'cris_npp', - sattypes_rad(61)= 'cris-fsr_npp', dsis(61)= 'cris-fsr_npp', - sattypes_rad(62)= 'cris-fsr_n20', dsis(62)= 'cris-fsr_n20', - sattypes_rad(63)= 'seviri_m11', dsis(63)= 'seviri_m11', - sattypes_rad(64)= 'abi_g16', dsis(64)= 'abi_g16', - sattypes_rad(65)= 'ahi_himawari8', dsis(65)= 'ahi_himawari8', + 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)= 'avhrr_n18', dsis(20)= 'avhrr3_n18', + sattypes_rad(21)= 'avhrr_metop-a', dsis(21)= 'avhrr3_metop-a', + sattypes_rad(22)= 'avhrr_n19', dsis(22)= 'avhrr3_n19', + 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_g11', + 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)= 'seviri_m08', dsis(50)= 'seviri_m08', + sattypes_rad(51)= 'seviri_m09', dsis(51)= 'seviri_m09', + sattypes_rad(52)= 'seviri_m10', dsis(52)= 'seviri_m10', + sattypes_rad(53)= 'seviri_m11', dsis(53)= 'seviri_m11', + sattypes_rad(54)= 'amsua_metop-b', dsis(54)= 'amsua_metop-b', + sattypes_rad(55)= 'hirs4_metop-b', dsis(55)= 'hirs4_metop-b', + sattypes_rad(56)= 'mhs_metop-b', dsis(56)= 'mhs_metop-b', + sattypes_rad(57)= 'iasi_metop-b', dsis(57)= 'iasi_metop-b', + sattypes_rad(58)= 'avhrr_metop-b', dsis(58)= 'avhrr3_metop-b', + sattypes_rad(59)= 'atms_npp', dsis(59)= 'atms_npp', + sattypes_rad(60)= 'atms_n20', dsis(60)= 'atms_n20', + sattypes_rad(61)= 'cris_npp', dsis(61)= 'cris_npp', + sattypes_rad(62)= 'cris-fsr_npp', dsis(62)= 'cris-fsr_npp', + sattypes_rad(63)= 'cris-fsr_n20', dsis(63)= 'cris-fsr_n20', + sattypes_rad(64)= 'gmi_gpm', dsis(64)= 'gmi_gpm', + sattypes_rad(65)= 'saphir_meghat', dsis(65)= 'saphir_meghat', + sattypes_rad(66)= 'amsua_metop-c', dsis(66)= 'amsua_metop-c', + sattypes_rad(67)= 'mhs_metop-c', dsis(67)= 'mhs_metop-c', + 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', + sattypes_rad(75)= 'abi_g18', dsis(75)= 'abi_g18', + sattypes_rad(76)= 'ahi_himawari9', dsis(76)= 'ahi_himawari9', + sattypes_rad(77)= 'viirs-m_j2', dsis(77)= 'viirs-m_j2', + sattypes_rad(78)= 'atms_n21', dsis(78)= 'atms_n21', + sattypes_rad(79)= 'cris-fsr_n21', dsis(79)= 'cris-fsr_n21', $SATOBS_ENKF / &ozobs_enkf @@ -2871,236 +2272,16 @@ export gsi_namelist=" sattypes_oz(8) = 'mls30_aura', sattypes_oz(9) = 'ompsnp_npp', sattypes_oz(10) = 'ompstc8_npp', + sattypes_oz(11) = 'ompstc8_n20', + sattypes_oz(12) = 'ompsnp_n20', + sattypes_oz(13) = 'ompslp_npp', + sattypes_oz(14) = 'ompstc8_n21', + sattypes_oz(15) = 'ompsnp_n21', + sattypes_oz(16) = 'gome_metop-c', $OZOBS_ENKF /" ;; - global_C96_fv3aero) - -# Define namelist for global run (aerosol analysis) - -export gsi_namelist=" - &SETUP - miter=3, - niter(1)=100,niter(2)=100,niter(3)=1, - niter_no_qc(1)=50,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=0,deltim=400, - factqmin=0.0,factqmax=0.0, - iguess=-1, - tzr_qc=1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=12,gpstop=50., - use_gfs_nemsio=.true.,sfcnst_comb=.true., - use_readin_anl_sfcmask=.false., - lrun_subdirs=.true., - crtm_coeffs_path='./crtm_coeffs/', - newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., - diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,nhr_obsbin=3, - cwoption=3,imp_physics=11,lupp=.true., - netcdf_diag=.true.,binary_diag=.true., - lobsdiag_forenkf=.false., - diag_aero=.true., use_fv3_aero=.true.,offtime_data=.true., - diag_rad=.false.,diag_pcp=.false.,diag_conv=.false.,diag_ozone=.false., - / - - &GRIDOPTS - JCAP_B=190,JCAP=190,NLAT=194,NLON=384,nsig=64, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - / - - &BKGERR - 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, - bkgv_write=.false., - cwcoveqqcov=.false., - / - - &ANBKGERR - anisotropic=.false., - / - - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7, - / - - &STRONGOPTS - tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - / - - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.true., - aircraft_t_bc=.false.,biaspredt=1000.0,upd_aircraft=.true.,cleanup_tail=.true., - / - - &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,time_window_max=3.0, - / - -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - modisaodbufr modis_aod aqua v.modis_aqua 1.0 1 0 - modisaodbufr modis_aod terra v.modis_terra 1.0 1 0 -:: - - &SUPEROB_RADAR - / - - &LAG_DATA - / - - &HYBRID_ENSEMBLE - l_hyb_ens=.false., - generate_ens=.false., - beta_s0=0.125,readin_beta=.false., - s_ens_h=800.,s_ens_v=-0.8,readin_localization=.true., - aniso_a_en=.false.,oz_univ_static=.false.,uv_hyb_ens=.true., - ensemble_path='./ensemble_data/', - ens_fast_read=.true., - / - - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - - &CHEM - laeroana_gocart=.true.,aod_qa_limit=1,luse_deepblue=.true., - / - - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=2019061718, - obhourset=0., - / - - &NST - nst_gsi=3, - nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=0, - /" -;; - - global_C96_fv3aerorad) - -# Define namelist for global run (aerosol analysis) - -export gsi_namelist=" - &SETUP - niter(1)=100,niter(2)=100 - niter_no_qc(1)=50,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=82,factqmin=0.5,factqmax=0.005,deltim=1200, - iguess=-1, - tzr_qc=1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=12,gpstop=50., - use_gfs_nemsio=.true.,sfcnst_comb=.true., - use_readin_anl_sfcmask=.false., - lrun_subdirs=.true., - crtm_coeffs_path='./crtm_coeffs/', - newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., - diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,nhr_obsbin=3, - cwoption=3,imp_physics=11,lupp=.true., - netcdf_diag=.true.,binary_diag=.false., - lobsdiag_forenkf=.false., - diag_aero=.false., use_fv3_aero=.true.,offtime_data=.true., - diag_rad=.true.,diag_pcp=.false.,diag_conv=.true.,diag_ozone=.false., - / - - &GRIDOPTS - JCAP_B=190,JCAP=190,NLAT=194,NLON=384,nsig=64, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - / - - &BKGERR - 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, - bkgv_write=.false., - cwcoveqqcov=.false., - / - - &ANBKGERR - anisotropic=.false., - / - - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7, - / - - &STRONGOPTS - tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - / - - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.true., - aircraft_t_bc=.false.,biaspredt=1000.0,upd_aircraft=.true.,cleanup_tail=.true., - / - - &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,time_window_max=3.0, - / - -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - airsbufr airs aqua airs_aqua 0.0 1 1 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - iasibufr iasi metop-b iasi_metop-b 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - nsstbufr sst nsst sst 0.0 0 0 -:: - - &SUPEROB_RADAR - / - - &LAG_DATA - / - - &HYBRID_ENSEMBLE - l_hyb_ens=.false., - generate_ens=.false., - beta_s0=0.125,readin_beta=.false., - s_ens_h=800.,s_ens_v=-0.8,readin_localization=.true., - aniso_a_en=.false.,oz_univ_static=.false.,uv_hyb_ens=.true., - ensemble_path='./ensemble_data/', - ens_fast_read=.true., - / - - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - - &CHEM - lread_ext_aerosol=.true., - / - - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=2019061718, - obhourset=0., - / - - &NST - nst_gsi=3, - nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=0, - /" -;; - *) # EXIT out for unresolved regression test diff --git a/regression/regression_namelists_db.sh b/regression/regression_namelists_db.sh index 9eed1bbd54..59962a587b 100755 --- a/regression/regression_namelists_db.sh +++ b/regression/regression_namelists_db.sh @@ -2,7 +2,7 @@ job_name=$1 case $job_name in -global_T62) +global_3dvar) # Define namelist for global run (pcgsoi minimization) @@ -168,373 +168,47 @@ OBS_INPUT:: " ;; -global_lanczos_T62) - -# Define namelist for global run (lanczos minimization) - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=10,niter(2)=5, - niter_no_qc(1)=500,niter_no_qc(2)=500, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=82,qoption=2, - factqmin=0.005,factqmax=0.005,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=10,gpstop=30., - lsqrtb=.true.,lcongrad=.true.,ltlint=.true.,ladtest=.true.,lgrtest=.false., - use_gfs_nemsio=.false.,lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - 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, - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcpdry=.false.,bamp_jcpdry=2.5e7, - $JCOPTS - / - &STRONGOPTS - tlnmc_option=1,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.true.,baldiag_inc=.true., - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true.,njqc=.false.,vqc=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=1450.0,dmesh(2)=1500.0,dmesh(3)=5000.0,dmesh(4)=10000.0,dmesh(5)=1450.0,time_window_max=0.5, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 1 - hirs3bufr_skip hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr_skip hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr_skip hirs4 metop-a hirs4_metop-a 0.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 3 1 - msubufr msu n14 msu_n14 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr_skip amsua n16 amsua_n16 0.0 1 1 - amsuabufr_skip amsua n17 amsua_n17 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr_skip amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr_skip amsub n15 amsub_n15 0.0 1 1 - amsubbufr_skip amsub n16 amsub_n16 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr_skip mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 1 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 4 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 5 0 - seviribufr seviri m09 seviri_m09 0.0 5 0 - seviribufr seviri m10 seviri_m10 0.0 5 0 - seviribufr seviri m11 seviri_m11 0.0 5 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_GLOBAL}, - n_ens=${ENSEMBLE_SIZE_GLOBAL}, - uv_hyb_ens=${HYBENS_UV_GLOBAL}, - beta_s0=${BETA_S0_GLOBAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_GLOBAL}, - s_ens_v=${HYBENS_VER_SCALE_GLOBAL}, - generate_ens=${GENERATE_ENS_GLOBAL}, - aniso_a_en=${HYBENS_ANISO_GLOBAL}, - nlon_ens=${LONA}, - nlat_ens=${NLAT}, - jcap_ens=${JCAP}, - jcap_ens_test=${JCAP}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${adate}, - obhourset=0., - $SINGLEOB - - - &NST - / -" -;; - -global_hybrid_T126) + global_4denvar ) # Define namelist for global hybrid run export gsi_namelist=" &SETUP - miter=1,niter(1)=5,niter(2)=150, - niter_no_qc(1)=50,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2,cwoption=3, - gencode=82,factqmin=0.1,factqmax=0.1,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_prepb_satwnd=.false., - nhr_assimilation=6,lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP_B=$JCAP_B,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - 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, - bkgv_write=.false., - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=2.5e7, - $JCOPTS - / - &STRONGOPTS - tlnmc_option=1,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.true.,baldiag_inc=.true., - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true.,njqc=.false.,vqc=.true.,aircraft_t_bc=.true.,biaspredt=1000.0,upd_aircraft=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=1450.0,dmesh(2)=1500.0,time_window_max=0.5, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr_profl t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr_profl q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr_profl uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - gpsrobufr gps_bnd null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr_skip hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr_skip amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr_skip mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis_las f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis_uas f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis_img f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis_env f16 ssmis_f16 0.0 1 0 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 0 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 0 - iasibufr iasi metop-b iasi_metop-b 0.0 1 0 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 0 - atmsbufr atms n20 atms_n20 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 - gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 - gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 - gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 - gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - $LAGDATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=20,beta_s0=0.25,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.7,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, - nlat_ens=96,nlon_ens=192,ANISO_A_EN=.false.,jcap_ens_test=62,oz_univ_static=.true.,readin_localization=.true., - write_ens_sprd=.false., - $HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_hybrid_T126_adate}, - obhourset=0., - $SINGLEOB - - &NST - / -" -;; - - global_4denvar_T126 ) - -# Define namelist for global 4denvar run - -export gsi_namelist=" - - &SETUP - miter=1,niter(1)=2,niter(2)=1, + miter=1,niter(1)=2,niter(2)=5, niter_no_qc(1)=1,niter_no_qc(2)=0, - use_gfs_nemsio=.true., - l4densvar=.true.,ens_nstarthr=3,nhr_obsbin=1,lwrite4danl=.true., - tzr_qc=1, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2,cwoption=3, - gencode=82,factqmin=0.1,factqmax=0.1,deltim=$DELTIM, + qoption=2, + gencode=82,factqmin=0.5,factqmax=0.0002,deltim=400, iguess=-1, oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_prepb_satwnd=.false., - nhr_assimilation=6,lrun_subdirs=.true., + use_pbl=.false.,use_compress=.true.,nsig_ext=55,gpstop=55., + use_gfs_nemsio=.false.,use_gfs_ncio=.true.,lrun_subdirs=.true.,use_readin_anl_sfcmask=.true., + crtm_coeffs_path='./crtm_coeffs/', + newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., + diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,thin4d=.true.,cwoption=3, + verbose=.false.,imp_physics=11,lupp=.true.,binary_diag=.false.,netcdf_diag=.true., + lobsdiag_forenkf=.false., + nhr_anal=3,6,9, + l4densvar=.true.,ens_nstarthr=3,nhr_obsbin=1,nhr_assimilation=6,lwrite4danl=.true., tzr_qc=1,sfcnst_comb=.true., + write_fv3_incr=.true.,incvars_to_zero= 'liq_wat_inc','icmr_inc',incvars_zero_strat='sphum_inc','liq_wat_inc','icmr_inc', + incvars_efold=5, + use_gfs_ncio=.true., $SETUP / &GRIDOPTS JCAP_B=$JCAP_B,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, + regional=.false., $GRIDOPTS / &BKGERR + 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, bkgv_write=.false., + cwcoveqqcov=.false., $BKGVERR / &ANBKGERR @@ -542,17 +216,19 @@ export gsi_namelist=" $ANBKGERR / &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=2.5e7,ljc4tlevs=.true., + ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7,ljc4tlevs=.true., $JCOPTS / &STRONGOPTS - tlnmc_option=3,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.true.,baldiag_inc=.true., + tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, + 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.,njqc=.false.,vqc=.true.,aircraft_t_bc=.true.,biaspredt=1000.0,upd_aircraft=.true., + dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.04, + use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.false., + aircraft_t_bc=.true.,biaspredt=1.0e5,upd_aircraft=.true.,cleanup_tail=.true. + nvqc=.true., $OBSQC / &OBS_INPUT @@ -577,19 +253,19 @@ OBS_INPUT:: gpsrobufr gps_bnd null gps 0.0 0 0 ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 + sbuvbufr_ sbuv2 n16 sbuv8_n16 0.0 0 0 + sbuvbufr_ sbuv2 n17 sbuv8_n17 0.0 0 0 + sbuvbufr_ sbuv2 n18 sbuv8_n18 0.0 0 0 + hirs3bufr_ hirs3 n17 hirs3_n17 0.0 1 0 hirs4bufr_skip hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 1 + gimgrbufr_ goes_img g11 imgr_g11 0.0 1 0 + gimgrbufr_ goes_img g12 imgr_g12 0.0 1 0 + airsbufr_ airs aqua airs_aqua 0.0 1 1 amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 amsuabufr_skip amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 + airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 + amsubbufr_ amsub n17 amsub_n17 0.0 1 1 mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 mhsbufr_skip mhs metop-a mhs_metop-a 0.0 1 1 ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 @@ -599,14 +275,13 @@ OBS_INPUT:: ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 - ssmisbufr ssmis f19 ssmis_f19 0.0 1 0 gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 + gsnd1bufr_skip sndrd3 g11 sndrD3_g11 0.0 1 0 gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 @@ -629,9 +304,11 @@ OBS_INPUT:: mhsbufr mhs metop-b mhs_metop-b 0.0 1 1 iasibufr iasi metop-b iasi_metop-b 0.0 1 1 gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 0 + atmsbufr atms npp atms_npp 0.0 1 1 + atmsbufr atms n20 atms_n20 0.0 1 1 crisbufr cris npp cris_npp 0.0 1 0 crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 + crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 @@ -644,13 +321,21 @@ OBS_INPUT:: 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 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 - ahibufr ahi himawari8 ahi_himawari8 0.0 3 0 + ahibufr ahi himawari8 ahi_himawari8 0.0 1 0 + abibufr abi g16 abi_g16 0.0 1 0 + abibufr abi g17 abi_g17 0.0 1 0 rapidscatbufr uv null uv 0.0 0 0 ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 + 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 + ompslpbufr ompslp npp ompslp_npp 0.0 1 1 :: &SUPEROB_RADAR $SUPERRAD @@ -659,9 +344,9 @@ OBS_INPUT:: $LAGDATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=10,beta_s0=0.25,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.7,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, - nlat_ens=96,nlon_ens=192,ANISO_A_EN=.false.,jcap_ens_test=62,oz_univ_static=.true.,readin_localization=.true., - write_ens_sprd=.false., + l_hyb_ens=.true.,n_ens=10,beta_s0=0.125,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.8,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=190, + nlat_ens=194,nlon_ens=384,aniso_a_en=.false.,jcap_ens_test=62,oz_univ_static=.false.,readin_localization=.true.,ensemble_path='./ensemble_data/', + ens_fast_read=.true.,write_ens_sprd=.false., $HYBRID_ENSEMBLE / &RAPIDREFRESH_CLDSURF @@ -672,1195 +357,96 @@ OBS_INPUT:: / &SINGLEOB_TEST maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_4denvar_T126_adate}, + oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_4denvar_T670_adate}, obhourset=0., $SINGLEOB / &NST - nst_gsi=3,nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=5, + nst_gsi=3,nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=0, $NST / " ;; - global_fv3_4denvar_T126 ) +RTMA) -# Define namelist for global fv3 4denvar run +# Define namelist for RTMA runs export gsi_namelist=" - &SETUP - miter=1,niter(1)=2,niter(2)=1, - niter_no_qc(1)=1,niter_no_qc(2)=0, - use_gfs_nemsio=.true., - l4densvar=.true.,ens_nstarthr=3,nhr_obsbin=1,lwrite4danl=.true., - tzr_qc=1, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2,cwoption=3, - gencode=82,factqmin=0.1,factqmax=0.1,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_prepb_satwnd=.false., - nhr_assimilation=6,lrun_subdirs=.true.,sfcnst_comb=.true., - $SETUP - / - &GRIDOPTS - JCAP_B=$JCAP_B,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - $GRIDOPTS - / - &BKGERR - 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, - bkgv_write=.false., - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=2.5e7,ljc4tlevs=.true., - $JCOPTS - / - &STRONGOPTS - tlnmc_option=3,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.true.,baldiag_inc=.true., - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true.,njqc=.false.,vqc=.true.,aircraft_t_bc=.true.,biaspredt=1000.0,upd_aircraft=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=1450.0,dmesh(2)=1500.0,dmesh(3)=1000.0,time_window_max=0.5, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr_profl t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr_profl q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr_profl uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - nsstbufr sst nsst sst 0.0 0 0 - gpsrobufr gps_bnd null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr_skip hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr_skip amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr_skip mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 - ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 - ssmisbufr ssmis f19 ssmis_f19 0.0 1 0 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 1 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 1 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 1 - iasibufr iasi metop-b iasi_metop-b 0.0 1 1 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 - gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 - gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 - gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - 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 - 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 - ahibufr ahi himawari8 ahi_himawari8 0.0 3 0 - rapidscatbufr uv null uv 0.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - $LAGDATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=10,beta_s0=0.25,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.7,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=62, - nlat_ens=96,nlon_ens=192,ANISO_A_EN=.false.,jcap_ens_test=62,oz_univ_static=.true.,readin_localization=.true.,ensemble_path='./ensemble_data/', - write_ens_sprd=.false., - $HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_4denvar_T126_adate}, - obhourset=0., - $SINGLEOB - / - &NST - nst_gsi=3,nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=5, - $NST - / -" -;; - - global_fv3_4denvar_C192 ) - -# Define namelist for global hybrid run - -export gsi_namelist=" - - &SETUP - miter=1,niter(1)=2,niter(2)=5, - niter_no_qc(1)=1,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=82,factqmin=0.5,factqmax=0.0002,deltim=400, - iguess=-1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=55,gpstop=55., - use_gfs_nemsio=.false.,use_gfs_ncio=.true.,lrun_subdirs=.true.,use_readin_anl_sfcmask=.true., - crtm_coeffs_path='./crtm_coeffs/', - newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., - diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,thin4d=.true.,cwoption=3, - verbose=.false.,imp_physics=11,lupp=.true.,binary_diag=.false.,netcdf_diag=.true., - lobsdiag_forenkf=.false., - nhr_anal=3,6,9, - l4densvar=.true.,ens_nstarthr=3,nhr_obsbin=1,nhr_assimilation=6,lwrite4danl=.true., tzr_qc=1,sfcnst_comb=.true., - write_fv3_incr=.true.,incvars_to_zero= 'liq_wat_inc','icmr_inc',incvars_zero_strat='sphum_inc','liq_wat_inc','icmr_inc', - incvars_efold=5, - use_gfs_ncio=.true., - $SETUP - / - &GRIDOPTS - JCAP_B=$JCAP_B,JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - regional=.false., - $GRIDOPTS - / - &BKGERR - 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, - bkgv_write=.false., - cwcoveqqcov=.false., - $BKGVERR - / - &ANBKGERR - anisotropic=.false., - $ANBKGERR - / - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7,ljc4tlevs=.true., - $JCOPTS - / - &STRONGOPTS - tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - baldiag_full=.false.,baldiag_inc=.false., - $STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.04, - use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.false., - aircraft_t_bc=.true.,biaspredt=1.0e5,upd_aircraft=.true.,cleanup_tail=.true. - nvqc=.true., - $OBSQC - / - &OBS_INPUT - dmesh(1)=1450.0,dmesh(2)=1500.0,dmesh(3)=1000.0,time_window_max=0.5, - $OBSINPUT - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr_profl t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr_profl q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr_profl uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - nsstbufr sst nsst sst 0.0 0 0 - gpsrobufr gps_bnd null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr_ sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr_ sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr_ sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs3bufr_ hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr_skip hirs4 metop-a hirs4_metop-a 0.0 1 1 - gimgrbufr_ goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr_ goes_img g12 imgr_g12 0.0 1 0 - airsbufr_ airs aqua airs_aqua 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr_skip amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr_ amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr_skip mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - ssmisbufr ssmis f17 ssmis_f17 0.0 1 0 - ssmisbufr ssmis f18 ssmis_f18 0.0 1 0 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr_skip sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 1 - gomebufr gome metop-a gome_metop-a 0.0 2 0 - omibufr omi aura omi_aura 0.0 2 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 1 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 1 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 1 - iasibufr iasi metop-b iasi_metop-b 0.0 1 1 - gomebufr gome metop-b gome_metop-b 0.0 2 0 - atmsbufr atms npp atms_npp 0.0 1 1 - atmsbufr atms n20 atms_n20 0.0 1 1 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 - gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 1 0 - gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 1 0 - gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 1 0 - gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - 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 - 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 - ahibufr ahi himawari8 ahi_himawari8 0.0 1 0 - abibufr abi g16 abi_g16 0.0 1 0 - abibufr abi g17 abi_g17 0.0 1 0 - rapidscatbufr uv null uv 0.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 2 0 - 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 - ompslpbufr ompslp npp ompslp_npp 0.0 1 1 -:: - &SUPEROB_RADAR - $SUPERRAD - / - &LAG_DATA - $LAGDATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=10,beta_s0=0.125,readin_beta=.false.,s_ens_h=800,s_ens_v=-0.8,generate_ens=.false.,uv_hyb_ens=.true.,jcap_ens=190, - nlat_ens=194,nlon_ens=384,aniso_a_en=.false.,jcap_ens_test=62,oz_univ_static=.false.,readin_localization=.true.,ensemble_path='./ensemble_data/', - ens_fast_read=.true.,write_ens_sprd=.false., - $HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=${global_4denvar_T670_adate}, - obhourset=0., - $SINGLEOB - / - &NST - nst_gsi=3,nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=0, - $NST - / -" -;; - -RTMA) - -# Define namelist for RTMA runs - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=2,niter(2)=1, - write_diag(1)=.true.,write_diag(2)=.true.,write_diag(3)=.true., - gencode=78,qoption=1,tsensible=.true. - factqmin=1.0,factqmax=1.0,factv=0.0,factcldch=0.0,factw10m=1.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - diag_rad=.false.,diag_pcp=.false.,diag_ozone=.false.,diag_aero=.false., - nhr_assimilation=6,min_offset=180,use_compress=.false.,lrun_subdirs=.true., - use_similarity_2dvar=.true., - neutral_stability_windfact_2dvar=.false., - use_prepb_satwnd=.false., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.false.,wrf_mass_regional=.false.,twodvar_regional=.true., - diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=.false., - / - &BKGERR - hzscl=1.414,1.000,0.707, - vs=0.5,bw=0.0, - / - &ANBKGERR - anisotropic=.true.,an_vs=0.5,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=1.,nord_f2a=4, - rtma_subdomain_option=.true.,triad4=.true.,nsmooth=0,nsmooth_shapiro=0,lreadnorm=.true., - / - &JCOPTS - / - &STRONGOPTS - tlnmc_option=0,nstrong=1,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',hilbert_curve=.true., - buddycheck_t=.false.,buddydiag_save=.false.,oberrflg=.true.,njqc=.true.,vqc=.false., - $OBSQC - / - &OBS_INPUT - dmesh(1)=60.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,time_window_max=3.0, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 1.0 0 0 - prepbufr t null t 1.0 0 0 - prepbufr q null q 1.0 0 0 - prepbufr uv null uv 1.0 0 0 - satwndbufr uv null uv 1.0 0 0 - prepbufr spd null spd 1.0 0 0 - prepbufr wspd10m null wspd10m 1.0 0 0 - satwnd wspd10m null wspd10m 1.0 0 0 - prepbufr uwnd10m null uwnd10m 1.0 0 0 - satwnd uwnd10m null uwnd10m 1.0 0 0 - prepbufr vwnd10m null vwnd10m 1.0 0 0 - satwnd vwnd10m null vwnd10m 1.0 0 0 - prepbufr gust null gust 1.0 0 0 - prepbufr vis null vis 1.0 0 0 - prepbufr td2m null td2m 1.0 0 0 - mxtmdat mxtm null mxtm 1.0 0 0 - mitmdat mitm null mitm 1.0 0 0 - prepbufr mxtm null mxtm 1.0 0 0 - prepbufr mitm null mitm 1.0 0 0 - prepbufr pmsl null pmsl 1.0 0 0 - prepbufr howv null howv 1.0 0 0 - satmar howv null howv 1.0 0 0 - prepbufr tcamt null tcamt 1.0 0 0 - goessky tcamt null tcamt 1.0 0 0 - prepbufr cldch null cldch 1.0 0 0 -:: - &SUPEROB_RADAR - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - l_closeobs=.true. - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=36.,oblon=260.,obpres=1000.,obdattim=${adate}, - obhourset=0., - - &NST - / -" -;; - -arw_binary) - -# Define namelist for arw binary run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=2,niter(2)=1, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.false.,wrf_mass_regional=.true.,diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=$NETCDF, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - / - &ANBKGERR - anisotropic=.false.,an_vs=1.0,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, - / - &JCOPTS - / - &STRONGOPTS - tlnmc_option=0,nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=1200.0,dmesh(2)=2000.0,dmesh(3)=2500.0,dmesh(4)=1000.0,time_window_max=0.5, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - omi omi aura omi_aura 0.0 4 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 2 1 - msubufr msu n14 msu_n14 0.0 1 1 - amsuabufr amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n16 amsua_n16 0.0 1 1 - amsuabufr amsua n17 amsua_n17 0.0 1 1 - amsuabufr amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n15 amsub_n15 0.0 1 1 - amsubbufr amsub n16 amsub_n16 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 1 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 3 1 - gomebufr gome metop-a gome_metop-a 0.0 4 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 4 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - - &NST - / -" -;; - -arw_netcdf) - -# Define namelist for arw netcdf run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=2,niter(2)=1, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.false.,wrf_mass_regional=.true.,diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=$NETCDF, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - / - &ANBKGERR - anisotropic=.false.,an_vs=1.0,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, - / - &JCOPTS - / - &STRONGOPTS - tlnmc_option=0,nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=1200.0,dmesh(2)=3000.0,dmesh(3)=4000.0,dmesh(4)=1000.0,time_window_max=0.5, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - omi omi aura omi_aura 0.0 4 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr_skip hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 2 1 - msubufr msu n14 msu_n14 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n16 amsua_n16 0.0 1 1 - amsuabufr amsua n17 amsua_n17 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n15 amsub_n15 0.0 1 1 - amsubbufr amsub n16 amsub_n16 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 1 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr_skip sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 3 1 - gomebufr gome metop-a gome_metop-a 0.0 4 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 4 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - - &NST - / -" -;; - -nmm_binary) - -# Define namelist for nmm binary run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=1,niter(2)=2, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.true.,wrf_mass_regional=.false.,diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=$NETCDF, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - / - &ANBKGERR - anisotropic=.false.,an_vs=1.0,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, - / - &JCOPTS - / - &STRONGOPTS - tlnmc_option=0,nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=1200.0,dmesh(2)=5000.0,dmesh(3)=8000.0,dmesh(4)=1000.0,time_window_max=0.5, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - omi omi aura omi_aura 0.0 4 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr_skip hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 2 1 - msubufr msu n14 msu_n14 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n16 amsua_n16 0.0 1 1 - amsuabufr amsua n17 amsua_n17 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n15 amsub_n15 0.0 1 1 - amsubbufr amsub n16 amsub_n16 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 1 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr_skip sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 3 1 - gomebufr gome metop-a gome_metop-a 0.0 4 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 4 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - - &NST - / -" -;; - -nmm_netcdf) - -# Define namelist for nmm netcdf run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=1,niter(2)=2, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - oneobtest=.false.,retrieval=.false., - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.true.,wrf_mass_regional=.false.,diagnostic_reg=.false., - filled_grid=.false.,half_grid=.true.,netcdf=$NETCDF, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - / - &ANBKGERR - anisotropic=.false.,an_vs=1.0,ngauss=1, - an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., - ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, - / - &JCOPTS - / - &STRONGOPTS - tlnmc_option=0,nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=1200.0,dmesh(2)=2000.0,dmesh(3)=2500.0,dmesh(4)=1000.0,time_window_max=0.5, - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - omi omi aura omi_aura 0.0 4 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 1 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 2 1 - msubufr msu n14 msu_n14 0.0 1 1 - amsuabufr amsua n15 amsua_n15 0.0 1 1 - amsuabufr amsua n16 amsua_n16 0.0 1 1 - amsuabufr amsua n17 amsua_n17 0.0 1 1 - amsuabufr amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr amsua aqua amsua_aqua 0.0 1 1 - amsubbufr amsub n15 amsub_n15 0.0 1 1 - amsubbufr amsub n16 amsub_n16 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 1 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr_skip sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 3 1 - gomebufr gome metop-a gome_metop-a 0.0 4 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 4 0 -:: - &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., - / - &LAG_DATA - / - &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - / - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - &CHEM - / - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, - obhourset=0., - - &NST - / -" -;; - - netcdf_fv3_regional) - -# Define namelist for netcdf fv3 run - -export gsi_namelist=" - - &SETUP - miter=2,niter(1)=50,niter(2)=50,niter_no_qc(1)=20, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, - iguess=-1, - newpc4pred=.true., adp_anglebc=.true., angord=4, - diag_precon=.true., step_start=1.e-3, - nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,gpstop=30., - lrun_subdirs=.true., - $SETUP - / - &GRIDOPTS - fv3_regional=.true.,grid_ratio_fv3_regional=3.0, - / - &BKGERR - hzscl=0.373,0.746,1.50, - vs=0.6,bw=0.,fstat=.false., - / - &ANBKGERR - anisotropic=.false., - / - &JCOPTS - / - &STRONGOPTS - / - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02, - vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., - / - &OBS_INPUT - dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5,ext_sonde=.true., - / -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - gpsrobufr gps_bnd null gps_bnd 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 0 - hirs3bufr hirs3 n16 hirs3_n16 0.0 1 0 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr hirs4 n18 hirs4_n18 0.0 1 0 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 0 - hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs281_aqua 0.0 1 0 - msubufr msu n14 msu_n14 0.0 1 0 - amsuabufr amsua n15 amsua_n15 0.0 1 0 - amsuabufr amsua n16 amsua_n16 0.0 1 0 - amsuabufr amsua n17 amsua_n17 0.0 1 0 - amsuabufr amsua n18 amsua_n18 0.0 1 0 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 0 - amsuabufr amsua metop-b amsua_metop-b 0.0 1 0 - airsbufr amsua aqua amsua_aqua 0.0 1 0 - amsubbufr amsub n15 amsub_n15 0.0 1 0 - amsubbufr amsub n16 amsub_n16 0.0 1 0 - amsubbufr amsub n17 amsub_n17 0.0 1 0 - mhsbufr mhs n18 mhs_n18 0.0 1 0 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 0 - mhsbufr mhs metop-b mhs_metop-b 0.0 1 0 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f14 ssmi_f14 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 1 0 - gomebufr gome metop-a gome_metop-a 0.0 1 0 - iasibufr iasi metop-b iasi_metop-b 0.0 1 0 - omibufr omi aura omi_aura 0.0 1 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 1 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 0 - amsuabufr amsua n19 amsua_n19 0.0 1 0 - mhsbufr mhs n19 mhs_n19 0.0 1 0 - tcvitl tcp null tcp 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - atmsbufr atms npp atms_npp 0.0 1 0 - crisbufr cris npp cris_npp 0.0 1 0 - crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 - seviribufr seviri m08 seviri_m08 0.0 1 0 - seviribufr seviri m09 seviri_m09 0.0 1 0 - seviribufr seviri m10 seviri_m10 0.0 1 0 - seviribufr seviri m11 seviri_m11 0.0 1 0 - gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 - gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 - gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 - gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 - prepbufr mta_cld null mta_cld 1.0 0 0 - prepbufr gos_ctp null gos_ctp 1.0 0 0 - lgycldbufr larccld null larccld 1.0 0 0 + &SETUP + miter=2,niter(1)=2,niter(2)=1, + write_diag(1)=.true.,write_diag(2)=.true.,write_diag(3)=.true., + gencode=78,qoption=1,tsensible=.true. + factqmin=1.0,factqmax=1.0,factv=0.0,factcldch=0.0,factw10m=1.0,deltim=$DELTIM, + iguess=-1, + oneobtest=.false.,retrieval=.false., + diag_rad=.false.,diag_pcp=.false.,diag_ozone=.false.,diag_aero=.false., + nhr_assimilation=6,min_offset=180,use_compress=.false.,lrun_subdirs=.true., + use_similarity_2dvar=.true., + neutral_stability_windfact_2dvar=.false., + use_prepb_satwnd=.false., + $SETUP + / + &GRIDOPTS + JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, + wrf_nmm_regional=.false.,wrf_mass_regional=.false.,twodvar_regional=.true., + diagnostic_reg=.false., + filled_grid=.false.,half_grid=.true.,netcdf=.false., + / + &BKGERR + hzscl=1.414,1.000,0.707, + vs=0.5,bw=0.0, + / + &ANBKGERR + anisotropic=.true.,an_vs=0.5,ngauss=1, + an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., + ifilt_ord=2,npass=3,normal=-200,grid_ratio=1.,nord_f2a=4, + rtma_subdomain_option=.true.,triad4=.true.,nsmooth=0,nsmooth_shapiro=0,lreadnorm=.true., + / + &JCOPTS + / + &STRONGOPTS + tlnmc_option=0,nstrong=1,nvmodes_keep=20,period_max=3., + baldiag_full=.true.,baldiag_inc=.true., + / + &OBSQC + dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02,vadfile='prepbufr',hilbert_curve=.true., + buddycheck_t=.false.,buddydiag_save=.false.,oberrflg=.true.,njqc=.true.,vqc=.false., + $OBSQC + / + &OBS_INPUT + dmesh(1)=60.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,time_window_max=3.0, + / +OBS_INPUT:: +! dfile dtype dplat dsis dval dthin dsfcalc + prepbufr ps null ps 1.0 0 0 + prepbufr t null t 1.0 0 0 + prepbufr q null q 1.0 0 0 + prepbufr uv null uv 1.0 0 0 + satwndbufr uv null uv 1.0 0 0 + prepbufr spd null spd 1.0 0 0 + prepbufr wspd10m null wspd10m 1.0 0 0 + satwnd wspd10m null wspd10m 1.0 0 0 + prepbufr uwnd10m null uwnd10m 1.0 0 0 + satwnd uwnd10m null uwnd10m 1.0 0 0 + prepbufr vwnd10m null vwnd10m 1.0 0 0 + satwnd vwnd10m null vwnd10m 1.0 0 0 + prepbufr gust null gust 1.0 0 0 + prepbufr vis null vis 1.0 0 0 + prepbufr td2m null td2m 1.0 0 0 + mxtmdat mxtm null mxtm 1.0 0 0 + mitmdat mitm null mitm 1.0 0 0 + prepbufr mxtm null mxtm 1.0 0 0 + prepbufr mitm null mitm 1.0 0 0 + prepbufr pmsl null pmsl 1.0 0 0 + prepbufr howv null howv 1.0 0 0 + satmar howv null howv 1.0 0 0 + prepbufr tcamt null tcamt 1.0 0 0 + goessky tcamt null tcamt 1.0 0 0 + prepbufr cldch null cldch 1.0 0 0 :: &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., / &LAG_DATA / @@ -1868,221 +454,263 @@ OBS_INPUT:: / &RAPIDREFRESH_CLDSURF dfi_radar_latent_heat_time_period=30.0, + l_closeobs=.true. / &CHEM / &SINGLEOB_TEST - / + maginnov=0.1,magoberr=0.1,oneob_type='t', + oblat=36.,oblon=260.,obpres=1000.,obdattim=${adate}, + obhourset=0., + &NST / " ;; -nems_nmmb) + rrfs_3denvar_glbens) -# Define namelist for nems nmmb run +# Define namelist for rrfs 3d hybrid envar run with global ensembles export gsi_namelist=" &SETUP - miter=2,niter(1)=2,niter(2)=1,niter_no_qc(1)=1, + miter=1,niter(1)=2,niter(2)=2, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0,deltim=$DELTIM, + qoption=2,print_obs_para=.true.,diag_radardbz=.false., + if_model_dbz=.false., static_gsi_nopcp_dbz=0.0, + rmesh_dbz=4.0,rmesh_vr=4.0,zmesh_dbz=1000.0,zmesh_vr=1000.0, + missing_to_nopcp=.false.,radar_no_thinning=.true., + gencode=78,factqmin=0.0,factqmax=0.0, iguess=-1, + lread_obs_save=.false.,lread_obs_skip=.false., oneobtest=.false.,retrieval=.false., nhr_assimilation=3,l_foto=.false., - use_pbl=.false.,use_compress=.false.,nsig_ext=13,preserve_restart_date=.true., - use_gfs_ozone=.true.,check_gfs_ozone_date=.true.,regional_ozone=.true.,gpstop=30. - lrun_subdirs=.true., - $SETUP + use_pbl=.false.,use_prepb_satwnd=.false., + newpc4pred=.true.,adp_anglebc=.true.,angord=4, + passive_bc=.true.,use_edges=.false.,emiss_bc=.true., + diag_precon=.true.,step_start=1.e-3, + l4densvar=.false.,nhr_obsbin=3, + use_gfs_nemsio=.false.,use_gfs_ncio=.true.,reset_bad_radbc=.true., + netcdf_diag=.false.,binary_diag=.true., + l_obsprvdiag=.false., / &GRIDOPTS - JCAP=$JCAP,JCAP_B=$JCAP_B,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS, - wrf_nmm_regional=.false.,wrf_mass_regional=.false.,nems_nmmb_regional=.true.,diagnostic_reg=.false., - nmmb_reference_grid='H',grid_ratio_nmmb=1.412, - filled_grid=.false.,half_grid=.true.,netcdf=.false., + fv3_regional=.true.,grid_ratio_fv3_regional=2.0,nvege_type=20, + fv3_io_layout_y=1, / &BKGERR - hzscl=0.373,0.746,1.50, - vs=0.6,bw=0.,fstat=.false., - / + vs=1.0, + hzscl=0.7,1.4,2.80, + bw=0.,fstat=.true., + usenewgfsberror=.true., +/ &ANBKGERR anisotropic=.false., / &JCOPTS / &STRONGOPTS - tlnmc_option=0,nstrong=0,nvmodes_keep=8,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., / &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02, - vadfile='prepbufr',njqc=.false.,vqc=.true., + dfact=0.75,dfact1=3.0,noiqc=.false.,c_varqc=0.02,vadfile='prepbufr', + vadwnd_l2rw_qc=.true., / &OBS_INPUT - dmesh(1)=1200.0,dmesh(2)=2000.0,dmesh(3)=2500.0,dmesh(4)=1000.0,time_window_max=0.5,ext_sonde=.true., + dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=30,time_window_max=1.5,time_window_rad=1.0,ext_sonde=.true., / OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - prepbufr ps null ps 0.0 0 0 - prepbufr t null t 0.0 0 0 - prepbufr q null q 0.0 0 0 - prepbufr pw null pw 0.0 0 0 - prepbufr uv null uv 0.0 0 0 - satwndbufr uv null uv 0.0 0 0 - prepbufr spd null spd 0.0 0 0 - prepbufr dw null dw 0.0 0 0 - radarbufr rw null rw 0.0 0 0 - prepbufr sst null sst 0.0 0 0 - gpsrobufr $gps_dtype null gps 0.0 0 0 - ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 - tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 - sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 - sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 - sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 - hirs2bufr hirs2 n14 hirs2_n14 0.0 1 1 - hirs3bufr_skip hirs3 n16 hirs3_n16 0.0 1 1 - hirs3bufr hirs3 n17 hirs3_n17 0.0 1 1 - hirs4bufr_skip hirs4 n18 hirs4_n18 0.0 1 1 - hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 - gsndrbufr sndr g11 sndr_g11 0.0 1 0 - gsndrbufr sndr g12 sndr_g12 0.0 1 0 - gimgrbufr goes_img g11 imgr_g11 0.0 1 0 - gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 2 1 - msubufr msu n14 msu_n14 0.0 1 1 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 1 - amsuabufr_skip amsua n16 amsua_n16 0.0 1 1 - amsuabufr_skip amsua n17 amsua_n17 0.0 1 1 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 1 - amsuabufr amsua metop-a amsua_metop-a 0.0 1 1 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 1 - amsubbufr_skip amsub n15 amsub_n15 0.0 1 1 - amsubbufr_skip amsub n16 amsub_n16 0.0 1 1 - amsubbufr amsub n17 amsub_n17 0.0 1 1 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 1 - mhsbufr mhs metop-a mhs_metop-a 0.0 1 1 - ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 - ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 - amsrebufr amsre_low aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_mid aqua amsre_aqua 0.0 1 1 - amsrebufr amsre_hig aqua amsre_aqua 0.0 1 1 - ssmisbufr ssmis f16 ssmis_f16 0.0 1 1 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 - iasibufr iasi metop-a iasi_metop-a 0.0 3 1 - gomebufr gome metop-a gome_metop-a 0.0 4 0 - omibufr omi aura omi_aura 0.0 4 0 - sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 - hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 - amsuabufr amsua n19 amsua_n19 0.0 1 1 - mhsbufr mhs n19 mhs_n19 0.0 1 1 - tcvitl tcp null tcp 0.0 0 0 - mlsbufr mls30 aura mls30_aura 1.0 0 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 4 0 +! dfile dtype dplat dsis dval dthin dsfcalc + dbzobs.nc dbz null dbz 1.0 0 0 + prepbufr ps null ps 1.0 0 0 + prepbufr t null t 1.0 0 0 + prepbufr q null q 1.0 0 0 + prepbufr pw null pw 1.0 0 0 + satwndbufr uv null uv 1.0 0 0 + prepbufr uv null uv 1.0 0 0 + prepbufr spd null spd 1.0 0 0 + prepbufr dw null dw 1.0 0 0 + l2rwbufr rw null l2rw 1.0 0 0 + prepbufr sst null sst 1.0 0 0 + gpsrobufr gps_ref null gps 1.0 0 0 + ssmirrbufr pcp_ssmi dmsp pcp_ssmi 1.0 -1 0 + tmirrbufr pcp_tmi trmm pcp_tmi 1.0 -1 0 + sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 + sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 + sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 + hirs3bufr hirs3 n16 hirs3_n16 0.0 1 0 + hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 + hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 2 0 + hirs4bufr hirs4 n18 hirs4_n18 0.0 1 0 + hirs4bufr hirs4 n19 hirs4_n19 0.0 2 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 2 0 + gimgrbufr goes_img g11 imgr_g11 0.0 1 0 + gimgrbufr goes_img g12 imgr_g12 0.0 1 0 + airsbufr airs aqua airs_aqua 0.0 2 0 + amsuabufr amsua n15 amsua_n15 0.0 2 0 + amsuabufr amsua n18 amsua_n18 0.0 2 0 + amsuabufr amsua n19 amsua_n19 0.0 2 0 + amsuabufr amsua metop-a amsua_metop-a 0.0 2 0 + amsuabufr amsua metop-b amsua_metop-b 0.0 2 0 + airsbufr amsua aqua amsua_aqua 0.0 2 0 + amsubbufr amsub n17 amsub_n17 0.0 1 0 + mhsbufr mhs n18 mhs_n18 0.0 2 0 + mhsbufr mhs n19 mhs_n19 0.0 2 0 + mhsbufr mhs metop-a mhs_metop-a 0.0 2 0 + mhsbufr mhs metop-b mhs_metop-b 0.0 2 0 + ssmitbufr ssmi f13 ssmi_f13 0.0 2 0 + ssmitbufr ssmi f14 ssmi_f14 0.0 2 0 + ssmitbufr ssmi f15 ssmi_f15 0.0 2 0 + amsrebufr amsre_low aqua amsre_aqua 0.0 2 0 + amsrebufr amsre_mid aqua amsre_aqua 0.0 2 0 + amsrebufr amsre_hig aqua amsre_aqua 0.0 2 0 + ssmisbufr ssmis f16 ssmis_f16 0.0 2 0 + ssmisbufr ssmis f17 ssmis_f17 0.0 2 0 + ssmisbufr ssmis f18 ssmis_f18 0.0 2 0 + ssmisbufr ssmis f19 ssmis_f19 0.0 2 0 + gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 1 0 + gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 1 0 + gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 1 0 + gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 1 0 + gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 1 0 + gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 1 0 + gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 + gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 1 0 + gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 1 0 + gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 1 0 + gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 1 0 + gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 1 0 + gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 2 0 + gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 2 0 + gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 2 0 + gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 2 0 + iasibufr iasi metop-a iasi_metop-a 0.0 2 0 + gomebufr gome metop-a gome_metop-a 0.0 2 0 + atmsbufr atms npp atms_npp 0.0 2 0 + atmsbufr atms n20 atms_n20 0.0 2 0 + crisbufr cris npp cris_npp 0.0 2 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 2 0 + crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 2 0 + abibufr abi g16 abi_g16 0.0 2 0 + mlsbufr mls30 aura mls30_aura 0.0 0 0 + oscatbufr uv null uv 0.0 0 0 + prepbufr mta_cld null mta_cld 1.0 0 0 + prepbufr gos_ctp null gos_ctp 1.0 0 0 + refInGSI rad_ref null rad_ref 1.0 0 0 + lghtInGSI lghtn null lghtn 1.0 0 0 + larcInGSI larccld null larccld 1.0 0 0 :: &SUPEROB_RADAR - del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., - l2superob_only=.false., + del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., l2superob_only=.false., / &LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=${HYBENS_REGIONAL}, - n_ens=${ENSEMBLE_SIZE_REGIONAL}, - uv_hyb_ens=${HYBENS_UV_REGIONAL}, - beta_s0=${BETA_S0_REGIONAL}, - readin_beta=.false., - s_ens_h=${HYBENS_HOR_SCALE_REGIONAL}, - s_ens_v=${HYBENS_VER_SCALE_REGIONAL}, - generate_ens=${GENERATE_ENS_REGIONAL}, - aniso_a_en=${HYBENS_ANISO_REGIONAL}, - nlon_ens=${NLON_ENS_REGIONAL}, - nlat_ens=${NLAT_ENS_REGIONAL}, - jcap_ens=${JCAP_ENS_REGIONAL}, - jcap_ens_test=${JCAP_ENS_TEST_REGIONAL}, - full_ensemble=.true.,pwgtflg=.true., + l_hyb_ens=${ifhyb}, + uv_hyb_ens=.true., + q_hyb_ens=.false., + aniso_a_en=.false.,generate_ens=.false., + n_ens=${nummem}, + beta_s0=0.15,s_ens_h=110,s_ens_v=3, + regional_ensemble_option=1, + pseudo_hybens = .false., + grid_ratio_ens = 3, + l_ens_in_diff_time=.true., + ensemble_path='', + i_en_perts_io=1, + jcap_ens=574, + fv3sar_bg_opt=0, + readin_localization=.true., + ens_fast_read=.false., / &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, + dfi_radar_latent_heat_time_period=20.0, + metar_impact_radius=10.0, + metar_impact_radius_lowCloud=4.0, + l_gsd_terrain_match_surfTobs=.true., + l_sfcobserror_ramp_t=.true., + l_sfcobserror_ramp_q=.true., + l_PBL_pseudo_SurfobsT=.false., + l_PBL_pseudo_SurfobsQ=.false., + l_PBL_pseudo_SurfobsUV=.false., + pblH_ration=0.4, + pps_press_incr=40.0, + l_gsd_limit_ocean_q=.true., + l_pw_hgt_adjust=.true., + l_limit_pw_innov=.true., + max_innov_pct=0.1, + l_cleanSnow_WarmTs=.true., + r_cleanSnow_WarmTs_threshold=5.0, + l_conserve_thetaV=.true., + i_conserve_thetaV_iternum=3, + l_gsd_soilTQ_nudge=.false., + l_cld_bld=.true., + l_numconc=.true., + l_closeobs=.true., + cld_bld_hgt=1200.0, + build_cloud_frac_p=0.50, + clear_cloud_frac_p=0.10, + iclean_hydro_withRef_allcol=1, + i_use_2mQ4B=2, + i_use_2mT4B=1, + i_gsdcldanal_type=0, + i_gsdsfc_uselist=1, + i_lightpcp=1, + i_sfct_gross=1, + i_coastline=3, + i_gsdqc=2, / &CHEM / + &NST + / &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=${adate}, + maginnov=1.0,magoberr=0.8,oneob_type='t', + oblat=38.,oblon=279.,obpres=500.,obdattim=2020040500, obhourset=0., - - &NST / " ;; -nems_nmmb_4denvar) + netcdf_fv3_regional) -# Define namelist for 4DEnVar nems nmmb run +# Define namelist for netcdf fv3 run export gsi_namelist=" &SETUP - miter=2,niter(1)=2,niter(2)=1,niter_no_qc(1)=1, + miter=2,niter(1)=50,niter(2)=50,niter_no_qc(1)=20, write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - gencode=78,qoption=2, - factqmin=0.0,factqmax=0.0, - iguess=-1,use_gfs_ozone=.true., - oneobtest=.false.,retrieval=.false., - nhr_assimilation=6,l_foto=.false., - use_pbl=.false.,gpstop=30., - print_diag_pcg=.true., + qoption=2, + factqmin=0.0,factqmax=0.0,deltim=$DELTIM, + iguess=-1, newpc4pred=.true., adp_anglebc=.true., angord=4, - passive_bc=.false., use_edges=.false., emiss_bc=.true., diag_precon=.true., step_start=1.e-3, - l4densvar=.true.,nhr_obsbin=3, + nhr_assimilation=3,l_foto=.false., + use_pbl=.false.,use_compress=.false.,gpstop=30., + lrun_subdirs=.true., $SETUP / &GRIDOPTS - wrf_nmm_regional=.false.,wrf_mass_regional=.false.,nems_nmmb_regional=.true.,diagnostic_reg=.false., - nmmb_reference_grid='H',grid_ratio_nmmb=3.0, - filled_grid=.false.,half_grid=.false.,netcdf=.false., - $GRIDOPTS + fv3_regional=.true.,grid_ratio_fv3_regional=3.0, / &BKGERR hzscl=0.373,0.746,1.50, - vs=1.0,bw=0.,fstat=.true., - $BKGERR + vs=0.6,bw=0.,fstat=.false., / &ANBKGERR anisotropic=.false., - $ANBKGERR / &JCOPTS - $JCOPTS / &STRONGOPTS - nstrong=0,nvmodes_keep=20,period_max=3., - baldiag_full=.true.,baldiag_inc=.true., - $STRONGOPTS / &OBSQC dfact=0.75,dfact1=3.0,noiqc=.true.,c_varqc=0.02, - vadfile='prepbufr',njqc=.false.,vqc=.true., - $OBSQC + vadfile='prepbufr',oberrflg=.false.,njqc=.false.,vqc=.true., / &OBS_INPUT - dmesh(1)=120.0,time_window_max=3.0,ext_sonde=.true., - $OBS_INPUT + dmesh(1)=120.0,dmesh(2)=60.0,dmesh(3)=60.0,dmesh(4)=60.0,dmesh(5)=120,time_window_max=1.5,ext_sonde=.true., / OBS_INPUT:: ! dfile dtype dplat dsis dval dthin dsfcalc @@ -2102,47 +730,40 @@ OBS_INPUT:: sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 hirs2bufr hirs2 n14 hirs2_n14 0.0 1 0 - hirs3bufr_skip hirs3 n16 hirs3_n16 0.0 1 0 + hirs3bufr hirs3 n16 hirs3_n16 0.0 1 0 hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 - hirs4bufr_skip hirs4 n18 hirs4_n18 0.0 1 0 + hirs4bufr hirs4 n18 hirs4_n18 0.0 1 0 hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 gsndrbufr sndr g11 sndr_g11 0.0 1 0 gsndrbufr sndr g12 sndr_g12 0.0 1 0 gimgrbufr goes_img g11 imgr_g11 0.0 1 0 gimgrbufr goes_img g12 imgr_g12 0.0 1 0 - airsbufr airs aqua airs_aqua 0.0 1 0 + airsbufr airs aqua airs281_aqua 0.0 1 0 msubufr msu n14 msu_n14 0.0 1 0 - amsuabufr_skip amsua n15 amsua_n15 0.0 1 0 - amsuabufr_skip amsua n16 amsua_n16 0.0 1 0 - amsuabufr_skip amsua n17 amsua_n17 0.0 1 0 - amsuabufr_skip amsua n18 amsua_n18 0.0 1 0 + amsuabufr amsua n15 amsua_n15 0.0 1 0 + amsuabufr amsua n16 amsua_n16 0.0 1 0 + amsuabufr amsua n17 amsua_n17 0.0 1 0 + amsuabufr amsua n18 amsua_n18 0.0 1 0 amsuabufr amsua metop-a amsua_metop-a 0.0 1 0 - airsbufr_skip amsua aqua amsua_aqua 0.0 1 0 - amsubbufr_skip amsub n15 amsub_n15 0.0 1 0 - amsubbufr_skip amsub n16 amsub_n16 0.0 1 0 + amsuabufr amsua metop-b amsua_metop-b 0.0 1 0 + airsbufr amsua aqua amsua_aqua 0.0 1 0 + amsubbufr amsub n15 amsub_n15 0.0 1 0 + amsubbufr amsub n16 amsub_n16 0.0 1 0 amsubbufr amsub n17 amsub_n17 0.0 1 0 - mhsbufr_skip mhs n18 mhs_n18 0.0 1 0 + mhsbufr mhs n18 mhs_n18 0.0 1 0 mhsbufr mhs metop-a mhs_metop-a 0.0 1 0 + mhsbufr mhs metop-b mhs_metop-b 0.0 1 0 ssmitbufr ssmi f13 ssmi_f13 0.0 1 0 + ssmitbufr ssmi f14 ssmi_f14 0.0 1 0 ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 amsrebufr amsre_low aqua amsre_aqua 0.0 1 0 amsrebufr amsre_mid aqua amsre_aqua 0.0 1 0 amsrebufr amsre_hig aqua amsre_aqua 0.0 1 0 ssmisbufr ssmis f16 ssmis_f16 0.0 1 0 - gsnd1bufr_skip sndrd1 g12 sndrD1_g12 0.0 1 0 - gsnd1bufr_skip sndrd2 g12 sndrD2_g12 0.0 1 0 - gsnd1bufr_skip sndrd3 g12 sndrD3_g12 0.0 1 0 - gsnd1bufr_skip sndrd4 g12 sndrD4_g12 0.0 1 0 - gsnd1bufr_skip sndrd1 g11 sndrD1_g11 0.0 1 0 - gsnd1bufr_skip sndrd2 g11 sndrD2_g11 0.0 1 0 - gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 1 0 - gsnd1bufr_skip sndrd4 g11 sndrD4_g11 0.0 1 0 - gsnd1bufr_skip sndrd1 g13 sndrD1_g13 0.0 1 0 - gsnd1bufr_skip sndrd2 g13 sndrD2_g13 0.0 1 0 - gsnd1bufr_skip sndrd3 g13 sndrD3_g13 0.0 1 0 - gsnd1bufr_skip sndrd4 g13 sndrD4_g13 0.0 1 0 iasibufr iasi metop-a iasi_metop-a 0.0 1 0 gomebufr gome metop-a gome_metop-a 0.0 1 0 + iasibufr iasi metop-b iasi_metop-b 0.0 1 0 omibufr omi aura omi_aura 0.0 1 0 sbuvbufr sbuv2 n19 sbuv8_n19 0.0 1 0 hirs4bufr hirs4 n19 hirs4_n19 0.0 1 0 @@ -2150,51 +771,35 @@ OBS_INPUT:: mhsbufr mhs n19 mhs_n19 0.0 1 0 tcvitl tcp null tcp 0.0 0 0 satwndbufr uv null uv 0.0 0 0 + atmsbufr atms npp atms_npp 0.0 1 0 + crisbufr cris npp cris_npp 0.0 1 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 + seviribufr seviri m08 seviri_m08 0.0 1 0 + seviribufr seviri m09 seviri_m09 0.0 1 0 + seviribufr seviri m10 seviri_m10 0.0 1 0 + seviribufr seviri m11 seviri_m11 0.0 1 0 gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 1 0 gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 1 0 gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 1 0 gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 1 0 - ompsnpbufr ompsnp npp ompsnp_npp 0.0 0 0 - ompstcbufr ompstc8 npp ompstc8_npp 0.0 1 0 + prepbufr mta_cld null mta_cld 1.0 0 0 + prepbufr gos_ctp null gos_ctp 1.0 0 0 + lgycldbufr larccld null larccld 1.0 0 0 :: &SUPEROB_RADAR del_azimuth=5.,del_elev=.25,del_range=5000.,del_time=.5,elev_angle_max=5.,minnum=50,range_max=100000., l2superob_only=.false., - $SUPEROB_RADAR / &LAG_DATA - $LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true., - n_ens=10, - uv_hyb_ens=.true., - beta_s0=0.25, - readin_beta=.false., - readin_beta=.true., - s_ens_h=800, - s_ens_v=5, - generate_ens=.false., - regional_ensemble_option=1, - aniso_a_en=.false., - nlon_ens=0, - nlat_ens=0, - jcap_ens=0, - jcap_ens_test=0, - full_ensemble=.true.,pwgtflg=.true., - $HYBRID_ENSEMBLE / &RAPIDREFRESH_CLDSURF - $RAPIDREFRESH_CLDSURF + dfi_radar_latent_heat_time_period=30.0, / &CHEM - $CHEM / &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=270.,obpres=850.,obdattim=2015031300, - obhourset=0., - $SINGLEOB_TEST / &NST / @@ -2427,7 +1032,7 @@ OBS_INPUT:: &LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=80,uv_hyb_ens=.true.,beta_s0=0.2, + l_hyb_ens=.true.,n_ens=10,uv_hyb_ens=.true.,beta_s0=0.2, readin_beta=.true., s_ens_h=300,s_ens_v=-0.5,readin_localization=.false., generate_ens=.false.,regional_ensemble_option=1,grid_ratio_ens=1, @@ -2530,7 +1135,7 @@ OBS_INPUT:: &LAG_DATA / &HYBRID_ENSEMBLE - l_hyb_ens=.true.,n_ens=80,uv_hyb_ens=.true.,beta_s0=0.2, + l_hyb_ens=.true.,n_ens=10,uv_hyb_ens=.true.,beta_s0=0.2, readin_beta=.true., s_ens_h=150,s_ens_v=-0.5,readin_localization=.false., generate_ens=.false.,regional_ensemble_option=1,grid_ratio_ens=1, @@ -2553,115 +1158,6 @@ OBS_INPUT:: " ;; - global_C96_fv3aero) - -# Define namelist for global run (aerosol analysis) - -export gsi_namelist=" - &SETUP - miter=3, - niter(1)=100,niter(2)=100,niter(3)=1, - niter_no_qc(1)=50,niter_no_qc(2)=0, - write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., - qoption=2, - gencode=0,deltim=400, - factqmin=0.0,factqmax=0.0, - iguess=-1, - tzr_qc=1, - oneobtest=.false.,retrieval=.false.,l_foto=.false., - use_pbl=.false.,use_compress=.true.,nsig_ext=12,gpstop=50., - use_gfs_nemsio=.true.,sfcnst_comb=.true., - use_readin_anl_sfcmask=.false., - lrun_subdirs=.true., - crtm_coeffs_path='./crtm_coeffs/', - newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false., - diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,nhr_obsbin=3, - cwoption=3,imp_physics=11,lupp=.true., - netcdf_diag=.true.,binary_diag=.true., - lobsdiag_forenkf=.false., - diag_aero=.true., use_fv3_aero=.true.,offtime_data=.true., - diag_rad=.false.,diag_pcp=.false.,diag_conv=.false.,diag_ozone=.false., - / - - &GRIDOPTS - JCAP_B=190,JCAP=190,NLAT=194,NLON=384,nsig=64, - regional=.false.,nlayers(63)=3,nlayers(64)=6, - / - - &BKGERR - 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, - bkgv_write=.false., - cwcoveqqcov=.false., - / - - &ANBKGERR - anisotropic=.false., - / - - &JCOPTS - ljcdfi=.false.,alphajc=0.0,ljcpdry=.true.,bamp_jcpdry=5.0e7, - / - - &STRONGOPTS - tlnmc_option=2,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5, - / - - &OBSQC - dfact=0.75,dfact1=3.0,noiqc=.true.,oberrflg=.false.,c_varqc=0.02, - use_poq7=.true.,qc_noirjaco3_pole=.true.,vqc=.true., - aircraft_t_bc=.false.,biaspredt=1000.0,upd_aircraft=.true.,cleanup_tail=.true., - / - - &OBS_INPUT - dmesh(1)=145.0,dmesh(2)=150.0,dmesh(3)=100.0,time_window_max=3.0, - / - -OBS_INPUT:: -! dfile dtype dplat dsis dval dthin dsfcalc - modisaodbufr modis_aod aqua v.modis_aqua 1.0 1 0 - modisaodbufr modis_aod terra v.modis_terra 1.0 1 0 -:: - - &SUPEROB_RADAR - / - - &LAG_DATA - / - - &HYBRID_ENSEMBLE - l_hyb_ens=.false., - generate_ens=.false., - beta_s0=0.125,readin_beta=.false., - s_ens_h=800.,s_ens_v=-0.8,readin_localization=.true., - aniso_a_en=.false.,oz_univ_static=.false.,uv_hyb_ens=.true., - ensemble_path='./ensemble_data/', - ens_fast_read=.true., - / - - &RAPIDREFRESH_CLDSURF - dfi_radar_latent_heat_time_period=30.0, - / - - &CHEM - laeroana_gocart=.true.,aod_qa_limit=-1000, - / - - &SINGLEOB_TEST - maginnov=0.1,magoberr=0.1,oneob_type='t', - oblat=45.,oblon=180.,obpres=1000.,obdattim=2019061718, - obhourset=0., - / - - &NST - nst_gsi=3, - nstinfo=4,fac_dtl=1,fac_tsl=1,zsea1=0,zsea2=0, - /" - -;; *) # EXIT out for unresolved job_name diff --git a/regression/regression_nl_update.sh b/regression/regression_nl_update.sh index d8d52b2169..ddd302c4df 100755 --- a/regression/regression_nl_update.sh +++ b/regression/regression_nl_update.sh @@ -2,22 +2,9 @@ # First, generate new variable to hold the first 6 characters of the experiment. -#if [[ `expr substr $exp $((${#exp}-4)) ${#exp}` = "updat" ]]; then -if [[ `expr substr $exp 1 6` = "global" ]]; then - if [[ `expr substr $exp 8 5` = "4dvar" ]]; then - export SETUP_update="" - export SETUP_enkf="" - elif [[ `expr substr $exp 8 7` = "lanczos" ]]; then - export SETUP_update="" - export SETUP_enkf="" - elif [[ `expr substr $exp 12 6` = "ozonly" ]]; then - export SETUP_update="newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false.,diag_precon=.true.,step_start=1.0e-3,emiss_bc=.true.," - export SETUP_enkf="univaroz=.true.,adp_anglebc=.true.,angord=4,use_edges=.false.,emiss_bc=.true.," - else - export SETUP_update="newpc4pred=.true.,adp_anglebc=.true.,angord=4,passive_bc=.true.,use_edges=.false.,diag_precon=.true.,step_start=1.0e-3,emiss_bc=.true.,cwoption=3," - export SETUP_enkf="univaroz=.true.,adp_anglebc=.true.,angord=4,use_edges=.false.,emiss_bc=.true.," - fi -fi +export SETUP_update="" +export SETUP_enkf="" + if [[ `expr substr $exp 1 4` = "rtma" ]]; then export OBSQC_update="pvis=0.2,pcldch=0.1,scale_cv=1.0,estvisoe=2.61,estcldchoe=2.3716,vis_thres=16000.,cldch_thres=16000.," else @@ -27,10 +14,8 @@ export GRIDOPTS_update="" export BKGVERR_update="" export ANBKGERR_update="" export JCOPTS_update="" -if [[ `expr substr $exp 1 6` = "global" ]]; then - export STRONGOPTS_update="" - export OBSQC_update="vqc=.false.,nvqc=.true.," -fi +export STRONGOPTS_update="" +export OBSQC_update="" export OBSINPUT_update="" export SUPERRAD_update="" export SINGLEOB_update="" diff --git a/regression/regression_param.sh b/regression/regression_param.sh index 65f6774daf..6024dbdb54 100755 --- a/regression/regression_param.sh +++ b/regression/regression_param.sh @@ -1,3 +1,5 @@ +set -x + regtest=$1 case $machine in @@ -6,26 +8,21 @@ case $machine in sub_cmd="sub_hera" memnode=96 numcore=40 + ;; + Orion) + sub_cmd="sub_orion" + memnode=192 + numcore=40 ;; Jet) sub_cmd="sub_jet" memnode=96 numcore=40 ;; - WCOSS) - sub_cmd="sub_wcoss -a GDAS-T2O -d $PWD" - memnode=64 # Phase-2 WCOSS - numcore=24 # Phase-2 WCOSS - ;; - WCOSS_C) - sub_cmd="sub_wcoss_c -a GDAS-T2O -d $PWD" - memnode=64 - numcore=24 - ;; - WCOSS_D) - sub_cmd="sub_wcoss_d -a ibm -d $PWD" - memnode=128 - numcore=28 + wcoss2) + sub_cmd="sub_wcoss2" + memnode=512 + numcore=128 ;; Discover) sub_cmd="sub_discover" @@ -40,11 +37,6 @@ case $machine in esac # Maximum memory per task for above machines -# wcoss_c : 64 Gb / 24 cores = 2.67 Gb / core -# wcoss_d : 128 Gb / 28 cores = 4.57 Gb / core -# theia : 64 Gb / 24 cores = 2.67 Gb / core -# discover: -# cheyenne: # Select minimim memory per core for regression tests export memnode=${memnode:-64} export numcore=${numcore:-24} @@ -52,26 +44,23 @@ export maxmem=$((($memnode*1024*1024)/$numcore)) # Kb / core case $regtest in - global_T62) + global_3dvar) if [[ "$machine" = "Hera" ]]; then - topts[1]="0:50:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:50:00" ; popts[2]="12/9/" ; ropts[2]="/2" + topts[1]="0:15:00" ; popts[1]="12/5/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="12/9/" ; ropts[2]="/2" + elif [[ "$machine" = "Orion" ]]; then + topts[1]="0:15:00" ; popts[1]="12/5/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="12/9/" ; ropts[2]="/2" elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:50:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:50:00" ; popts[2]="12/9/" ; ropts[2]="/2" + topts[1]="0:15:00" ; popts[1]="12/5/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="12/9/" ; ropts[2]="/2" elif [[ "$machine" = "Cheyenne" ]]; then topts[1]="0:30:00" ; popts[1]="16/2/" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:30:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:30:00" ; popts[1]="36/4/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:30:00" ; popts[2]="72/8/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:30:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="28/4/" ; ropts[2]="/2" + elif [[ "$machine" = "wcoss2" ]]; then + topts[1]="0:15:00" ; popts[1]="12/5/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="12/9/" ; ropts[2]="/2" elif [[ "$machine" = "Discover" ]]; then topts[1]="0:30:00" ; popts[1]="36/2" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="72/3" ; ropts[2]="/2" @@ -85,57 +74,21 @@ case $regtest in ;; - global_T62_ozonly) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="12/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/2/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="12/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/2/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="16/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/2/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/2/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="16/1/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="12/2/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="16/1" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="16/2" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="0:45:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - global_4dvar_T62) + global_4dvar) if [[ "$machine" = "Hera" ]]; then topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" + elif [[ "$machine" = "Orion" ]]; then + topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" elif [[ "$machine" = "Jet" ]]; then topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:35:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:25:00" ; popts[2]="16/4/" ; ropts[2]="/2" elif [[ "$machine" = "Cheyenne" ]]; then topts[1]="0:35:00" ; popts[1]="16/2/" ; ropts[1]="/1" topts[2]="0:25:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="1:35:00" ; popts[1]="48/12/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="1:25:00" ; popts[2]="60/15/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then + elif [[ "$machine" = "wcoss2" ]]; then topts[1]="0:15:00" ; popts[1]="28/2/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="28/4/" ; ropts[2]="/2" elif [[ "$machine" = "Discover" ]]; then @@ -147,14 +100,11 @@ case $regtest in topts[1]="0:45:00" if [[ "$machine" = "Hera" ]]; then popts[1]="12/5/" + elif [[ "$machine" = "Orion" ]]; then + popts[1]="12/5/" elif [[ "$machine" = "Jet" ]]; then popts[1]="12/5/" - elif [[ "$machine" = "WCOSS" ]]; then - popts[1]="16/4/" - elif [[ "$machine" = "WCOSS_C" ]]; then - popts[1]="48/12/" - topts[1]="3:00:00" - elif [[ "$machine" = "WCOSS_D" ]]; then + elif [[ "$machine" = "wcoss2" ]]; then popts[1]="28/4/" topts[1]="3:00:00" fi @@ -164,95 +114,26 @@ case $regtest in ;; - global_hybrid_T126) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="0:45:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - global_4denvar_T126) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="1:59:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="1:59:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:35:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:35:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="6/10/" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="2:00:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - global_fv3_4denvar_T126) + global_4denvar) if [[ "$machine" = "Hera" ]]; then - topts[1]="0:35:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" + topts[1]="0:10:00" ; popts[1]="12/8/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/10/" ; ropts[2]="/2" + elif [[ "$machine" = "Orion" ]]; then + topts[1]="0:10:00" ; popts[1]="12/8/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/12/" ; ropts[2]="/2" elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:35:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="1:59:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" + topts[1]="0:10:00" ; popts[1]="12/8/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/10/" ; ropts[2]="/2" elif [[ "$machine" = "Discover" ]]; then topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" elif [[ "$machine" = "Cheyenne" ]]; then topts[1]="1:59:00" ; popts[1]="6/8/" ; ropts[1]="/1" topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:35:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:35:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:35:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" + elif [[ "$machine" = "wcoss2" ]]; then + topts[1]="0:10:00" ; popts[1]="12/8/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/10/" ; ropts[2]="/2" fi if [ "$debug" = ".true." ] ; then @@ -263,135 +144,27 @@ case $regtest in ;; - global_fv3_4denvar_C192) + rrfs_3denvar_glbens) if [[ "$machine" = "Hera" ]]; then - topts[1]="0:35:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" + topts[1]="0:15:00" ; popts[1]="20/1/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="20/2/" ; ropts[2]="/1" + elif [[ "$machine" = "Orion" ]]; then + topts[1]="0:15:00" ; popts[1]="20/1/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="20/2/" ; ropts[2]="/1" elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:35:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="1:59:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="1:59:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:35:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:35:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:35:00" ; popts[1]="6/8/" ; ropts[1]="/1" - topts[2]="0:35:00" ; popts[2]="6/10/" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="1:30:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - global_lanczos_T62) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:30:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="12/5/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:30:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="12/5/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:20:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:20:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:20:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:20:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:20:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:20:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:20:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:20:00" ; popts[2]="28/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="0:45:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - global_nemsio_T62) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/9/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/9/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:30:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:30:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="0:45:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - arw_binary | arw_netcdf) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="4/4/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="6/6/" ; ropts[2]="/1" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="4/4/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="6/6/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/2/" ; ropts[2]="/1" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="16/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/2/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="20/2/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="1024/1" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="28/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/2/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="16/1" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="20/2" ; ropts[2]="/2" + topts[1]="0:15:00" ; popts[1]="20/1/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="20/2/" ; ropts[2]="/1" + elif [[ "$machine" = "wcoss2" ]]; then + topts[1]="0:15:00" ; popts[1]="64/1/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="128/2/" ; ropts[2]="/1" fi if [ "$debug" = ".true." ] ; then topts[1]="0:30:00" fi - scaling[1]=4; scaling[2]=10; scaling[3]=4 + scaling[1]=2; scaling[2]=10; scaling[3]=4 ;; @@ -400,16 +173,13 @@ case $regtest in if [[ "$machine" = "Hera" ]]; then topts[1]="0:15:00" ; popts[1]="4/4/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="6/6/" ; ropts[2]="/1" + elif [[ "$machine" = "Orion" ]]; then + topts[1]="0:15:00" ; popts[1]="4/4/" ; ropts[1]="/1" + topts[2]="0:15:00" ; popts[2]="6/6/" ; ropts[2]="/1" elif [[ "$machine" = "Jet" ]]; then topts[1]="0:15:00" ; popts[1]="4/4/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="6/6/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/2/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="20/2/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="1024/1" - elif [[ "$machine" = "WCOSS_D" ]]; then + elif [[ "$machine" = "wcoss2" ]]; then topts[1]="0:15:00" ; popts[1]="28/1/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="28/2/" ; ropts[2]="/1" fi @@ -422,129 +192,27 @@ case $regtest in ;; - nmm_binary ) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:30:00" ; popts[1]="6/6/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="8/8/" ; ropts[2]="/1" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:30:00" ; popts[1]="6/6/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="8/8/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:30:00" ; popts[1]="7/12/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/12/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:30:00" ; popts[1]="7/12/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/12/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:30:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:30:00" ; popts[2]="60/10/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:30:00" ; popts[1]="7/24/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/24/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="48/2" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="60/3" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="1:00:00" - fi - - scaling[1]=8; scaling[2]=10; scaling[3]=8 - - ;; - - nmm_netcdf) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="4/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="4/4/" ; ropts[2]="/1" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="4/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="4/4/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="8/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/1/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="8/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/1/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="8/2/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="14/1/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/2/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="8/1" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="16/1" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="0:30:00" - fi - - scaling[1]=5; scaling[2]=10; scaling[3]=2 - -;; - - nmmb_nems_4denvar) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:30:00" ; popts[1]="7/10/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/10/" ; ropts[2]="/1" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:30:00" ; popts[1]="7/10/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/10/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:30:00" ; popts[1]="7/10/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/10/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:30:00" ; popts[1]="7/10/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="9/10/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="1:30:00" ; popts[1]="72/9/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="1:30:00" ; popts[2]="96/12/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="7/14/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="9/14/" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="1:00:00" - fi - - scaling[1]=8; scaling[2]=10; scaling[3]=8 - -;; - rtma) if [[ "$machine" = "Hera" ]]; then topts[1]="0:30:00" ; popts[1]="6/12/" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="8/12/" ; ropts[2]="/1" - elif [[ "$machine" = "Jet" ]]; then + elif [[ "$machine" = "Orion" ]]; then topts[1]="0:30:00" ; popts[1]="6/12/" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="8/12/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:30:00" ; popts[1]="8/10/" ; ropts[1]="/1" + elif [[ "$machine" = "Jet" ]]; then + topts[1]="0:30:00" ; popts[1]="6/12/" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="8/12/" ; ropts[2]="/1" elif [[ "$machine" = "Cheyenne" ]]; then topts[1]="0:15:00" ; popts[1]="8/6/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="8/8/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="1:15:00" ; popts[1]="48/6/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="1:15:00" ; popts[2]="64/8/" ; ropts[2]="1024/1" - elif [[ "$machine" = "WCOSS_D" ]]; then + elif [[ "$machine" = "wcoss2" ]]; then topts[1]="0:30:00" ; popts[1]="14/8/" ; ropts[1]="/1" topts[2]="0:30:00" ; popts[2]="14/14/" ; ropts[2]="/2" fi if [ "$debug" = ".true." ] ; then topts[1]="3:00:00" - if [[ "$machine" = "WCOSS_C" ]]; then - popts[1]="64/8/" - fi fi scaling[1]=10; scaling[2]=10; scaling[3]=2 @@ -556,19 +224,16 @@ case $regtest in if [[ "$machine" = "Hera" ]]; then topts[1]="0:20:00" ; popts[1]="6/6/" ; ropts[1]="/1" topts[2]="0:20:00" ; popts[2]="8/8/" ; ropts[2]="/1" - elif [[ "$machine" = "Jet" ]]; then + elif [[ "$machine" = "Orion" ]]; then topts[1]="0:20:00" ; popts[1]="6/6/" ; ropts[1]="/1" topts[2]="0:20:00" ; popts[2]="8/8/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS" ]]; then + elif [[ "$machine" = "Jet" ]]; then topts[1]="0:20:00" ; popts[1]="6/6/" ; ropts[1]="/1" topts[2]="0:20:00" ; popts[2]="8/8/" ; ropts[2]="/1" elif [[ "$machine" = "Cheyenne" ]]; then topts[1]="0:20:00" ; popts[1]="6/6/" ; ropts[1]="/1" topts[2]="0:20:00" ; popts[2]="8/8/" ; ropts[2]="/1" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="1:20:00" ; popts[1]="48/8/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="1:20:00" ; popts[2]="60/10/" ; ropts[2]="1024/1" - elif [[ "$machine" = "WCOSS_D" ]]; then + elif [[ "$machine" = "wcoss2" ]]; then topts[1]="0:15:00" ; popts[1]="10/10/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="14/14/" ; ropts[2]="/2" fi @@ -581,26 +246,23 @@ case $regtest in ;; - global_enkf_T62) + global_enkf) if [[ "$machine" = "Hera" ]]; then - topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" + topts[1]="0:10:00" ; popts[1]="12/3/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/5/" ; ropts[2]="/2" + elif [[ "$machine" = "Orion" ]]; then + topts[1]="0:10:00" ; popts[1]="12/3/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/5/" ; ropts[2]="/2" elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:15:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="12/5/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" + topts[1]="0:10:00" ; popts[1]="12/3/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="12/5/" ; ropts[2]="/2" elif [[ "$machine" = "Cheyenne" ]]; then topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:25:00" ; popts[1]="20/4/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:25:00" ; popts[2]="20/5/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" + elif [[ "$machine" = "wcoss2" ]]; then + topts[1]="0:10:00" ; popts[1]="16/2/" ; ropts[1]="/1" + topts[2]="0:10:00" ; popts[2]="16/4/" ; ropts[2]="/2" fi if [ "$debug" = ".true." ] ; then @@ -611,72 +273,6 @@ case $regtest in ;; - global_C96_fv3aero) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:30:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="12/9/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:30:00" ; popts[1]="12/3/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="12/9/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="36/4/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="72/8/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:15:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="28/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="20/4" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="40/2" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="0:45:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - - global_C96_fv3aerorad) - - if [[ "$machine" = "Hera" ]]; then - topts[1]="0:20:00" ; popts[1]="16/4/" ; ropts[1]="/1" - topts[2]="0:20:00" ; popts[2]="16/8/" ; ropts[2]="/2" - elif [[ "$machine" = "Jet" ]]; then - topts[1]="0:20:00" ; popts[1]="16/4/" ; ropts[1]="/1" - topts[2]="0:20:00" ; popts[2]="16/8/" ; ropts[2]="/2" - elif [[ "$machine" = "Cheyenne" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS" ]]; then - topts[1]="0:15:00" ; popts[1]="16/2/" ; ropts[1]="/1" - topts[2]="0:15:00" ; popts[2]="16/4/" ; ropts[2]="/2" - elif [[ "$machine" = "WCOSS_C" ]]; then - topts[1]="0:15:00" ; popts[1]="36/4/" ; ropts[1]="1024/1" # sub_wcoss_c popts are "#tasks/#nodes/" - topts[2]="0:15:00" ; popts[2]="72/8/" ; ropts[2]="1024/2" - elif [[ "$machine" = "WCOSS_D" ]]; then - topts[1]="0:30:00" ; popts[1]="28/2/" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="28/4/" ; ropts[2]="/2" - elif [[ "$machine" = "Discover" ]]; then - topts[1]="0:30:00" ; popts[1]="20/4" ; ropts[1]="/1" - topts[2]="0:30:00" ; popts[2]="40/2" ; ropts[2]="/2" - fi - - if [ "$debug" = ".true." ] ; then - topts[1]="1:00:00" - fi - - scaling[1]=10; scaling[2]=8; scaling[3]=4 - - ;; - *) # EXIT out for unresolved regtest echo "unknown $regtest" @@ -712,6 +308,9 @@ if [[ "$machine" = "Hera" ]]; then export MPI_BUFS_PER_HOST=256 export MPI_GROUP_MAX=256 export APRUN="srun" +elif [[ "$machine" = "Orion" ]]; then + export OMP_STACKSIZE=2048M + export APRUN="srun -n \$ntasks" elif [[ "$machine" = "Jet" ]]; then export OMP_STACKSIZE=1024M export MPI_BUFS_PER_PROC=256 @@ -724,23 +323,12 @@ elif [[ "$machine" = "Cheyenne" ]]; then export MPI_BUFS_PER_HOST=256 export MPI_GROUP_MAX=256 export APRUN="mpirun -v -np \$NCPUS" -elif [[ "$machine" = "WCOSS" ]]; then - export MP_USE_BULK_XFER=yes - export MP_BULK_MIN_MSG_SIZE=64k - export APRUN="mpirun.lsf" - if [ "$debug" = ".true." ] ; then - export MP_DEBUG_NOTIMEOUT=yes - fi -elif [[ "$machine" = "WCOSS_C" ]]; then - export KMP_AFFINITY=disabled +elif [[ "$machine" = "wcoss2" ]]; then + export OMP_PLACES=cores export OMP_STACKSIZE=2G export FORT_BUFFERED=true - export APRUN="mpirun -v -np \$PBS_NP" -elif [[ "$machine" = "WCOSS_D" ]]; then - export KMP_AFFINITY=scatter - export KMP_STACKSIZE=2G - export FORT_BUFFERED=true - export APRUN="mpirun" + export FI_OFI_RXM_SAR_LIMIT=3145728 + export APRUN="mpiexec -n \$ntasks -ppn \$ppn --cpu-bind core --depth \$threads" elif [[ "$machine" = "Discover" ]]; then export APRUN="mpiexec_mpt -np \$SLURM_NTASKS" fi diff --git a/regression/regression_test.sh b/regression/regression_test.sh index f9a736c05b..0bcb9f4d90 100755 --- a/regression/regression_test.sh +++ b/regression/regression_test.sh @@ -8,10 +8,6 @@ exp1=$1 exp2=$3 exp3=$2 -#exp1=$global_T62_updat_exp1 -#exp2=$global_T62_contrl_exp1 -#exp3=$global_T62_updat_exp2 - input=$5 #input=tmp62 @@ -50,6 +46,9 @@ for exp in $list; do $ncp $savdir/$exp/wrf_inout ./wrf_inout.$exp $ncp $savdir/$exp/wrf_inout06 ./wrf_inout06.$exp $ncp $savdir/$exp/siginc.nc ./siginc.nc.$exp + $ncp $savdir/$exp/fv3_dynvars ./fv3_dynvars.$exp + $ncp $savdir/$exp/fv3_sfcdata ./fv3_sfcdata.$exp + $ncp $savdir/$exp/fv3_tracer ./fv3_tracer.$exp done # Grep out penalty/gradient information, run time, and maximum resident memory from stdout file @@ -73,9 +72,6 @@ diff penalty.$exp1.txt penalty.$exp3.txt > penalty.${exp1}-${exp3}.txt exp1_scale=$2 exp2_scale=$4 -#exp1_scale=$global_T62_updat_exp2 -#exp2_scale=$global_T62_contrl_exp2 - # Copy stdout for additional scalability testing list="$exp1_scale $exp2_scale" for exp_scale in $list; do @@ -227,18 +223,18 @@ fi if [[ $(grep -c 'cost,grad,step' penalty.${exp1}-${exp2}.txt) = 0 ]]; then if [[ $(grep -c 'congrad::evaljgrad: grepcost' penalty.${exp1}-${exp2}.txt) = 0 ]]; then - echo 'The results between the two runs ('${exp1}' and '${exp2}') are reproducible.' + echo 'The results (penalty) between the two runs ('${exp1}' and '${exp2}') are reproducible.' # echo 'since the corresponding penalties and gradients are identical with '$(grep -c 'cost,grad,step' penalty.${exp1}-${exp2}.txt)' lines different.' echo else - echo 'The results between the two runs are nonreproducible,' + echo 'The results (penalty) between the two runs are nonreproducible,' echo 'thus the regression test has Failed on cost for '${exp1}' and '${exp2}' analyses.' # echo 'thus the regression test has failed for '${exp1}' and '${exp2}' analyses with '$(grep -c 'cost,grad,step' penalty.${exp1}-${exp2}.txt)' lines different.' echo failed_test=1 fi else - echo 'The results between the two runs are nonreproducible,' + echo 'The results (penalty) between the two runs are nonreproducible,' echo 'thus the regression test has Failed on cost for '${exp1}' and '${exp2}' analyses.' echo fi @@ -351,6 +347,40 @@ else fi } >> $output fi + + elif [[ `expr substr $exp1 1 4` = "rrfs" ]]; then +{ + fv3_failed_test=0 + if cmp -s fv3_dynvars.${exp1} fv3_dynvars.${exp2} + then + echo 'The fv3_dynvars are reproducible' + else + fv3_failed_test=1 + fi + if cmp -s fv3_sfcdata.${exp1} fv3_sfcdata.${exp2} + then + echo 'The fv3_sfcdata are reproducible' + else + fv3_failed_test=1 + fi + if cmp -s fv3_tracer.${exp1} fv3_tracer.${exp2} + then + echo 'The fv3_tracer are reproducible' + else + fv3_failed_test=1 + fi + if [[ $fv3_failed_test -eq 0 ]] + then + echo 'The results between the two runs ('${exp1}' and '${exp2}') are reproducible' + echo 'since the corresponding results are identical.' + echo + else + echo 'The results between the two runs ('${exp1}' and '${exp2}') are not reproducible' + echo 'Thus, the case has Failed siganl of the regression tests.' + echo + failed_test=1 + fi +} >> $output fi # Next, reproducibility between exp1 and exp3 @@ -359,18 +389,18 @@ fi if [[ $(grep -c 'cost,grad,step' penalty.${exp1}-${exp3}.txt) = 0 ]]; then if [[ $(grep -c 'congrad::evaljgrad: grepcost' penalty.${exp1}-${exp3}.txt) = 0 ]]; then - echo 'The results between the two runs ('${exp1}' and '${exp3}') are reproducible' + echo 'The results (penalty) between the two runs ('${exp1}' and '${exp3}') are reproducible' # echo 'since the corresponding penalties and gradients are identical with '$(grep -c 'cost,grad,step' penalty.${exp1}-${exp3}.txt)' lines different.' echo else - echo 'The results between the two runs are nonreproducible,' + echo 'The results (penalty) between the two runs are nonreproducible,' echo 'thus the regression test has Failed cost for '${exp1}' and '${exp3}' analyses.' # echo 'thus the regression test has failed for '${exp1}' and '${exp3}' analyses with '$(grep -c 'cost,grad,step' penalty.${exp1}-${exp3}.txt)' lines different.' echo failed_test=1 fi else - echo 'The results between the two runs are nonreproducible,' + echo 'The results (penalty) between the two runs are nonreproducible,' echo 'thus the regression test has Failed cost for '${exp1}' and '${exp3}' analyses.' echo fi @@ -450,6 +480,7 @@ elif [[ `expr substr $exp1 1 6` = "global" ]]; then fi } >> $output + elif [[ -f siganl.${exp1} ]]; then { @@ -467,6 +498,7 @@ elif [[ `expr substr $exp1 1 6` = "global" ]]; then fi } >> $output + elif [[ -f siginc.nc.${exp1} ]]; then { @@ -487,6 +519,41 @@ elif [[ `expr substr $exp1 1 6` = "global" ]]; then } >> $output fi + +elif [[ `expr substr $exp1 1 4` = "rrfs" ]]; then +{ + fv3_failed_test=0 + if cmp -s fv3_dynvars.${exp1} fv3_dynvars.${exp3} + then + echo 'The fv3_dynvars are reproducible' + else + fv3_failed_test=1 + fi + if cmp -s fv3_sfcdata.${exp1} fv3_sfcdata.${exp3} + then + echo 'The fv3_sfcdata are reproducible' + else + fv3_failed_test=1 + fi + if cmp -s fv3_tracer.${exp1} fv3_tracer.${exp3} + then + echo 'The fv3_tracer are reproducible' + else + fv3_failed_test=1 + fi + if [[ $fv3_failed_test -eq 0 ]] + then + echo 'The results between the two runs ('${exp1}' and '${exp3}') are reproducible' + echo 'since the corresponding results are identical.' + echo + else + echo 'The results between the two runs ('${exp1}' and '${exp3}') are not reproducible' + echo 'Thus, the case has Failed siganl of the regression tests.' + echo + failed_test=1 + fi +} >> $output + fi # Finally, scalability @@ -509,11 +576,20 @@ mkdir -p $vfydir $ncp $output $vfydir/ +# Final check for any failed tests +count=$(grep -i "fail" $output |wc -l) +if [ $count -gt 0 ]; then + (( failed_test = $failed_test + $count )) +fi + +# Remove job log files is no failures detected cd $scripts -rm -f ${exp1}.out -rm -f ${exp2}.out -rm -f ${exp3}.out -rm -f ${exp2_scale}.out +if [ $count -eq 0 ]; then + rm -f ${exp1}.out + rm -f ${exp2}.out + rm -f ${exp3}.out + rm -f ${exp2_scale}.out +fi if [[ "$clean" = ".true." ]]; then rm -rf $savdir diff --git a/regression/regression_test_enkf.sh b/regression/regression_test_enkf.sh index adaff2f2fc..f52a5d451f 100755 --- a/regression/regression_test_enkf.sh +++ b/regression/regression_test_enkf.sh @@ -32,17 +32,18 @@ cd $tmpdir # Other required constants for regression testing maxtime=1200 maxmem=${maxmem:-3400000} # set in regression_param +maxmem=$((${memnode:-64}*1024*1024)) -# Copy stdout and sanl files +# Copy stdout and incr files # from $savdir to $tmpdir list="$exp1 $exp2 $exp3" for exp in $list; do $ncp $savdir/$exp/stdout ./stdout.$exp - nmem=20 + nmem=10 imem=1 while [[ $imem -le $nmem ]]; do member="_mem"`printf %03i $imem` - $ncp $savdir/$exp/sanl_${global_enkf_T62_adate}_fhr06$member $tmpdir/sanl$member.$exp + $ncp $savdir/$exp/incr_${global_adate}_fhr06$member $tmpdir/incr$member.$exp (( imem = $imem + 1 )) done done @@ -63,9 +64,6 @@ diff increment.$exp1.txt increment.$exp3.txt > increment.${exp1}-${exp3}.txt exp1_scale=$2 exp2_scale=$4 -#exp1_scale=$global_T62_updat_exp2 -#exp2_scale=$global_T62_contrl_exp2 - # Copy stdout for additional scalability testing list="$exp1_scale $exp2_scale" for exp_scale in $list; do @@ -280,14 +278,17 @@ fi } >> $output else { -nmem=20 +nmem=10 imem=1 while [[ $imem -le $nmem ]]; do member="_mem"`printf %03i $imem` - if ! cmp -s sanl$member.${exp1} sanl$member.${exp2} -then - echo 'sanl'$member'.'${exp1}' sanl'$member'.'${exp2}' are NOT identical' -fi + ncdump incr$member.${exp1} > incr$member.${exp1}.out + ncdump incr$member.${exp2} > incr$member.${exp2}.out + if [ ! diff incr$member.${exp1}.out incr$member.${exp2}.out ]; then + echo 'incr'$member'.'${exp1}' incr'$member'.'${exp2}' are NOT identical' + else + rm -f incr$member.${exp1}.out incr$member.${exp2}.out + fi (( imem = $imem + 1 )) done echo @@ -377,15 +378,18 @@ else else { - nmem=20 + nmem=10 imem=1 while [[ $imem -le $nmem ]]; do member="_mem"`printf %03i $imem` - if ! cmp -s sanl$member.${exp1} sanl$member.${exp3} - then - echo 'sanl'$member'.'${exp1}' sanl'$member'.'${exp3}' are NOT identical' + ncdump incr$member.${exp1} > incr$member.${exp1}.out + ncdump incr$member.${exp3} > incr$member.${exp3}.out + if [ ! diff incr$member.${exp1}.out incr$member.${exp3}.out ]; then + echo 'incr'$member'.'${exp1}' incr'$member'.'${exp3}' are NOT identical' + else + rm -f incr$member.${exp1}.out incr$member.${exp3}.out fi - (( imem = $imem + 1 )) + (( imem = $imem + 1 )) done echo } >> $output @@ -413,11 +417,20 @@ mkdir -p $vfydir $ncp $output $vfydir/ +# Final check for any failed tests +count=$(grep -i "fail" $output |wc -l) +if [ $count -gt 0 ]; then + (( failed_test = $failed_test + $count )) +fi + +# Remove job log files is no failures detected cd $scripts -rm -f ${exp1}.out -rm -f ${exp2}.out -rm -f ${exp3}.out -rm -f ${exp2_scale}.out +if [ $count -eq 0 ]; then + rm -f ${exp1}.out + rm -f ${exp2}.out + rm -f ${exp3}.out + rm -f ${exp2_scale}.out +fi if [[ "$clean" = ".true." ]]; then rm -rf $savdir diff --git a/regression/regression_var.sh b/regression/regression_var.sh index 4951ab31f5..05b5563ef1 100755 --- a/regression/regression_var.sh +++ b/regression/regression_var.sh @@ -17,7 +17,8 @@ if [ "$#" = 7 ] ; then export ush="$gsisrc/ush" export cmaketest="true" export clean="false" - export ptmpName=`echo $builddir | sed -e "s/\//_/g"` + dir_root="${builddir%/*}" + export ptmpName="${dir_root##*/}" else # Name of the branch being tested updat="XXXXXXXX" @@ -28,18 +29,12 @@ else fi # Determine the machine -if [[ -d /dcom && -d /hwrf ]]; then # WCOSS - export machine="WCOSS" -elif [[ -d /glade ]]; then # Cheyenne +if [[ -d /glade ]]; then # Cheyenne export machine="Cheyenne" elif [[ -d /scratch1 ]]; then # Hera export machine="Hera" -elif [[ -d /jetmon ]]; then # Jet +elif [[ -d /mnt/lfs4 || -d /jetmon || -d /mnt/lfs1 ]]; then # Jet export machine="Jet" -elif [[ -d /cm ]]; then # LUNA or SURGE - export machine="WCOSS_C" -elif [[ -d /ioddev_dell ]]; then # venus or mars - export machine="WCOSS_D" elif [[ -d /discover ]]; then # NCCS Discover export machine="Discover" elif [[ -d /sw/gaea ]]; then # Gaea @@ -48,45 +43,12 @@ elif [[ -d /data/prod ]]; then # S4 export machine="S4" elif [[ -d /work ]]; then # Orion export machine="Orion" +elif [[ -d /lfs/h2 ]]; then # wcoss2 + export machine="wcoss2" fi echo "Running Regression Tests on '$machine'"; case $machine in - WCOSS_D) - export noscrub=/gpfs/dell2/emc/modeling/noscrub/$LOGNAME - export group="dev" - export queue="dev" - - export ptmp="/gpfs/dell2/ptmp/$LOGNAME/$ptmpName" - - export fixcrtm="/gpfs/dell2/emc/modeling/noscrub/Michael.Lueken/fix_update" - export casesdir="/gpfs/dell2/emc/modeling/noscrub/Michael.Lueken/CASES" - - export check_resource="yes" - - export accnt="" - ;; - WCOSS) - if [ -d /da/noscrub/$LOGNAME ]; then - export noscrub=/da/noscrub/$LOGNAME - elif [ -d /global/noscrub/$LOGNAME ]; then - export noscrub=/global/noscrub/$LOGNAME - fi - if [[ "$cmaketest" = "false" ]]; then - export basedir="/global/save/$LOGNAME/gsi" - fi - export group="dev" - export queue="dev" - - export ptmp="/ptmpp1/$LOGNAME/$ptmpName" - - export fixcrtm="/da/save/Michael.Lueken/CRTM_REL-2.2.3/crtm_v2.2.3/fix_update" - export casesdir="/da/noscrub/Michael.Lueken/CASES" - - export check_resource="yes" - - export accnt="" - ;; Cheyenne) export queue="economy" export noscrub="/glade/scratch/$LOGNAME" @@ -96,84 +58,97 @@ case $machine in fi export ptmp="/glade/scratch/$LOGNAME/$ptmpName" - export fixcrtm="/glade/p/ral/jntp/tools/crtm/2.2.3/fix_update" export casesdir="/glade/p/ral/jntp/tools/CASES" export check_resource="no" export accnt="p48503002" ;; + wcoss2) + export local_or_default="${local_or_default:-/lfs/h2/emc/da/noscrub/$LOGNAME}" + if [ -d $local_or_default ]; then + export noscrub="$local_or_default/noscrub" + elif [ -d /lfs/h2/emc/global/noscrub/$LOGNAME ]; then + export noscrub="/lfs/h2/emc/global/noscrub/$LOGNAME/noscrub" + fi + + export queue="${queue:-dev}" + export group="${group:-global}" + if [[ "$cmaketest" = "false" ]]; then + export basedir="/lfs/h2/emc/da/noscrub/$LOGNAME/gsi" + fi + export ptmp="${ptmp:-/lfs/h2/emc/ptmp/$LOGNAME/$ptmpName}" + + export casesdir="/lfs/h2/emc/da/noscrub/russ.treadon/CASES/regtest" + + export check_resource="no" + export accnt="${accnt:-GFS-DEV}" + ;; + Orion) + export local_or_default="${local_or_default:-/work/noaa/da/$LOGNAME}" + if [ -d $local_or_default ]; then + export noscrub="$local_or_default/noscrub" + elif [ -d /work/noaa/global/$LOGNAME ]; then + export noscrub="/work/noaa/global/$LOGNAME/noscrub" + fi + + export queue="${queue:-batch}" + export group="${group:-global}" + if [[ "$cmaketest" = "false" ]]; then + export basedir="/work/noaa/da/$LOGNAME/gsi" + fi + export ptmp="${ptmp:-/work/noaa/stmp/$LOGNAME/$ptmpName}" + + export casesdir="/work/noaa/da/rtreadon/CASES/regtest" + + export check_resource="no" + export accnt="${accnt:-da-cpu}" + ;; Hera) - if [ -d /scratch1/NCEPDEV/da/$LOGNAME ]; then - export noscrub="/scratch1/NCEPDEV/da/$LOGNAME/noscrub" + + export local_or_default="${local_or_default:-/scratch1/NCEPDEV/da/$LOGNAME}" + if [ -d $local_or_default ]; then + export noscrub="$local_or_default/noscrub" elif [ -d /scratch1/NCEPDEV/global/$LOGNAME ]; then export noscrub="/scratch1/NCEPDEV/global/$LOGNAME/noscrub" elif [ -d /scratch2/BMC/gsienkf/$LOGNAME ]; then export noscrub="/scratch2/BMC/gsienkf/$LOGNAME" fi - export group="global" - export queue="batch" + export group="${group:-global}" + export queue="${queue:-batch}" if [[ "$cmaketest" = "false" ]]; then export basedir="/scratch1/NCEPDEV/da/$LOGNAME/git/gsi" fi - export ptmp="/scratch1/NCEPDEV/stmp2/$LOGNAME/$ptmpName" + export ptmp="${ptmp:-/scratch1/NCEPDEV/stmp2/$LOGNAME/$ptmpName}" - export fixcrtm="/scratch1/NCEPDEV/da/Michael.Lueken/CRTM_REL-2.2.3/crtm_v2.2.3/fix_update" - export casesdir="/scratch1/NCEPDEV/da/Michael.Lueken/noscrub/CASES" + export casesdir="/scratch1/NCEPDEV/da/Russ.Treadon/CASES/regtest" export check_resource="no" - - export accnt="da-cpu" + export accnt="${accnt:-da-cpu}" # On Hera, there are no scrubbers to remove old contents from stmp* directories. # After completion of regression tests, will remove the regression test subdirecories - export clean=".true." + export clean=".false." ;; Jet) export noscrub=/lfs1/NESDIS/nesdis-rdo2/$LOGNAME/noscrub export ptmp=/lfs1/NESDIS/nesdis-rdo2/$LOGNAME/ptmp - export fixcrtm="/lfs1/NESDIS/nesdis-rdo2/David.Huber/save/CRTM_REL-2.2.3/crtm_v2.2.3/fix_update" - export casesdir="/lfs1/NESDIS/nesdis-rdo2/David.Huber/save/CASES" + export casesdir="/lfs1/NESDIS/nesdis-rdo2/David.Huber/save/CASES/regtest" export check_resource="no" export accnt="nesdis-rdo2" export group="global" export queue="batch" if [[ "$cmaketest" = "false" ]]; then - export basedir="/lfs1/NESDIS/nesdis-rdo2/$LOGNAME/gsi" + export basedir="/lfs1/NESDIS/nesdis-rdo2/$LOGNAME/save/git/gsi" fi - export ptmp="/lfs1/NESDIS/nesdis-rdo2/$LOGNAME/ptmp/$ptmpName" - # On Jet, there are no scrubbers to remove old contents from stmp* directories. # After completion of regression tests, will remove the regression test subdirecories export clean=".true." ;; - WCOSS_C) - if [ -d /gpfs/hps3/emc/global/noscrub/$LOGNAME ]; then - export noscrub="/gpfs/hps3/emc/global/noscrub/$LOGNAME" - elif [ -d /gpfs/hps3/emc/da/noscrub/$LOGNAME ]; then - export noscrub="/gpfs/hps3/emc/da/noscrub/$LOGNAME" - elif [ -d /gpfs/hps3/emc/hwrf/noscrub/$LOGNAME ]; then - export noscrub="/gpfs/hps3/emc/hwrf/noscrub/$LOGNAME" - fi - if [[ "$cmaketest" = "false" ]]; then - export basedir="/gpfs/hps3/emc/global/noscrub/$LOGNAME/svn/gsi" - fi - export group="dev" - export queue="dev" - - export ptmp="/gpfs/hps/ptmp/$LOGNAME/$ptmpName" - - export fixcrtm="/gpfs/hps3/emc/da/noscrub/Michael.Lueken/CRTM_REL-2.2.3/fix_update" - export casesdir="/gpfs/hps3/emc/da/noscrub/Michael.Lueken/CASES" - - export check_resource="no" - - export accnt="" - ;; Discover) if [[ "$cmaketest" = "false" ]]; then echo "Regression tests on Discover need to be run via ctest" @@ -182,7 +157,6 @@ case $machine in export ptmp=$basedir export ptmp=$basedir export noscrub=$basedir - export fixcrtm="/discover/nobackup/projects/gmao/share/gmao_ops/fvInput_4dvar/gsi/etc/fix_ncep20170329/REL-2.2.3-r60152_local-rev_1/CRTM_Coeffs/$endianness" export casesdir="/discover/nobackup/projects/gmao/obsdev/wrmccart/NCEP_regression/CASES" export check_resource="no" export accnt="g0613" @@ -195,18 +169,6 @@ case $machine in ;; esac -if [[ "$cmaketest" = "false" ]]; then - export builddir=$noscrub/build - export gsisrc="$basedir/$updat/src" - export gsiexec_updat="$gsisrc/global_gsi.x" - export gsiexec_contrl="$basedir/$contrl/src/global_gsi.x" - export enkfexec_updat="$gsisrc/enkf/global_enkf.x" - export enkfexec_contrl="$basedir/$contrl/src/enkf/global_enkf.x" - export fixgsi="$basedir/$updat/fix" - export scripts="$basedir/$updat/regression" - export ush="$basedir/$updat/ush" -fi - # We are dealing with *which* endian files export endianness="Big_Endian" @@ -220,65 +182,23 @@ export savdir="$ptmp" export JCAP="62" # Case Study analysis dates -export global_T62_adate="2016120300" -export global_4dvar_T62_adate="2014080400" -export global_hybrid_T126_adate="2014092912" -export global_4denvar_T126_adate="2019041500" -export global_fv3_4denvar_T126_adate="2018110500" -export global_fv3_4denvar_C192_adate="2019061006" -export global_enkf_T62_adate="2014092912" -export global_lanczos_T62_adate="2014080400" -export global_nemsio_T62_adate="2013011400" -export nmmb_nems_adate="2015061000" -export arw_binary_adate="2010072412" -export arw_netcdf_adate="2008051112" -export nmm_binary_adate="2010021600" -export nmm_netcdf_adate="2007122000" +export global_adate="2022110900" export rtma_adate="2020022420" export hwrf_nmm_adate="2012102812" export fv3_netcdf_adate="2017030100" -export global_C96_fv3aero_adate="2019062200" -export global_C96_fv3aerorad_adate="2019062200" +export rrfs_3denvar_glbens_adate="2021072518" # Paths for canned case data. -export global_T62_obs="$casesdir/global/sigmap/$global_T62_adate" -export global_T62_ges="$casesdir/global/sigmap/$global_T62_adate" -export global_4dvar_T62_obs="$casesdir/global/sigmap/$global_4dvar_T62_adate" -export global_4dvar_T62_ges="$casesdir/global/sigmap/$global_4dvar_T62_adate" -export global_hybrid_T126_datobs="$casesdir/global/sigmap/$global_hybrid_T126_adate/obs" -export global_4denvar_T126_datges="$casesdir/global/sigmap/$global_4denvar_T126_adate" -export global_4denvar_T126_datobs="$casesdir/global/sigmap/$global_4denvar_T126_adate" -export global_fv3_4denvar_T126_datges="$casesdir/global/fv3/$global_fv3_4denvar_T126_adate" -export global_fv3_4denvar_T126_datobs=$global_fv3_4denvar_T126_datges -export global_fv3_4denvar_C192_datges="$casesdir/global/fv3/$global_fv3_4denvar_C192_adate" -export global_fv3_4denvar_C192_datobs=$global_fv3_4denvar_C192_datges -export global_hybrid_T126_datges="$casesdir/global/sigmap/$global_hybrid_T126_adate/ges" -export global_enkf_T62_datobs="$casesdir/global/sigmap/$global_enkf_T62_adate/new_obs" -export global_enkf_T62_datges="$casesdir/global/sigmap/$global_enkf_T62_adate/ges" -export global_lanczos_T62_obs="$casesdir/global/sigmap/$global_lanczos_T62_adate" -export global_lanczos_T62_ges="$casesdir/global/sigmap/$global_lanczos_T62_adate" -export global_nemsio_T62_obs="$casesdir/global/sigmap/$global_nemsio_T62_adate" -export global_nemsio_T62_ges="$casesdir/global/sigmap_nemsio/$global_nemsio_T62_adate" -export nmmb_nems_4denvar_obs="$casesdir/regional/nmmb_nems/$nmmb_nems_adate" -export nmmb_nems_4denvar_ges="$casesdir/regional/nmmb_nems/$nmmb_nems_adate" -export arw_binary_obs="$casesdir/regional/arw_binary/$arw_binary_adate" -export arw_binary_ges="$casesdir/regional/arw_binary/$arw_binary_adate" -export arw_netcdf_obs="$casesdir/regional/arw_netcdf/$arw_netcdf_adate" -export arw_netcdf_ges="$casesdir/regional/arw_netcdf/$arw_netcdf_adate" -export nmm_binary_obs="$casesdir/regional/ndas_binary/$nmm_binary_adate" -export nmm_binary_ges="$casesdir/regional/ndas_binary/$nmm_binary_adate" -export nmm_netcdf_obs="$casesdir/regional/ndas_binary/$nmm_netcdf_adate" -export nmm_netcdf_ges="$casesdir/regional/nmm_netcdf/$nmm_netcdf_adate" +export global_data="$casesdir/gfs/prod" export rtma_obs="$casesdir/regional/rtma_binary/$rtma_adate" export rtma_ges="$casesdir/regional/rtma_binary/$rtma_adate" export hwrf_nmm_obs="$casesdir/regional/hwrf_nmm/$hwrf_nmm_adate" export hwrf_nmm_ges="$casesdir/regional/hwrf_nmm/$hwrf_nmm_adate" export fv3_netcdf_obs="$casesdir/regional/fv3_netcdf/$fv3_netcdf_adate" export fv3_netcdf_ges="$casesdir/regional/fv3_netcdf/$fv3_netcdf_adate" -export global_C96_fv3aero_obs="$casesdir/global/fv3/$global_C96_fv3aero_adate" -export global_C96_fv3aero_ges="$casesdir/global/fv3/$global_C96_fv3aero_adate" -export global_C96_fv3aerorad_obs="$casesdir/global/fv3/$global_C96_fv3aerorad_adate" -export global_C96_fv3aerorad_ges="$casesdir/global/fv3/$global_C96_fv3aerorad_adate" +export rrfs_3denvar_glbens_obs="$casesdir/regional/rrfs/$rrfs_3denvar_glbens_adate/obs" +export rrfs_3denvar_glbens_ges="$casesdir/regional/rrfs/$rrfs_3denvar_glbens_adate/ges" +export rrfs_3denvar_glbens_ens="$casesdir/regional/rrfs/$rrfs_3denvar_glbens_adate/ens" # Define type of GPSRO data to be assimilated (refractivity or bending angle) export gps_dtype="gps_bnd" @@ -289,7 +209,7 @@ export regression_vfydir="$noscrub/regression" # Define debug variable - If you want to run the debug tests, set this variable to .true. Default is .false. export debug=".false." -# Define parameters for global_T62_3d4dvar and global_T62_4dvar +# Define parameters for global_3dvar, global_4dvar, global_4denvar export minimization="lanczos" # If "lanczos", use sqrtb lanczos minimization algorithm. Otherwise use "pcgsoi". export nhr_obsbin="6" # Time window for observation binning. Use "6" for 3d4dvar test. Otherwise use "1" diff --git a/regression/rrfs_3denvar_glbens.sh b/regression/rrfs_3denvar_glbens.sh new file mode 100755 index 0000000000..af5da51172 --- /dev/null +++ b/regression/rrfs_3denvar_glbens.sh @@ -0,0 +1,291 @@ + +set -x + +# Set variables used in script +# CLEAN up $tmpdir when finished (YES=remove, NO=leave alone) +# ncp is cp replacement, currently keep as /bin/cp + +UNCOMPRESS=gunzip +CLEAN=NO +ncp=/bin/cp + +# +# Set experiment name +# +exp=$jobname + +#----------------------------------------------------------------------- +# +# Extract from ADATE the starting year, month, day, and hour of the +# forecast. These are needed below for various operations. +# +#----------------------------------------------------------------------- +# +adate=${rrfs_3denvar_glbens_adate} +YYYYMMDDHH=$(date +%Y%m%d%H -d "${adate:0:8} ${adate:8:2}") +JJJ=$(date +%j -d "${adate:0:8} ${adate:8:2}") + +YYYY=${YYYYMMDDHH:0:4} +MM=${YYYYMMDDHH:4:2} +DD=${YYYYMMDDHH:6:2} +HH=${YYYYMMDDHH:8:2} +YYYYMMDD=${YYYYMMDDHH:0:8} +# +#MESO_USELIST_FN=$(date +%Y-%m-%d -d "${START_DATE} -1 day")_meso_uselist.txt +#AIR_REJECT_FN=$(date +%Y%m%d -d "${START_DATE} -1 day")_rejects.txt + +# +#----------------------------------------------------------------------- +# +# go to working directory and save directory. +# define fix and background path +# +#----------------------------------------------------------------------- +# Set runtime and save directories +tmpdir=$tmpdir/tmpreg_rrfs_3denvar_glbens/${exp} +savdir=$savdir/outreg_rrfs_3denvar_glbens/${exp} + +# Set up $tmpdir +rm -rf $tmpdir +mkdir -p $tmpdir +chgrp rstprod $tmpdir +chmod 750 $tmpdir +cd $tmpdir + +bkpath=${rrfs_3denvar_glbens_ges} +# decide background type +if [ -r "${bkpath}/fv3_coupler.res" ]; then + BKTYPE=0 # warm start +else + BKTYPE=1 # cold start +fi + +fixcrtm=${fixcrtm:-$CRTM_FIX} + +#--------------------------------------------------------------------- +# +# decide regional_ensemble_option: global ensemble (1) or FV3LAM ensemble (5) +# +#--------------------------------------------------------------------- +# +echo "regional_ensemble_option is ",${regional_ensemble_option:-1} + +echo "$VERBOSE" "fixgsi is $fixgsi" +echo "$VERBOSE" "fixgriddir is $fixgriddir" +echo "$VERBOSE" "default bkpath is $bkpath" +echo "$VERBOSE" "background type is is $BKTYPE" + +ifhyb=.false. +if [[ ${regional_ensemble_option:-1} -eq 1 ]]; then #using GDAS + #----------------------------------------------------------------------- + # Make a list of the latest GFS EnKF ensemble + #----------------------------------------------------------------------- + ls ${rrfs_3denvar_glbens_ens}/*gdas.t??z.atmf009.mem0??.nc >> filelist03 + + nummem=$(more filelist03 | wc -l) + nummem=$((nummem - 3 )) + if [[ ${nummem} -ge 10 ]]; then + echo "$VERBOSE" "Do hybrid with ${memname}" + ifhyb=.true. + echo "$VERBOSE" " Cycle ${YYYYMMDDHH}: GSI hybrid uses ${memname} with n_ens=${nummem}" + else + echo "$VERBOSE" " Cycle ${YYYYMMDDHH}: GSI does pure 3DVAR." + echo "$VERBOSE" " Hybrid needs at least ${HYBENSMEM_NMIN} ${memname} ensembles, only ${nummem} available" + fi + +fi + +#----------------------------------------------------------------------- +# +# link or copy background and grib configuration files +# +# Using ncks to add phis (terrain) into cold start input background. +# it is better to change GSI to use the terrain from fix file. +# Adding radar_tten array to fv3_tracer. Should remove this after add this array in +# radar_tten converting code. +#----------------------------------------------------------------------- + +ln -snf ${bkpath}/fv3_akbk fv3_akbk +ln -snf ${bkpath}/fv3_grid_spec fv3_grid_spec + +if [ ${BKTYPE} -eq 1 ]; then # cold start uses background from INPUT + ln -snf ${bkpath}/phis.nc phis.nc + ncks -A -v phis phis.nc ${bkpath}/gfs_data.tile7.halo0.nc + + ln_vrfy -snf ${bkpath}/sfc_data.tile7.halo0.nc fv3_sfcdata + ln_vrfy -snf ${bkpath}/gfs_data.tile7.halo0.nc fv3_dynvars + ln_vrfy -s fv3_dynvars fv3_tracer + + fv3lam_bg_type=1 +else # cycle uses background from restart + timestring=${YYYYMMDD}.${HH}0000 + cp ${bkpath}/${timestring}.fv_core.res.tile1.nc fv3_dynvars + cp ${bkpath}/${timestring}.fv_tracer.res.tile1.nc fv3_tracer + cp ${bkpath}/${timestring}.sfc_data.nc fv3_sfcdata + cp ${bkpath}/${timestring}.phy_data.nc fv3_phyvars + fv3lam_bg_type=0 +fi + +# update times in coupler.res to current cycle time +cp ${bkpath}/fv3_coupler.res coupler.res +sed -i "s/yyyy/${YYYY}/" coupler.res +sed -i "s/mm/${MM}/" coupler.res +sed -i "s/dd/${DD}/" coupler.res +sed -i "s/hh/${HH}/" coupler.res + + +# +#----------------------------------------------------------------------- +# +# link observation files +# copy observation files to working directory +# +#----------------------------------------------------------------------- + obs_source=rap + obsfileprefix=${YYYYMMDDHH}.${obs_source} + obspath_tmp=${rrfs_3denvar_glbens_obs} + + obs_files_source[0]=${obspath_tmp}/${obsfileprefix}.t${HH}${SUBH}z.prepbufr.tm00 + obs_files_target[0]=prepbufr + + obs_number=${#obs_files_source[@]} + obs_files_source[${obs_number}]=${obspath_tmp}/${obsfileprefix}.t${HH}${SUBH}z.satwnd.tm00.bufr_d + obs_files_target[${obs_number}]=satwndbufr + + obs_number=${#obs_files_source[@]} + obs_files_source[${obs_number}]=${obspath_tmp}/${obsfileprefix}.t${HH}${SUBH}z.nexrad.tm00.bufr_d + obs_files_target[${obs_number}]=l2rwbufr + + +obs_number=${#obs_files_source[@]} +for (( i=0; i<${obs_number}; i++ )); +do + obs_file=${obs_files_source[$i]} + obs_file_t=${obs_files_target[$i]} + if [ -r "${obs_file}" ]; then + ln -s "${obs_file}" "${obs_file_t}" + else + echo "$VERBOSE" "Warning: ${obs_file} does not exist!" + fi +done + +# +#----------------------------------------------------------------------- +# +# Create links to fix files in the FIXgsi directory. +# +#----------------------------------------------------------------------- + +ANAVINFO=${fixgsi}/anavinfo.rrfs +CONVINFO=${fixgsi}/convinfo.rrfs +HYBENSINFO=${fixgsi}/hybens_info.rrfs +OBERROR=${fixgsi}/errtable.rrfs +BERROR=${fixgsi}/rrfs_glb_berror.l127y770.f77 + +SATINFO=${fixgsi}/global_satinfo.txt +OZINFO=${fixgsi}/global_ozinfo.txt +PCPINFO=${fixgsi}/global_pcpinfo.txt +ATMS_BEAMWIDTH=${fixgsi}/atms_beamwidth.txt + +# Fixed fields +cp ${ANAVINFO} anavinfo +cp ${BERROR} berror_stats +cp $SATINFO satinfo +cp $CONVINFO convinfo +cp $OZINFO ozinfo +cp $PCPINFO pcpinfo +cp $OBERROR errtable +cp $ATMS_BEAMWIDTH atms_beamwidth.txt +cp ${HYBENSINFO} hybens_info + +cp ${bkpath}/gsd_sfcobs_provider.txt gsd_sfcobs_provider.txt +cp ${bkpath}/current_bad_aircraft current_bad_aircraft +cp ${bpath}/gsd_sfcobs_uselist.txt gsd_sfcobs_uselist.txt + +#----------------------------------------------------------------------- +# +# CRTM Spectral and Transmittance coefficients +# +#----------------------------------------------------------------------- +CRTMFIX=${fixcrtm} +emiscoef_IRwater=${CRTMFIX}/Nalli.IRwater.EmisCoeff.bin +emiscoef_IRice=${CRTMFIX}/NPOESS.IRice.EmisCoeff.bin +emiscoef_IRland=${CRTMFIX}/NPOESS.IRland.EmisCoeff.bin +emiscoef_IRsnow=${CRTMFIX}/NPOESS.IRsnow.EmisCoeff.bin +emiscoef_VISice=${CRTMFIX}/NPOESS.VISice.EmisCoeff.bin +emiscoef_VISland=${CRTMFIX}/NPOESS.VISland.EmisCoeff.bin +emiscoef_VISsnow=${CRTMFIX}/NPOESS.VISsnow.EmisCoeff.bin +emiscoef_VISwater=${CRTMFIX}/NPOESS.VISwater.EmisCoeff.bin +emiscoef_MWwater=${CRTMFIX}/FASTEM6.MWwater.EmisCoeff.bin +aercoef=${CRTMFIX}/AerosolCoeff.bin +cldcoef=${CRTMFIX}/CloudCoeff.bin + +ln -s ${emiscoef_IRwater} Nalli.IRwater.EmisCoeff.bin +ln -s $emiscoef_IRice ./NPOESS.IRice.EmisCoeff.bin +ln -s $emiscoef_IRsnow ./NPOESS.IRsnow.EmisCoeff.bin +ln -s $emiscoef_IRland ./NPOESS.IRland.EmisCoeff.bin +ln -s $emiscoef_VISice ./NPOESS.VISice.EmisCoeff.bin +ln -s $emiscoef_VISland ./NPOESS.VISland.EmisCoeff.bin +ln -s $emiscoef_VISsnow ./NPOESS.VISsnow.EmisCoeff.bin +ln -s $emiscoef_VISwater ./NPOESS.VISwater.EmisCoeff.bin +ln -s $emiscoef_MWwater ./FASTEM6.MWwater.EmisCoeff.bin +ln -s $aercoef ./AerosolCoeff.bin +ln -s $cldcoef ./CloudCoeff.bin + + +# Copy CRTM coefficient files based on entries in satinfo file +for file in $(awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq) ;do + ln -s ${CRTMFIX}/${file}.SpcCoeff.bin ./ + ln -s ${CRTMFIX}/${file}.TauCoeff.bin ./ +done + +#----------------------------------------------------------------------- +# +# Build the GSI namelist on-the-fly +# +#----------------------------------------------------------------------- +# + +. $scripts/regression_nl_update.sh + +SETUP="$SETUP_update" +GRIDOPTS="$GRIDOPTS_update" +BKGVERR="$BKGVERR_update" +ANBKGERR="$ANBKERR_update" +JCOPTS="$JCOPTS_update" +STRONGOPTS="$STRONGOPTS_update" +OBSQC="$OBSQC_update" +OBSINPUT="$OBSINPUT_update" +SUPERRAD="$SUPERRAD_update" +HYBRID_ENSEMBLE='ensemble_path="",' +SINGLEOB="$SINGLEOB_update" + +if [ "$debug" = ".false." ]; then + . $scripts/regression_namelists.sh rrfs_3denvar_glbens +else + . $scripts/regression_namelists_db.sh rrfs_3denvar_glbens +fi + +cat << EOF > gsiparm.anl + +$gsi_namelist + +EOF + +# Copy executable and fixed files to $tmpdir +if [[ $exp == *"updat"* ]]; then + $ncp $gsiexec_updat ./gsi.x +elif [[ $exp == *"contrl"* ]]; then + $ncp $gsiexec_contrl ./gsi.x +fi + +#cp $fv3_netcdf_ges/nam.t06z.satbias_pc.tm04 ./satbias_pc +#cp $fv3_netcdf_ges/nam.t06z.satbias.tm04 ./satbias_in +#cp $fv3_netcdf_ges/nam.t06z.radstat.tm04 ./radstat.gdas + +# Run GSI +cd $tmpdir +echo "run gsi now" +eval "$APRUN $tmpdir/gsi.x > stdout 2>&1" +rc=$? +exit $rc diff --git a/src/enkf/controlvec.f90 b/src/enkf/controlvec.f90 index b8b62e3b72..4aa2613c63 100644 --- a/src/enkf/controlvec.f90 +++ b/src/enkf/controlvec.f90 @@ -131,7 +131,7 @@ subroutine init_controlvec() cvars3d(nc3d) = trim(adjustl(var)) clevels(nc3d) = ilev + clevels(nc3d-1) else - if (nproc .eq. 0) print *,'Error: only ', nlevs, ' and ', nlevs+1,' number of levels is supported in current version, got ',ilev + if (nproc .eq. 0) print *,'Error controlvec: only ', nlevs, ' and ', nlevs+1,' number of levels is supported in current version, got ',ilev call stop2(503) endif enddo @@ -212,7 +212,10 @@ subroutine read_control() ! read in whole control vector on i/o procs - keep in memory ! (needed in write_ensemble) allocate(grdin(npts,ncdim,nbackgrounds,nanals_per_iotask)) -allocate(qsat(npts,nlevs,nbackgrounds,nanals_per_iotask)) +! if only updating the sfc fields, qsat will not be calculated in readgriddata +! only allocate if needed. +q_ind = getindex(cvars3d, 'q') +if (q_ind > 0) allocate(qsat(npts,nlevs,nbackgrounds,nanals_per_iotask)) if (paranc) then if (nproc == 0) t1 = mpi_wtime() call readgriddata_pnc(cvars3d,cvars2d,nc3d,nc2d,clevels,ncdim,nbackgrounds, & @@ -225,7 +228,8 @@ subroutine read_control() fgfileprefixes,fgsfcfileprefixes,reducedgrid,grdin,qsat) end if !print *,'min/max qsat',nanal,'=',minval(qsat),maxval(qsat) - if (use_qsatensmean) then + q_ind = getindex(cvars3d, 'q') + if (use_qsatensmean .and. q_ind>0 ) then allocate(qsatmean(npts,nlevs,nbackgrounds)) allocate(qsat_tmp(npts)) ! compute ensemble mean qsat @@ -257,7 +261,6 @@ subroutine read_control() ! print *,'min/max qsatmean proc',nproc,'=',& ! minval(qsatmean(:,:,nbackgrounds/2+1)),maxval(qsatmean(:,:,nbackgrounds/2+1)) !endif - q_ind = getindex(cvars3d, 'q') if (pseudo_rh .and. q_ind > 0) then if (use_qsatensmean) then do ne=1,nanals_per_iotask @@ -289,7 +292,7 @@ subroutine write_control(no_inflate_flag) logical, intent(in) :: no_inflate_flag real(r_double) :: t1,t2 -integer(i_kind) :: nb, nvar, ne +integer(i_kind) :: nb, nvar,ne,nn integer(i_kind) :: q_ind, ierr real(r_single), allocatable, dimension(:,:) :: grdin_mean_tmp real(r_single), allocatable, dimension(:,:,:,:) :: grdin_mean @@ -309,11 +312,21 @@ subroutine write_control(no_inflate_flag) print *,'--------------' endif ! gather ensmean increment on root. - 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(:,:,nb,1) = grdin_mean(:,:,nb,1) + grdin_mean_tmp - enddo + if (real(npts)*real(ncdim) < 2_r_kind**32/2_r_kind - 1_r_kind) then + 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(:,:,nb,1) = grdin_mean(:,:,nb,1) + grdin_mean_tmp + enddo + else + do nn=1,ncdim + do ne=1,nanals_per_iotask + call mpi_reduce(grdin(:,nn,nb,ne), grdin_mean_tmp(:,nn), npts, mpi_real4,& + mpi_sum,0,mpi_comm_io,ierr) + if (nproc == 0) grdin_mean(:,nn,nb,1) = grdin_mean(:,nn,nb,1) + grdin_mean_tmp(:,nn) + enddo + enddo + endif ! print out ens mean increment info if (nproc == 0) then grdin_mean(:,:,nb,1) = grdin_mean(:,:,nb,1)/real(nanals) diff --git a/src/enkf/enkf.f90 b/src/enkf/enkf.f90 index c117e4ba56..d35613b585 100644 --- a/src/enkf/enkf.f90 +++ b/src/enkf/enkf.f90 @@ -97,6 +97,12 @@ module enkf ! used to be the same) and the "chunks" come from loadbal ! 2018-05-31: whitaker: add modulated ensemble model-space vertical ! localization (neigv>0) and denkf option. +! 2022-04-01: Y. Wang and X. Wang: Add dbz_ind related if-blocks to fix spurious +! analysis increments due to some unstable amplifying behaviors near edges of +! strong precipitation when clear air and large reflectivity values are +! assimilated in locations near each other (as may be the case in the leading +! line of an MCS). +! poc: xuguang.wang@ou.edu ! ! attributes: ! language: f95 @@ -182,7 +188,7 @@ subroutine enkf_update() integer(i_kind) ierr ! kd-tree search results type(kdtree2_result),dimension(:),allocatable :: sresults1,sresults2 -integer(i_kind) nanal,nn,nnn,nobm,nsame,nn1,nn2,oz_ind,nlev +integer(i_kind) nanal,nn,nnn,nobm,nsame,nn1,nn2,oz_ind,nlev,dbz_ind real(r_single),dimension(nlevs_pres):: taperv logical lastiter, kdgrid, kdobs @@ -609,6 +615,7 @@ subroutine enkf_update() nn2 = ncdim end if if (nf2 > 0) then + dbz_ind = getindex(cvars3d, 'dbz') !$omp parallel do schedule(dynamic,1) private(ii,i,nb,obt,nn,nnn,nlev,lnsig,kfgain,ens_tmp,taper1,taper3,taperv) do ii=1,nf2 ! loop over nearby horiz grid points do nb=1,nbackgrounds ! loop over background time levels @@ -628,8 +635,13 @@ subroutine enkf_update() ! (through hpfhtcon) kfgain=taper1*sum(ens_tmp*anal_obtmp_modens) ! update mean. - ensmean_chunk(i,nn,nb) = ensmean_chunk(i,nn,nb) + & - kfgain*obinc_tmp + if ( (nn >= (dbz_ind-1)*nlevs+1 .and. nn <= (dbz_ind-1)*nlevs+nlevs) )then + ensmean_chunk(i,nn,nb) = max(ensmean_chunk(i,nn,nb) + & + kfgain*obinc_tmp,zero) + else + ensmean_chunk(i,nn,nb) = ensmean_chunk(i,nn,nb) + & + kfgain*obinc_tmp + end if ! update perturbations. anal_chunk(:,i,nn,nb) = anal_chunk(:,i,nn,nb) + & kfgain*obganl(:) @@ -652,7 +664,11 @@ subroutine enkf_update() ! (through hpfhtcon) kfgain=taperv(nnn)*sum(anal_chunk(:,i,nn,nb)*anal_obtmp) ! update mean. - ensmean_chunk(i,nn,nb) = ensmean_chunk(i,nn,nb) + kfgain*obinc_tmp + if ( (nn >= (dbz_ind-1)*nlevs+1 .and. nn <= (dbz_ind-1)*nlevs+nlevs) )then + ensmean_chunk(i,nn,nb) = max(ensmean_chunk(i,nn,nb) + kfgain*obinc_tmp,zero) + else + ensmean_chunk(i,nn,nb) = ensmean_chunk(i,nn,nb) + kfgain*obinc_tmp + end if ! update perturbations. anal_chunk(:,i,nn,nb) = anal_chunk(:,i,nn,nb) + kfgain*obganl(:) end if @@ -681,7 +697,13 @@ subroutine enkf_update() taper(obt*obtimelinv)* & sum(anal_obchunk_modens(:,nob2)*anal_obtmp_modens)*hpfhtcon ! update mean. - ensmean_obchunk(nob2) = ensmean_obchunk(nob2) + kfgain*obinc_tmp + nob3 = indxproc_obs(nproc+1,nob2) + if(trim(obtype(nob3)) == 'dbz' ) then + ensmean_obchunk(nob2) = max((ensmean_obchunk(nob2) + & + kfgain*obinc_tmp),zero) + else + ensmean_obchunk(nob2) = ensmean_obchunk(nob2) + kfgain*obinc_tmp + end if ! update perturbations. anal_obchunk(:,nob2) = anal_obchunk(:,nob2) + kfgain*obganl anal_obchunk_modens(:,nob2) = anal_obchunk_modens(:,nob2) + kfgain*obganl_modens @@ -707,7 +729,13 @@ subroutine enkf_update() taper(lnsig*lnsiglinv)*taper(obt*obtimelinv)* & sum(anal_obchunk(:,nob2)*anal_obtmp)*hpfhtcon ! update mean. - ensmean_obchunk(nob2) = ensmean_obchunk(nob2) + kfgain*obinc_tmp + nob3 = indxproc_obs(nproc+1,nob2) + if(trim(obtype(nob3)) == 'dbz' ) then + ensmean_obchunk(nob2) = max((ensmean_obchunk(nob2) + & + kfgain*obinc_tmp),zero) + else + ensmean_obchunk(nob2) = ensmean_obchunk(nob2) + kfgain*obinc_tmp + end if ! update perturbations. anal_obchunk(:,nob2) = anal_obchunk(:,nob2) + kfgain*obganl ! recompute ob space spread ratio for unassimlated obs @@ -758,6 +786,7 @@ 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 + if(allocated(assimltd_flag))deallocate(assimltd_flag) allocate(assimltd_flag(nobstot)) assimltd_flag = 99999 if (iassim_order == 2) then diff --git a/src/enkf/gridinfo_fv3reg.f90 b/src/enkf/gridinfo_fv3reg.f90 index 53e5f5b3de..4eff63c003 100644 --- a/src/enkf/gridinfo_fv3reg.f90 +++ b/src/enkf/gridinfo_fv3reg.f90 @@ -43,7 +43,8 @@ module gridinfo ! !$$$ -use mpisetup, only: nproc, mpi_integer, mpi_real4, mpi_comm_world,mpi_status +use mpisetup, only: nproc, mpi_integer, mpi_real4,mpi_status +use mpimod, only: mpi_comm_world use params, only: datapath,nlevs,nlons,nlats,use_gfs_nemsio, fgfileprefixes, & fv3fixpath, nx_res,ny_res, ntiles,l_fv3reg_filecombined,paranc, & fv3_io_layout_nx,fv3_io_layout_ny @@ -71,10 +72,10 @@ module gridinfo integer(i_kind),public :: npts integer(i_kind),public :: ntrunc ! supported variable names in anavinfo -character(len=max_varname_length),public, dimension(15) :: & +character(len=max_varname_length),public, dimension(16) :: & vars3d_supported = [character(len=max_varname_length) :: & 'u', 'v', 'w', 't', 'q', 'oz', 'cw', 'tsen', 'prse', & - 'ql', 'qi', 'qr', 'qs', 'qg', 'qnr'] + 'ql', 'qi', 'qr', 'qs', 'qg', 'qnr','dbz'] character(len=max_varname_length),public, dimension(3) :: & vars2d_supported = [character(len=max_varname_length) :: & 'ps', 'pst', 'sst'] diff --git a/src/enkf/gridinfo_gfs.f90 b/src/enkf/gridinfo_gfs.f90 index c2e2b10f57..317ca2221c 100644 --- a/src/enkf/gridinfo_gfs.f90 +++ b/src/enkf/gridinfo_gfs.f90 @@ -66,7 +66,7 @@ module gridinfo ! supported variable names in anavinfo character(len=max_varname_length),public, dimension(13) :: vars3d_supported = (/'u ', 'v ', 'tv ', 'q ', 'oz ', 'cw ', 'tsen', 'prse', & 'ql ', 'qi ', 'qr ', 'qs ', 'qg '/) -character(len=max_varname_length),public, dimension(3) :: vars2d_supported = (/'ps ', 'pst', 'sst' /) +character(len=max_varname_length),public, dimension(13) :: vars2d_supported = (/'ps ', 'pst', 'sst', 't2m', 'q2m', 'st1', 'st2', 'st3', 'st4', 'sl1', 'sl2', 'sl3', 'sl4' /) ! supported variable names in anavinfo contains diff --git a/src/enkf/gridio_fv3reg.f90 b/src/enkf/gridio_fv3reg.f90 index fb23a21a0c..068e6cba8b 100644 --- a/src/enkf/gridio_fv3reg.f90 +++ b/src/enkf/gridio_fv3reg.f90 @@ -24,6 +24,8 @@ module gridio ! -- add code to update 'delp' directly ! from analysis icnrements ! 2022-06- Ting -- Implement paranc=.true. for fv3-lam + ! 2022-04-01 Yongming Wang and X. Wang: Add interface for read in dBZ + ! poc: xuguang.wang@ou.edu ! attributes: ! language: f95 ! @@ -40,7 +42,7 @@ module gridio use params, only: nlevs, cliptracers, datapath, arw, nmm, datestring use params, only: nx_res,ny_res,nlevs,ntiles,l_fv3reg_filecombined,& fv3_io_layout_nx,fv3_io_layout_ny,nanals - use params, only: pseudo_rh, l_use_enkf_directZDA + use params, only: pseudo_rh use mpeu_util, only: getindex use read_fv3regional_restarts,only:read_fv3_restart_data1d,read_fv3_restart_data2d use read_fv3regional_restarts,only:read_fv3_restart_data3d,read_fv3_restart_data4d @@ -60,17 +62,19 @@ module gridio !------------------------------------------------------------------------- - integer(i_kind) ,parameter:: ndynvarslist=6, ntracerslist=8 + integer(i_kind) ,parameter:: ndynvarslist=6, ntracerslist=8, nphysicslist=1 character(len=max_varname_length), parameter, dimension(ndynvarslist) :: & vardynvars = [character(len=max_varname_length) :: & 'u', 'v', 'T', 'W', 'DZ', 'delp'] character(len=max_varname_length), parameter, dimension(ntracerslist) :: & vartracers = [character(len=max_varname_length) :: & 'sphum','o3mr', 'liq_wat','ice_wat','rainwat','snowwat','graupel','rain_nc'] + character(len=max_varname_length), parameter, dimension(nphysicslist) :: & + varphysics = [character(len=max_varname_length) :: 'ref_f3d'] type type_fv3lamfile logical l_filecombined - character(len=max_varname_length), dimension(2):: fv3lamfilename - integer (i_kind), dimension(2):: fv3lam_fileid(2) + character(len=max_varname_length), dimension(3):: fv3lamfilename + integer (i_kind), dimension(3):: fv3lam_fileid contains procedure, pass(this) :: setupfile => type_bound_setupfile procedure, pass(this):: get_idfn => type_bound_getidfn @@ -104,9 +108,9 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, ! Define local variables character(len=500) :: filename - character(len=:),allocatable :: fv3filename,fv3filename1 + character(len=:),allocatable :: fv3filename,fv3filename1,fv3filename2 character(len=7) :: charnanal - integer(i_kind) file_id,file_id1 + integer(i_kind) file_id,file_id1,file_id2 real(r_single), dimension(:,:,:), allocatable ::workvar3d,uworkvar3d,& vworkvar3d,tvworkvar3d,tsenworkvar3d,& workprsi,qworkvar3d @@ -124,6 +128,7 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, integer(i_kind) :: nlevsp1 integer (i_kind):: i,j, k,nn,ntile,nn_tile0, nb,nanal,ne integer(i_kind) :: u_ind, v_ind, tv_ind,tsen_ind, q_ind, oz_ind + integer(i_kind) :: dbz_ind integer(i_kind) :: w_ind, ql_ind, qi_ind, qr_ind, qs_ind, qg_ind, qnr_ind integer (i_kind):: ps_ind, sst_ind integer (i_kind):: tmp_ind,ifile @@ -147,6 +152,7 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, qs_ind = getindex(vars3d, 'qs') ! Q snow (3D) qg_ind = getindex(vars3d, 'qg') ! Q graupel (3D) qnr_ind = getindex(vars3d, 'qnr') ! N rain (3D) + dbz_ind = getindex(vars3d, 'dbz') ! Reflectivity (3D) ps_ind = getindex(vars2d, 'ps') ! Ps (2D) sst_ind = getindex(vars2d, 'sst') ! SST (2D) @@ -191,9 +197,19 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, fv3filename1=trim(adjustl(filename))//"_tracer" call nc_check( nf90_open(trim(adjustl(fv3filename1)),nf90_nowrite,file_id1),& myname_,'open: '//trim(adjustl(fv3filename1)) ) - call fv3lamfile%setupfile(fileid1=file_id,fv3fn1=trim(adjustl(fv3filename)) , & - fileid2=file_id1,fv3fn2=trim(adjustl(fv3filename1)) ) - + if(dbz_ind > 0) then + fv3filename2=trim(adjustl(filename))//"_phyvar" + call nc_check(nf90_open(trim(adjustl(fv3filename2)),nf90_nowrite,file_id2),& + myname_,'open: '//trim(adjustl(fv3filename2)) ) + endif + if(dbz_ind > 0) then + call fv3lamfile%setupfile(fileid1=file_id,fv3fn1=trim(adjustl(fv3filename)) , & + fileid2=file_id1,fv3fn2=trim(adjustl(fv3filename1)),& + fileid3=file_id2,fv3fn3=trim(adjustl(fv3filename2))) + else + call fv3lamfile%setupfile(fileid1=file_id,fv3fn1=trim(adjustl(fv3filename)) , & + fileid2=file_id1,fv3fn2=trim(adjustl(fv3filename1))) + endif endif !---------------------------------------------------------------------- @@ -476,6 +492,27 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, endif + if (dbz_ind > 0) then + varstrname = 'ref_f3d' + call fv3lamfile%get_idfn(varstrname,file_id,fv3filename) + call read_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) + do k=1,nlevs + nn = nn_tile0 + do j=1,ny_res + do i=1,nx_res + nn=nn+1 + vargrid(nn,levels(dbz_ind-1)+k,nb,ne)=max(workvar3d(i,j,nlevs+1-k),0.0_r_kind) + enddo + enddo + enddo + do k = levels(dbz_ind-1)+1, levels(dbz_ind) + if (nproc .eq. 0) & + write(6,*) 'READFVregional : dbz ', & + & k, minval(vargrid(:,k,nb,ne)), maxval(vargrid(:,k,nb,ne)) + enddo + + endif + ! set SST to zero for now if (sst_ind > 0) then vargrid(:,levels(n3d)+sst_ind,nb,ne) = zero @@ -549,7 +586,8 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, call nc_check( nf90_close(file_id),& myname_,'close '//trim(filename) ) else - do ifile=1,2 + do ifile=1,3 + if(dbz_ind <= 0 .and. ifile == 3) cycle file_id=fv3lamfile%fv3lam_fileid(ifile) filename=fv3lamfile%fv3lamfilename(ifile) call nc_check( nf90_close(file_id),& @@ -601,15 +639,15 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid !---------------------------------------------------------------------- ! Define variables computed within subroutine character(len=500) :: filename - character(len=:),allocatable :: fv3filename,fv3filename1 + character(len=:),allocatable :: fv3filename,fv3filename1,fv3filename2 character(len=7) :: charnanal !---------------------------------------------------------------------- - integer(i_kind) :: u_ind, v_ind, tv_ind, tsen_ind,q_ind, ps_ind,oz_ind - integer(i_kind) :: w_ind + integer(i_kind) :: u_ind, v_ind, tv_ind, tsen_ind,q_ind, ps_ind,oz_ind,dbz_ind + integer(i_kind) :: w_ind, cw_ind, ph_ind integer(i_kind) :: ql_ind, qi_ind, qr_ind, qs_ind, qg_ind, qnr_ind - integer(i_kind) file_id,file_id1 + integer(i_kind) file_id,file_id1,file_id2 real(r_single), dimension(:,:), allocatable ::pswork real(r_single), dimension(:,:,:), allocatable ::workvar3d,workinc3d,workinc3d2,uworkvar3d,& vworkvar3d,tvworkvar3d,tsenworkvar3d,& @@ -652,10 +690,11 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid qs_ind = getindex(vars3d, 'qs') ! QS (3D) for FV3 qg_ind = getindex(vars3d, 'qg') ! QG (3D) for FV3 qnr_ind = getindex(vars3d, 'qnr') ! QNR (3D) for FV3 + dbz_ind = getindex(vars3d, 'dbz') ! Reflectivity (3D) ps_ind = getindex(vars2d, 'ps') ! Ps (2D) - + clip=tiny(clip) !---------------------------------------------------------------------- if (nbackgrounds > 1) then write(6,*)'gridio/writegriddata: writing multiple backgrounds not yet supported' @@ -699,6 +738,15 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid call fv3lamfile%setupfile(fileid1=file_id,fv3fn1=trim(adjustl(fv3filename)) , & fileid2=file_id1,fv3fn2=trim(adjustl(fv3filename1)) ) + if(dbz_ind > 0) then + call fv3lamfile%setupfile(fileid1=file_id,fv3fn1=trim(adjustl(fv3filename)) , & + fileid2=file_id1,fv3fn2=trim(adjustl(fv3filename1)),& + fileid3=file_id2,fv3fn3=trim(adjustl(fv3filename2))) + else + call fv3lamfile%setupfile(fileid1=file_id,fv3fn1=trim(adjustl(fv3filename)) , & + fileid2=file_id1,fv3fn2=trim(adjustl(fv3filename1))) + endif + endif @@ -805,6 +853,8 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid varstrname = 'sphum' call fv3lamfile%get_idfn(varstrname,file_id,fv3filename) call read_fv3_restart_data3d(varstrname,fv3filename,file_id,qworkvar3d) + !enforce lower positive bound (clip) to replace negative hydrometers + if ( cliptracers ) where (qworkvar3d < clip) qworkvar3d = clip tvworkvar3d=tsenworkvar3d*(one+fv*qworkvar3d) tvworkvar3d=tvworkvar3d+workinc3d if(q_ind > 0) then @@ -818,6 +868,8 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo qworkvar3d=qworkvar3d+workinc3d + !enforce lower positive bound (clip) to replace negative q + if ( cliptracers ) where (qworkvar3d < clip) qworkvar3d = clip endif tsenworkvar3d=tvworkvar3d/(one+fv*qworkvar3d) varstrname = 'T' @@ -884,10 +936,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) endif @@ -907,10 +956,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) endif @@ -930,10 +976,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) endif @@ -953,10 +996,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) endif @@ -976,10 +1016,7 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) endif @@ -998,10 +1035,26 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip + call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) + + endif + + if (dbz_ind > 0) then + varstrname = 'ref_f3d' + call fv3lamfile%get_idfn(varstrname,file_id,fv3filename) + call read_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) + do k=1,nlevs + nn = nn_tile0 + do j=1,ny_res + do i=1,nx_res + nn=nn+1 + workinc3d(i,j,nlevs+1-k)=vargrid(nn,levels(dbz_ind-1)+k,nb,ne) + enddo + enddo + enddo + workvar3d=workvar3d+workinc3d + where (workvar3d < 0.0_r_kind) workvar3d = 0.0_r_kind call write_fv3_restart_data3d(varstrname,fv3filename,file_id,workvar3d) endif @@ -1051,7 +1104,8 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,vargrid call nc_check( nf90_close(file_id),& myname_,'close '//trim(filename) ) else - do ifile=1,2 + do ifile=1,3 + if(dbz_ind <=0 .and. ifile == 3) cycle file_id=fv3lamfile%fv3lam_fileid(ifile) filename=fv3lamfile%fv3lamfilename(ifile) call nc_check( nf90_close(file_id),& @@ -1820,7 +1874,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat ps_ind = getindex(vars2d, 'ps') ! Ps (2D) - + clip=tiny(clip) allocate(my_neb(4)) !---------------------------------------------------------------------- if (nbackgrounds > 1) then @@ -2105,6 +2159,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo if(iope ==0 ) then + if ( cliptracers ) where (qworkvar3d < clip) qworkvar3d = clip tvworkvar3d=tsenworkvar3d*(one+fv*qworkvar3d) tvworkvar3d=tvworkvar3d+workinc3d if(q_ind > 0) then @@ -2118,6 +2173,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo qworkvar3d=qworkvar3d+workinc3d + if ( cliptracers ) where (qworkvar3d < clip) qworkvar3d = clip endif tsenworkvar3d=tvworkvar3d/(one+fv*qworkvar3d) endif @@ -2213,10 +2269,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip endif do k=1,nlevs call mpi_scatterv(workvar3d(:,:,k),recvcounts2d,displs2d,mpi_real4,& @@ -2247,10 +2300,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip endif do k=1,nlevs call mpi_scatterv(workvar3d(:,:,k),recvcounts2d,displs2d,mpi_real4,& @@ -2281,10 +2331,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip endif do k=1,nlevs call mpi_scatterv(workvar3d(:,:,k),recvcounts2d,displs2d,mpi_real4,& @@ -2315,10 +2362,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip endif do k=1,nlevs call mpi_scatterv(workvar3d(:,:,k),recvcounts2d,displs2d,mpi_real4,& @@ -2349,10 +2393,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip endif do k=1,nlevs call mpi_scatterv(workvar3d(:,:,k),recvcounts2d,displs2d,mpi_real4,& @@ -2382,10 +2423,7 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat enddo enddo workvar3d=workvar3d+workinc3d - if ( l_use_enkf_directZDA .and. cliptracers ) then ! set cliptracers to remove negative hydrometers - clip = tiny(workvar3d(1,1,1)) - where (workvar3d < clip) workvar3d = clip - end if + if ( cliptracers ) where (workvar3d < clip) workvar3d = clip endif do k=1,nlevs call mpi_scatterv(workvar3d(:,:,k),recvcounts2d,displs2d,mpi_real4,& @@ -2478,19 +2516,23 @@ subroutine writegriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,vargrid,no_inflat ! Return calculated values return end subroutine writegriddata_pnc -subroutine type_bound_setupfile(this,fileid1,fv3fn1,fileid2,fv3fn2) +subroutine type_bound_setupfile(this,fileid1,fv3fn1,fileid2,fv3fn2,fileid3,fv3fn3) implicit none class (type_fv3lamfile) :: this integer(i_kind) fileid1 - integer(i_kind), optional :: fileid2 + integer(i_kind), optional :: fileid2,fileid3 character(len=*)::fv3fn1 - character(len=*),optional ::fv3fn2 + character(len=*),optional ::fv3fn2,fv3fn3 if (present (fileid2)) then this%l_filecombined=.false. this%fv3lamfilename(1)=trim(fv3fn1) this%fv3lamfilename(2)=trim(fv3fn2) this%fv3lam_fileid(1)=fileid1 this%fv3lam_fileid(2)=fileid2 + if (present (fileid3)) then + this%fv3lamfilename(3)=trim(fv3fn3) + this%fv3lam_fileid(3)=fileid3 + endif else this%l_filecombined=.true. this%fv3lamfilename(1)=fv3fn1 @@ -2509,6 +2551,9 @@ subroutine type_bound_getidfn(this,vnamloc,fileid,fv3fn) else if(ifindstrloc(vartracers,vnamloc)> 0) then fv3fn=trim(this%fv3lamfilename(2)) fileid=this%fv3lam_fileid(2) + else if(ifindstrloc(varphysics,vnamloc)> 0) then + fv3fn=trim(this%fv3lamfilename(3)) + fileid=this%fv3lam_fileid(3) else write(6,*)"the varname ",trim(vnamloc)," is not recognized in the ype_bound_getidfn, stop" call stop2(23) diff --git a/src/enkf/gridio_gfs.f90 b/src/enkf/gridio_gfs.f90 index fe5199e395..e4631f4e2d 100644 --- a/src/enkf/gridio_gfs.f90 +++ b/src/enkf/gridio_gfs.f90 @@ -35,6 +35,7 @@ module gridio ! a required input for EFSO calculations ! 2019-03-13 Add precipitation components ! 2019-07-10 Add convective clouds +! 2022-07-21 Draper: added read/write for sfc file for nc io (writeincrements, and readgridata) ! ! attributes: ! language: f95 @@ -100,12 +101,21 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & logical ice logical use_full_hydro integer(i_kind), allocatable, dimension(:) :: mem_pe, lev_pe1, lev_pe2, iocomms - integer(i_kind) :: iope, ionumproc, iolevs, krev + integer(i_kind) :: iope, ionumproc, iolevs, krev, ierr integer(i_kind) :: ncstart(3), nccount(3) ! mpi gatherv things integer(i_kind), allocatable, dimension(:) :: recvcounts, displs real(r_single), dimension(nlons,nlats,nlevs) :: ug3d_0, vg3d_0 + logical :: read_sfc_file, read_atm_file + + call set_ncio_file_flags(vars3d, n3d, vars2d, n2d, read_sfc_file, read_atm_file) + + if (read_sfc_file) then + print *,'paranc not supported for reading surface files' + call mpi_barrier(mpi_comm_world,ierr) + call mpi_finalize(ierr) + endif ! figure out what member to read and do MPI sub-communicator things allocate(mem_pe(0:numproc-1)) @@ -157,7 +167,7 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & levdim = get_dim(dset,'pfull'); nlevsin = levdim%len idvc=2 else - print *, 'parallel read only supported for netCDF, stopping with error' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** parallel read only supported for netCDF' , ' PROGRAM STOPS' call stop2(23) end if ice = .false. ! calculate qsat w/resp to ice? @@ -185,6 +195,9 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & sst_ind = getindex(vars2d, 'sst') use_full_hydro = ( ql_ind > 0 .and. qi_ind > 0 .and. & qr_ind > 0 .and. qs_ind > 0 .and. qg_ind > 0 ) + ! Currently, we do not let precipiation to affect the enkf analysis + ! The following line will be removed after testing + use_full_hydro = .false. if (.not. isinitialized) call init_spec_vars(nlons,nlats,ntrunc,4) @@ -195,7 +208,7 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & call read_vardata(dset, 'pressfc', values_2d,errcode=iret) if (iret /= 0) then - print *,'error reading ps' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading ps, iret= ',iret,' PROGRAM STOPS' call stop2(31) endif psg = 0.01_r_kind*reshape(values_2d,(/nlons*nlats/)) @@ -215,12 +228,12 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & call read_vardata(dset, 'ugrd', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading ugrd' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading ugrd, iret= ',iret,' PROGRAM STOPS' call stop2(22) endif call read_vardata(dset, 'vgrd', vg3d, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading vgrd' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading vgrd, iret= ',iret,' PROGRAM STOPS' call stop2(23) endif call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& @@ -247,12 +260,12 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & end if call read_vardata(dset,'tmp', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading tmp' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading tmp, iret= ',iret,' PROGRAM STOPS' call stop2(24) endif call read_vardata(dset,'spfh', vg3d, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading spfh' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading spfh, iret= ',iret,' PROGRAM STOPS' call stop2(25) endif call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& @@ -276,7 +289,7 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & if (oz_ind > 0) then call read_vardata(dset, 'o3mr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading o3mr' + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading o3mr, iret= ',iret,' PROGRAM STOPS' call stop2(26) endif if (cliptracers) where (ug3d < clip) ug3d = clip @@ -290,31 +303,122 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & end do end if endif - if (cw_ind > 0 .or. ql_ind > 0 .or. qi_ind > 0) then - call read_vardata(dset, 'clwmr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) - if (iret /= 0) then - print *,'error reading clwmr' - call stop2(27) + ! Read in hydrometeor fields based on control/state variables listed in anavinfo table + if (use_full_hydro) then + if(ql_ind > 0) then + call read_vardata(dset, 'clwmr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading clwmr, iret= ',iret,' PROGRAM STOPS' + call stop2(26) + endif + if (cliptracers) where (ug3d < clip) ug3d = clip + call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& + mpi_real4, 0, iocomms(mem_pe(nproc)),iret) + if (iope==0) then + do k=1,nlevs + krev = nlevs-k+1 + ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(ql_ind-1)+k,nb,ne)) + end do + end if endif - if (imp_physics == 11) then - call read_vardata(dset, 'icmr', vg3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if(qi_ind > 0) then + call read_vardata(dset, 'icmr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading icmr' - call stop2(28) + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading icmr, iret= ',iret,' PROGRAM STOPS' + call stop2(26) + endif + if (cliptracers) where (ug3d < clip) ug3d = clip + call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& + mpi_real4, 0, iocomms(mem_pe(nproc)),iret) + if (iope==0) then + do k=1,nlevs + krev = nlevs-k+1 + ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(qi_ind-1)+k,nb,ne)) + end do + end if + endif + if(qr_ind > 0) then + call read_vardata(dset, 'rwmr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading rwmr, iret= ',iret,' PROGRAM STOPS' + call stop2(26) endif - ug3d = ug3d + vg3d + if (cliptracers) where (ug3d < clip) ug3d = clip + call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& + mpi_real4, 0, iocomms(mem_pe(nproc)),iret) + if (iope==0) then + do k=1,nlevs + krev = nlevs-k+1 + ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(qr_ind-1)+k,nb,ne)) + end do + end if + endif + if(qs_ind > 0) then + call read_vardata(dset, 'snmr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading snmr, iret= ',iret,' PROGRAM STOPS' + call stop2(26) + endif + if (cliptracers) where (ug3d < clip) ug3d = clip + call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& + mpi_real4, 0, iocomms(mem_pe(nproc)),iret) + if (iope==0) then + do k=1,nlevs + krev = nlevs-k+1 + ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(qs_ind-1)+k,nb,ne)) + end do + end if + endif + if(qg_ind > 0) then + call read_vardata(dset, 'grle', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading grle, iret= ',iret,' PROGRAM STOPS' + call stop2(26) + endif + if (cliptracers) where (ug3d < clip) ug3d = clip + call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& + mpi_real4, 0, iocomms(mem_pe(nproc)),iret) + if (iope==0) then + do k=1,nlevs + krev = nlevs-k+1 + ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(qg_ind-1)+k,nb,ne)) + end do + end if + endif + else + ! Handle non-precipiting hydrometeors + ! if control or state variable is cw, make sure combine background ql and qi to cw + if (cw_ind > 0 .or. ql_ind > 0 .or. qi_ind > 0) then + call read_vardata(dset, 'clwmr', ug3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading clwmr, iret= ',iret,' PROGRAM STOPS' + call stop2(27) + endif + if (imp_physics == 11) then + call read_vardata(dset, 'icmr', vg3d, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'READGRIDDATA_PNC: ***FATAL ERROR*** reading icmr, iret= ',iret,' PROGRAM STOPS' + call stop2(28) + endif + ug3d = ug3d + vg3d + endif + if (cliptracers) where (ug3d < clip) ug3d = clip + call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& + mpi_real4, 0, iocomms(mem_pe(nproc)),iret) + if (iope==0) then + do k=1,nlevs + krev = nlevs-k+1 + ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) + call copytogrdin(ug,cw(:,k)) + if (cw_ind > 0) grdin(:,levels(cw_ind-1)+k,nb,ne) = cw(:,k) + end do + end if endif - if (cliptracers) where (ug3d < clip) ug3d = clip - call mpi_gatherv(ug3d, recvcounts(iope+1), mpi_real4, ug3d_0, recvcounts, displs,& - mpi_real4, 0, iocomms(mem_pe(nproc)),iret) - if (iope==0) then - do k=1,nlevs - krev = nlevs-k+1 - ug = reshape(ug3d_0(:,:,krev),(/nlons*nlats/)) - call copytogrdin(ug,cw(:,k)) - if (cw_ind > 0) grdin(:,levels(cw_ind-1)+k,nb,ne) = cw(:,k) - end do - end if endif deallocate(ug3d,vg3d) @@ -355,22 +459,25 @@ subroutine readgriddata_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, & end if ! cloud derivatives + ! Currently, we do not let precipiation to affect the enkf analysis + ! The following line will be removed after testing + use_full_hydro = .true. if (.not. use_full_hydro .and. iope==0) then - if (ql_ind > 0 .or. qi_ind > 0) then - do k=1,nlevs - do i = 1, npts - qi_coef = -r0_05*(tv(i,k)/(one+fv*q(i,k))-t0c) - qi_coef = max(zero,qi_coef) - qi_coef = min(one,qi_coef) ! 0<=qi_coef<=1 - if (ql_ind > 0) then - grdin(i,levels(ql_ind-1)+k,nb,ne) = cw(i,k)*(one-qi_coef) - endif - if (qi_ind > 0) then - grdin(i,levels(qi_ind-1)+k,nb,ne) = cw(i,k)*qi_coef - endif + if (ql_ind > 0 .or. qi_ind > 0) then + do k=1,nlevs + do i = 1, npts + qi_coef = -r0_05*(tv(i,k)/(one+fv*q(i,k))-t0c) + qi_coef = max(zero,qi_coef) + qi_coef = min(one,qi_coef) ! 0<=qi_coef<=1 + if (ql_ind > 0) then + grdin(i,levels(ql_ind-1)+k,nb,ne) = cw(i,k)*(one-qi_coef) + endif + if (qi_ind > 0) then + grdin(i,levels(qi_ind-1)+k,nb,ne) = cw(i,k)*qi_coef + endif + enddo enddo - enddo - endif + endif endif if (sst_ind > 0 .and. iope==0) then @@ -457,7 +564,7 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, type(sigio_head) :: sighead type(sigio_data) :: sigdata type(nemsio_gfile) :: gfile - type(Dataset) :: dset + type(Dataset) :: dset, dset_sfc type(Dimension) :: londim,latdim,levdim type(nemsio_gfile) :: gfilesfc @@ -465,14 +572,20 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, integer(i_kind) :: qr_ind, qs_ind, qg_ind integer(i_kind) :: tsen_ind, ql_ind, qi_ind, prse_ind integer(i_kind) :: ps_ind, pst_ind, sst_ind + integer(i_kind) :: tmp2m_ind, spfh2m_ind, soilt1_ind, soilt2_ind, soilt3_ind + integer(i_kind) :: soilt4_ind,slc1_ind, slc2_ind, slc3_ind, slc4_ind integer(i_kind) :: k,iunitsig,iret,nb,i,idvc,nlonsin,nlatsin,nlevsin,ne,nanal integer(i_kind) :: nlonsin_sfc,nlatsin_sfc logical ice logical use_full_hydro + logical read_sfc_file, read_atm_file use_full_hydro = .false. + ! determine which files will be read in + call set_ncio_file_flags(vars3d, n3d, vars2d, n2d, read_sfc_file, read_atm_file) + ne = 0 ensmemloop: do nanal=nanal1,nanal2 ne = ne + 1 @@ -565,6 +678,7 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, ! print *, 'ql: ', ql_ind, ', prse: ', prse_ind ! print *, 'ps: ', ps_ind, ', pst: ', pst_ind, ', sst: ', sst_ind ! endif + if (read_atm_file) then if (.not. isinitialized) call init_spec_vars(nlons,nlats,ntrunc,4) @@ -634,7 +748,7 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, pressi(:,k) = 0.01_r_kind*ak(nlevs-k+2)+bk(nlevs-k+2)*psg if (nanal .eq. 1) print *,'netcdf, min/max pressi',k,minval(pressi(:,k)),maxval(pressi(:,k)) enddo - deallocate(ak,bk,values_2d) + deallocate(ak,bk) else vrtspec = sigdata%ps call sptez_s(vrtspec,psg,1) @@ -1003,10 +1117,134 @@ subroutine readgriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,ntimes, deallocate(pressi,pslg) deallocate(psg) if (pst_ind > 0) deallocate(vmassdiv,pstend) + endif ! read_atm_file + if (use_gfs_nemsio) call nemsio_close(gfile,iret=iret) if (use_gfs_ncio) call close_dataset(dset) if (use_gfs_nemsio) call nemsio_close(gfilesfc,iret=iret) + if ( read_sfc_file ) then + + if ( .not. use_gfs_ncio ) then + write(6,*) 'griddio/griddata for sfc update vars only coded for nc io' + call stop2(23) + endif + if ( reducedgrid ) then + write(6,*) "reducedgrid=T interpolation not valid for writing sfc files" + call stop2(22) + endif + + ! land sfc DA variables + tmp2m_ind = getindex(vars2d, 't2m') + spfh2m_ind = getindex(vars2d, 'q2m') + soilt1_ind = getindex(vars2d, 'st1') + slc1_ind = getindex(vars2d, 'sl1') + soilt2_ind = getindex(vars2d, 'st2') + slc2_ind = getindex(vars2d, 'sl2') + soilt3_ind = getindex(vars2d, 'st3') + slc3_ind = getindex(vars2d, 'sl3') + soilt4_ind = getindex(vars2d, 'st4') + slc4_ind = getindex(vars2d, 'sl4') + + dset_sfc = open_dataset(filenamesfc) + ! read in sfc vars, if requested + if (tmp2m_ind > 0) then + call read_vardata(dset_sfc, 'tmp2m', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading tmp2m' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + tmp2m_ind,nb,ne)) + endif + if (spfh2m_ind > 0) then + call read_vardata(dset_sfc, 'spfh2m', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading spfh2m' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + spfh2m_ind,nb,ne)) + endif + if (soilt1_ind > 0) then + call read_vardata(dset_sfc, 'soilt1', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading soilt1' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + soilt1_ind,nb,ne)) + endif + if (soilt2_ind > 0) then + call read_vardata(dset_sfc, 'soilt2', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading soilt2' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + soilt2_ind,nb,ne)) + endif + if (soilt3_ind > 0) then + call read_vardata(dset_sfc, 'soilt3', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading soilt3' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + soilt3_ind,nb,ne)) + endif + if (soilt4_ind > 0) then + call read_vardata(dset_sfc, 'soilt4', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading soilt2' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + soilt4_ind,nb,ne)) + endif + if (slc1_ind > 0) then + call read_vardata(dset_sfc, 'slc1', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading slc1' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + slc1_ind,nb,ne)) + endif + if (slc2_ind > 0) then + call read_vardata(dset_sfc, 'slc2', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading slc2' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + slc2_ind,nb,ne)) + endif + if (slc3_ind > 0) then + call read_vardata(dset_sfc, 'slc3', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading slc3' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + slc3_ind,nb,ne)) + endif + if (slc4_ind > 0) then + call read_vardata(dset_sfc, 'slc4', values_2d, errcode=iret) + if (iret /= 0) then + print *,'error reading slc2' + call stop2(22) + endif + ug = reshape(values_2d,(/nlons*nlats/)) + call copytogrdin(ug,grdin(:,levels(n3d) + slc4_ind,nb,ne)) + endif + + call close_dataset(dset_sfc) + + endif ! sfc read + + if ( allocated(values_2d) ) deallocate(values_2d) + end do backgroundloop ! loop over backgrounds to read in end do ensmemloop ! loop over ens members to read in @@ -1901,6 +2139,15 @@ subroutine writegriddata(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin,n integer k,krev,nt,ierr,iunitsig,nb,i,ne,nanal logical :: nocompress + logical :: write_sfc_file, write_atm_file + + call set_ncio_file_flags(vars3d, n3d, vars2d, n2d, write_sfc_file, write_atm_file) + + if (write_sfc_file .and. nproc==0 ) then + ! adding the sfc increments requires adjusting several other variables. This is done is a separate + ! program. + write(6,*)'gridio/writegriddata: not coded to write sfc analysis, use separate add_incr program instead' + endif nocompress = .true. if (nccompress) nocompress = .false. @@ -3305,7 +3552,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,write_ensmean + datestring,nhr_anal,write_ensmean, fgsfcfileprefixes,incsfcfileprefixes use constants, only: grav use mpi use module_ncio, only: Dataset, Variable, Dimension, open_dataset,& @@ -3341,7 +3588,12 @@ subroutine writeincrement(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin, integer(i_kind) :: ncid_out, lon_dimid, lat_dimid, lev_dimid, ilev_dimid integer(i_kind) :: lonvarid, latvarid, levvarid, pfullvarid, ilevvarid, & hyaivarid, hybivarid, uvarid, vvarid, delpvarid, delzvarid, & - tvarid, sphumvarid, liqwatvarid, o3varid, icvarid + tvarid, sphumvarid, liqwatvarid, o3varid, icvarid, & + tmp2mvarid, spfh2mvarid, soilt1varid, soilt2varid, & + soilt3varid, soilt4varid, slc1varid, slc2varid, & + slc3varid, slc4varid, maskvarid + integer(i_kind) :: tmp2m_ind, spfh2m_ind, soilt1_ind, soilt2_ind, soilt3_ind, & + soilt4_ind,slc1_ind, slc2_ind, slc3_ind, slc4_ind integer(i_kind) :: iadateout ! fixed fields such as lat, lon, levs @@ -3353,10 +3605,17 @@ subroutine writeincrement(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin, ! increment real(r_kind), dimension(nlons*nlats) :: psinc, inc, ug, vg, work real(r_single), allocatable, dimension(:,:,:) :: inc3d, inc3d2, inc3dout + real(r_single), allocatable, dimension(:,:) :: inc2d, inc2dout real(r_single), allocatable, dimension(:,:,:) :: tv, tvanl, tmp, tmpanl, q, qanl real(r_kind), allocatable, dimension(:,:) :: values_2d real(r_kind), allocatable, dimension(:) :: psges, delzb, values_1d + ! soil / snow mask (not fixed) + integer(i_kind), dimension(nlons,nlats) :: mask + logical :: write_sfc_file, write_atm_file + + call set_ncio_file_flags(vars3d, n3d, vars2d, n2d, write_sfc_file, write_atm_file) + if ( write_atm_file) then use_full_hydro = .false. clip = tiny_r_kind read(datestring,*) iadateout @@ -3677,14 +3936,267 @@ subroutine writeincrement(nanal1,nanal2,vars3d,vars2d,n3d,n2d,levels,ndim,grdin, call nccheck_incr(nf90_put_var(ncid_out, icvarid, sngl(inc3dout), & start = ncstart, count = nccount)) + call close_dataset(dsfg,errcode=iret) + if (iret/=0) then + write(6,*)'gridio/writeincrement gfs model: problem closing netcdf fg dataset, iret=',iret + call stop2(23) + endif ! deallocate things deallocate(inc3d,inc3d2,inc3dout) deallocate(tmp,tv,q,tmpanl,tvanl,qanl) - deallocate(delzb,psges) + if (allocated(delzb)) deallocate(delzb) + if (allocated(psges)) deallocate(psges) end do backgroundloop ! loop over backgrounds to read in end do ensmemloop ! loop over ens members to read in + endif ! write_atm_file + + if (write_sfc_file) then + + ne = 0 + sfcensmemloop: do nanal=nanal1,nanal2 + ne = ne + 1 + write(charnanal,'(i3.3)') nanal + sfcbackgroundloop: do nb=1,nbackgrounds + + if (nanal == 0 .and. write_ensmean) then + filenamein = trim(adjustl(datapath))//trim(adjustl(fgsfcfileprefixes(nb)))//"ensmean" + filenameout = trim(adjustl(datapath))//trim(adjustl(incsfcfileprefixes(nb)))//"ensmean" + else + if(no_inflate_flag) then + filenameout = trim(adjustl(datapath))//trim(adjustl(incsfcfileprefixes(nb)))//"nimem"//charnanal + else + filenameout = trim(adjustl(datapath))//trim(adjustl(incsfcfileprefixes(nb)))//"mem"//charnanal + end if + filenamein = trim(adjustl(datapath))//trim(adjustl(fgsfcfileprefixes(nb)))//"mem"//charnanal + endif + + ! create the output netCDF increment file + call nccheck_incr(nf90_create(path=trim(filenameout), cmode=nf90_netcdf4, ncid=ncid_out)) + + ! create dimensions based on analysis resolution, not guess + call nccheck_incr(nf90_def_dim(ncid_out, "longitude", nlons, lon_dimid)) + call nccheck_incr(nf90_def_dim(ncid_out, "latitude", nlats, lat_dimid)) + ! create variables + call nccheck_incr(nf90_def_var(ncid_out, "longitude", nf90_real, (/lon_dimid/), lonvarid)) + call nccheck_incr(nf90_def_var(ncid_out, "latitude", nf90_real, (/lat_dimid/), latvarid)) + call nccheck_incr(nf90_def_var(ncid_out, "tmp2m_inc", nf90_real, dimids3(1:2), tmp2mvarid)) + call nccheck_incr(nf90_def_var(ncid_out, "spfh2m_inc", nf90_real, dimids3(1:2), spfh2mvarid)) + call nccheck_incr(nf90_def_var(ncid_out, "soilt1_inc", nf90_real, dimids3(1:2), soilt1varid)) + call nccheck_incr(nf90_def_var(ncid_out, "soilt2_inc", nf90_real, dimids3(1:2), soilt2varid)) + call nccheck_incr(nf90_def_var(ncid_out, "soilt3_inc", nf90_real, dimids3(1:2), soilt3varid)) + call nccheck_incr(nf90_def_var(ncid_out, "soilt4_inc", nf90_real, dimids3(1:2), soilt4varid)) + call nccheck_incr(nf90_def_var(ncid_out, "slc1_inc", nf90_real, dimids3(1:2), slc1varid)) + call nccheck_incr(nf90_def_var(ncid_out, "slc2_inc", nf90_real, dimids3(1:2), slc2varid)) + call nccheck_incr(nf90_def_var(ncid_out, "slc3_inc", nf90_real, dimids3(1:2), slc3varid)) + call nccheck_incr(nf90_def_var(ncid_out, "slc4_inc", nf90_real, dimids3(1:2), slc4varid)) + call nccheck_incr(nf90_def_var(ncid_out, "soilsnow_mask", nf90_int, dimids3(1:2), maskvarid)) + ! place global attributes to serial calc_increment output + call nccheck_incr(nf90_put_att(ncid_out, nf90_global, "source", "GSI EnKF")) + call nccheck_incr(nf90_put_att(ncid_out, nf90_global, "comment", & + "global landsfc anal increment from writeincrement")) + call nccheck_incr(nf90_put_att(ncid_out, nf90_global, "analysis_time", iadateout)) + call nccheck_incr(nf90_put_att(ncid_out, nf90_global, "IAU_hour_from_guess", nhr_anal(nb))) + ! add units to lat/lon because that's what the calc_increment utility has + call nccheck_incr(nf90_put_att(ncid_out, lonvarid, "units", "degrees_east")) + call nccheck_incr(nf90_put_att(ncid_out, latvarid, "units", "degrees_north")) + ! end the netCDF file definition + call nccheck_incr(nf90_enddef(ncid_out)) + + tmp2m_ind = getindex(vars2d, 't2m') !< indices in the state or control var arrays + spfh2m_ind = getindex(vars2d, 'q2m') + soilt1_ind = getindex(vars2d, 'st1') + slc1_ind = getindex(vars2d, 'sl1') + soilt2_ind = getindex(vars2d, 'st2') + slc2_ind = getindex(vars2d, 'sl2') + soilt3_ind = getindex(vars2d, 'st3') + slc3_ind = getindex(vars2d, 'sl3') + soilt4_ind = getindex(vars2d, 'st4') + slc4_ind = getindex(vars2d, 'sl4') + + dsfg = open_dataset(filenamein) + + ! longitudes + call read_vardata(dsfg, 'grid_xt', values_1d, errcode=iret) + deglons(:) = values_1d + call nccheck_incr(nf90_put_var(ncid_out, lonvarid, deglons, & + start = (/1/), count = (/nlons/))) + + call read_vardata(dsfg, 'grid_yt', values_1d, errcode=iret) + ! latitudes + do j=1,nlats + deglats(nlats-j+1) = values_1d(j) + end do + + call nccheck_incr(nf90_put_var(ncid_out, latvarid, deglats, & + start = (/1/), count = (/nlats/))) + + ! construct mask (1 - soil, 2 - snow, 0 - not snow) + ! note: same logic/threshold used in global_cycle to produce + ! mask on model grid. + + call read_vardata(dsfg, 'slc1', values_2d, errcode=iret) + + mask = 0 + do j=1,nlats + do i = 1, nlons + if (values_2d(i,j) .LT. 1.0) then + mask(i,nlats-j+1) = 1 + endif + enddo + end do + + call read_vardata(dsfg, 'weasd', values_2d, errcode=iret) + do j=1,nlats + do i = 1, nlons + if (values_2d(i,j) .GT. 0.001) then + mask(i,nlats-j+1) = 2 + endif + enddo + end do + call nccheck_incr(nf90_put_var(ncid_out, maskvarid, mask, & + start = ncstart(1:2), count = nccount(1:2))) + + allocate(inc2d(nlons,nlats)) + allocate(inc2dout(nlons,nlats)) + + ! tmp2m increment + inc(:) = zero + if (tmp2m_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d) + tmp2m_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + do j=1,nlats + inc2dout(:,nlats-j+1) = inc2d(:,j) + end do + call nccheck_incr(nf90_put_var(ncid_out, tmp2mvarid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! spfh2m increment + inc(:) = zero + if (spfh2m_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+spfh2m_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + do j=1,nlats + inc2dout(:,nlats-j+1) = inc2d(:,j) + end do + call nccheck_incr(nf90_put_var(ncid_out, spfh2mvarid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! soilt1 increment + inc(:) = zero + if (soilt1_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+soilt1_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + inc2dout=0. + do j=1,nlats + do i = 1, nlons + if (mask(i,nlats-j+1) .NE. 0) inc2dout(i,nlats-j+1) = inc2d(i,j) + enddo + end do + call nccheck_incr(nf90_put_var(ncid_out, soilt1varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! soilt2 increment + inc(:) = zero + if (soilt2_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+soilt2_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + inc2dout=0. + do j=1,nlats + do i = 1, nlons + if (mask(i,nlats-j+1) .NE. 0) inc2dout(i,nlats-j+1) = inc2d(i,j) + enddo + end do + call nccheck_incr(nf90_put_var(ncid_out, soilt2varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! soilt3 increment + inc(:) = zero + if (soilt3_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+soilt3_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + inc2dout=0. + do j=1,nlats + do i = 1, nlons + if (mask(i,nlats-j+1) .NE. 0) inc2dout(i,nlats-j+1) = inc2d(i,j) + enddo + end do + call nccheck_incr(nf90_put_var(ncid_out, soilt3varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! soilt4 increment + inc(:) = zero + if (soilt4_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+soilt4_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + inc2dout=0. + do j=1,nlats + do i = 1, nlons + if (mask(i,nlats-j+1) .NE. 0) inc2dout(i,nlats-j+1) = inc2d(i,j) + enddo + end do + call nccheck_incr(nf90_put_var(ncid_out, soilt4varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! slc1 increment + inc(:) = zero + if (slc1_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+slc1_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + do j=1,nlats + inc2dout(:,nlats-j+1) = inc2d(:,j) + end do + call nccheck_incr(nf90_put_var(ncid_out, slc1varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! slc2 increment + inc(:) = zero + if (slc2_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+slc2_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + do j=1,nlats + inc2dout(:,nlats-j+1) = inc2d(:,j) + end do + call nccheck_incr(nf90_put_var(ncid_out, slc2varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! slc3 increment + inc(:) = zero + if (slc3_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+slc3_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + do j=1,nlats + inc2dout(:,nlats-j+1) = inc2d(:,j) + end do + call nccheck_incr(nf90_put_var(ncid_out, slc3varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + ! slc4 increment + inc(:) = zero + if (slc4_ind > 0) then + call copyfromgrdin(grdin(:,levels(n3d)+slc4_ind,nb,ne),inc) + endif + inc2d(:,:) = reshape(inc,(/nlons,nlats/)) + do j=1,nlats + inc2dout(:,nlats-j+1) = inc2d(:,j) + end do + call nccheck_incr(nf90_put_var(ncid_out, slc4varid, sngl(inc2dout), & + start = ncstart(1:2), count = nccount(1:2))) + + call close_dataset(dsfg,errcode=iret) + if (iret/=0) then + write(6,*)'gridio/writeincrement gfs model: problem closing netcdf sfc fg dataset, iret=',iret + call stop2(23) + endif + ! deallocate things + deallocate(inc2d,inc2dout) + + end do sfcbackgroundloop ! loop over backgrounds to read in + end do sfcensmemloop ! loop over ens members to read in + + endif ! write_sfc_file + return contains @@ -3709,7 +4221,7 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate use netcdf use params, only: nbackgrounds,incfileprefixes,fgfileprefixes,reducedgrid,& datestring,nhr_anal - use constants, only: grav + use constants, only: grav,qcmin use mpi use module_ncio, only: Dataset, Variable, Dimension, open_dataset,& read_attribute, close_dataset, get_dim, read_vardata,& @@ -3744,7 +4256,8 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate integer(i_kind) :: ncid_out, lon_dimid, lat_dimid, lev_dimid, ilev_dimid integer(i_kind) :: lonvarid, latvarid, levvarid, pfullvarid, ilevvarid, & hyaivarid, hybivarid, uvarid, vvarid, delpvarid, delzvarid, & - tvarid, sphumvarid, liqwatvarid, o3varid, icvarid + tvarid, sphumvarid, liqwatvarid, o3varid, icvarid, & + rwmrvarid, snmrvarid, grlevarid integer(i_kind) :: iadateout ! fixed fields such as lat, lon, levs @@ -3757,6 +4270,7 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate real(r_kind), dimension(nlons*nlats) :: psinc, inc, ug, vg, work real(r_single), allocatable, dimension(:,:,:) :: inc3d, inc3d2, inc3dout real(r_single), allocatable, dimension(:,:,:) :: tv, tvanl, tmp, tmpanl, q, qanl + real(r_single), allocatable, dimension(:,:,:) :: q2, qanl2 real(r_kind), allocatable, dimension(:,:) :: values_2d real(r_kind), allocatable, dimension(:) :: psges, delzb, values_1d @@ -3846,6 +4360,12 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate call nccheck_incr(nf90_var_par_access(ncid_out, o3varid, nf90_collective)) call nccheck_incr(nf90_def_var(ncid_out, "icmr_inc", nf90_real, dimids3, icvarid)) call nccheck_incr(nf90_var_par_access(ncid_out, icvarid, nf90_collective)) + call nccheck_incr(nf90_def_var(ncid_out, "rwmr_inc", nf90_real, dimids3, rwmrvarid)) + call nccheck_incr(nf90_var_par_access(ncid_out, rwmrvarid, nf90_collective)) + call nccheck_incr(nf90_def_var(ncid_out, "snmr_inc", nf90_real, dimids3, snmrvarid)) + call nccheck_incr(nf90_var_par_access(ncid_out, snmrvarid, nf90_collective)) + call nccheck_incr(nf90_def_var(ncid_out, "grle_inc", nf90_real, dimids3, grlevarid)) + call nccheck_incr(nf90_var_par_access(ncid_out, grlevarid, nf90_collective)) ! place global attributes to parallel calc_increment output call nccheck_incr(nf90_put_att(ncid_out, nf90_global, "source", "GSI EnKF")) call nccheck_incr(nf90_put_att(ncid_out, nf90_global, "comment", & @@ -3878,7 +4398,7 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate dsfg = open_dataset(filenamein, paropen=.true., mpicomm=iocomms(mem_pe(nproc))) call read_attribute(dsfg, 'ak', values_1d,errcode=iret) if (iret /= 0) then - print *,'error reading ak' + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading ak, iret= ',iret,' PROGRAM STOPS' call stop2(29) endif do k=1,nlevs+1 @@ -3887,7 +4407,7 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate enddo call read_attribute(dsfg, 'bk', values_1d,errcode=iret) if (iret /= 0) then - print *,'error reading bk' + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading bk, iret= ',iret,' PROGRAM STOPS' call stop2(29) endif do k=1,nlevs+1 @@ -3997,7 +4517,7 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate allocate(tvanl(nlons,nlats,nccount(3)),tmpanl(nlons,nlats,nccount(3)),qanl(nlons,nlats,nccount(3))) call read_vardata(dsfg, 'spfh', q, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading spfh' + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading spfh, iret= ',iret,' PROGRAM STOPS' call stop2(29) endif do k=lev_pe1(iope), lev_pe2(iope) @@ -4022,7 +4542,7 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate ! t increment call read_vardata(dsfg, 'tmp', tmp, ncstart=ncstart, nccount=nccount, errcode=iret) if (iret /= 0) then - print *,'error reading tmp' + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading tmp, iret= ',iret,' PROGRAM STOPS' call stop2(29) endif tv = tmp * ( 1.0 + fv*q) @@ -4094,33 +4614,68 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate call nccheck_incr(nf90_put_var(ncid_out, o3varid, sngl(inc3dout), & start = ncstart, count = nccount)) + ! For hydrometeors, following the treatment for specific humidity increment + ! Need to make sure the analysis value is not negative + ! Read in background + increment and make sure the minimum is qcmin + ! Adjust increment accordingly + ! liq wat increment ! icmr increment + ! if cw increment, make sure split the cw increment into ql and qi increments + allocate(q2(nlons,nlats,nccount(3)),qanl2(nlons,nlats,nccount(3))) + call read_vardata(dsfg, 'clwmr', q, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading clwmr, iret= ',iret,' PROGRAM STOPS' + call stop2(29) + endif + call read_vardata(dsfg, 'icmr', q2, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading icmr, iret= ',iret,' PROGRAM STOPS' + call stop2(29) + endif do k=lev_pe1(iope), lev_pe2(iope) krev = nlevs-k+1 ki = k - lev_pe1(iope) + 1 - ug = zero + ug = zero; vg = zero if (cw_ind > 0) then call copyfromgrdin(grdin(:,levels(cw_ind-1)+krev,nb,ne),ug) + else if (ql_ind > 0) then + call copyfromgrdin(grdin(:,levels(ql_ind-1)+krev,nb,ne),ug) end if - if (imp_physics == 11) then - work = -r0_05 * (reshape(tmpanl(:,:,ki),(/nlons*nlats/)) - t0c) - do i=1,nlons*nlats - work(i) = max(zero,work(i)) - work(i) = min(one,work(i)) - enddo - vg = ug * work ! cloud ice - ug = ug * (one - work) ! cloud water - inc3d2(:,:,ki) = reshape(vg,(/nlons,nlats/)) + ! analysis control variable is cw, need to split cw analysis to ql and qi + if (cw_ind > 0) then + if (imp_physics == 11) then + work = -r0_05 * (reshape(tmpanl(:,:,ki),(/nlons*nlats/)) - t0c) + do i=1,nlons*nlats + work(i) = max(zero,work(i)) + work(i) = min(one,work(i)) + enddo + vg = ug * work ! cloud ice + ug = ug * (one - work) ! cloud water + endif + else if (qi_ind > 0) then + call copyfromgrdin(grdin(:,levels(qi_ind-1)+krev,nb,ne),vg) endif - inc3d(:,:,ki) = reshape(ug,(/nlons,nlats/)) + inc3d(:,:,ki) = reshape(ug,(/nlons,nlats/)) ! cloud water + qanl(:,:,ki) = q(:,:,ki) + inc3d(:,:,ki) + inc3d2(:,:,ki) = reshape(vg,(/nlons,nlats/)) ! cloud ice + qanl2(:,:,ki) = q2(:,:,ki) + inc3d(:,:,ki) enddo + + ! adjust hydrometeor increment to make sure analysis is positive + if (cliptracers) where (qanl < qcmin) qanl = qcmin + inc3d = qanl - q ! ql + if (cliptracers) where (qanl2 < qcmin) qanl2 = qcmin + inc3d2 = qanl2 - q2 ! qi + + ! output ql increment do j=1,nlats inc3dout(:,nlats-j+1,:) = inc3d(:,j,:) end do if (should_zero_increments_for('liq_wat_inc')) inc3dout = zero call nccheck_incr(nf90_put_var(ncid_out, liqwatvarid, sngl(inc3dout), & start = ncstart, count = nccount)) + ! output qi increment do j=1,nlats inc3dout(:,nlats-j+1,:) = inc3d2(:,j,:) end do @@ -4128,11 +4683,87 @@ subroutine writeincrement_pnc(vars3d,vars2d,n3d,n2d,levels,ndim,grdin,no_inflate call nccheck_incr(nf90_put_var(ncid_out, icvarid, sngl(inc3dout), & start = ncstart, count = nccount)) + ! rwmr increment + call read_vardata(dsfg, 'rwmr', q, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading rwmr, iret= ',iret,' PROGRAM STOPS' + call stop2(29) + endif + do k=lev_pe1(iope), lev_pe2(iope) + krev = nlevs-k+1 + ki = k - lev_pe1(iope) + 1 + inc(:) = zero + if (qr_ind > 0) then + call copyfromgrdin(grdin(:,levels(qr_ind-1) + krev,nb,ne),inc) + endif + inc3d(:,:,ki) = reshape(inc,(/nlons,nlats/)) + qanl(:,:,ki) = q(:,:,ki) + inc3d(:,:,ki) + end do + if (cliptracers) where (qanl < qcmin) qanl = qcmin + inc3d = qanl - q ! updated rwmr increment + do j=1,nlats + inc3dout(:,nlats-j+1,:) = inc3d(:,j,:) + end do + if (should_zero_increments_for('rwmr_inc')) inc3dout = zero + call nccheck_incr(nf90_put_var(ncid_out, rwmrvarid, sngl(inc3dout), & + start = ncstart, count = nccount)) + + ! snmr increment + call read_vardata(dsfg, 'snmr', q, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading snmr, iret= ',iret,' PROGRAM STOPS' + call stop2(29) + endif + do k=lev_pe1(iope), lev_pe2(iope) + krev = nlevs-k+1 + ki = k - lev_pe1(iope) + 1 + inc(:) = zero + if (qs_ind > 0) then + call copyfromgrdin(grdin(:,levels(qs_ind-1) + krev,nb,ne),inc) + endif + inc3d(:,:,ki) = reshape(inc,(/nlons,nlats/)) + qanl(:,:,ki) = q(:,:,ki) + inc3d(:,:,ki) + end do + if (cliptracers) where (qanl < qcmin) qanl = qcmin + inc3d = qanl - q ! updated snmr increment + do j=1,nlats + inc3dout(:,nlats-j+1,:) = inc3d(:,j,:) + end do + if (should_zero_increments_for('snmr_inc')) inc3dout = zero + call nccheck_incr(nf90_put_var(ncid_out, snmrvarid, sngl(inc3dout), & + start = ncstart, count = nccount)) + + ! grle increment + call read_vardata(dsfg, 'grle', q, ncstart=ncstart, nccount=nccount, errcode=iret) + if (iret /= 0) then + write(6,*)'WRITEINCREMENT_PNC: ***FATAL ERROR*** reading grle, iret= ',iret,' PROGRAM STOPS' + call stop2(29) + endif + do k=lev_pe1(iope), lev_pe2(iope) + krev = nlevs-k+1 + ki = k - lev_pe1(iope) + 1 + inc(:) = zero + if (qg_ind > 0) then + call copyfromgrdin(grdin(:,levels(qg_ind-1) + krev,nb,ne),inc) + endif + inc3d(:,:,ki) = reshape(inc,(/nlons,nlats/)) + qanl(:,:,ki) = q(:,:,ki) + inc3d(:,:,ki) + end do + if (cliptracers) where (qanl < qcmin) qanl = qcmin + inc3d = qanl - q ! updated grle increment + do j=1,nlats + inc3dout(:,nlats-j+1,:) = inc3d(:,j,:) + end do + if (should_zero_increments_for('grle_inc')) inc3dout = zero + call nccheck_incr(nf90_put_var(ncid_out, grlevarid, sngl(inc3dout), & + start = ncstart, count = nccount)) + call mpi_barrier(iocomms(mem_pe(nproc)), iret) ! deallocate things deallocate(inc3d,inc3d2,inc3dout) deallocate(tmp,tv,q,tmpanl,tvanl,qanl) + deallocate(q2,qanl2) if (allocated(delzb)) deallocate(delzb) if (allocated(psges)) deallocate(psges) @@ -4163,6 +4794,64 @@ end subroutine copyfromgrdin end subroutine writeincrement_pnc + subroutine set_ncio_file_flags(vars3d, n3d, vars2d, n2d, sfc_file, atm_file) + ! determine if variables are in sfc and/or atm file, for ncio case. + character(len=max_varname_length), dimension(n2d), intent(in) :: vars2d + character(len=max_varname_length), dimension(n3d), intent(in) :: vars3d + integer, intent(in) :: n2d, n3d + logical, intent(out) :: sfc_file, atm_file + + integer(i_kind) :: u_ind, v_ind, tv_ind, q_ind, oz_ind, cw_ind + integer(i_kind) :: qr_ind, qs_ind, qg_ind + integer(i_kind) :: tsen_ind, ql_ind, qi_ind, prse_ind + integer(i_kind) :: ps_ind, pst_ind, sst_ind + integer(i_kind) :: tmp2m_ind, spfh2m_ind, soilt1_ind, soilt2_ind, soilt3_ind + integer(i_kind) :: soilt4_ind,slc1_ind, slc2_ind, slc3_ind, slc4_ind + + ! atmos file variables + u_ind = getindex(vars3d, 'u') !< indices in the state or control var arrays + v_ind = getindex(vars3d, 'v') ! U and V (3D) + tv_ind = getindex(vars3d, 'tv') ! Tv (3D) + q_ind = getindex(vars3d, 'q') ! Q (3D) + oz_ind = getindex(vars3d, 'oz') ! Oz (3D) + cw_ind = getindex(vars3d, 'cw') ! CW (3D) + tsen_ind = getindex(vars3d, 'tsen') !sensible T (3D) + ql_ind = getindex(vars3d, 'ql') ! QL (3D) + qi_ind = getindex(vars3d, 'qi') ! QI (3D) + prse_ind = getindex(vars3d, 'prse') + qr_ind = getindex(vars3d, 'qr') ! QR (3D) + qs_ind = getindex(vars3d, 'qs') ! QS (3D) + qg_ind = getindex(vars3d, 'qg') ! QG (3D) + ps_ind = getindex(vars2d, 'ps') ! Ps (2D) + pst_ind = getindex(vars2d, 'pst') ! Ps tendency (2D) // equivalent of + ! old logical massbal_adjust, if non-zero + sst_ind = getindex(vars2d, 'sst') ! is this really in the atmos file? + + ! for nc gfs io determine if requested variables are in sfc and/or atmos file + atm_file = ( u_ind>0 .or. v_ind>0 .or. tv_ind>0 .or. q_ind>0 .or. sst_ind>0 .or. & + oz_ind>0 .or. cw_ind>0 .or. tsen_ind>0 .or. ql_ind>0 .or. & + qi_ind>0 .or. prse_ind>0 .or. qr_ind>0 .or. qs_ind>0 .or. qg_ind>0 ) + + ! sfc file variables + tmp2m_ind = getindex(vars2d, 't2m') + spfh2m_ind = getindex(vars2d, 'q2m') + soilt1_ind = getindex(vars2d, 'st1') + slc1_ind = getindex(vars2d, 'sl1') + soilt2_ind = getindex(vars2d, 'st2') + slc2_ind = getindex(vars2d, 'sl2') + soilt3_ind = getindex(vars2d, 'st3') + slc3_ind = getindex(vars2d, 'sl3') + soilt4_ind = getindex(vars2d, 'st4') + slc4_ind = getindex(vars2d, 'sl4') + + sfc_file = ( tmp2m_ind > 0 .or. spfh2m_ind > 0 .or. soilt1_ind > 0 .or. & + slc1_ind > 0 .or. soilt2_ind > 0 .or. slc2_ind > 0 .or. & + soilt3_ind > 0 .or. slc3_ind > 0 .or. soilt4_ind > 0 .or. & + slc4_ind > 0 ) + + end subroutine set_ncio_file_flags + + logical function checkfield(field,fields,nrec) result(hasfield) use nemsio_module, only: nemsio_charkind integer, intent(in) :: nrec diff --git a/src/enkf/innovstats.f90 b/src/enkf/innovstats.f90 index e67cf43f10..68668218fc 100644 --- a/src/enkf/innovstats.f90 +++ b/src/enkf/innovstats.f90 @@ -213,7 +213,7 @@ subroutine print_innovstats(obfit,obsprd) call printstats(' all gps',sumgps_nh,biasq_nh,sumgps_spread_nh,sumgps_oberr_nh,nobsgps_nh,& sumgps_sh,biasgps_sh,sumgps_spread_sh,sumgps_oberr_sh,nobsgps_sh,& sumgps_tr,biasgps_tr,sumgps_spread_tr,sumgps_oberr_tr,nobsgps_tr) - call printstats(' all dbz',sumdbz_nh,biasq_nh,sumdbz_spread_nh,sumdbz_oberr_nh,nobsdbz_nh,& + call printstats(' all dbz',sumdbz_nh,biasdbz_nh,sumdbz_spread_nh,sumdbz_oberr_nh,nobsdbz_nh,& sumdbz_sh,biasdbz_sh,sumdbz_spread_sh,sumdbz_oberr_sh,nobsdbz_sh,& sumdbz_tr,biasdbz_tr,sumdbz_spread_tr,sumdbz_oberr_tr,nobsdbz_tr) call printstats(' all rw',sumrw_nh,biasq_nh,sumrw_spread_nh,sumrw_oberr_nh,nobsrw_nh,& diff --git a/src/enkf/loadbal.f90 b/src/enkf/loadbal.f90 index ff99bc0736..3292c99ee4 100644 --- a/src/enkf/loadbal.f90 +++ b/src/enkf/loadbal.f90 @@ -130,7 +130,6 @@ module loadbal numptsperproc, numobsperproc integer(i_kind),public, allocatable, dimension(:,:) :: indxproc, indxproc_obs integer(i_kind),public :: npts_min, npts_max, nobs_min, nobs_max -integer(8) totsize ! kd-tree structures. type(kdtree2),public,pointer :: kdtree_obs, kdtree_grid, kdtree_obs2 @@ -356,73 +355,126 @@ subroutine scatter_chunks allocate(scounts(0:numproc-1)) allocate(displs(0:numproc-1)) allocate(rcounts(0:numproc-1)) +! 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,kind=8) + ! only IO tasks send any data. ! scounts is number of data elements to send to processor np. ! rcounts is number of data elements to recv from processor np. ! displs is displacement into send array for data to go to proc np -do np=0,numproc-1 - displs(np) = np*nanals_per_iotask*npts_max*ncdim -enddo -if (nproc <= ntasks_io-1) then - scounts = nanals_per_iotask*npts_max*ncdim + +if (real(numproc)*real(nanals_per_iotask)*real(npts_max)*real(ncdim) < 2_r_kind**32/2_r_kind - 1_r_kind) then + do np=0,numproc-1 + displs(np) = np*nanals_per_iotask*npts_max*ncdim + enddo + if (nproc <= ntasks_io-1) then + scounts = nanals_per_iotask*npts_max*ncdim + else + scounts = 0 + endif + ! displs is also the displacement into recv array for data to go into anal_chunk + ! on task np. + do np=0,numproc-1 + if (np <= ntasks_io-1) then + rcounts(np) = nanals_per_iotask*npts_max*ncdim + else + rcounts(np) = 0 + end if + enddo + allocate(sendbuf(numproc*nanals_per_iotask*npts_max*ncdim)) + allocate(recvbuf(numproc*nanals_per_iotask*npts_max*ncdim)) + + ! send and receive buffers. + do nb=1,nbackgrounds ! loop over time levels in background + + if (nproc <= ntasks_io-1) then + ! fill up send buffer. + do np=1,numproc + do ne=1,nanals_per_iotask + do nn=1,ncdim + do i=1,numptsperproc(np) + n = ((np-1)*ncdim*nanals_per_iotask + (ne-1)*ncdim + (nn-1))*npts_max + i + sendbuf(n) = grdin(indxproc(np,i),nn,nb,ne) + enddo + enddo + enddo + enddo + end if + call mpi_alltoallv(sendbuf, scounts, displs, mpi_real4, recvbuf, rcounts, displs,& + mpi_real4, mpi_comm_world, ierr) + + !==> compute ensemble of first guesses on each task, remove mean from anal. + !$omp parallel do schedule(dynamic,1) private(nn,i,nanal,n) + do nn=1,ncdim + do i=1,numptsperproc(nproc+1) + do nanal=1,nanals + n = ((nanal-1)*ncdim + (nn-1))*npts_max + i + anal_chunk(nanal,i,nn,nb) = recvbuf(n) + enddo + end do + end do + !$omp end parallel do + + enddo ! loop over nbackgrounds else - scounts = 0 -endif -! displs is also the displacement into recv array for data to go into anal_chunk -! on -! task np. -do np=0,numproc-1 - if (np <= ntasks_io-1) then - rcounts(np) = nanals_per_iotask*npts_max*ncdim + do np=0,numproc-1 + displs(np) = np*nanals_per_iotask*npts_max + enddo + if (nproc <= ntasks_io-1) then + scounts = nanals_per_iotask*npts_max else - rcounts(np) = 0 - end if -enddo -allocate(sendbuf(numproc*nanals_per_iotask*npts_max*ncdim)) -allocate(recvbuf(numproc*nanals_per_iotask*npts_max*ncdim)) - -! 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,kind=8) + scounts = 0 + endif + ! displs is also the displacement into recv array for data to go into anal_chunk + ! on task np. + do np=0,numproc-1 + if (np <= ntasks_io-1) then + rcounts(np) = nanals_per_iotask*npts_max + else + rcounts(np) = 0 + end if + enddo + allocate(sendbuf(numproc*nanals_per_iotask*npts_max)) + allocate(recvbuf(numproc*nanals_per_iotask*npts_max)) + + ! send and receive buffers. + do nb=1,nbackgrounds ! loop over time levels in background + do nn=1,ncdim ! loop over levels + + if (nproc <= ntasks_io-1) then + ! fill up send buffer. + do np=1,numproc + do ne=1,nanals_per_iotask + do i=1,numptsperproc(np) + n = ((ne-1)*nanals_per_iotask + (np-1))*npts_max + i + sendbuf(n) = grdin(indxproc(np,i),nn,nb,ne) + enddo + enddo + enddo + end if + call mpi_alltoallv(sendbuf, scounts, displs, mpi_real4, recvbuf, rcounts, displs,& + mpi_real4, mpi_comm_world, ierr) + !==> compute ensemble of first guesses on each task, remove mean from anal. + !$omp parallel do schedule(dynamic,1) private(i,nanal,n) + do i=1,numptsperproc(nproc+1) + do nanal=1,nanals + n = (nanal-1)*npts_max + i + anal_chunk(nanal,i,nn,nb) = recvbuf(n) + enddo + end do + !$omp end parallel do + + enddo ! end loop over levels + enddo ! loop over nbackgrounds +endif +deallocate(sendbuf, recvbuf) allocate(anal_chunk_prior(nanals,npts_max,ncdim,nbackgrounds)) allocate(ensmean_chunk(npts_max,ncdim,nbackgrounds)) allocate(ensmean_chunk_prior(npts_max,ncdim,nbackgrounds)) ensmean_chunk = 0_r_single -! send and receive buffers. -do nb=1,nbackgrounds ! loop over time levels in background - - if (nproc <= ntasks_io-1) then - ! fill up send buffer. - do np=1,numproc - do ne=1,nanals_per_iotask - do nn=1,ncdim - do i=1,numptsperproc(np) - n = ((np-1)*ncdim*nanals_per_iotask + (ne-1)*ncdim + (nn-1))*npts_max + i - sendbuf(n) = grdin(indxproc(np,i),nn,nb,ne) - enddo - enddo - enddo - enddo - end if - call mpi_alltoallv(sendbuf, scounts, displs, mpi_real4, recvbuf, rcounts, displs,& - mpi_real4, mpi_comm_world, ierr) - - !==> compute ensemble of first guesses on each task, remove mean from anal. - !$omp parallel do schedule(dynamic,1) private(nn,i,nanal,n) - do nn=1,ncdim - do i=1,numptsperproc(nproc+1) - do nanal=1,nanals - n = ((nanal-1)*ncdim + (nn-1))*npts_max + i - anal_chunk(nanal,i,nn,nb) = recvbuf(n) - enddo - end do - end do - !$omp end parallel do - -enddo ! loop over nbackgrounds - !==> compute mean, remove it from anal_chunk !$omp parallel do schedule(dynamic,1) private(nn,i,n,nb) do nb=1,nbackgrounds @@ -440,7 +492,6 @@ subroutine scatter_chunks end do !$omp end parallel do -deallocate(sendbuf, recvbuf) end subroutine scatter_chunks @@ -460,52 +511,94 @@ subroutine gather_chunks ! scounts is number of data elements to send to processor np. ! rcounts is number of data elements to recv from processor np. ! displs is displacement into send array for data to go to proc np -if (nproc <= ntasks_io-1) then - rcounts = nanals_per_iotask*npts_max*ncdim -else - rcounts = 0 -endif -do np=0,numproc-1 - displs(np) = np*nanals_per_iotask*npts_max*ncdim - if (np <= ntasks_io-1) then - scounts(np) = nanals_per_iotask*npts_max*ncdim - else - scounts(np) = 0 - end if -enddo -allocate(recvbuf(numproc*nanals_per_iotask*npts_max*ncdim)) -allocate(sendbuf(numproc*nanals_per_iotask*npts_max*ncdim)) - -do nb=1,nbackgrounds ! loop over time levels in background - do nn=1,ncdim - do i=1,numptsperproc(nproc+1) - do nanal=1,nanals - n = ((nanal-1)*ncdim + (nn-1))*npts_max + i - ! add ensemble mean back in. - sendbuf(n) = anal_chunk(nanal,i,nn,nb)+ensmean_chunk(i,nn,nb) - ! convert to increment (A-F). - sendbuf(n) = sendbuf(n)-(anal_chunk_prior(nanal,i,nn,nb)+ensmean_chunk_prior(i,nn,nb)) - enddo - enddo - enddo - call mpi_alltoallv(sendbuf, scounts, displs, mpi_real4, recvbuf, rcounts, displs,& - mpi_real4, mpi_comm_world, ierr) - if (nproc <= ntasks_io-1) then - do np=1,numproc - do ne=1,nanals_per_iotask - do nn=1,ncdim - do i=1,numptsperproc(np) - n = ((np-1)*ncdim*nanals_per_iotask + (ne-1)*ncdim + (nn-1))*npts_max + i - grdin(indxproc(np,i),nn,nb,ne) = recvbuf(n) +if (real(numproc)*real(nanals_per_iotask)*real(npts_max)*real(ncdim) < 2_r_kind**32/2_r_kind - 1_i_kind) then + if (nproc <= ntasks_io-1) then + rcounts = nanals_per_iotask*npts_max*ncdim + else + rcounts = 0 + endif + do np=0,numproc-1 + displs(np) = np*nanals_per_iotask*npts_max*ncdim + if (np <= ntasks_io-1) then + scounts(np) = nanals_per_iotask*npts_max*ncdim + else + scounts(np) = 0 + end if + enddo + allocate(recvbuf(numproc*nanals_per_iotask*npts_max*ncdim)) + allocate(sendbuf(numproc*nanals_per_iotask*npts_max*ncdim)) + do nb=1,nbackgrounds ! loop over time levels in background + do nn=1,ncdim + do i=1,numptsperproc(nproc+1) + do nanal=1,nanals + n = ((nanal-1)*ncdim + (nn-1))*npts_max + i + ! add ensemble mean back in. + sendbuf(n) = anal_chunk(nanal,i,nn,nb)+ensmean_chunk(i,nn,nb) + ! convert to increment (A-F). + sendbuf(n) = sendbuf(n)-(anal_chunk_prior(nanal,i,nn,nb)+ensmean_chunk_prior(i,nn,nb)) + enddo enddo - enddo enddo - enddo - !print *,nproc,'min/max ps',minval(grdin(:,ncdim)),maxval(grdin(:,ncdim)) - end if -enddo ! end loop over background time levels - + call mpi_alltoallv(sendbuf, scounts, displs, mpi_real4, recvbuf, rcounts, displs,& + mpi_real4, mpi_comm_world, ierr) + if (nproc <= ntasks_io-1) then + do np=1,numproc + do ne=1,nanals_per_iotask + do nn=1,ncdim + do i=1,numptsperproc(np) + n = ((np-1)*ncdim*nanals_per_iotask + (ne-1)*ncdim + (nn-1))*npts_max + i + grdin(indxproc(np,i),nn,nb,ne) = recvbuf(n) + enddo + enddo + enddo + enddo + !print *,nproc,'min/max ps',minval(grdin(:,ncdim)),maxval(grdin(:,ncdim)) + end if + enddo ! end loop over background time levels +else + if (nproc <= ntasks_io-1) then + rcounts = nanals_per_iotask*npts_max + else + rcounts = 0 + endif + do np=0,numproc-1 + displs(np) = np*nanals_per_iotask*npts_max + if (np <= ntasks_io-1) then + scounts(np) = nanals_per_iotask*npts_max + else + scounts(np) = 0 + end if + enddo + allocate(recvbuf(numproc*nanals_per_iotask*npts_max)) + allocate(sendbuf(numproc*nanals_per_iotask*npts_max)) + do nb=1,nbackgrounds ! loop over time levels in background + do nn=1,ncdim ! loop over levels + do i=1,numptsperproc(nproc+1) + do nanal=1,nanals + n = (nanal-1)*npts_max + i + ! add ensemble mean back in. + sendbuf(n) = anal_chunk(nanal,i,nn,nb)+ensmean_chunk(i,nn,nb) + ! convert to increment (A-F). + sendbuf(n) = sendbuf(n)-(anal_chunk_prior(nanal,i,nn,nb)+ensmean_chunk_prior(i,nn,nb)) + enddo + enddo + call mpi_alltoallv(sendbuf, scounts, displs, mpi_real4, recvbuf, rcounts, displs,& + mpi_real4, mpi_comm_world, ierr) + if (nproc <= ntasks_io-1) then + do np=1,numproc + do ne=1,nanals_per_iotask + do i=1,numptsperproc(np) + n = ((ne-1)*nanals_per_iotask + (np-1))*npts_max + i + grdin(indxproc(np,i),nn,nb,ne) = recvbuf(n) + enddo + enddo + enddo + !print *,nproc,'min/max ps',minval(grdin(:,ncdim)),maxval(grdin(:,ncdim)) + end if + enddo ! end loop over levels + enddo ! end loop over background time levels +endif deallocate(sendbuf, recvbuf) end subroutine gather_chunks diff --git a/src/enkf/mpi_readobs.f90 b/src/enkf/mpi_readobs.f90 index e48f5a1804..de8d02e76c 100644 --- a/src/enkf/mpi_readobs.f90 +++ b/src/enkf/mpi_readobs.f90 @@ -250,7 +250,7 @@ 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 - if (real(nanals)*real(nobs_tot) < 2**32/2. - 1) then + if (real(nanals)*real(nobs_tot) < 2_r_kind**32/2_r_kind - 1_r_kind) 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 diff --git a/src/enkf/params.f90 b/src/enkf/params.f90 index 593e5a5ec4..b21d88abd0 100644 --- a/src/enkf/params.f90 +++ b/src/enkf/params.f90 @@ -85,7 +85,9 @@ module params character(len=120),dimension(7),public :: statefileprefixes character(len=120),dimension(7),public :: statesfcfileprefixes character(len=120),dimension(7),public :: anlfileprefixes +character(len=120),dimension(7),public :: anlsfcfileprefixes character(len=120),dimension(7),public :: incfileprefixes +character(len=120),dimension(7),public :: incsfcfileprefixes ! analysis date string (YYYYMMDDHH) character(len=10), public :: datestring ! Hour for datestring @@ -266,7 +268,7 @@ module params lnsigcutoffsatnh,lnsigcutoffsattr,lnsigcutoffsatsh,& lnsigcutoffpsnh,lnsigcutoffpstr,lnsigcutoffpssh,& fgfileprefixes,fgsfcfileprefixes,anlfileprefixes, & - incfileprefixes, & + anlsfcfileprefixes,incfileprefixes,incsfcfileprefixes,& statefileprefixes,statesfcfileprefixes, & covl_minfact,covl_efold,lupd_obspace_serial,letkf_novlocal,& analpertwtnh,analpertwtsh,analpertwttr,sprd_tol,& @@ -460,8 +462,8 @@ subroutine read_namelist() ! Initialize first-guess and analysis file name prefixes. ! (blank means use default names) fgfileprefixes = ''; anlfileprefixes=''; statefileprefixes='' -fgsfcfileprefixes = ''; statesfcfileprefixes='' -incfileprefixes = '' +anlsfcfileprefixes=''; fgsfcfileprefixes = ''; statesfcfileprefixes='' +incfileprefixes = ''; incsfcfileprefixes = '' ! option for including convective clouds in the all-sky cnvw_option=.false. @@ -720,7 +722,7 @@ subroutine read_namelist() endif endif if (trim(fgsfcfileprefixes(nbackgrounds+1)) .eq. "") then - fgsfcfileprefixes(nbackgrounds+1)="sfgsfc_"//datestring//"_fhr"//charfhr_anal(nbackgrounds+1)//"_" + fgsfcfileprefixes(nbackgrounds+1)="bfg_"//datestring//"_fhr"//charfhr_anal(nbackgrounds+1)//"_" end if nbackgrounds = nbackgrounds+1 end do @@ -742,7 +744,7 @@ subroutine read_namelist() endif endif if (trim(statesfcfileprefixes(nstatefields+1)) .eq. "") then - statesfcfileprefixes(nstatefields+1)="sfgsfc_"//datestring//"_fhr"//charfhr_state(nstatefields+1)//"_" + statesfcfileprefixes(nstatefields+1)="bfg_"//datestring//"_fhr"//charfhr_state(nstatefields+1)//"_" end if nstatefields = nstatefields+1 end do @@ -762,6 +764,23 @@ subroutine read_namelist() incfileprefixes(nb)="incr_"//datestring//"_fhr"//charfhr_anal(nb)//"_" ! else ! anlfileprefixes(nb)="sanl_"//datestring//"_" +! endif + endif + endif + if (trim(anlsfcfileprefixes(nb)) .eq. "") then + ! default analysis file prefix + if (regional) then + if (nbackgrounds > 1) then + anlsfcfileprefixes(nb)="sfc_analysis_fhr"//charfhr_anal(nb)//"." + else + anlsfcfileprefixes(nb)="sfc_analysis." + endif + else ! global +! if (nbackgrounds > 1) then + anlsfcfileprefixes(nb)="banl_"//datestring//"_fhr"//charfhr_anal(nb)//"_" + incsfcfileprefixes(nb)="sfcincr_"//datestring//"_fhr"//charfhr_anal(nb)//"_" +! else +! anlfileprefixes(nb)="sanl_"//datestring//"_" ! endif endif endif diff --git a/src/enkf/readconvobs.f90 b/src/enkf/readconvobs.f90 index e1977298a6..d1f4ec3ff8 100644 --- a/src/enkf/readconvobs.f90 +++ b/src/enkf/readconvobs.f90 @@ -24,6 +24,7 @@ module readconvobs ! reflectivity and radial velocity assimilation. POC: xuguang.wang@ou.edu ! 2017-12-13 shlyaeva - added netcdf diag read/write capability ! 2019-03-21 CAPS(C. Tong) - added direct reflectivity DA capability +! 2022-03-23 draper - added option to not scale qobs by forecast qsat. ! ! attributes: ! language: f95 @@ -32,7 +33,8 @@ module readconvobs use kinds, only: r_kind,i_kind,r_single,r_double use constants, only: one,zero,deg2rad -use params, only: npefiles, netcdf_diag, modelspace_vloc, l_use_enkf_directZDA +use params, only: npefiles, netcdf_diag, modelspace_vloc, & + l_use_enkf_directZDA implicit none private @@ -329,7 +331,6 @@ subroutine get_num_convobs_nc(obspath,datestring,num_obs_tot,num_obs_totdiag,id) call nc_diag_read_close(obsfile) - num_obs_totdiag = num_obs_totdiag + nobs_curr do i = 1, nobs_curr @@ -789,6 +790,9 @@ subroutine get_convobs_data_nc(obspath, datestring, nobs_max, nobs_maxdiag, & x_obs(nob) = x_obs(nob) /Forecast_Saturation_Spec_Hum(i) hx_mean(nob) = hx_mean(nob) /Forecast_Saturation_Spec_Hum(i) hx_mean_nobc(nob) = hx_mean_nobc(nob) /Forecast_Saturation_Spec_Hum(i) + if (neigv>0) then + hx_modens(:,nob) = hx_modens(:,nob)/ Forecast_Saturation_Spec_Hum(i) + endif endif ! for wind, also read v-component diff --git a/src/enkf/statevec.f90 b/src/enkf/statevec.f90 index d1be91af3c..5ad70346aa 100644 --- a/src/enkf/statevec.f90 +++ b/src/enkf/statevec.f90 @@ -14,7 +14,7 @@ module statevec ! ! Public Variables: ! nanals: (integer scalar) number of ensemble members (from module params) -! nlevs: number of analysis vertical levels (from module params). +! nlevs: number of analysis atmos vertical levels (from module params). ! ns3d: number of 3D variables ! ns2d: number of 2D variables ! svars3d: names of 3D variables @@ -120,7 +120,7 @@ subroutine init_statevec() svars3d(ns3d)=trim(adjustl(var)) slevels(ns3d)=ilev + slevels(ns3d-1) else - if (nproc .eq. 0) print *,'Error: only ', nlevs, ' and ', nlevs+1,' number of levels is supported in current version, got ',ilev + if (nproc .eq. 0) print *,'Error statevec: - only ', nlevs, ' and ', nlevs+1,' number of levels is supported in current version, got ',ilev call stop2(503) endif enddo diff --git a/src/gsi/adjtest.f90 b/src/gsi/adjtest.f90 index d910d14f12..e1a5da7d07 100644 --- a/src/gsi/adjtest.f90 +++ b/src/gsi/adjtest.f90 @@ -33,10 +33,12 @@ module adjtest use control_vectors, only: control_vector,allocate_cv,random_cv, & deallocate_cv,dot_product,assignment(=) use state_vectors, only: allocate_state,deallocate_state,dot_product +use gridmod, only : minmype use gsi_bundlemod, only: gsi_bundle use gsi_bundlemod, only: assignment(=) use bias_predictors, only: predictors,allocate_preds,deallocate_preds, & assignment(=) +use control2state_mod, only: control2state,c2sset,control2state_ad implicit none private @@ -81,7 +83,7 @@ subroutine adtest(xhat) integer(i_kind) :: ii,idig real(r_kind) :: zz1,zz2,zz3 -if (mype==0) write(6,*)'ADTEST starting' +if (mype==minmype) write(6,*)'ADTEST starting' ! ---------------------------------------------------------------------- ! Allocate local variables @@ -97,10 +99,10 @@ subroutine adtest(xhat) ! Initialize control space vectors if (present(xhat)) then xtest1=xhat - if (mype==0) write(6,*)'ADTEST use input xhat' + if (mype==minmype) write(6,*)'ADTEST use input xhat' else call random_cv(xtest1) - if (mype==0) write(6,*)'ADTEST use random_cv(xhat)' + if (mype==minmype) write(6,*)'ADTEST use random_cv(xhat)' endif xtest2=zero @@ -135,18 +137,20 @@ subroutine adtest(xhat) do ii=1,nsubwin zz2=zz2+dot_product(stest1(ii),stest1(ii)) enddo -DO ii=1,nrclen +do ii=1,nrclen zz2=zz2+sbias1%values(ii)*sbias1%values(ii) -ENDDO +enddo -if ( abs(zz1+zz2) > sqrt(tiny(zz3)) ) then - zz3=two*abs(zz1-zz2)/(zz1+zz2) -else - zz3=abs(zz1-zz2) -endif -idig= int(-log(zz3+tiny(zz3))/log(10.0_r_kind)) +if (mype==minmype) then + if ( abs(zz1+zz2) > sqrt(tiny(zz3)) ) then + zz3=two*abs(zz1-zz2)/(zz1+zz2) + else + zz3=abs(zz1-zz2) + end if + idig= int(-log(zz3+tiny(zz3))/log(10.0_r_kind)) -if (mype==0) then +! Note that this result is not completely correct especially on processors +! other than minmype. See issue 548. write(6,'(A)')' ADTEST 0.123456789012345678' write(6,'(A,ES25.18)')' ADTEST = ',zz1 write(6,'(A,ES25.18)')' ADTEST = ',zz2 @@ -166,7 +170,7 @@ subroutine adtest(xhat) call deallocate_preds(sbias2) ! ---------------------------------------------------------------------- -if (mype==0) write(6,*)'ADTEST finished' +if (mype==minmype) write(6,*)'ADTEST finished' return end subroutine adtest diff --git a/src/gsi/adjtest_obs.f90 b/src/gsi/adjtest_obs.f90 index 67e2ff0cdd..294dc32ca0 100644 --- a/src/gsi/adjtest_obs.f90 +++ b/src/gsi/adjtest_obs.f90 @@ -78,6 +78,7 @@ subroutine adtest_obs use m_obsdiags, only: obsLLists use m_obsLList, only: obsLList_getTLDdotprod + use control2state_mod, only: control2state implicit none diff --git a/src/gsi/aeroinfo.f90 b/src/gsi/aeroinfo.f90 index dd8489029b..a030bdeffc 100644 --- a/src/gsi/aeroinfo.f90 +++ b/src/gsi/aeroinfo.f90 @@ -313,12 +313,10 @@ subroutine aeroinfo_read ! Successful read, return to calling routine else -! File does not exist, write warning message to alert users +! File does not exist, write warning message to unit 6 to alert users if (mype==mype_aero) then - open(iout_aero) - write(iout_aero,*)'AEROINFO_READ: ***WARNING*** FILE ',trim(fname),' does not exist' - write(iout_aero,*)'AEROINFO_READ: jpch_aero=',jpch_aero - close(iout_aero) + write(6,*)'AEROINFO_READ: ***WARNING*** FILE ',trim(fname),' does not exist' + write(6,*)'AEROINFO_READ: jpch_aero=',jpch_aero endif end if diff --git a/src/gsi/aircraftinfo.f90 b/src/gsi/aircraftinfo.f90 index b84455f47c..a29f1571b1 100644 --- a/src/gsi/aircraftinfo.f90 +++ b/src/gsi/aircraftinfo.f90 @@ -57,7 +57,7 @@ module aircraftinfo logical :: cleanup_tail ! logical to remove tail number no longer used logical :: upd_aircraft ! indicator if update bias at 06Z & 18Z - integer(i_kind), parameter :: max_tail=10000 ! max tail numbers + integer(i_kind), parameter :: max_tail=100000 ! max tail numbers integer(i_kind) npredt ! predictor number integer(i_kind) ntail ! total tail number integer(i_kind) ntail_update ! new total tail number diff --git a/src/gsi/apply_scaledepwgts.f90 b/src/gsi/apply_scaledepwgts.f90 new file mode 100644 index 0000000000..e97b6fb614 --- /dev/null +++ b/src/gsi/apply_scaledepwgts.f90 @@ -0,0 +1,163 @@ +!$$$ program documentation block +! +! program history: +! +! 2018-03-28 T. Lei and D. Kleist - consoliated and added codes +! for the scale dependent scale localization scheme +! +!$$$ end documentation block + +function fwgtofwvlen (rvlft,rvrgt,rcons,rlen,rinput) +!$$$ subprogram documentation block +! +! subprogram: fwgtofwvlen +! +! abstract: Calculation of spectral filter functions +! +!$$$ end documentation block + + use kinds, only: r_kind,i_kind,r_single + implicit none + + real(r_kind),intent(in) :: rvlft,rvrgt,rcons,rlen,rinput + real(r_kind) :: fwgtofwvlen + real(r_kind) :: rlen1,rtem1,rconshalf + + rlen1=rlen/10.0_r_kind ! rlen corresponds to a (-5,5) region + rconshalf=0.5_r_kind*rcons + if(rinput > rvlft .and. rinput < rvrgt) then + fwgtofwvlen=rcons + else + rtem1=min(abs(rinput-rvlft),abs(rinput-rvrgt)) + fwgtofwvlen=rconshalf*(1.0_r_kind+tanh(5.0_r_kind-rtem1/rlen1)) + endif + +end function fwgtofwvlen +! . . . . +subroutine init_mult_spc_wgts(jcap_in) +!$$$ subprogram documentation block +! +! subprogram: init_mult_spc_wgts +! +!$$$ end documentation block + + use kinds, only: r_kind,i_kind,r_single + use constants, only: zero,half,one,two,three,rearth,pi,tiny_r_kind + use mpimod, only: mype + use general_sub2grid_mod, only: general_sub2grid_create_info + use egrid2agrid_mod,only: g_create_egrid2agrid + use general_sub2grid_mod, only: sub2grid_info + use hybrid_ensemble_parameters, only: nsclgrp + use hybrid_ensemble_parameters, only: spc_multwgt,spcwgt_params,r_ensloccov4scl + implicit none + + integer(i_kind),intent(in ) :: jcap_in + + integer(i_kind) i + integer(i_kind) ig + real(r_kind) rwv0,rtem1,rtem2 + real (r_kind):: fwgtofwvlen + real(r_kind) :: totwvlength + logical :: l_sum_spc_weights + + ! Spectral scale decomposition is differernt between SDL-cross and SDL-nocross + if( r_ensloccov4scl < tiny_r_kind )then + l_sum_spc_weights = .false. + else + l_sum_spc_weights = .true. + end if + + spc_multwgt(0,1)=one + do ig=2,nsclgrp + spc_multwgt(0,ig)=zero + end do + + + rwv0=2.0_r_kind*pi*rearth*0.001_r_kind + do i=1,jcap_in + totwvlength= rwv0/real(i) + rtem1=zero + do ig=1,nsclgrp + if(ig /= 2) then + spc_multwgt(i,ig)=fwgtofwvlen(spcwgt_params(1,ig),spcwgt_params(2,ig),& + spcwgt_params(3,ig),spcwgt_params(4,ig),totwvlength) + spc_multwgt(i,ig)=min(max(spc_multwgt(i,ig),zero),one) + if(l_sum_spc_weights) then + rtem1=rtem1+spc_multwgt(i,ig) + else + rtem1=rtem1+spc_multwgt(i,ig)*spc_multwgt(i,ig) + endif + endif + enddo + rtem2 =1.0_r_kind - rtem1 + if(rtem2 >= zero) then + + if(l_sum_spc_weights) then + spc_multwgt(i,2)=rtem2 + else + spc_multwgt(i,2)=sqrt(rtem2) + endif + else + if(mype == 0)write(6,*) ' rtem2 < zero ',i,rtem2,(spc_multwgt(i,ig),ig=1,nsclgrp) + spc_multwgt(i,2)=zero + endif + enddo + + return +end subroutine init_mult_spc_wgts + +subroutine apply_scaledepwgts(grd_in,sp_in,wbundle,spwgts,wbundle2) +! +! Program history log: +! 2017-03-30 J. Kay, X. Wang - copied from Kleist's apply_scaledepwgts and +! add the calculation of scale-dependent weighting for mixed resolution ensemble +! POC: xuguang.wang@ou.edu +! + use constants, only: one + use control_vectors, only: control_vector + use kinds, only: r_kind,i_kind + use kinds, only: r_single + use general_specmod, only: general_spec_multwgt + use gsi_bundlemod, only: gsi_bundle + use general_sub2grid_mod, only: general_sub2grid,general_grid2sub + use general_specmod, only: spec_vars + use general_sub2grid_mod, only: sub2grid_info + use mpimod, only: mpi_comm_world,mype + implicit none + +! Declare passed variables + type(gsi_bundle),intent(in) :: wbundle + type(gsi_bundle),intent(inout) :: wbundle2 + type(spec_vars),intent (in):: sp_in + type(sub2grid_info),intent(in)::grd_in + real(r_kind),dimension(0:sp_in%jcap),intent(in):: spwgts + +! Declare local variables + integer(i_kind) kk + + real(r_kind),dimension(grd_in%nlat*grd_in%nlon*grd_in%nlevs_alloc) :: hwork + real(r_kind),dimension(grd_in%nlat,grd_in%nlon,grd_in%nlevs_alloc) :: work + real(r_kind),dimension(sp_in%nc):: spc1 + +! Beta1 first +! Get from subdomains to + call general_sub2grid(grd_in,wbundle%values,hwork) + work=reshape(hwork,(/grd_in%nlat,grd_in%nlon,grd_in%nlevs_alloc/)) + + do kk=1,grd_in%nlevs_alloc +! Transform from physical space to spectral space + call general_g2s0(grd_in,sp_in,spc1,work(:,:,kk)) + +! Apply spectral weights + call general_spec_multwgt(sp_in,spc1,spwgts) +! Transform back to physical space + call general_s2g0(grd_in,sp_in,spc1,work(:,:,kk)) + + end do + +! Transfer work back to subdomains + hwork=reshape(work,(/grd_in%nlat*grd_in%nlon*grd_in%nlevs_alloc/)) + call general_grid2sub(grd_in,hwork,wbundle2%values) + + return +end subroutine apply_scaledepwgts diff --git a/src/gsi/atms_spatial_average_mod.f90 b/src/gsi/atms_spatial_average_mod.f90 index dd05faa23e..b3e4aafc41 100644 --- a/src/gsi/atms_spatial_average_mod.f90 +++ b/src/gsi/atms_spatial_average_mod.f90 @@ -153,7 +153,7 @@ SUBROUTINE ATMS_Spatial_Average(Num_Obs, NChanl, FOV, Time, BT_InOut, & Scanline_Back(FOV(I),Scanline(I))=I END DO -!$omp parallel do schedule(dynamic,1) private(ichan,iscan,ios,ifov) +!$omp parallel do schedule(dynamic,1) private(i,ichan,iscan,ios,ifov) DO IChan=1,nchanl err(ichan)=0 diff --git a/src/gsi/bicg.f90 b/src/gsi/bicg.f90 index 6eb2f78905..d7ac743d8f 100644 --- a/src/gsi/bicg.f90 +++ b/src/gsi/bicg.f90 @@ -30,7 +30,7 @@ subroutine bicg() use kinds, only: r_kind,i_kind,r_quad use gsi_4dvar, only: l4dvar, & - ladtest, lgrtest, lanczosave, ltcost, nwrvecs + ladtest, lgrtest, lanczosave, ltcost, nwrvecs, lsqrtb use jfunc, only: jiter,miter,niter,xhatsave,yhatsave,jiterstart use constants, only: zero,tiny_r_kind use mpimod, only: mype @@ -39,6 +39,7 @@ subroutine bicg() use obsmod, only: lsaveobsens,l_do_adjoint use adjtest, only: adtest use grdtest, only: grtest +use gsi_bundlemod, only : gsi_bundlegetpointer use control_vectors, only: control_vector use control_vectors, only: allocate_cv,deallocate_cv,write_cv,inquire_cv use control_vectors, only: dot_product,assignment(=) @@ -89,6 +90,13 @@ subroutine bicg() call allocate_cv(gradf) call allocate_cv(grads) +if(l_hyb_ens .and. .not. aniso_a_en) then + if (lsqrtb) then + write(6,*)'l_hyb_ens: not for use with lsqrtb' + call stop2(317) + end if +end if + ! Get initial cost function and gradient nprt=2 diff --git a/src/gsi/bicglanczos.F90 b/src/gsi/bicglanczos.F90 index 1914b0214d..13525e38cb 100755 --- a/src/gsi/bicglanczos.F90 +++ b/src/gsi/bicglanczos.F90 @@ -57,13 +57,14 @@ module bicglanczos use constants, only : zero, one, half,two, zero_quad,tiny_r_kind use timermod , only : timer_ini, timer_fnl use lanczos , only : save_precond -use gsi_4dvar, only : iorthomax +use gsi_4dvar, only : iorthomax,lsqrtb use control_vectors, only: control_vector use control_vectors, only: allocate_cv,deallocate_cv,inquire_cv use control_vectors, only: read_cv,write_cv use control_vectors, only: dot_product,assignment(=) use gsi_bundlemod, only: gsi_bundle use gsi_bundlemod, only: assignment(=) +use gsi_bundlemod, only : gsi_bundlegetpointer use mpimod , only : mpi_comm_world use mpimod, only: mype use jfunc , only : iter, jiter @@ -248,7 +249,13 @@ subroutine pcglanczos(xhat,yhat,pcost,gradx,grady,preduc,kmaxit,lsavevecs) if(nprt>=1.and.ltcost_) call allocate_cv(gradf) call allocate_cv(dirw) -!--- 'zeta' is an upper bound on the relative error of the gradient. +if(l_hyb_ens .and. .not. aniso_a_en) then + if (lsqrtb) then + write(6,*)'l_hyb_ens: not for use with lsqrtb' + call stop2(317) + end if +end if + !--- 'zeta' is an upper bound on the relative error of the gradient. zeta = 1.0e-4_r_kind zreqrd = preduc diff --git a/src/gsi/bkerror.f90 b/src/gsi/bkerror.f90 index b3a0140691..7eb83b09d6 100644 --- a/src/gsi/bkerror.f90 +++ b/src/gsi/bkerror.f90 @@ -71,7 +71,6 @@ subroutine bkerror(grady) ! Declare local variables integer(i_kind) i,ii - integer(i_kind) i_t,i_p,i_st,i_vp integer(i_kind) ipnts(4),istatus ! integer(i_kind) nval_lenz,ndim2d real(r_kind),pointer,dimension(:,:,:):: p_t =>NULL() @@ -97,11 +96,7 @@ subroutine bkerror(grady) ! Only need to get pointer for ii=1 - all other are the same call gsi_bundlegetpointer ( grady%step(1), (/'t ','sf','vp','ps'/), & ipnts, istatus ) - i_t = ipnts(1) - i_st = ipnts(2) - i_vp = ipnts(3) - i_p = ipnts(4) - dobal = i_t>0.and.i_p>0.and.i_st>0.and.i_vp>0 + dobal = ipnts(1)>0 .and. ipnts(2)>0 .and. ipnts(3)>0 .and. ipnts(4)>0 ! if ensemble run, multiply by sqrt_beta_s if(l_hyb_ens) call sqrt_beta_s_mult(grady) diff --git a/src/gsi/calctends_no_tl.f90 b/src/gsi/calctends_no_tl.f90 index 73be86be2e..d4dacb94a5 100644 --- a/src/gsi/calctends_no_tl.f90 +++ b/src/gsi/calctends_no_tl.f90 @@ -244,28 +244,21 @@ subroutine calctends_no_tl(st,vp,t,p,mype,u_t,v_t,t_t,p_t,uvflag) end if end if -! top/bottom boundary condition: do j=jtstart(kk),jtstop(kk) do i=1,lat2 + +! top/bottom boundary condition: + what(i,j,1)=zero what(i,j,nsig+1)=zero - enddo - enddo - ! load actual dp/dt - do j=jtstart(kk),jtstop(kk) - do i=1,lat2 p_t(i,j)=prsth(i,j,1) - end do - end do ! before big k loop, zero out the km1 summation arrays - do j=jtstart(kk),jtstop(kk) - do i=1,lat2 sumkm1 (i,j)=zero sum2km1 (i,j)=zero sumvkm1 (i,j)=zero diff --git a/src/gsi/chemmod.f90 b/src/gsi/chemmod.f90 index dc3f53a160..14a90c818c 100644 --- a/src/gsi/chemmod.f90 +++ b/src/gsi/chemmod.f90 @@ -40,7 +40,7 @@ module chemmod public :: naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3 ! fv3smoke - public :: naero_smoke_fv3,aeronames_smoke_fv3 + public :: naero_smoke_fv3,aeronames_smoke_fv3,pm2_5_innov_threshold public :: naero_gocart_wrf,aeronames_gocart_wrf @@ -79,6 +79,8 @@ module chemmod integer(i_kind) :: icvt_cmaq_fv3 real(r_kind) :: raod_radius_mean_scale,raod_radius_std_scale real(r_kind) :: ppmv_conv = 96.06_r_kind/28.964_r_kind*1.0e+3_r_kind + real(r_kind) :: pm2_5_innov_threshold + logical :: wrf_pm2_5 logical :: lread_ext_aerosol ! if true, will read in aerosols from aerfXX rather than from sigfXX @@ -98,7 +100,7 @@ module chemmod code_pm25_anowbufr=102,code_pm10_ncbufr=code_pm25_ncbufr,& code_pm10_anowbufr=code_pm25_anowbufr - real(r_kind),parameter :: pm2_5_teom_max=100.0_r_kind !ug/m3 + real(r_kind),parameter :: pm2_5_teom_max=900.0_r_kind !ug/m3 !some parameters need to be put here since convinfo file won't !accomodate, stands for maximum realistic value of surface pm2.5 real(r_kind),parameter :: pm10_teom_max=150.0_r_kind !ug/m3 @@ -305,6 +307,7 @@ subroutine init_chem laeroana_gocart = .false. laeroana_fv3cmaq = .false. ! .true. for performing aerosol analysis for regional FV3-CMAQ model(Please other parameters requred in gsimod.F90) laeroana_fv3smoke = .false. + pm2_5_innov_threshold = 20.0_r_kind l_aoderr_table = .false. icvt_cmaq_fv3 = 1 ! 1. Control variable is individual aerosol specie; 2: CV is total mass per I,J,K mode raod_radius_mean_scale = 1.0_r_kind ! Tune radius of particles when calculating AOD using CRTM diff --git a/src/gsi/class_get_fv3_regional_ensperts.f90 b/src/gsi/class_get_fv3_regional_ensperts.f90 index 6c51a4fd88..bda4a47cd3 100644 --- a/src/gsi/class_get_fv3_regional_ensperts.f90 +++ b/src/gsi/class_get_fv3_regional_ensperts.f90 @@ -31,7 +31,7 @@ subroutine get_fv3_regional_ensperts(this,en_perts,nelen,ps_bar) import abstract_get_fv3_regional_ensperts_class implicit none class(abstract_get_fv3_regional_ensperts_class),intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_single),dimension(:,:,:),allocatable, intent(inout):: ps_bar diff --git a/src/gsi/class_get_pseudo_ensperts.f90 b/src/gsi/class_get_pseudo_ensperts.f90 index 703a62df3f..beee90f5e9 100644 --- a/src/gsi/class_get_pseudo_ensperts.f90 +++ b/src/gsi/class_get_pseudo_ensperts.f90 @@ -12,7 +12,7 @@ subroutine get_pseudo_ensperts(this,en_perts,nelen) import abstract_get_pseudo_ensperts_class implicit none class(abstract_get_pseudo_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ) :: nelen end subroutine get_pseudo_ensperts end interface diff --git a/src/gsi/class_get_wrf_mass_ensperts.f90 b/src/gsi/class_get_wrf_mass_ensperts.f90 index 902b14ad21..b392bcd174 100644 --- a/src/gsi/class_get_wrf_mass_ensperts.f90 +++ b/src/gsi/class_get_wrf_mass_ensperts.f90 @@ -12,7 +12,7 @@ subroutine get_wrf_mass_ensperts(this,en_perts,nelen,ps_bar) import abstract_get_wrf_mass_ensperts_class implicit none class(abstract_get_wrf_mass_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_single),dimension(:,:,:),allocatable:: ps_bar end subroutine get_wrf_mass_ensperts @@ -25,7 +25,7 @@ subroutine ens_spread_dualres_regional(this,mype,en_perts,nelen,en_bar) implicit none class(abstract_get_wrf_mass_ensperts_class), intent(inout) :: this integer(i_kind),intent(in):: mype - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen type(gsi_bundle),OPTIONAL,intent(in):: en_bar end subroutine ens_spread_dualres_regional diff --git a/src/gsi/class_get_wrf_nmm_ensperts.f90 b/src/gsi/class_get_wrf_nmm_ensperts.f90 index 19170033e2..9f496c7b03 100644 --- a/src/gsi/class_get_wrf_nmm_ensperts.f90 +++ b/src/gsi/class_get_wrf_nmm_ensperts.f90 @@ -13,7 +13,7 @@ subroutine get_wrf_nmm_ensperts(this,en_perts,nelen,region_lat_ens,region_lon_en import abstract_get_wrf_nmm_ensperts_class implicit none class(abstract_get_wrf_nmm_ensperts_class),intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_kind),allocatable, intent(inout):: region_lat_ens(:,:),region_lon_ens(:,:) real(r_single),dimension(:,:,:),allocatable, intent(inout):: ps_bar diff --git a/src/gsi/compact_diffs.f90 b/src/gsi/compact_diffs.f90 index 14f7b8fdc5..ae03407917 100644 --- a/src/gsi/compact_diffs.f90 +++ b/src/gsi/compact_diffs.f90 @@ -268,7 +268,6 @@ subroutine stvp2uv(work,idim) integer(i_kind) ix,iy integer(i_kind) ny,i,j real(r_kind) polsu,polnu,polnv,polsv - real(r_kind),dimension(nlon):: grid3n,grid3s,grid1n,grid1s real(r_kind),dimension(nlat-2,nlon):: a,b,grid1,grid2,grid3,grid4 if(idim <=1) write(6,*) ' error in call to stvp2uv ',idim @@ -318,27 +317,17 @@ subroutine stvp2uv(work,idim) polnv=polnv/float(nlon) polsu=polsu/float(nlon) polsv=polsv/float(nlon) - do ix=1,nlon - grid3n(ix)= polnu*coslon(ix)+polnv*sinlon(ix) - grid1n(ix)=-polnu*sinlon(ix)+polnv*coslon(ix) - grid3s(ix)= polsu*coslon(ix)+polsv*sinlon(ix) - grid1s(ix)= polsu*sinlon(ix)-polsv*coslon(ix) - end do ! work(1 is u, work(2 is v do j=1,nlon - do i=1,nlat - if(i /= 1 .and. i /= nlat)then - work(1,i,j)=grid3(i-1,j) - work(2,i,j)=grid1(i-1,j) - else if(i == 1)then - work(1,i,j)=grid3s(j) - work(2,i,j)=grid1s(j) - else - work(1,i,j)=grid3n(j) - work(2,i,j)=grid1n(j) - end if + do i=2,nlat-1 + work(1,i,j)=grid3(i-1,j) + work(2,i,j)=grid1(i-1,j) end do - enddo + work(1,1,j)= polsu*coslon(j)+polsv*sinlon(j) + work(2,1,j)= polsu*sinlon(j)-polsv*coslon(j) + work(1,nlat,j)= polnu*coslon(j)+polnv*sinlon(j) + work(2,nlat,j)= -polnu*sinlon(j)+polnv*coslon(j) + end do return end subroutine stvp2uv @@ -749,18 +738,14 @@ subroutine tstvp2uv(work,idim) ny=nlat-2 do j=1,nlon - do i=1,nlat - if(i /= 1 .and. i /= nlat)then - grid3(i-1,j)=work(1,i,j) - grid1(i-1,j)=work(2,i,j) - else if(i == 1)then - grid3s(j)=work(1,i,j) - grid1s(j)=work(2,i,j) - else - grid3n(j)=work(1,i,j) - grid1n(j)=work(2,i,j) - end if + do i=2,nlat-1 + grid3(i-1,j)=work(1,i,j) + grid1(i-1,j)=work(2,i,j) end do + grid3s(j)=work(1,1,j) + grid1s(j)=work(2,1,j) + grid3n(j)=work(1,nlat,j) + grid1n(j)=work(2,nlat,j) end do polnu=zero @@ -815,16 +800,15 @@ subroutine tstvp2uv(work,idim) nlon,ny,noq) !$omp end parallel sections do j=1,nlon - do i=1,nlat - if(i /= 1 .and. i /= nlat)then -! NOTE: Adjoint of first derivative is its negative - work(1,i,j)=-(a(i-1,j)+d(i-1,j)) - work(2,i,j)=-(b(i-1,j)+c(i-1,j)) - else - work(1,i,j)=zero - work(2,i,j)=zero - end if + do i=2,nlat-1 +! NOTE: Adjoint of first derivative is its negative + work(1,i,j)=-(a(i-1,j)+d(i-1,j)) + work(2,i,j)=-(b(i-1,j)+c(i-1,j)) end do + work(1,1,j)=zero + work(2,1,j)=zero + work(1,nlat,j)=zero + work(2,nlat,j)=zero end do return diff --git a/src/gsi/constants.f90 b/src/gsi/constants.f90 index 484e46b8b8..b4cf775068 100644 --- a/src/gsi/constants.f90 +++ b/src/gsi/constants.f90 @@ -90,7 +90,7 @@ module constants ! Declare derived constants integer(i_kind):: huge_i_kind - integer(i_kind), parameter :: max_varname_length=64 + integer(i_kind), parameter :: max_varname_length=20 real(r_single):: tiny_single, huge_single real(r_kind):: xai, xa, xbi, xb, dldt, rozcon,ozcon,fv, tpwcon,eps, rd_over_g real(r_kind):: el2orc, g_over_rd, rd_over_cp, cpr, omeps, epsm1, factor2 diff --git a/src/gsi/control2state.f90 b/src/gsi/control2state.f90 index fb87c1d0ef..f2d8849ce0 100644 --- a/src/gsi/control2state.f90 +++ b/src/gsi/control2state.f90 @@ -1,3 +1,65 @@ +!------------------------------------------------------------------------- +! NOAA/NCEP, National Centers for Environmental Prediction GSI ! +!------------------------------------------------------------------------- +!BOP +! +! !MODULE: control2state_mod --- control2state_mod variables and routines +! +! !INTERFACE: +! +module control2state_mod + +! !USES: + + +! !DESCRIPTION: module control2state routines and variables + +use kinds, only: r_kind,i_kind +use constants, only : max_varname_length, zero +use control_vectors, only: control_vector,c2sset_flg +use control_vectors, only: cvars3d,cvars2d +use bias_predictors, only: predictors +use jfunc, only: nsclen,npclen,ntclen +use gsi_4dvar, only: nsubwin, l4dvar, lsqrtb,ladtest_obs +use gsi_chemguess_mod, only: gsi_chemguess_get +use gsi_metguess_mod, only: gsi_metguess_get +use gsi_bundlemod, only: gsi_bundlegetpointer +use gsi_bundlemod, only: gsi_bundlecreate +use gsi_bundlemod, only: gsi_bundle +use gsi_bundlemod, only: gsi_bundlegetvar +use gsi_bundlemod, only: gsi_bundleputvar +use gsi_bundlemod, only: gsi_bundledestroy +use gsi_bundlemod, only: assignment(=) +use gridmod, only: nems_nmmb_regional +use gridmod, only: regional, twodvar_regional +use gridmod, only: lat2,lon2,nsig,nlat,nlon +use chemmod, only: laeroana_fv3cmaq, naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3,icvt_cmaq_fv3 +use mpeu_util, only: getindex + +implicit none + +private +public :: do_getprs,do_normal_rh_to_q,do_tv_to_tsen,do_getuv,do_cw_to_hydro +public :: do_cw_to_hydro_hwrf,nclouds,ngases +public :: control2state +public :: control2state_ad +public :: c2sset +public :: icpblh,icgust,icvis,icoz,icwspd10m,icw +public :: ictd2m,icmxtm,icmitm,icpmsl,ichowv +public :: icsfwter,icvpwter,ictcamt,iclcbas +public :: iccldch,icuwnd10m,icvwnd10m + +logical :: do_getprs,do_normal_rh_to_q,do_tv_to_tsen,do_getuv,do_cw_to_hydro +logical :: do_cw_to_hydro_hwrf + +integer(i_kind) :: icpblh,icgust,icvis,icoz,icwspd10m,icw +integer(i_kind) :: ictd2m,icmxtm,icmitm,icpmsl,ichowv +integer(i_kind) :: icsfwter,icvpwter,ictcamt,iclcbas +integer(i_kind) :: iccldch,icuwnd10m,icvwnd10m + +integer :: ngases,nclouds + +contains subroutine control2state(xhat,sval,bval) !$$$ subprogram documentation block ! . . . . @@ -57,31 +119,11 @@ subroutine control2state(xhat,sval,bval) ! bval - Bias predictors ! !$$$ end documentation block -use kinds, only: r_kind,i_kind -use control_vectors, only: control_vector -use control_vectors, only: cvars3d,cvars2d -use bias_predictors, only: predictors -use gsi_4dvar, only: nsubwin, l4dvar, lsqrtb, ladtest_obs -use gridmod, only: regional,lat2,lon2,nsig, nlat, nlon, twodvar_regional -use jfunc, only: nsclen,npclen,ntclen -use cwhydromod, only: cw2hydro_tl use amassaeromod, only: amass2aero_tl -use cwhydromod, only: cw2hydro_tl_hwrf -use gsi_bundlemod, only: gsi_bundlecreate -use gsi_bundlemod, only: gsi_bundle -use gsi_bundlemod, only: gsi_bundlegetpointer -use gsi_bundlemod, only: gsi_bundlegetvar -use gsi_bundlemod, only: gsi_bundleputvar -use gsi_bundlemod, only: gsi_bundledestroy -use gsi_bundlemod, only: assignment(=) -use gsi_chemguess_mod, only: gsi_chemguess_get -use gsi_metguess_mod, only: gsi_metguess_get -use mpeu_util, only: getindex -use constants, only : max_varname_length, zero use general_sub2grid_mod, only: general_sub2grid,general_grid2sub use general_commvars_mod, only: s2g_cv -use gridmod, only: nems_nmmb_regional -use chemmod, only: laeroana_fv3cmaq, naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3,icvt_cmaq_fv3 +use cwhydromod, only: cw2hydro_tl +use cwhydromod, only: cw2hydro_tl_hwrf implicit none ! Declare passed variables @@ -94,22 +136,9 @@ subroutine control2state(xhat,sval,bval) character(len=max_varname_length),allocatable,dimension(:) :: gases character(len=max_varname_length),allocatable,dimension(:) :: clouds real(r_kind),dimension(nlat*nlon*s2g_cv%nlevs_alloc) :: hwork -integer(i_kind) :: ii,jj,ic,id,ngases,nclouds,istatus,istatus_oz +integer(i_kind) :: ii,jj,ic,id,istatus,istatus_oz type(gsi_bundle):: wbundle ! work bundle -! Note: The following does not aim to get all variables in -! the state and control vectors, but rather the ones -! this routines knows how to handle. -! Declare required local control variables -integer(i_kind), parameter :: ncvars = 9 -integer(i_kind) :: icps(ncvars) -integer(i_kind) :: icpblh,icgust,icvis,icoz,icwspd10m,icw -integer(i_kind) :: ictd2m,icmxtm,icmitm,icpmsl,ichowv -integer(i_kind) :: icsfwter,icvpwter,ictcamt,iclcbas -integer(i_kind) :: iccldch,icuwnd10m,icvwnd10m -character(len=3), parameter :: mycvars(ncvars) = (/ & ! vars from CV needed here - 'sf ', 'vp ', 'ps ', 't ', 'q ', 'cw ', 'ql ', 'qi ', 'w ' /) -logical :: lc_sf,lc_vp,lc_w,lc_ps,lc_t,lc_rh,lc_cw,lc_ql,lc_qi real(r_kind),pointer,dimension(:,:) :: cv_ps=>NULL() real(r_kind),pointer,dimension(:,:) :: cv_lcbas=>NULL() real(r_kind),pointer,dimension(:,:,:) :: cv_sf=>NULL() @@ -120,14 +149,6 @@ subroutine control2state(xhat,sval,bval) real(r_kind),pointer,dimension(:,:,:) :: cv_sfwter=>NULL() real(r_kind),pointer,dimension(:,:,:) :: cv_vpwter=>NULL() -! Declare required local state variables -integer(i_kind), parameter :: nsvars = 12 -integer(i_kind) :: isps(nsvars) -character(len=4), parameter :: mysvars(nsvars) = (/ & ! vars from ST needed here - 'u ', 'v ', 'prse', 'q ', 'tsen', 'ql ', 'qi ', 'w ', & - 'qr ', 'qs ', 'qg ', 'qh ' /) -logical :: ls_u,ls_v,ls_w,ls_prse,ls_q,ls_tsen,ls_ql,ls_qi -logical :: ls_qr,ls_qs,ls_qg,ls_qh real(r_kind),pointer,dimension(:,:) :: sv_ps=>NULL(),sv_sst=>NULL() real(r_kind),pointer,dimension(:,:) :: sv_gust=>NULL(),sv_vis=>NULL(),sv_pblh=>NULL() real(r_kind),pointer,dimension(:,:) :: sv_wspd10m=>NULL(),sv_tcamt=>NULL(),sv_lcbas=>NULL() @@ -143,82 +164,17 @@ subroutine control2state(xhat,sval,bval) real(r_kind),allocatable,dimension(:,:,:):: uland,vland,uwter,vwter -logical :: do_getprs_tl,do_normal_rh_to_q,do_tv_to_tsen,do_getuv,do_cw_to_hydro -logical :: do_cw_to_hydro_hwrf - - -if (lsqrtb) then - write(6,*)trim(myname),': not for sqrt(B)' - call stop2(106) -end if -if (nsubwin/=1 .and. .not.l4dvar) then - write(6,*)trim(myname),': error 3dvar',nsubwin,l4dvar - call stop2(107) -end if - -! Inquire about cloud-vars -call gsi_metguess_get('clouds::3d',nclouds,istatus) +if (c2sset_flg)call c2sset(xhat,sval) if (nclouds>0) then allocate(clouds(nclouds)) call gsi_metguess_get('clouds::3d',clouds,istatus) end if -! Inquire about chemistry -call gsi_chemguess_get('dim',ngases,istatus) if (ngases>0) then allocate(gases(ngases)) call gsi_chemguess_get('gsinames',gases,istatus) endif -! Since each internal vector of xhat has the same structure, pointers are -! the same independent of the subwindow jj -call gsi_bundlegetpointer (xhat%step(1),mycvars,icps,istatus) -lc_sf =icps(1)>0; lc_vp =icps(2)>0; lc_ps =icps(3)>0 -lc_t =icps(4)>0; lc_rh =icps(5)>0; lc_cw =icps(6)>0 -lc_ql =icps(7)>0; lc_qi =icps(8)>0; lc_w =icps(9)>0 - -! Since each internal vector of xhat has the same structure, pointers are -! the same independent of the subwindow jj -call gsi_bundlegetpointer (sval(1),mysvars,isps,istatus) -ls_u =isps(1)>0; ls_v =isps(2)>0; ls_prse=isps(3)>0 -ls_q =isps(4)>0; ls_tsen=isps(5)>0; ls_ql =isps(6)>0 -ls_qi =isps(7)>0; ls_w =isps(8)>0 -ls_qr =isps(9)>0; ls_qs =isps(10)>0 -ls_qg =isps(11)>0; ls_qh =isps(12)>0 - -! Define what to do depending on what's in CV and SV -do_getprs_tl =lc_ps.and.lc_t .and.ls_prse -do_normal_rh_to_q=lc_rh.and.lc_t .and.ls_prse.and.ls_q -do_tv_to_tsen =lc_t .and.ls_q .and.ls_tsen -do_getuv =lc_sf.and.lc_vp.and.ls_u.and.ls_v - -do_cw_to_hydro=.false. -do_cw_to_hydro_hwrf=.false. -if (regional) then - do_cw_to_hydro=lc_cw.and.ls_ql.and.ls_qi - do_cw_to_hydro_hwrf=lc_cw.and.ls_ql.and.ls_qi.and.ls_qr.and.ls_qs.and.ls_qg.and.ls_qh -else - do_cw_to_hydro=lc_cw.and.ls_tsen.and.ls_ql.and.ls_qi.and.(.not.lc_ql) !ncep global -endif - -call gsi_bundlegetpointer (xhat%step(1),'oz',icoz,istatus) -call gsi_bundlegetpointer (xhat%step(1),'gust',icgust,istatus) -call gsi_bundlegetpointer (xhat%step(1),'vis',icvis,istatus) -call gsi_bundlegetpointer (xhat%step(1),'pblh',icpblh,istatus) -call gsi_bundlegetpointer (xhat%step(1),'wspd10m',icwspd10m,istatus) -call gsi_bundlegetpointer (xhat%step(1),'td2m',ictd2m,istatus) -call gsi_bundlegetpointer (xhat%step(1),'mxtm',icmxtm,istatus) -call gsi_bundlegetpointer (xhat%step(1),'mitm',icmitm,istatus) -call gsi_bundlegetpointer (xhat%step(1),'pmsl',icpmsl,istatus) -call gsi_bundlegetpointer (xhat%step(1),'howv',ichowv,istatus) -call gsi_bundlegetpointer (xhat%step(1),'sfwter',icsfwter,istatus) -call gsi_bundlegetpointer (xhat%step(1),'vpwter',icvpwter,istatus) -call gsi_bundlegetpointer (xhat%step(1),'w',icw,istatus) -call gsi_bundlegetpointer (xhat%step(1),'tcamt',ictcamt,istatus) -call gsi_bundlegetpointer (xhat%step(1),'lcbas',iclcbas,istatus) -call gsi_bundlegetpointer (xhat%step(1),'cldch',iccldch,istatus) -call gsi_bundlegetpointer (xhat%step(1),'uwnd10m',icuwnd10m,istatus) -call gsi_bundlegetpointer (xhat%step(1),'vwnd10m',icvwnd10m,istatus) ! Loop over control steps do jj=1,nsubwin @@ -295,7 +251,7 @@ subroutine control2state(xhat,sval,bval) ! Copy other variables call gsi_bundlegetvar ( wbundle, 't' , sv_tv, istatus ) ! Get 3d pressure - if(do_getprs_tl) call getprs_tl(cv_ps,cv_t,sv_prse) + if(do_getprs) call getprs_tl(cv_ps,cv_t,sv_prse) ! Convert input normalized RH to q if(do_normal_rh_to_q) call normal_rh_to_q(cv_rh,cv_t,sv_prse,sv_q) @@ -445,3 +401,471 @@ subroutine control2state(xhat,sval,bval) return end subroutine control2state +subroutine c2sset(xhat,sval) +!$$$ subprogram documentation block +! . . . . +! subprogram: c2sset +! prgmmr: derber +! +! abstract: Sets flags for control2state and control2state_ad +! +! program history log: +! 2022-08-30 derber - initial code from control2state + +! input argument list: +! xhat - Control variable +! sval - State variable +! +!$$$ end documentation block +implicit none + +! Declare passed variables +type(control_vector), intent(in) :: xhat +type(gsi_bundle) , intent(in) :: sval(nsubwin) + +! Declare local variables +character(len=*),parameter::myname='c2sset' +integer(i_kind) :: istatus + +! Note: The following does not aim to get all variables in +! the state and control vectors, but rather the ones +! this routines knows how to handle. +! Declare required local control variables +integer(i_kind), parameter :: ncvars = 9 +integer(i_kind) :: icps(ncvars) +character(len=3), parameter :: mycvars(ncvars) = (/ & ! vars from CV needed here + 'sf ', 'vp ', 'ps ', 't ', 'q ', 'cw ', 'ql ', 'qi ', 'w ' /) +logical :: lc_sf,lc_vp,lc_w,lc_ps,lc_t,lc_rh,lc_cw,lc_ql,lc_qi + +! Declare required local state variables +integer(i_kind), parameter :: nsvars = 12 +integer(i_kind) :: isps(nsvars) +character(len=4), parameter :: mysvars(nsvars) = (/ & ! vars from ST needed here + 'u ', 'v ', 'prse', 'q ', 'tsen', 'ql ', 'qi ', 'w ', & + 'qr ', 'qs ', 'qg ', 'qh ' /) +logical :: ls_u,ls_v,ls_w,ls_prse,ls_q,ls_tsen,ls_ql,ls_qi +logical :: ls_qr,ls_qs,ls_qg,ls_qh + + + +if (lsqrtb) then + write(6,*)trim(myname),': not for sqrt(B)' + call stop2(106) +end if +if (nsubwin/=1 .and. .not.l4dvar) then + write(6,*)trim(myname),': error 3dvar',nsubwin,l4dvar + call stop2(107) +end if + +! Inquire about cloud-vars +call gsi_metguess_get('clouds::3d',nclouds,istatus) + +! Inquire about chemistry +call gsi_chemguess_get('dim',ngases,istatus) + +! Since each internal vector of xhat has the same structure, pointers are +! the same independent of the subwindow jj +call gsi_bundlegetpointer (xhat%step(1),mycvars,icps,istatus) +lc_sf =icps(1)>0; lc_vp =icps(2)>0; lc_ps =icps(3)>0 +lc_t =icps(4)>0; lc_rh =icps(5)>0; lc_cw =icps(6)>0 +lc_ql =icps(7)>0; lc_qi =icps(8)>0; lc_w =icps(9)>0 + +! Since each internal vector of sval has the same structure, pointers are +! the same independent of the subwindow jj +call gsi_bundlegetpointer (sval(1),mysvars,isps,istatus) +ls_u =isps(1)>0; ls_v =isps(2)>0; ls_prse=isps(3)>0 +ls_q =isps(4)>0; ls_tsen=isps(5)>0; ls_ql =isps(6)>0 +ls_qi =isps(7)>0; ls_w =isps(8)>0 +ls_qr =isps(9)>0; ls_qs =isps(10)>0 +ls_qg =isps(11)>0; ls_qh =isps(12)>0 + +! Define what to do depending on what's in CV and SV +do_getprs =lc_ps.and.lc_t .and.ls_prse +do_normal_rh_to_q=lc_rh.and.lc_t .and.ls_prse.and.ls_q +do_tv_to_tsen =lc_t .and.ls_q .and.ls_tsen +do_getuv =lc_sf.and.lc_vp.and.ls_u.and.ls_v + +do_cw_to_hydro=.false. +do_cw_to_hydro_hwrf=.false. +if (regional) then + do_cw_to_hydro=lc_cw.and.ls_ql.and.ls_qi + do_cw_to_hydro_hwrf=lc_cw.and.ls_ql.and.ls_qi.and.ls_qr.and.ls_qs.and.ls_qg.and.ls_qh +else + do_cw_to_hydro=lc_cw.and.ls_tsen.and.ls_ql.and.ls_qi.and.(.not.lc_ql) !ncep global +endif + +call gsi_bundlegetpointer (xhat%step(1),'oz',icoz,istatus) +call gsi_bundlegetpointer (xhat%step(1),'gust',icgust,istatus) +call gsi_bundlegetpointer (xhat%step(1),'vis',icvis,istatus) +call gsi_bundlegetpointer (xhat%step(1),'pblh',icpblh,istatus) +call gsi_bundlegetpointer (xhat%step(1),'wspd10m',icwspd10m,istatus) +call gsi_bundlegetpointer (xhat%step(1),'td2m',ictd2m,istatus) +call gsi_bundlegetpointer (xhat%step(1),'mxtm',icmxtm,istatus) +call gsi_bundlegetpointer (xhat%step(1),'mitm',icmitm,istatus) +call gsi_bundlegetpointer (xhat%step(1),'pmsl',icpmsl,istatus) +call gsi_bundlegetpointer (xhat%step(1),'howv',ichowv,istatus) +call gsi_bundlegetpointer (xhat%step(1),'sfwter',icsfwter,istatus) +call gsi_bundlegetpointer (xhat%step(1),'vpwter',icvpwter,istatus) +call gsi_bundlegetpointer (xhat%step(1),'w',icw,istatus) +call gsi_bundlegetpointer (xhat%step(1),'tcamt',ictcamt,istatus) +call gsi_bundlegetpointer (xhat%step(1),'lcbas',iclcbas,istatus) +call gsi_bundlegetpointer (xhat%step(1),'cldch',iccldch,istatus) +call gsi_bundlegetpointer (xhat%step(1),'uwnd10m',icuwnd10m,istatus) +call gsi_bundlegetpointer (xhat%step(1),'vwnd10m',icvwnd10m,istatus) + +c2sset_flg=.false. +return +end subroutine c2sset +subroutine control2state_ad(rval,bval,grad) +!$$$ subprogram documentation block +! . . . . +! subprogram: control2state_ad +! prgmmr: tremolet +! +! abstract: Converts variables from physical space to control space +! This is also the adjoint of control2state +! +! program history log: +! 2007-04-16 tremolet - initial code +! 2008-11-28 todling - update to GSI May 2008: add tsen and p3d +! 2009-01-15 todling - handle predictors in quad precision +! 2009-04-21 derber - modify call to getstvp to call to getuv +! 2009-06-15 parrish - add call to strong_bk_ad when l_hyb_ens=.true. (hybrid ensemble run) +! 2009-08-12 lueken - update documentation +! 2009-11-27 parrish - for uv_hyb_ens=.true., then ensemble perturbations contain u,v instead of st,vp +! so introduce extra code to handle this case. +! 2010-02-20 parrish - introduce modifications to allow dual resolution capability when running +! in hybrid ensemble mode. +! 2010-03-24 zhu - use cstate for generalizing control variable +! 2010-04-29 todling - update to use gsi_bundle; rename cstate to wbundle +! 2010-05-31 todling - better consistency checks; add co/co2 +! - ready to bypass analysis of (any) meteorological fields +! 2010-06-15 todling - generalized handling of chemistry +! 2011-02-22 zhu - add gust,vis,pblh +! 2011-05-15 auligne/todling - generalized cloud handling +! 2011-07-12 zhu - add do_cw_to_hydro_ad and cw2hydro_ad +! 2011-11-01 eliu - generalize the use of do_cw_to_hydro_ad +! 2012-02-08 kleist - remove strong_bk_ad and ensemble_forward_model_ad and related parameters +! 2013-05-23 zhu - add ntclen and predt for aircraft temperature bias correction +! 2013-10-25 todling - nullify work pointers +! 2013-10-28 todling - rename p3d to prse +! 2014-01-31 mkim - add support for when ql and qi are CVs for all-sky mw radiance DA +! 2014-03-19 pondeca - add wspd10m +! 2014-04-10 pondeca - add td2m,mxtm,mitm,pmsl +! 2014-05-07 pondeca - add howv +! 2014-06-16 carley/zhu - add tcamt and lcbas +! 2014-12-03 derber - introduce parallel regions for optimization +! 2015-07-10 pondeca - add cloud ceiling height (cldch) +! 2016-05-03 pondeca - add uwnd10m, and vwnd10m +! 2017-05-12 Y. Wang and X. Wang - add w as state variable for rw DA, POC: xuguang.wang@ou.edu +! 2016-08-12 lippi - add vertical velocity (w) to mycvars and mysvars. +! 2016-05-03 pondeca - add uwnd10m, and vwnd10m +! 2022-05-24 H.Wang - add amass2aero_ad for regional FV3-CMAQ DA when using +! total mass as control variable. +! +! input argument list: +! rval - State variable +! bval +! output argument list: +! grad - Control variable +! +!$$$ +use amassaeromod, only: amass2aero_ad +use cwhydromod, only: cw2hydro_ad +use cwhydromod, only: cw2hydro_ad_hwrf + +implicit none + +! Declare passed variables +type(gsi_bundle) , intent(inout) :: rval(nsubwin) +type(predictors) , intent(in ) :: bval +type(control_vector), intent(inout) :: grad + +! Declare local variables +character(len=*),parameter::myname='control2state_ad' +character(len=max_varname_length),allocatable,dimension(:) :: gases +character(len=max_varname_length),allocatable,dimension(:) :: clouds +integer(i_kind) :: ii,jj,ic,id,istatus,istatus_oz +type(gsi_bundle) :: wbundle ! work bundle + +real(r_kind),pointer,dimension(:,:) :: cv_ps=>NULL() +real(r_kind),pointer,dimension(:,:) :: cv_lcbas=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: cv_sf=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: cv_vp=>NULL() +!real(r_kind),pointer,dimension(:,:,:) :: cv_w=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: cv_t=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: cv_rh=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: cv_sfwter=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: cv_vpwter=>NULL() + +! Declare required local state variables +real(r_kind),pointer,dimension(:,:) :: rv_ps=>NULL(),rv_sst=>NULL() +real(r_kind),pointer,dimension(:,:) :: rv_gust=>NULL(),rv_vis=>NULL(),rv_pblh=>NULL() +real(r_kind),pointer,dimension(:,:) :: rv_wspd10m=>NULL(),rv_tcamt=>NULL(),rv_lcbas=>NULL() +real(r_kind),pointer,dimension(:,:) :: rv_td2m=>NULL(),rv_mxtm=>NULL(),rv_mitm=>NULL() +real(r_kind),pointer,dimension(:,:) :: rv_pmsl=>NULL(),rv_howv=>NULL(),rv_cldch=>NULL() +real(r_kind),pointer,dimension(:,:) :: rv_uwnd10m=>NULL(),rv_vwnd10m=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: rv_u=>NULL(),rv_v=>NULL(),rv_w=>NULL(),rv_dw=>NULL(),rv_prse=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: rv_q=>NULL(),rv_tsen=>NULL(),rv_tv=>NULL(),rv_oz=>NULL() +real(r_kind),pointer,dimension(:,:,:) :: rv_rank3=>NULL() +real(r_kind),pointer,dimension(:,:) :: rv_rank2=>NULL() + +real(r_kind),allocatable,dimension(:,:,:):: uland,vland,uwter,vwter + + + +!****************************************************************************** + +if (c2sset_flg)call c2sset(grad,rval) +if (lsqrtb) then + write(6,*)trim(myname),': not for sqrt(B)' + call stop2(311) +end if + +! Inquire about clouds +if (nclouds>0) then + allocate(clouds(nclouds)) + call gsi_metguess_get ('clouds::3d',clouds,istatus) +endif + +! Inquire about chemistry +call gsi_chemguess_get('dim',ngases,istatus) +if (ngases>0) then + allocate(gases(ngases)) + call gsi_chemguess_get('gsinames',gases,istatus) +endif + + +! Loop over control steps +do jj=1,nsubwin + +! Create a work bundle similar to grad control vector's bundle + call gsi_bundlecreate ( wbundle, grad%step(jj), 'control2state_ad work', istatus ) + if (istatus/=0) then + write(6,*) trim(myname),': trouble creating work bundle' + call stop2(999) + endif + +!$omp parallel sections private(istatus,ii,ic,id,istatus_oz,rv_u,rv_v,rv_prse,rv_q,rv_tsen,uland,vland,uwter,vwter) + +!$omp section + + call gsi_bundlegetpointer (wbundle,'sf' ,cv_sf ,istatus) + call gsi_bundlegetpointer (wbundle,'vp' ,cv_vp ,istatus) + call gsi_bundlegetpointer (rval(jj),'u' ,rv_u, istatus) + call gsi_bundlegetpointer (rval(jj),'v' ,rv_v, istatus) + call gsi_bundleputvar ( wbundle, 'sf', zero, istatus ) + call gsi_bundleputvar ( wbundle, 'vp', zero, istatus ) +! Convert RHS calculations for u,v to st/vp for application of +! background error + if (do_getuv) then + if (twodvar_regional .and. icsfwter>0 .and. icvpwter>0) then + call gsi_bundlegetpointer (wbundle,'sfwter', cv_sfwter,istatus) + call gsi_bundlegetpointer (wbundle,'vpwter', cv_vpwter,istatus) + allocate(uland(lat2,lon2,nsig),vland(lat2,lon2,nsig), & + uwter(lat2,lon2,nsig),vwter(lat2,lon2,nsig)) + + uland=zero ; uwter=zero + vland=zero ; vwter=zero + + call landlake_uvmerge(rv_u,rv_v,uland,vland,uwter,vwter,0) + + call getuv(uwter,vwter,cv_sfwter,cv_vpwter,1) + call getuv(uland,vland,cv_sf,cv_vp,1) + deallocate(uland,vland,uwter,vwter) + else + call getuv(rv_u,rv_v,cv_sf,cv_vp,1) + endif + endif + + if(jj == 1)then + do ii=1,nsclen + grad%predr(ii)=bval%predr(ii) + enddo + do ii=1,npclen + grad%predp(ii)=bval%predp(ii) + enddo + if (ntclen>0) then + do ii=1,ntclen + grad%predt(ii)=bval%predt(ii) + enddo + end if + end if + +!$omp section + +! Get pointers to required control variables + call gsi_bundlegetpointer (wbundle,'ps' ,cv_ps ,istatus) + call gsi_bundlegetpointer (wbundle,'t' ,cv_t, istatus) + call gsi_bundlegetpointer (wbundle,'q' ,cv_rh ,istatus) + +! Get pointers to this subwin require state variables + call gsi_bundlegetpointer (rval(jj),'ps' ,rv_ps, istatus) + call gsi_bundlegetpointer (rval(jj),'prse',rv_prse,istatus) + call gsi_bundlegetpointer (rval(jj),'tv' ,rv_tv, istatus) + call gsi_bundlegetpointer (rval(jj),'tsen',rv_tsen,istatus) + call gsi_bundlegetpointer (rval(jj),'q' ,rv_q , istatus) + +! Adjoint of control to initial state + call gsi_bundleputvar ( wbundle, 't' , rv_tv, istatus ) + call gsi_bundleputvar ( wbundle, 'q' , zero, istatus ) + call gsi_bundleputvar ( wbundle, 'ps', rv_ps, istatus ) + + if (do_cw_to_hydro .and. .not.do_cw_to_hydro_hwrf) then +! Case when cloud-vars do not map one-to-one +! e.g. cw-to-ql&qi + call cw2hydro_ad(rval(jj),wbundle,clouds,nclouds) + elseif (do_cw_to_hydro_hwrf) then +! Case when cloud-vars do not map one-to-one +! e.g. cw-to-ql&qi&qr&qs&qg&qh + call cw2hydro_ad_hwrf(rval(jj),wbundle,rv_tsen) + else +! Case when cloud-vars map one-to-one, take care of them together +! e.g. cw-to-cw + do ic=1,nclouds + id=getindex(cvars3d,clouds(ic)) + if (id>0) then + call gsi_bundlegetpointer (rval(jj),clouds(ic),rv_rank3,istatus) + call gsi_bundleputvar (wbundle, clouds(ic),rv_rank3,istatus) + endif + enddo + end if +! Calculate sensible temperature + if(do_tv_to_tsen) call tv_to_tsen_ad(cv_t,rv_q,rv_tsen) + +! Adjoint of convert input normalized RH to q to add contribution of moisture +! to t, p , and normalized rh + if(do_normal_rh_to_q) call normal_rh_to_q_ad(cv_rh,cv_t,rv_prse,rv_q) + +! Adjoint to convert ps to 3-d pressure + if(do_getprs) call getprs_ad(cv_ps,cv_t,rv_prse) + + +!$omp section + + call gsi_bundlegetpointer (rval(jj),'sst' ,rv_sst, istatus) + call gsi_bundleputvar ( wbundle, 'sst', rv_sst, istatus ) + +! call gsi_bundlegetpointer (rval(jj),'oz' ,rv_oz , istatus) + call gsi_bundlegetpointer (rval(jj),'oz' ,rv_oz , istatus_oz) + + if (icoz>0) then + call gsi_bundleputvar ( wbundle, 'oz', rv_oz, istatus ) + else + if(istatus_oz==0) rv_oz=zero + end if + +! Same one-to-one map for chemistry-vars; take care of them together + if (.not.laeroana_fv3cmaq .and. icvt_cmaq_fv3 == 2) then + write(6,*) ' icvt_cmaq_fv3 == 2 but laeroana_fv3cmaq=false stop!!!' + call stop2(999) + endif + + if (icvt_cmaq_fv3 == 2) then + call amass2aero_ad(rval(jj),wbundle,aeronames_cmaq_fv3,naero_cmaq_fv3) + else + do ic=1,ngases + id=getindex(cvars3d,gases(ic)) + if (id>0) then + call gsi_bundlegetpointer (rval(jj),gases(ic),rv_rank3,istatus) + call gsi_bundleputvar (wbundle, gases(ic),rv_rank3,istatus) + endif + + id=getindex(cvars2d,gases(ic)) + if (id>0) then + call gsi_bundlegetpointer (rval(jj),gases(ic),rv_rank2,istatus) + call gsi_bundleputvar (wbundle, gases(ic),rv_rank2,istatus) + endif + enddo + end if + if (icgust>0) then + call gsi_bundlegetpointer (rval(jj),'gust' ,rv_gust, istatus) + call gsi_bundleputvar ( wbundle, 'gust', rv_gust, istatus ) + end if + if (icvis >0) then + call gsi_bundlegetpointer (rval(jj),'vis' ,rv_vis , istatus) + call gsi_bundleputvar ( wbundle, 'vis' , rv_vis , istatus ) + end if + if (icpblh>0)then + call gsi_bundlegetpointer (rval(jj),'pblh' ,rv_pblh, istatus) + call gsi_bundleputvar ( wbundle, 'pblh', rv_pblh, istatus ) + end if + if (icwspd10m>0) then + call gsi_bundlegetpointer (rval(jj),'wspd10m' ,rv_wspd10m, istatus) + call gsi_bundleputvar ( wbundle, 'wspd10m', rv_wspd10m, istatus ) + end if + if (ictd2m>0) then + call gsi_bundlegetpointer (rval(jj),'td2m' ,rv_td2m, istatus) + call gsi_bundleputvar ( wbundle, 'td2m', rv_td2m, istatus ) + end if + if (icmxtm>0) then + call gsi_bundlegetpointer (rval(jj),'mxtm' ,rv_mxtm, istatus) + call gsi_bundleputvar ( wbundle, 'mxtm', rv_mxtm, istatus ) + end if + if (icmitm>0) then + call gsi_bundlegetpointer (rval(jj),'mitm' ,rv_mitm, istatus) + call gsi_bundleputvar ( wbundle, 'mitm', rv_mitm, istatus ) + end if + if (icpmsl>0) then + call gsi_bundlegetpointer (rval(jj),'pmsl' ,rv_pmsl, istatus) + call gsi_bundleputvar ( wbundle, 'pmsl', rv_pmsl, istatus ) + end if + if (ichowv>0) then + call gsi_bundlegetpointer (rval(jj),'howv' ,rv_howv, istatus) + call gsi_bundleputvar ( wbundle, 'howv', rv_howv, istatus ) + end if + if (icw>0) then + call gsi_bundlegetpointer (rval(jj),'w' ,rv_w, istatus) + call gsi_bundleputvar ( wbundle, 'w', rv_w, istatus ) + if(nems_nmmb_regional)then + call gsi_bundlegetpointer (rval(jj),'dw' ,rv_dw, istatus) + call gsi_bundleputvar ( wbundle, 'dw', rv_dw, istatus ) + end if + end if + if (ictcamt>0) then + call gsi_bundlegetpointer (rval(jj),'tcamt',rv_tcamt, istatus) + call gsi_bundleputvar ( wbundle, 'tcamt', rv_tcamt, istatus ) + end if + if (iclcbas>0) then + call gsi_bundlegetpointer (wbundle,'lcbas',cv_lcbas,istatus) + call gsi_bundlegetpointer (rval(jj),'lcbas',rv_lcbas, istatus) + call gsi_bundleputvar ( wbundle, 'lcbas', zero, istatus ) + ! Adjoint of convert loglcbas to lcbas + call loglcbas_to_lcbas_ad(cv_lcbas,rv_lcbas) + end if + if (iccldch >0) then + call gsi_bundlegetpointer (rval(jj),'cldch' ,rv_cldch , istatus) + call gsi_bundleputvar ( wbundle, 'cldch' , rv_cldch , istatus ) + end if + if (icuwnd10m>0) then + call gsi_bundlegetpointer (rval(jj),'uwnd10m' ,rv_uwnd10m, istatus) + call gsi_bundleputvar ( wbundle, 'uwnd10m', rv_uwnd10m, istatus ) + end if + if (icvwnd10m>0) then + call gsi_bundlegetpointer (rval(jj),'vwnd10m' ,rv_vwnd10m, istatus) + call gsi_bundleputvar ( wbundle, 'vwnd10m', rv_vwnd10m, istatus ) + end if + +!$omp end parallel sections + +! Adjoint of transfer variables + + do ii=1,wbundle%ndim + grad%step(jj)%values(ii)=wbundle%values(ii)+grad%step(jj)%values(ii) + enddo + call gsi_bundledestroy(wbundle,istatus) + if (istatus/=0) then + write(6,*) trim(myname),': trouble destroying work bundle' + call stop2(999) + endif + +end do + +! Clean up +if (ngases>0) deallocate(gases) + +if (nclouds>0) deallocate(clouds) + +return +end subroutine control2state_ad +end module control2state_mod diff --git a/src/gsi/control2state_ad.f90 b/src/gsi/control2state_ad.f90 deleted file mode 100644 index 718c767c48..0000000000 --- a/src/gsi/control2state_ad.f90 +++ /dev/null @@ -1,441 +0,0 @@ -subroutine control2state_ad(rval,bval,grad) -!$$$ subprogram documentation block -! . . . . -! subprogram: control2state_ad -! prgmmr: tremolet -! -! abstract: Converts variables from physical space to control space -! This is also the adjoint of control2state -! -! program history log: -! 2007-04-16 tremolet - initial code -! 2008-11-28 todling - update to GSI May 2008: add tsen and p3d -! 2009-01-15 todling - handle predictors in quad precision -! 2009-04-21 derber - modify call to getstvp to call to getuv -! 2009-06-15 parrish - add call to strong_bk_ad when l_hyb_ens=.true. (hybrid ensemble run) -! 2009-08-12 lueken - update documentation -! 2009-11-27 parrish - for uv_hyb_ens=.true., then ensemble perturbations contain u,v instead of st,vp -! so introduce extra code to handle this case. -! 2010-02-20 parrish - introduce modifications to allow dual resolution capability when running -! in hybrid ensemble mode. -! 2010-03-24 zhu - use cstate for generalizing control variable -! 2010-04-29 todling - update to use gsi_bundle; rename cstate to wbundle -! 2010-05-31 todling - better consistency checks; add co/co2 -! - ready to bypass analysis of (any) meteorological fields -! 2010-06-15 todling - generalized handling of chemistry -! 2011-02-22 zhu - add gust,vis,pblh -! 2011-05-15 auligne/todling - generalized cloud handling -! 2011-07-12 zhu - add do_cw_to_hydro_ad and cw2hydro_ad -! 2011-11-01 eliu - generalize the use of do_cw_to_hydro_ad -! 2012-02-08 kleist - remove strong_bk_ad and ensemble_forward_model_ad and related parameters -! 2013-05-23 zhu - add ntclen and predt for aircraft temperature bias correction -! 2013-10-25 todling - nullify work pointers -! 2013-10-28 todling - rename p3d to prse -! 2014-01-31 mkim - add support for when ql and qi are CVs for all-sky mw radiance DA -! 2014-03-19 pondeca - add wspd10m -! 2014-04-10 pondeca - add td2m,mxtm,mitm,pmsl -! 2014-05-07 pondeca - add howv -! 2014-06-16 carley/zhu - add tcamt and lcbas -! 2014-12-03 derber - introduce parallel regions for optimization -! 2015-07-10 pondeca - add cloud ceiling height (cldch) -! 2016-05-03 pondeca - add uwnd10m, and vwnd10m -! 2017-05-12 Y. Wang and X. Wang - add w as state variable for rw DA, POC: xuguang.wang@ou.edu -! 2016-08-12 lippi - add vertical velocity (w) to mycvars and mysvars. -! 2016-05-03 pondeca - add uwnd10m, and vwnd10m -! 2022-05-24 H.Wang - add amass2aero_ad for regional FV3-CMAQ DA when using -! total mass as control variable. -! -! input argument list: -! rval - State variable -! bval -! output argument list: -! grad - Control variable -! -!$$$ -use kinds, only: i_kind,r_kind -use control_vectors, only: control_vector -use control_vectors, only: cvars3d,cvars2d -use bias_predictors, only: predictors -use gsi_4dvar, only: nsubwin, lsqrtb -use gridmod, only: regional,lat2,lon2,nsig,twodvar_regional -use jfunc, only: nsclen,npclen,ntclen -use cwhydromod, only: cw2hydro_ad -use amassaeromod, only: amass2aero_ad -use cwhydromod, only: cw2hydro_ad_hwrf -use gsi_bundlemod, only: gsi_bundlecreate -use gsi_bundlemod, only: gsi_bundle -use gsi_bundlemod, only: gsi_bundlegetpointer -use gsi_bundlemod, only: gsi_bundlegetvar -use gsi_bundlemod, only: gsi_bundleputvar -use gsi_bundlemod, only: gsi_bundledestroy -use gsi_chemguess_mod, only: gsi_chemguess_get -use gsi_metguess_mod, only: gsi_metguess_get -use mpeu_util, only: getindex -use constants, only: max_varname_length,zero -use gridmod, only: nems_nmmb_regional -use chemmod, only: laeroana_fv3cmaq, naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3,icvt_cmaq_fv3 - -implicit none - -! Declare passed variables -type(gsi_bundle) , intent(inout) :: rval(nsubwin) -type(predictors) , intent(in ) :: bval -type(control_vector), intent(inout) :: grad - -! Declare local variables -character(len=*),parameter::myname='control2state_ad' -character(len=max_varname_length),allocatable,dimension(:) :: gases -character(len=max_varname_length),allocatable,dimension(:) :: clouds -integer(i_kind) :: ii,jj,ic,id,ngases,nclouds,istatus,istatus_oz -type(gsi_bundle) :: wbundle ! work bundle - -! Note: The following does not aim to get all variables in -! the state and control vectors, but rather the ones -! this routines knows how to handle. -integer(i_kind), parameter :: ncvars = 9 -integer(i_kind) :: icps(ncvars) -integer(i_kind) :: icpblh,icgust,icvis,icoz,icwspd10m,icw -integer(i_kind) :: ictd2m,icmxtm,icmitm,icpmsl,ichowv -integer(i_kind) :: ictcamt,iclcbas,icsfwter,icvpwter -integer(i_kind) :: iccldch,icuwnd10m,icvwnd10m -character(len=3), parameter :: mycvars(ncvars) = (/ & - 'sf ', 'vp ', 'ps ', 't ', 'q ', 'cw ', 'ql ', 'qi ', 'w ' /) -logical :: lc_sf,lc_vp,lc_w,lc_ps,lc_t,lc_rh,lc_cw,lc_ql,lc_qi -real(r_kind),pointer,dimension(:,:) :: cv_ps=>NULL() -real(r_kind),pointer,dimension(:,:) :: cv_lcbas=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: cv_sf=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: cv_vp=>NULL() -!real(r_kind),pointer,dimension(:,:,:) :: cv_w=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: cv_t=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: cv_rh=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: cv_sfwter=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: cv_vpwter=>NULL() - -! Declare required local state variables -integer(i_kind), parameter :: nsvars = 12 -integer(i_kind) :: isps(nsvars) -character(len=4), parameter :: mysvars(nsvars) = (/ & ! vars from ST needed here - 'u ', 'v ', 'prse', 'q ', 'tsen', 'ql ', 'qi ', 'w ', & - 'qr ', 'qs ', 'qg ', 'qh ' /) -logical :: ls_u,ls_v,ls_w,ls_prse,ls_q,ls_tsen,ls_ql,ls_qi -logical :: ls_qr,ls_qs,ls_qg,ls_qh -real(r_kind),pointer,dimension(:,:) :: rv_ps=>NULL(),rv_sst=>NULL() -real(r_kind),pointer,dimension(:,:) :: rv_gust=>NULL(),rv_vis=>NULL(),rv_pblh=>NULL() -real(r_kind),pointer,dimension(:,:) :: rv_wspd10m=>NULL(),rv_tcamt,rv_lcbas=>NULL() -real(r_kind),pointer,dimension(:,:) :: rv_td2m=>NULL(),rv_mxtm=>NULL(),rv_mitm=>NULL() -real(r_kind),pointer,dimension(:,:) :: rv_pmsl=>NULL(),rv_howv=>NULL(),rv_cldch=>NULL() -real(r_kind),pointer,dimension(:,:) :: rv_uwnd10m=>NULL(),rv_vwnd10m=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: rv_u=>NULL(),rv_v=>NULL(),rv_w=>NULL(),rv_dw=>NULL(),rv_prse=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: rv_q=>NULL(),rv_tsen=>NULL(),rv_tv=>NULL(),rv_oz=>NULL() -real(r_kind),pointer,dimension(:,:,:) :: rv_rank3=>NULL() -real(r_kind),pointer,dimension(:,:) :: rv_rank2=>NULL() - -real(r_kind),allocatable,dimension(:,:,:):: uland,vland,uwter,vwter - -logical :: do_getuv,do_tv_to_tsen_ad,do_normal_rh_to_q_ad,do_getprs_ad,do_cw_to_hydro_ad -logical :: do_cw_to_hydro_ad_hwrf - - -!****************************************************************************** - -if (lsqrtb) then - write(6,*)trim(myname),': not for sqrt(B)' - call stop2(311) -end if - -! Inquire about clouds -call gsi_metguess_get ('clouds::3d',nclouds,istatus) -if (nclouds>0) then - allocate(clouds(nclouds)) - call gsi_metguess_get ('clouds::3d',clouds,istatus) -endif - -! Inquire about chemistry -call gsi_chemguess_get('dim',ngases,istatus) -if (ngases>0) then - allocate(gases(ngases)) - call gsi_chemguess_get('gsinames',gases,istatus) -endif - -! Since each internal vector [step(jj)] of grad has the same structure, pointers are -! the same independent of the subwindow jj -call gsi_bundlegetpointer (grad%step(1),mycvars,icps,istatus) -lc_sf =icps(1)>0; lc_vp =icps(2)>0; lc_ps =icps(3)>0 -lc_t =icps(4)>0; lc_rh =icps(5)>0; lc_cw =icps(6)>0 -lc_ql =icps(7)>0; lc_qi =icps(8)>0; lc_w =icps(9)>0 - -! Since each internal vector of xhat has the same structure, pointers are -! the same independent of the subwindow jj -call gsi_bundlegetpointer (rval(1),mysvars,isps,istatus) -ls_u =isps(1)>0; ls_v =isps(2)>0; ls_prse=isps(3)>0 -ls_q =isps(4)>0; ls_tsen=isps(5)>0; ls_ql =isps(6)>0 -ls_qi =isps(7)>0; ls_w =isps(8)>0 -ls_qr =isps(9)>0; ls_qs =isps(10)>0 -ls_qg =isps(11)>0; ls_qh =isps(12)>0 - -! Define what to do depending on what's in CV and SV -do_getuv =lc_sf.and.lc_vp.and.ls_u .and.ls_v -do_tv_to_tsen_ad =lc_t .and.ls_q .and.ls_tsen -do_normal_rh_to_q_ad=lc_t .and.lc_rh.and.ls_prse.and.ls_q -do_getprs_ad =lc_t .and.lc_ps.and.ls_prse - -do_cw_to_hydro_ad=.false. -do_cw_to_hydro_ad_hwrf=.false. -if (regional) then - do_cw_to_hydro_ad=lc_cw.and.ls_ql.and.ls_qi - do_cw_to_hydro_ad_hwrf=lc_cw.and.ls_ql.and.ls_qi.and.ls_qr.and.ls_qs.and.ls_qg.and.ls_qh -else - do_cw_to_hydro_ad=lc_cw.and.ls_tsen.and.ls_ql.and.ls_qi.and.(.not.lc_ql) !ncep global -endif - -call gsi_bundlegetpointer (grad%step(1),'oz',icoz,istatus) -call gsi_bundlegetpointer (grad%step(1),'gust',icgust,istatus) -call gsi_bundlegetpointer (grad%step(1),'vis',icvis,istatus) -call gsi_bundlegetpointer (grad%step(1),'pblh',icpblh,istatus) -call gsi_bundlegetpointer (grad%step(1),'wspd10m',icwspd10m,istatus) -call gsi_bundlegetpointer (grad%step(1),'td2m',ictd2m,istatus) -call gsi_bundlegetpointer (grad%step(1),'mxtm',icmxtm,istatus) -call gsi_bundlegetpointer (grad%step(1),'mitm',icmitm,istatus) -call gsi_bundlegetpointer (grad%step(1),'pmsl',icpmsl,istatus) -call gsi_bundlegetpointer (grad%step(1),'howv',ichowv,istatus) -call gsi_bundlegetpointer (grad%step(1),'sfwter',icsfwter,istatus) -call gsi_bundlegetpointer (grad%step(1),'vpwter',icvpwter,istatus) -call gsi_bundlegetpointer (grad%step(1),'w',icw,istatus) -call gsi_bundlegetpointer (grad%step(1),'tcamt',ictcamt,istatus) -call gsi_bundlegetpointer (grad%step(1),'lcbas',iclcbas,istatus) -call gsi_bundlegetpointer (grad%step(1),'cldch',iccldch,istatus) -call gsi_bundlegetpointer (grad%step(1),'uwnd10m',icuwnd10m,istatus) -call gsi_bundlegetpointer (grad%step(1),'vwnd10m',icvwnd10m,istatus) - -! Loop over control steps -do jj=1,nsubwin - -! Create a work bundle similar to grad control vector's bundle - call gsi_bundlecreate ( wbundle, grad%step(jj), 'control2state_ad work', istatus ) - if (istatus/=0) then - write(6,*) trim(myname),': trouble creating work bundle' - call stop2(999) - endif - -!$omp parallel sections private(istatus,ii,ic,id,istatus_oz,rv_u,rv_v,rv_prse,rv_q,rv_tsen,uland,vland,uwter,vwter) - -!$omp section - - call gsi_bundlegetpointer (wbundle,'sf' ,cv_sf ,istatus) - call gsi_bundlegetpointer (wbundle,'vp' ,cv_vp ,istatus) - call gsi_bundlegetpointer (rval(jj),'u' ,rv_u, istatus) - call gsi_bundlegetpointer (rval(jj),'v' ,rv_v, istatus) - call gsi_bundleputvar ( wbundle, 'sf', zero, istatus ) - call gsi_bundleputvar ( wbundle, 'vp', zero, istatus ) -! Convert RHS calculations for u,v to st/vp for application of -! background error - if (do_getuv) then - if (twodvar_regional .and. icsfwter>0 .and. icvpwter>0) then - call gsi_bundlegetpointer (wbundle,'sfwter', cv_sfwter,istatus) - call gsi_bundlegetpointer (wbundle,'vpwter', cv_vpwter,istatus) - allocate(uland(lat2,lon2,nsig),vland(lat2,lon2,nsig), & - uwter(lat2,lon2,nsig),vwter(lat2,lon2,nsig)) - - uland=zero ; uwter=zero - vland=zero ; vwter=zero - - call landlake_uvmerge(rv_u,rv_v,uland,vland,uwter,vwter,0) - - call getuv(uwter,vwter,cv_sfwter,cv_vpwter,1) - call getuv(uland,vland,cv_sf,cv_vp,1) - deallocate(uland,vland,uwter,vwter) - else - call getuv(rv_u,rv_v,cv_sf,cv_vp,1) - endif - endif - - if(jj == 1)then - do ii=1,nsclen - grad%predr(ii)=bval%predr(ii) - enddo - do ii=1,npclen - grad%predp(ii)=bval%predp(ii) - enddo - if (ntclen>0) then - do ii=1,ntclen - grad%predt(ii)=bval%predt(ii) - enddo - end if - end if - -!$omp section - -! Get pointers to required control variables - call gsi_bundlegetpointer (wbundle,'ps' ,cv_ps ,istatus) - call gsi_bundlegetpointer (wbundle,'t' ,cv_t, istatus) - call gsi_bundlegetpointer (wbundle,'q' ,cv_rh ,istatus) - -! Get pointers to this subwin require state variables - call gsi_bundlegetpointer (rval(jj),'ps' ,rv_ps, istatus) - call gsi_bundlegetpointer (rval(jj),'prse',rv_prse,istatus) - call gsi_bundlegetpointer (rval(jj),'tv' ,rv_tv, istatus) - call gsi_bundlegetpointer (rval(jj),'tsen',rv_tsen,istatus) - call gsi_bundlegetpointer (rval(jj),'q' ,rv_q , istatus) - -! Adjoint of control to initial state - call gsi_bundleputvar ( wbundle, 't' , rv_tv, istatus ) - call gsi_bundleputvar ( wbundle, 'q' , zero, istatus ) - call gsi_bundleputvar ( wbundle, 'ps', rv_ps, istatus ) - - if (do_cw_to_hydro_ad .and. .not.do_cw_to_hydro_ad_hwrf) then -! Case when cloud-vars do not map one-to-one -! e.g. cw-to-ql&qi - call cw2hydro_ad(rval(jj),wbundle,clouds,nclouds) - elseif (do_cw_to_hydro_ad_hwrf) then -! Case when cloud-vars do not map one-to-one -! e.g. cw-to-ql&qi&qr&qs&qg&qh - call cw2hydro_ad_hwrf(rval(jj),wbundle,rv_tsen) - else -! Case when cloud-vars map one-to-one, take care of them together -! e.g. cw-to-cw - do ic=1,nclouds - id=getindex(cvars3d,clouds(ic)) - if (id>0) then - call gsi_bundlegetpointer (rval(jj),clouds(ic),rv_rank3,istatus) - call gsi_bundleputvar (wbundle, clouds(ic),rv_rank3,istatus) - endif - enddo - end if -! Calculate sensible temperature - if(do_tv_to_tsen_ad) call tv_to_tsen_ad(cv_t,rv_q,rv_tsen) - -! Adjoint of convert input normalized RH to q to add contribution of moisture -! to t, p , and normalized rh - if(do_normal_rh_to_q_ad) call normal_rh_to_q_ad(cv_rh,cv_t,rv_prse,rv_q) - -! Adjoint to convert ps to 3-d pressure - if(do_getprs_ad) call getprs_ad(cv_ps,cv_t,rv_prse) - - -!$omp section - - call gsi_bundlegetpointer (rval(jj),'sst' ,rv_sst, istatus) - call gsi_bundleputvar ( wbundle, 'sst', rv_sst, istatus ) - -! call gsi_bundlegetpointer (rval(jj),'oz' ,rv_oz , istatus) - call gsi_bundlegetpointer (rval(jj),'oz' ,rv_oz , istatus_oz) - - if (icoz>0) then - call gsi_bundleputvar ( wbundle, 'oz', rv_oz, istatus ) - else - if(istatus_oz==0) rv_oz=zero - end if - -! Same one-to-one map for chemistry-vars; take care of them together - if (.not.laeroana_fv3cmaq .and. icvt_cmaq_fv3 == 2) then - write(6,*) ' icvt_cmaq_fv3 == 2 but laeroana_fv3cmaq=false stop!!!' - call stop2(999) - endif - - if (icvt_cmaq_fv3 == 2) then - call amass2aero_ad(rval(jj),wbundle,aeronames_cmaq_fv3,naero_cmaq_fv3) - else - do ic=1,ngases - id=getindex(cvars3d,gases(ic)) - if (id>0) then - call gsi_bundlegetpointer (rval(jj),gases(ic),rv_rank3,istatus) - call gsi_bundleputvar (wbundle, gases(ic),rv_rank3,istatus) - endif - - id=getindex(cvars2d,gases(ic)) - if (id>0) then - call gsi_bundlegetpointer (rval(jj),gases(ic),rv_rank2,istatus) - call gsi_bundleputvar (wbundle, gases(ic),rv_rank2,istatus) - endif - enddo - end if - if (icgust>0) then - call gsi_bundlegetpointer (rval(jj),'gust' ,rv_gust, istatus) - call gsi_bundleputvar ( wbundle, 'gust', rv_gust, istatus ) - end if - if (icvis >0) then - call gsi_bundlegetpointer (rval(jj),'vis' ,rv_vis , istatus) - call gsi_bundleputvar ( wbundle, 'vis' , rv_vis , istatus ) - end if - if (icpblh>0)then - call gsi_bundlegetpointer (rval(jj),'pblh' ,rv_pblh, istatus) - call gsi_bundleputvar ( wbundle, 'pblh', rv_pblh, istatus ) - end if - if (icwspd10m>0) then - call gsi_bundlegetpointer (rval(jj),'wspd10m' ,rv_wspd10m, istatus) - call gsi_bundleputvar ( wbundle, 'wspd10m', rv_wspd10m, istatus ) - end if - if (ictd2m>0) then - call gsi_bundlegetpointer (rval(jj),'td2m' ,rv_td2m, istatus) - call gsi_bundleputvar ( wbundle, 'td2m', rv_td2m, istatus ) - end if - if (icmxtm>0) then - call gsi_bundlegetpointer (rval(jj),'mxtm' ,rv_mxtm, istatus) - call gsi_bundleputvar ( wbundle, 'mxtm', rv_mxtm, istatus ) - end if - if (icmitm>0) then - call gsi_bundlegetpointer (rval(jj),'mitm' ,rv_mitm, istatus) - call gsi_bundleputvar ( wbundle, 'mitm', rv_mitm, istatus ) - end if - if (icpmsl>0) then - call gsi_bundlegetpointer (rval(jj),'pmsl' ,rv_pmsl, istatus) - call gsi_bundleputvar ( wbundle, 'pmsl', rv_pmsl, istatus ) - end if - if (ichowv>0) then - call gsi_bundlegetpointer (rval(jj),'howv' ,rv_howv, istatus) - call gsi_bundleputvar ( wbundle, 'howv', rv_howv, istatus ) - end if - if (icw>0) then - call gsi_bundlegetpointer (rval(jj),'w' ,rv_w, istatus) - call gsi_bundleputvar ( wbundle, 'w', rv_w, istatus ) - if(nems_nmmb_regional)then - call gsi_bundlegetpointer (rval(jj),'dw' ,rv_dw, istatus) - call gsi_bundleputvar ( wbundle, 'dw', rv_dw, istatus ) - end if - end if - if (ictcamt>0) then - call gsi_bundlegetpointer (rval(jj),'tcamt',rv_tcamt, istatus) - call gsi_bundleputvar ( wbundle, 'tcamt', rv_tcamt, istatus ) - end if - if (iclcbas>0) then - call gsi_bundlegetpointer (wbundle,'lcbas',cv_lcbas,istatus) - call gsi_bundlegetpointer (rval(jj),'lcbas',rv_lcbas, istatus) - call gsi_bundleputvar ( wbundle, 'lcbas', zero, istatus ) - ! Adjoint of convert loglcbas to lcbas - call loglcbas_to_lcbas_ad(cv_lcbas,rv_lcbas) - end if - if (iccldch >0) then - call gsi_bundlegetpointer (rval(jj),'cldch' ,rv_cldch , istatus) - call gsi_bundleputvar ( wbundle, 'cldch' , rv_cldch , istatus ) - end if - if (icuwnd10m>0) then - call gsi_bundlegetpointer (rval(jj),'uwnd10m' ,rv_uwnd10m, istatus) - call gsi_bundleputvar ( wbundle, 'uwnd10m', rv_uwnd10m, istatus ) - end if - if (icvwnd10m>0) then - call gsi_bundlegetpointer (rval(jj),'vwnd10m' ,rv_vwnd10m, istatus) - call gsi_bundleputvar ( wbundle, 'vwnd10m', rv_vwnd10m, istatus ) - end if - -!$omp end parallel sections - -! Adjoint of transfer variables - - do ii=1,wbundle%ndim - grad%step(jj)%values(ii)=wbundle%values(ii)+grad%step(jj)%values(ii) - enddo - call gsi_bundledestroy(wbundle,istatus) - if (istatus/=0) then - write(6,*) trim(myname),': trouble destroying work bundle' - call stop2(999) - endif - -end do - -! Clean up -if (ngases>0) deallocate(gases) - -if (nclouds>0) deallocate(clouds) - -return -end subroutine control2state_ad diff --git a/src/gsi/control_vectors.f90 b/src/gsi/control_vectors.f90 index a1c0a61ed9..97578124d2 100644 --- a/src/gsi/control_vectors.f90 +++ b/src/gsi/control_vectors.f90 @@ -83,6 +83,7 @@ module control_vectors use hybrid_ensemble_parameters, only: beta_s0,l_hyb_ens use hybrid_ensemble_parameters, only: grd_ens use constants, only : max_varname_length +use gridmod, only : minmype use m_rerank, only : rerank use GSI_BundleMod, only : GSI_BundleCreate @@ -112,7 +113,7 @@ module control_vectors public dot_product public prt_control_norms, axpy, random_cv, setup_control_vectors, & write_cv, read_cv, inquire_cv, maxval, qdot_prod_sub, init_anacv, & - final_anacv + final_anacv,c2sset_flg ! ! Public variables @@ -144,7 +145,7 @@ module control_vectors type(GSI_Bundle), pointer :: step(:) type(GSI_Bundle), pointer :: motley(:) type(GSI_Grid) :: grid_aens - type(GSI_Bundle), pointer :: aens(:,:) + type(GSI_Bundle), pointer :: aens(:,:,:) real(r_kind), pointer :: predr(:) => NULL() real(r_kind), pointer :: predp(:) => NULL() real(r_kind), pointer :: predt(:) => NULL() @@ -157,6 +158,7 @@ module control_vectors integer(i_kind) :: latlon11,latlon1n,lat2,lon2,nsig,n_ens integer(i_kind) :: nval_lenz_en logical,save :: lsqrtb,lcalc_gfdl_cfrac +logical :: c2sset_flg integer(i_kind) :: m_vec_alloc, max_vec_alloc, m_allocs, m_deallocs @@ -296,6 +298,7 @@ subroutine init_anacv ! language: f90 ! machine: ibm rs/6000 sp ! +use hybrid_ensemble_parameters,only:idaen3d,idaen2d implicit none !character(len=*),parameter:: rcname='anavinfo.txt' character(len=*),parameter:: rcname='anavinfo' ! filename should have extension @@ -345,6 +348,7 @@ subroutine init_anacv allocate(cvarsmd(mvars)) allocate(atsfc_sdv(mvars)) allocate(an_amp0(nvars)) +allocate(idaen3d(nc3d),idaen2d(nc2d)) allocate(incvars_to_zero(nvars)) allocate(incvars_zero_strat(nvars)) incvars_to_zero(:) = 'NONE' @@ -371,12 +375,22 @@ subroutine init_anacv cvars2d(nc2d)=trim(adjustl(var)) nrf2_loc(nc2d)=ii ! rid of soon as2d(nc2d)=aas + if(itracer>10) then + idaen2d(nc2d)=2 + else + idaen2d(nc2d)=1 + endif else nc3d=nc3d+1 cvars3d(nc3d)=trim(adjustl(var)) nrf3_loc(nc3d)=ii ! rid of soon nrf_3d(ii)=.true. as3d(nc3d)=aas + if(itracer>10) then + idaen3d(nc3d)=2 + else + idaen3d(nc3d)=1 + endif endif endif nrf_var(ii)=trim(adjustl(var)) @@ -401,6 +415,7 @@ subroutine init_anacv write(6,*) myname_,': ALL CONTROL VARIABLES ', nrf_var end if lcalc_gfdl_cfrac = .false. +c2sset_flg = .true. end subroutine init_anacv subroutine final_anacv @@ -446,9 +461,11 @@ subroutine allocate_cv(ycv) !$$$ end documentation block use hybrid_ensemble_parameters, only: grd_ens + use hybrid_ensemble_parameters, only: naensgrp implicit none type(control_vector), intent( out) :: ycv integer(i_kind) :: ii,jj,nn,ndim,ierror,n_step,n_aens + integer(i_kind) :: ig character(len=256)::bname character(len=max_varname_length)::ltmp(1) type(gsi_grid) :: grid_motley @@ -481,7 +498,7 @@ subroutine allocate_cv(ycv) ! If so, define grid of ensemble control vector n_aens=0 if (l_hyb_ens) then - ALLOCATE(ycv%aens(nsubwin,n_ens)) + ALLOCATE(ycv%aens(nsubwin,naensgrp,n_ens)) call GSI_GridCreate(ycv%grid_aens,grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) if (lsqrtb) then n_aens=nval_lenz_en @@ -524,17 +541,19 @@ subroutine allocate_cv(ycv) if (l_hyb_ens) then ltmp(1)='a_en' - do nn=1,n_ens - ycv%aens(jj,nn)%values => ycv%values(ii+1:ii+n_aens) - write(bname,'(a,i3.3,a,i4.4)') 'Ensemble Control Bundle subwin-',jj,' and member-',nn - call GSI_BundleSet(ycv%aens(jj,nn),ycv%grid_aens,bname,ierror,names3d=ltmp,bundle_kind=r_kind) - if (ierror/=0) then - write(6,*)'allocate_cv: error alloc(ensemble bundle)' - call stop2(109) - endif - ndim=ndim+ycv%aens(jj,nn)%ndim - - ii=ii+n_aens + do ig=1,naensgrp + do nn=1,n_ens + ycv%aens(jj,ig,nn)%values => ycv%values(ii+1:ii+n_aens) + write(bname,'(a,i3.3,a,i4.4)') 'Ensemble Control Bundle subwin-',jj,' and member-',nn + call GSI_BundleSet(ycv%aens(jj,ig,nn),ycv%grid_aens,bname,ierror,names3d=ltmp,bundle_kind=r_kind) + if (ierror/=0) then + write(6,*)'allocate_cv: error alloc(ensemble bundle)' + call stop2(109) + endif + ndim=ndim+ycv%aens(jj,ig,nn)%ndim + + ii=ii+n_aens + enddo enddo endif @@ -620,15 +639,19 @@ subroutine deallocate_cv(ycv) ! !$$$ end documentation block + use hybrid_ensemble_parameters, only: naensgrp implicit none type(control_vector), intent(inout) :: ycv integer(i_kind) :: ii,nn,ierror + integer(i_kind) :: ig if (ycv%lallocated) then do ii=1,nsubwin if (l_hyb_ens) then - do nn=n_ens,1,-1 - call GSI_BundleUnset(ycv%aens(ii,nn),ierror) + do ig=1,naensgrp + do nn=n_ens,1,-1 + call GSI_BundleUnset(ycv%aens(ii,ig,nn),ierror) + enddo enddo endif ! if (beta_s0>tiny_r_kind) then @@ -845,9 +868,11 @@ real(r_quad) function qdot_prod_sub(xcv,ycv) ! !$$$ end documentation block + use hybrid_ensemble_parameters, only: naensgrp implicit none type(control_vector), intent(in ) :: xcv, ycv integer(i_kind) :: ii,nn,m3d,m2d,i,j,itot + integer(i_kind) :: ig,nigtmp real(r_quad),allocatable,dimension(:) :: partsum qdot_prod_sub=zero_quad @@ -858,19 +883,21 @@ real(r_quad) function qdot_prod_sub(xcv,ycv) qdot_prod_sub=qdot_prod_sub+qdot_product( xcv%step(ii)%values(:) ,ycv%step(ii)%values(:) ) end do if(l_hyb_ens) then - do nn=1,n_ens - do ii=1,nsubwin - qdot_prod_sub=qdot_prod_sub+qdot_product( xcv%aens(ii,nn)%values(:) ,ycv%aens(ii,nn)%values(:) ) + do ig=1,naensgrp + do nn=1,n_ens + do ii=1,nsubwin + qdot_prod_sub=qdot_prod_sub+qdot_product( xcv%aens(ii,ig,nn)%values(:) ,ycv%aens(ii,ig,nn)%values(:) ) + end do end do end do endif else + m3d=xcv%step(1)%n3d + m2d=xcv%step(1)%n2d + itot=max(m3d,0)+max(m2d,0) + if(l_hyb_ens)itot=itot+n_ens*naensgrp + allocate(partsum(itot)) do ii=1,nsubwin - m3d=xcv%step(ii)%n3d - m2d=xcv%step(ii)%n2d - itot=max(m3d,0)+max(m2d,0) - if(l_hyb_ens)itot=itot+n_ens - allocate(partsum(itot)) !$omp parallel do schedule(dynamic,1) private(i) do i = 1,m3d partsum(i) = dplevs(xcv%step(ii)%r3(i)%q,ycv%step(ii)%r3(i)%q,ihalo=1) @@ -880,20 +907,23 @@ real(r_quad) function qdot_prod_sub(xcv,ycv) partsum(m3d+i) = dplevs(xcv%step(ii)%r2(i)%q,ycv%step(ii)%r2(i)%q,ihalo=1) enddo if(l_hyb_ens) then + do ig=1,naensgrp + nigtmp=n_ens*(ig-1) !$omp parallel do schedule(dynamic,1) private(i) - do i = 1,n_ens - partsum(m3d+m2d+i) = dplevs(xcv%aens(ii,i)%r3(1)%q,ycv%aens(ii,i)%r3(1)%q,ihalo=1) + do i = 1,n_ens + partsum(m3d+m2d+nigtmp+i) = dplevs(xcv%aens(ii,ig,i)%r3(1)%q,ycv%aens(ii,ig,i)%r3(1)%q,ihalo=1) + end do end do end if do i=1,itot qdot_prod_sub = qdot_prod_sub + partsum(i) end do - deallocate(partsum) end do + deallocate(partsum) end if ! Duplicated part of vector - if(mype == 0)then + if(mype == minmype)then do j=nclen1+1,nclen qdot_prod_sub=qdot_prod_sub+xcv%values(j)*ycv%values(j) end do @@ -933,38 +963,41 @@ subroutine qdot_prod_vars_eb(xcv,ycv,prods,eb) ! !$$$ end documentation block + use hybrid_ensemble_parameters, only: naensgrp implicit none type(control_vector), intent(in ) :: xcv, ycv character(len=*) , intent(in ) :: eb real(r_quad) , intent( out) :: prods(nsubwin+1) - real(r_quad) :: zz(nsubwin) integer(i_kind) :: ii,i,nn,m3d,m2d real(r_quad),allocatable,dimension(:) :: partsum + integer(i_kind) :: ig + integer(i_kind) ::ngtmp,nn0 prods(:)=zero_quad - zz(:)=zero_quad ! Independent part of vector if (lsqrtb) then if(trim(eb) == 'cost_b') then do ii=1,nsubwin - zz(ii)=zz(ii)+qdot_product( xcv%step(ii)%values(:) ,ycv%step(ii)%values(:) ) + prods(ii)=prods(ii)+qdot_product( xcv%step(ii)%values(:) ,ycv%step(ii)%values(:) ) end do endif if(trim(eb) == 'cost_e') then - do nn=1,n_ens - do ii=1,nsubwin - zz(ii)=zz(ii)+qdot_product( xcv%aens(ii,nn)%values(:) ,ycv%aens(ii,nn)%values(:) ) + do ig=1,naensgrp + do nn=1,n_ens + do ii=1,nsubwin + prods(ii)=prods(ii)+qdot_product( xcv%aens(ii,ig,nn)%values(:) ,ycv%aens(ii,ig,nn)%values(:) ) + end do end do end do endif else if(trim(eb) == 'cost_b') then + m3d=xcv%step(1)%n3d + m2d=xcv%step(1)%n2d + allocate(partsum(m2d+m3d)) do ii=1,nsubwin - m3d=xcv%step(ii)%n3d - m2d=xcv%step(ii)%n2d - allocate(partsum(m2d+m3d)) !$omp parallel do schedule(dynamic,1) private(i) do i = 1,m3d partsum(i)= dplevs(xcv%step(ii)%r3(i)%q,ycv%step(ii)%r3(i)%q,ihalo=1) @@ -974,41 +1007,42 @@ subroutine qdot_prod_vars_eb(xcv,ycv,prods,eb) partsum(m3d+i)= dplevs(xcv%step(ii)%r2(i)%q,ycv%step(ii)%r2(i)%q,ihalo=1) enddo do i = 1,m2d+m3d - zz(ii)=zz(ii) + partsum(i) + prods(ii)=prods(ii) + partsum(i) end do - deallocate(partsum) end do + deallocate(partsum) end if if(trim(eb) == 'cost_e') then - do ii=1,nsubwin ! RTod: somebody could work in opt/zing this ... - allocate(partsum(n_ens)) -!$omp parallel do schedule(dynamic,1) private(nn,m3d,m2d) - do nn=1,n_ens - partsum(nn) = zero_quad - m3d=xcv%aens(ii,nn)%n3d - do i = 1,m3d - partsum(nn)= partsum(nn) + dplevs(xcv%aens(ii,nn)%r3(i)%q,ycv%aens(ii,nn)%r3(i)%q,ihalo=1) + allocate(partsum(n_ens*naensgrp)) + do ii=1,nsubwin +!$omp parallel do schedule(dynamic,1) private(nn,m3d,m2d,ig,ngtmp,nn0) + do ig=1,naensgrp + ngtmp=(ig-1)*n_ens + do nn=1,n_ens + nn0=nn+ngtmp + partsum(nn0) = zero_quad + m3d=xcv%aens(ii,ig,nn)%n3d + do i = 1,m3d + partsum(nn0)= partsum(nn0) + dplevs(xcv%aens(ii,ig,nn)%r3(i)%q,ycv%aens(ii,ig,nn)%r3(i)%q,ihalo=1) + enddo + m2d=xcv%aens(ii,ig,nn)%n2d + do i = 1,m2d + partsum(nn0)= partsum(nn0) + dplevs(xcv%aens(ii,ig,nn)%r2(i)%q,ycv%aens(ii,ig,nn)%r2(i)%q,ihalo=1) + enddo enddo - m2d=xcv%aens(ii,nn)%n2d - do i = 1,m2d - partsum(nn)= partsum(nn) + dplevs(xcv%aens(ii,nn)%r2(i)%q,ycv%aens(ii,nn)%r2(i)%q,ihalo=1) - enddo - enddo - do nn=1,n_ens - zz(ii)=zz(ii)+partsum(nn) end do - deallocate(partsum) + do nn=1,n_ens*naensgrp + prods(ii)=prods(ii)+partsum(nn) + end do end do + deallocate(partsum) end if end if - call mpl_allreduce(nsubwin,qpvals=zz) - prods(1:nsubwin) = zz(1:nsubwin) - ! Duplicated part of vector - if(trim(eb) == 'cost_b') then + if(mype == minmype .and. trim(eb) == 'cost_b' ) then if (nsclen>0) then - prods(nsubwin+1) = prods(nsubwin+1) + qdot_product(xcv%predr(:),ycv%predr(:)) + prods(nsubwin+1) = qdot_product(xcv%predr(:),ycv%predr(:)) endif if (npclen>0) then prods(nsubwin+1) = prods(nsubwin+1) + qdot_product(xcv%predp(:),ycv%predp(:)) @@ -1018,6 +1052,9 @@ subroutine qdot_prod_vars_eb(xcv,ycv,prods,eb) endif end if + call mpl_allreduce(nsubwin+1,qpvals=prods) + + return end subroutine qdot_prod_vars_eb ! ---------------------------------------------------------------------- @@ -1348,6 +1385,7 @@ subroutine random_cv(ycv,kseed) ! !$$$ end documentation block +use hybrid_ensemble_parameters, only: naensgrp implicit none type(control_vector) , intent(inout) :: ycv integer(i_kind), optional, intent(in ) :: kseed @@ -1355,6 +1393,7 @@ subroutine random_cv(ycv,kseed) integer(i_kind):: ii,jj,nn,iseed integer, allocatable :: nseed(:) ! Intentionaly default integer real(r_kind), allocatable :: zz(:) +integer(i_kind) :: ig iseed=iadatebgn if (present(kseed)) iseed=iseed+kseed @@ -1381,10 +1420,12 @@ subroutine random_cv(ycv,kseed) if (nval_lenz_en>0) then allocate(zz(nval_lenz_en)) do nn=1,n_ens - do jj=1,nsubwin - call random_number(zz) - do ii=1,nval_lenz_en - ycv%aens(jj,nn)%values(ii) = two*zz(ii)-one + do ig=1,naensgrp + do jj=1,nsubwin + call random_number(zz) + do ii=1,nval_lenz_en + ycv%aens(jj,ig,nn)%values(ii) = two*zz(ii)-one + enddo enddo enddo enddo diff --git a/src/gsi/convthin.f90 b/src/gsi/convthin.f90 index cc6d2ed1b5..3a52188d73 100644 --- a/src/gsi/convthin.f90 +++ b/src/gsi/convthin.f90 @@ -326,11 +326,8 @@ subroutine map3grids(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,iobs ibest_save(itx,ip)=iin ! Case(3): obs score > best value at this location, -! --> do not use this obs, return to calling program. - elseif (icount_fore(itx,ip) > 0 .and. crit > score_crit_fore(itx,ip)) then - iuse=.false. - ! Case(4): none of the above cases are satisified, don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. endif ! cases @@ -358,25 +355,17 @@ subroutine map3grids(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,iobs ibest_save(itx,ip)=iin ! Case(3): obs score > best value at this location, -! --> do not use this obs, return to calling program. - elseif(icount_aft(itx,ip) > 0 .and. crit > score_crit_aft(itx,ip)) then - iuse=.false. - ! Case(4): none of the above cases are satisified, -! --> don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. endif ! cases else -! Case: obs score > best value at this location, -! --> do not use this obs, return to calling program. - if(crit > score_crit(itx,ip) .and. icount(itx,ip) > 0) then - iuse=.false. ! Case: obs score < best value at this location, ! --> update score, count, and best obs counters - elseif (icount(itx,ip) > 0 .and. crit < score_crit(itx,ip)) then + if (icount(itx,ip) > 0 .and. crit < score_crit(itx,ip)) then score_crit(itx,ip)= crit iobsout=ibest_obs(itx,ip) icount(itx,ip)=icount(itx,ip)+1 @@ -394,7 +383,8 @@ subroutine map3grids(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,iobs ibest_save(itx,ip) = iin ! Case: none of the above cases are satisified, -! --> don't use this obs +! Case: obs score > best value at this location, +! --> do not use this obs, return to calling program. else iuse = .false. end if @@ -473,8 +463,8 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io integer(i_kind) ix,iy real(r_kind) dlat1,dlon1,pob1 - real(r_kind) dx,dy,dp,dxx,dyy,dpp - real(r_kind) crit!,dist1 + real(r_kind) dx,dy,dp + real(r_kind) crit !,dist1 logical foreswp, aftswp @@ -510,13 +500,13 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io dx=dlon1-ix ix=max(1,min(ix,mlon(iy))) - dxx=half-min(dx,one-dx) - dyy=half-min(dy,one-dy) - if( pflag == 1) then - dpp=half-min(dp,one-dp) - else - dpp=min(dp,one-dp) - endif +! dxx=half-min(dx,one-dx) +! dyy=half-min(dy,one-dy) +! if( pflag == 1) then +! dpp=half-min(dp,one-dp) +! else +! dpp=min(dp,one-dp) +! endif itx=hll(ix,iy) @@ -535,10 +525,10 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io ! TDR fore/aft (Pseudo-dual-Doppler-radars) if(foreswp) then ! fore sweeps + iobs=iobs+1 + iobsout=iobs ! Case(1): first obs at this location, keep this obs as starting point if (icount_fore(itx,ip)==0) then - iobs=iobs+1 - iobsout=iobs score_crit_fore(itx,ip)= crit icount_fore(itx,ip)=icount_fore(itx,ip)+1 ibest_obs(itx,ip) = iobs @@ -549,8 +539,6 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io ! Case(2): obs score < best value at this location, ! --> update score, count, and best obs counters elseif (icount_fore(itx,ip) > 0 .and. crit < score_crit_fore(itx,ip)) then - iobs=iobs+1 - iobsout=iobs score_crit(itx,ip)= crit ! iobsout=ibest_obs(itx,ip) icount(itx,ip)=icount(itx,ip)+1 @@ -560,27 +548,19 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io ibest_save(itx,ip)=iobs ! Case(3): obs score > best value at this location, -! --> do not use this obs, return to calling program. - elseif (icount_fore(itx,ip) > 0 .and. crit > score_crit_fore(itx,ip)) then - iobs=iobs+1 - iobsout=iobs - rusage(iobs)=101.1_r_kind - iuse=.false. - ! Case(4): none of the above cases are satisified, don't use this obs +! --> do not use this obs, return to calling program. else - iuse = .false. - iobs=iobs+1 - iobsout=iobs rusage(iobs)=101.1_r_kind + iuse=.false. endif ! cases else if(aftswp) then ! aft sweeps + iobs=iobs+1 + iobsout=iobs ! Case(1): first obs at this location, keep this obs as starting point if (icount_aft(itx,ip)==0) then - iobs=iobs+1 - iobsout=iobs score_crit_aft(itx,ip)= crit icount_aft(itx,ip)=icount_aft(itx,ip)+1 ibest_obs(itx,ip) = iobs @@ -589,8 +569,6 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io ! Case(2): obs score < best value at this location, ! --> update score, count, and best obs counters elseif (icount_aft(itx,ip) > 0 .and. crit < score_crit_aft(itx,ip)) then - iobs=iobs+1 - iobsout=iobs score_crit_aft(itx,ip)= crit icount_aft(itx,ip)=icount_aft(itx,ip)+1 iobsout=ibest_obs(itx,ip) @@ -599,36 +577,20 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io rusage(iobs)=usage ! Case(3): obs score > best value at this location, -! --> do not use this obs, return to calling program. - elseif(icount_aft(itx,ip) > 0 .and. crit > score_crit_aft(itx,ip)) then - iuse=.false. - iobs=iobs+1 - iobsout=iobs - rusage(iobs)=101.1_r_kind - ! Case(4): none of the above cases are satisified, -! --> don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. - iobs=iobs+1 - iobsout=iobs rusage(iobs)=101.1_r_kind endif ! cases else -! Case: obs score > best value at this location, -! --> do not use this obs, return to calling program. - if(crit > score_crit(itx,ip) .and. icount(itx,ip) > 0) then - iuse=.false. - iobs=iobs+1 - iobsout=iobs - rusage(iobs)=101.0_r_kind + iobs=iobs+1 + iobsout=iobs ! Case: obs score < best value at this location, ! --> update score, count, and best obs counters - elseif (icount(itx,ip) > 0 .and. crit < score_crit(itx,ip)) then - iobs=iobs+1 - iobsout=iobs + if (icount(itx,ip) > 0 .and. crit < score_crit(itx,ip)) then score_crit(itx,ip)= crit icount(itx,ip)=icount(itx,ip)+1 iiout = ibest_obs(itx,ip) @@ -640,20 +602,17 @@ subroutine map3grids_m(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,crit1,io ! Case: first obs at this location, ! --> keep this obs as starting point elseif (icount(itx,ip)==0) then - iobs=iobs+1 - iobsout=iobs score_crit(itx,ip)= crit ibest_obs(itx,ip) = iobs icount(itx,ip)=icount(itx,ip)+1 ibest_save(itx,ip) = iin rusage(iobs)=usage -! Case: none of the above cases are satisified, -! --> don't use this obs +! Case: obs score > best value at this location, +! or none of the above cases are satisified, +! --> do not use this obs, return to calling program. else iuse = .false. - iobs=iobs+1 - iobsout=iobs rusage(iobs)=101.0_r_kind end if end if diff --git a/src/gsi/convthin_time.f90 b/src/gsi/convthin_time.f90 index 36ab178393..7f36caf09a 100644 --- a/src/gsi/convthin_time.f90 +++ b/src/gsi/convthin_time.f90 @@ -226,7 +226,8 @@ subroutine map3grids_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,& integer(i_kind) ix,iy real(r_kind) dlat1,dlon1,pob1 - real(r_kind) dx,dy,dp,dxx,dyy,dpp + real(r_kind) dx,dy,dp +! real(r_kind) dxx,dyy,dpp real(r_kind) crit!,dist1 logical foreswp, aftswp @@ -262,13 +263,13 @@ subroutine map3grids_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,& dx=dlon1-ix ix=max(1,min(ix,mlon(iy))) - dxx=half-min(dx,one-dx) - dyy=half-min(dy,one-dy) - if( pflag == 1) then - dpp=half-min(dp,one-dp) - else - dpp=min(dp,one-dp) - endif +! dxx=half-min(dx,one-dx) +! dyy=half-min(dy,one-dy) +! if( pflag == 1) then +! dpp=half-min(dp,one-dp) +! else +! dpp=min(dp,one-dp) +! endif itx=hll(ix,iy) @@ -306,10 +307,8 @@ subroutine map3grids_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,& ibest_save_tm(itx,ip,itm)=iin ! Case(3): obs score > best value at this location, -! --> do not use this obs, return to calling program. - elseif (icount_fore_tm(itx,ip,itm) > 0 .and. crit > score_crit_fore_tm(itx,ip,itm)) then - iuse=.false. ! Case(4): none of the above cases are satisified, don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. endif ! cases @@ -337,25 +336,17 @@ subroutine map3grids_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,& ibest_save_tm(itx,ip,itm)=iin ! Case(3): obs score > best value at this location, +! Case(4): none of the above cases are satisified, ! --> do not use this obs, return to calling program. - elseif(icount_aft_tm(itx,ip,itm) > 0 .and. crit > score_crit_aft_tm(itx,ip,itm)) then - iuse=.false. - -! Case(4): none of the above cases are satisified, -! --> don't use this obs else iuse = .false. endif ! cases else -! Case: obs score > best value at this location, -! --> do not use this obs, return to calling program. - if(crit > score_crit_tm(itx,ip,itm) .and. icount_tm(itx,ip,itm) > 0) then - iuse=.false. ! Case: obs score < best value at this location, ! --> update score, count, and best obs counters - elseif (icount_tm(itx,ip,itm) > 0 .and. crit < score_crit_tm(itx,ip,itm)) then + if (icount_tm(itx,ip,itm) > 0 .and. crit < score_crit_tm(itx,ip,itm)) then score_crit_tm(itx,ip,itm)= crit iobsout=ibest_obs_tm(itx,ip,itm) icount_tm(itx,ip,itm)=icount_tm(itx,ip,itm)+1 @@ -372,8 +363,9 @@ subroutine map3grids_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,& icount_tm(itx,ip,itm)=icount_tm(itx,ip,itm)+1 ibest_save_tm(itx,ip,itm) = iin +! Case: obs score > best value at this location, ! Case: none of the above cases are satisified, -! --> don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. end if @@ -447,7 +439,8 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c integer(i_kind) ix,iy real(r_kind) dlat1,dlon1,pob1 - real(r_kind) dx,dy,dp,dxx,dyy,dpp + real(r_kind) dx,dy,dp +! real(r_kind) dxx,dyy,dpp real(r_kind) crit!,dist1 logical foreswp, aftswp @@ -484,13 +477,13 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c dx=dlon1-ix ix=max(1,min(ix,mlon(iy))) - dxx=half-min(dx,one-dx) - dyy=half-min(dy,one-dy) - if( pflag == 1) then - dpp=half-min(dp,one-dp) - else - dpp=min(dp,one-dp) - endif +! dxx=half-min(dx,one-dx) +! dyy=half-min(dy,one-dy) +! if( pflag == 1) then +! dpp=half-min(dp,one-dp) +! else +! dpp=min(dp,one-dp) +! endif itx=hll(ix,iy) @@ -508,19 +501,11 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c ! TDR fore (Pseudo-dual-Doppler-radars) if(foreswp) then ! fore sweeps -! Case: obs score > best value at this location, -! --> do not use this obs, return to calling program. - if(crit > score_crit_fore_tm(itx,ip,itm) .and. icount_fore_tm(itx,ip,itm) > 0) then - iuse=.false. - iobs=iobs+1 - iobsout=iobs - rusage(iobs)=101.1_r_kind - ! Case: obs score < best value at this location, ! --> update score, count, and best obs counters - elseif (icount_fore_tm(itx,ip,itm) > 0 .and. crit < score_crit_fore_tm(itx,ip,itm)) then - iobs=iobs+1 - iobsout=iobs + iobs=iobs+1 + iobsout=iobs + if (icount_fore_tm(itx,ip,itm) > 0 .and. crit < score_crit_fore_tm(itx,ip,itm)) then score_crit_fore_tm(itx,ip,itm)= crit ! iobsout=ibest_obs_tm(itx,ip) icount_fore_tm(itx,ip,itm)=icount_fore_tm(itx,ip,itm)+1 @@ -532,8 +517,6 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c ! Case: first obs at this location, ! --> keep this obs as starting point elseif (icount_fore_tm(itx,ip,itm)==0) then - iobs=iobs+1 - iobsout=iobs rusage(iobs)=usage score_crit_fore_tm(itx,ip,itm)= crit ibest_obs_tm(itx,ip,itm) = iobs @@ -541,28 +524,20 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c ibest_save_tm(itx,ip,itm) = iobs ! Case: none of the above cases are satisified, -! --> don't use this obs +! Case: obs score > best value at this location, +! --> do not use this obs, return to calling program. else iuse = .false. - iobs=iobs+1 - iobsout=iobs rusage(iobs)=101.0_r_kind end if ! TDR aft (Pseudo-dual-Doppler-radars) else if(aftswp) then ! fore sweeps -! Case: obs score > best value at this location, -! --> do not use this obs, return to calling program. - if(crit > score_crit_aft_tm(itx,ip,itm) .and. icount_aft_tm(itx,ip,itm) > 0) then - iuse=.false. - iobs=iobs+1 - iobsout=iobs - rusage(iobs)=101.0_r_kind + iobs=iobs+1 + iobsout=iobs ! Case: obs score < best value at this location, ! --> update score, count, and best obs counters - elseif (icount_aft_tm(itx,ip,itm) > 0 .and. crit < score_crit_aft_tm(itx,ip,itm)) then - iobs=iobs+1 - iobsout=iobs + if (icount_aft_tm(itx,ip,itm) > 0 .and. crit < score_crit_aft_tm(itx,ip,itm)) then score_crit_aft_tm(itx,ip,itm)= crit ! iobsout=ibest_obs_tm(itx,ip) icount_aft_tm(itx,ip,itm)=icount_aft_tm(itx,ip,itm)+1 @@ -574,37 +549,27 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c ! Case: first obs at this location, ! --> keep this obs as starting point elseif (icount_aft_tm(itx,ip,itm)==0) then - iobs=iobs+1 - iobsout=iobs rusage(iobs)=usage score_crit_aft_tm(itx,ip,itm)= crit ibest_obs_tm(itx,ip,itm) = iobs icount_aft_tm(itx,ip,itm)=icount_aft_tm(itx,ip,itm)+1 ibest_save_tm(itx,ip,itm) = iobs +! Case: obs score > best value at this location, ! Case: none of the above cases are satisified, -! --> don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. - iobs=iobs+1 - iobsout=iobs rusage(iobs)=101.1_r_kind end if else -! Case: obs score > best value at this location, -! --> do not use this obs, return to calling program. - if(crit > score_crit_tm(itx,ip,itm) .and. icount_tm(itx,ip,itm) > 0) then - iuse=.false. - iobs=iobs+1 - iobsout=iobs - rusage(iobs)=101.0_r_kind + iobs=iobs+1 + iobsout=iobs ! Case: obs score < best value at this location, ! --> update score, count, and best obs counters - elseif (icount_tm(itx,ip,itm) > 0 .and. crit < score_crit_tm(itx,ip,itm)) then - iobs=iobs+1 - iobsout=iobs + if (icount_tm(itx,ip,itm) > 0 .and. crit < score_crit_tm(itx,ip,itm)) then score_crit_tm(itx,ip,itm)= crit icount_tm(itx,ip,itm)=icount_tm(itx,ip,itm)+1 iiout = ibest_obs_tm(itx,ip,itm) @@ -616,20 +581,17 @@ subroutine map3grids_m_tm(flg,pflag,pcoord,nlevp,dlat_earth,dlon_earth,pob,itm,c ! Case: first obs at this location, ! --> keep this obs as starting point elseif (icount_tm(itx,ip,itm)==0) then - iobs=iobs+1 - iobsout=iobs rusage(iobs)=usage score_crit_tm(itx,ip,itm)= crit ibest_obs_tm(itx,ip,itm) = iobs icount_tm(itx,ip,itm)=icount_tm(itx,ip,itm)+1 ibest_save_tm(itx,ip,itm) = iin +! Case: obs score > best value at this location, ! Case: none of the above cases are satisified, -! --> don't use this obs +! --> do not use this obs, return to calling program. else iuse = .false. - iobs=iobs+1 - iobsout=iobs rusage(iobs)=101.0_r_kind end if end if diff --git a/src/gsi/correlated_obsmod.F90 b/src/gsi/correlated_obsmod.F90 index 683e13d742..7a14cd3226 100644 --- a/src/gsi/correlated_obsmod.F90 +++ b/src/gsi/correlated_obsmod.F90 @@ -977,11 +977,15 @@ subroutine upd_varch_ if(isurf==1) then if(iamroot_)write(6,'(1x,a6,a20,2i6,2f20.15)')'>>>',idnames(itbl),jj,nn,varch(mm),sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) varch_sea(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) - endif - if(isurf==2) varch_land(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) - if(isurf==3) varch_ice(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) - if(isurf==4) varch_snow(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) - if(isurf==5) varch_mixed(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) + else if(isurf==2) then + varch_land(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) + else if(isurf==3) then + varch_ice(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) + else if(isurf==4) then + varch_snow(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) + else if(isurf==5) then + varch_mixed(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(jj,jj)) + end if enddo else allocate(ircv(nchanl1)) @@ -1023,15 +1027,9 @@ subroutine upd_varch_ IJsubset(iii)=ijac(ii) ! subset indexes in channels presently in use endif enddo - if (iii/=ncp) then - if (iamroot_) then - write(6,*) myname, ' iii,ncp= ',iii,ncp - endif - call die(myname_,' serious dimensions insconsistency, aborting') - endif - if (jjj/=ncp) then + if (iii/=ncp .or. jjj/=ncp) then if (iamroot_) then - write(6,*) myname, ' jjj,ncp= ',jjj,ncp + write(6,*) myname, ' iii,jjj,ncp= ',iii,jjj,ncp endif call die(myname_,' serious dimensions insconsistency, aborting') endif @@ -1039,11 +1037,17 @@ subroutine upd_varch_ nn=IJsubset(ii) mm=ich1(nn) rr=IRsubset(ii) - if(isurf==1) varch_sea(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) - if(isurf==2) varch_land(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) - if(isurf==3) varch_ice(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) - if(isurf==4) varch_snow(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) - if(isurf==5) varch_mixed(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) + if(isurf==1) then + varch_sea(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) + else if(isurf==2) then + varch_land(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) + else if(isurf==3) then + varch_ice(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) + else if(isurf==4) then + varch_snow(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) + else if(isurf==5) then + varch_mixed(mm)=sqrt(GSI_BundleErrorCov(itbl)%R(rr,rr)) + end if enddo ! clean up deallocate(IJsubset) @@ -1260,18 +1264,12 @@ logical function scale_jac_(depart,obs,err2,raterr2,jacobian,nchanl,varinv,diaga IJsubset(iii)=ijac(ii) ! subset indexes in Jac/dep presently in use endif enddo - if (iii/=ncp) then + if (iii/=ncp .and. jjj/=ncp) then if (iamroot_) then - write(6,*) myname, ' iii,ncp= ',iii,ncp + write(6,*) myname, ' iii,ncp= ',iii,jjj,ncp endif call die(myname_,' serious dimensions insconsistency (R), aborting') endif - if (jjj/=ncp) then - if (iamroot_) then - write(6,*) myname, ' jjj,ncp= ',jjj,ncp - endif - call die(myname_,' serious dimensions insconsistency (J), aborting') - endif if( ErrorCov%method<0 ) then ! Keep departures and Jacobian unchanged @@ -1300,33 +1298,25 @@ logical function scale_jac_(depart,obs,err2,raterr2,jacobian,nchanl,varinv,diaga ! decompose the sub-matrix - returning the result in the ! structure holding the full covariance - nsigjac=size(jacobian,1) - allocate(row(nsigjac,ncp)) - allocate(col(ncp),col2(ncp)) - row=zero_quad - col=zero_quad - col2=zero_quad - - allocate(qcaj(ncp)) allocate(UT(ncp,ncp)) - qcaj = one - UT = zero if( ErrorCov%method==2 ) then if(lqcoef)then + allocate(qcaj(ncp)) do jj=1,ncp - jjj=IJsubset(jj) - qcaj(jj) = raterr2(jjj) + qcaj(jj) = raterr2(IJsubset(jj)) enddo subset = choleskydecom_inv_ (IRsubset,IJsubset,ErrorCov,UT,diagadd,qcaj) + deallocate(qcaj) else subset = choleskydecom_inv_ (IRsubset,IJsubset,ErrorCov,UT,diagadd) endif else if( ErrorCov%method==1 ) then + allocate(qcaj(ncp)) do jj=1,ncp - jjj=IJsubset(jj) - qcaj(jj) = varinv(jjj) + qcaj(jj) = varinv(IJsubset(jj)) enddo subset = choleskydecom_inv_ (IRsubset,IJsubset,ErrorCov,UT,diagadd,qcaj) + deallocate(qcaj) endif if(.not.subset) then @@ -1345,23 +1335,31 @@ logical function scale_jac_(depart,obs,err2,raterr2,jacobian,nchanl,varinv,diaga do kk=ii,ncp rinvdiag(ii)=rinvdiag(ii)+UT(ii,kk)**2 enddo - enddo + end do + nsigjac=size(jacobian,1) + allocate(row(nsigjac,ncp)) + allocate(col(ncp),col2(ncp)) +!$omp parallel do schedule(dynamic,1) private(ii,jj,nn) do ii=1,ncp + row(:,ii)=zero_quad + col(ii)=zero_quad + col2(ii)=zero_quad do jj=1,ii nn=IJsubset(jj) col(ii) = col(ii) + UT(jj,ii) * depart(nn) - col2(ii) = col2(ii) + UT(jj,ii) * obs(nn) + col2(ii) = col2(ii) + UT(jj,ii) * obs(nn) row(:,ii) = row(:,ii) + UT(jj,ii) * jacobian(:,nn) enddo enddo + deallocate(UT) ! Place Jacobian and departure in output arrays - do jj=1,ncp - mm=IJsubset(jj) - depart(mm)=col(jj) - obs(mm)=col2(jj) - jacobian(:,mm)=row(:,jj) + do ii=1,ncp + mm=IJsubset(ii) + depart(mm)=col(ii) + obs(mm)=col2(ii) + jacobian(:,mm)=row(:,ii) raterr2(mm) = one err2(mm) = one wgtjo(mm) = one @@ -1369,8 +1367,6 @@ logical function scale_jac_(depart,obs,err2,raterr2,jacobian,nchanl,varinv,diaga deallocate(col,col2) deallocate(row) - deallocate(qcaj) - deallocate(UT) else if( ErrorCov%method==3 ) then !use diag(Re) scales GSI specified errors ! inv(Rg) = inv(De*Dg) @@ -1445,17 +1441,16 @@ logical function choleskydecom_inv_(Isubset,IJsubset,ErrorCov,UT,diagadd,qcaj) do ii=1,ncp UT(ii,jj) = ErrorCov%R(Isubset(ii),Isubset(jj))/sqrt(qcaj(ii)*qcaj(jj)) enddo + UT(jj,jj) = UT(jj,jj)+diagadd(IJsubset(jj)) enddo else do jj=1,ncp do ii=1,ncp UT(ii,jj) = ErrorCov%R(Isubset(ii),Isubset(jj)) enddo + UT(jj,jj) = UT(jj,jj)+diagadd(IJsubset(jj)) enddo endif - do jj=1,ncp - UT(jj,jj) = UT(jj,jj)+diagadd(IJsubset(jj)) - enddo if(r_kind==r_single) then ! this trick only works because this uses the f77 lapack interfaces call SPOTRF('U', ncp, UT, ncp, info ) else if(r_kind==r_double) then diff --git a/src/gsi/cplr_get_fv3_regional_ensperts.f90 b/src/gsi/cplr_get_fv3_regional_ensperts.f90 index d64f266026..5a3e72970d 100644 --- a/src/gsi/cplr_get_fv3_regional_ensperts.f90 +++ b/src/gsi/cplr_get_fv3_regional_ensperts.f90 @@ -8,14 +8,18 @@ module get_fv3_regional_ensperts_mod 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_parallel_over_ens + procedure, pass(this) :: parallel_read_fv3_step2 + procedure, nopass :: fill_regional_2d 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 + type(sub2grid_info):: grd_fv3lam_ens_dynvar_io_nouv,grd_fv3lam_ens_tracer_io_nouv,grd_fv3lam_ens_uv,grd_fv3lam_ens_phyvar_io_nouv 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 + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_ens_io_phymetvars3d_nouv contains subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) @@ -46,9 +50,9 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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: l_both_fv3sar_gfs_ens, n_ens_gfs,n_ens_fv3sar + use mpimod, only: mpi_comm_world,ierror,mype,npe + use hybrid_ensemble_parameters, only: n_ens,grd_ens,parallelization_over_ensmembers + use hybrid_ensemble_parameters, only: l_both_fv3sar_gfs_ens,n_ens_gfs,n_ens_fv3sar,weight_ens_fv3sar use hybrid_ensemble_parameters, only: ntlevs_ens,ensemble_path use control_vectors, only: cvars2d,cvars3d,nc2d,nc3d use gsi_bundlemod, only: gsi_bundlecreate @@ -69,17 +73,23 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) use gsi_rfv3io_mod, only: fv3lam_io_dynmetvars2d_nouv,fv3lam_io_tracermetvars2d_nouv use netcdf , only: nf90_open, nf90_close,nf90_nowrite,nf90_inquire,nf90_format_netcdf4 use netcdf_mod , only: nc_check + use gsi_rfv3io_mod, only: fv3lam_io_phymetvars3d_nouv + use obsmod, only: if_model_dbz implicit none class(get_fv3_regional_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + 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_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig)::w,ql,qi,qr,qg,qs,qnr,dbz + real(r_kind),dimension(:,:,:),allocatable :: gg_u,gg_v,gg_tv,gg_rh + real(r_kind),dimension(:,:,:),allocatable :: gg_w,gg_dbz,gg_qr,gg_qs, & + gg_qi,gg_qg,gg_oz,gg_cwmr + real(r_kind),dimension(:,:),allocatable :: gg_ps real(r_single),pointer,dimension(:,:,:):: w3 =>NULL() real(r_single),pointer,dimension(:,:):: w2 =>NULL() @@ -96,9 +106,9 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) integer(i_kind):: i,j,k,n,mm1,istatus integer(i_kind):: ndynvario2d,ntracerio2d - integer(r_kind):: ndynvario3d,ntracerio3d + integer(r_kind):: ndynvario3d,ntracerio3d,nphyvario3d integer(i_kind):: inner_vars,numfields - integer(i_kind):: ilev,ic2,ic3 + integer(i_kind):: ilev,ic2,ic3,iope integer(i_kind):: m integer(i_kind)::loc_id,ncfmt @@ -125,8 +135,10 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) !clt setup varnames for IO ndynvario2d=0 ntracerio2d=0 + nphyvario3d=0 ndynvario3d=size(fv3lam_io_dynmetvars3d_nouv) ntracerio3d=size(fv3lam_io_tracermetvars3d_nouv) + nphyvario3d=size(fv3lam_io_phymetvars3d_nouv) if (allocated(fv3lam_io_dynmetvars2d_nouv))then ndynvario2d=size(fv3lam_io_dynmetvars2d_nouv) endif @@ -137,6 +149,10 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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 ( nphyvario3d > 0 )then + allocate(fv3lam_ens_io_phymetvars3d_nouv(nphyvario3d)) + fv3lam_ens_io_phymetvars3d_nouv=fv3lam_io_phymetvars3d_nouv + end if if (ndynvario2d > 0 ) then allocate(fv3lam_ens_io_dynmetvars2d_nouv(ndynvario2d)) fv3lam_ens_io_dynmetvars2d_nouv=fv3lam_io_dynmetvars2d_nouv @@ -168,6 +184,24 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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) + if( nphyvario3d > 0 )then + inner_vars=1 + numfields=inner_vars*(nphyvario3d*grd_ens%nsig) + deallocate(lnames,names) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,nphyvario3d + do k=1,grd_ens%nsig + lnames(1,ilev)=k + names(1,ilev)=fv3lam_ens_io_phymetvars3d_nouv(i) + ilev=ilev+1 + enddo + enddo + + call general_sub2grid_create_info(grd_fv3lam_ens_phyvar_io_nouv,inner_vars,grd_ens%nlat,& + grd_ens%nlon,grd_ens%nsig,numfields,regional,names=names,lnames=lnames) + end if + inner_vars=1 numfields=inner_vars*(ntracerio3d*grd_ens%nsig+ntracerio2d) deallocate(lnames,names) @@ -248,22 +282,79 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) en_bar(m)%values=zero do n=imem_start,n_ens - en_perts(n,m)%valuesr4 = zero + en_perts(n,1,m)%valuesr4 = zero enddo mm1=mype+1 kap1=rd_over_cp+one kapr=one/rd_over_cp + + if( parallelization_over_ensmembers ) then + if(n_ens_fv3sar>npe) then + parallelization_over_ensmembers=.false. +130 format('Disabling parallelization_over_ensmembers because number of ensemble members (',I0,') is greater than number of MPI ranks (',I0,').') + if(mype==0) then + write(6,130) n_ens_fv3sar,npe + endif + endif + endif ! parallelization_over_ensmembers + + if(parallelization_over_ensmembers .and. mype==0) then + write(6,'(I0,A)') mype,': will read ensemble data in parallel (parallelization_over_ensmembers=.true.)' + endif + + if( parallelization_over_ensmembers )then + do n=1,n_ens_fv3sar + write(ensfilenam_str,22) trim(adjustl(ensemble_path)),ens_fhrlevs(m),n +22 format(a,'fv3SAR',i2.2,'_ens_mem',i3.3) + iope=(n-1)*npe/n_ens_fv3sar + ! DEFINE INPUT FILE NAME + fv3_filename%grid_spec=trim(ensfilenam_str)//'-fv3_grid_spec' + 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%phyvars=trim(ensfilenam_str)//'-fv3_phyvars' + fv3_filename%sfcdata=trim(ensfilenam_str)//"-fv3_sfcdata" + fv3_filename%couplerres=trim(ensfilenam_str)//"-coupler.res" + + + if( mype==iope) then + allocate(gg_u(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_v(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_tv(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_rh(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_oz(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_ps(grd_ens%nlat,grd_ens%nlon)) + if ( .not. if_model_dbz ) then + call this%general_read_fv3_regional_parallel_over_ens(iope,fv3_filename,gg_ps,gg_u,gg_v,gg_tv,gg_rh,gg_oz) + else + allocate(gg_w(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_dbz(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_qr(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_qs(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_qi(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_qg(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_cwmr(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + call this%general_read_fv3_regional_parallel_over_ens(iope,fv3_filename,gg_ps,gg_u,gg_v,gg_tv,gg_rh,gg_oz, & + g_ql=gg_cwmr,g_qi=gg_qi,g_qr=gg_qr,g_qs=gg_qs,g_qg=gg_qg,g_w=gg_w,g_dbz=gg_dbz) + end if + end if + end do + if(mype==0) then + write(6,'(I0,A)') mype,': reading ensemble data in parallel is done (parallelization_over_ensmembers=.true.)' + endif + end if + call MPI_Barrier(mpi_comm_world,ierror) ! ! LOOP OVER ENSEMBLE MEMBERS do n_fv3sar=1,n_ens_fv3sar n=n_ens_gfs+n_fv3sar write(ensfilenam_str,22) trim(adjustl(ensemble_path)),ens_fhrlevs(m),n_fv3sar -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%phyvars=trim(ensfilenam_str)//'-fv3_phyvars' fv3_filename%tracers=trim(ensfilenam_str)//"-fv3_tracer" fv3_filename%sfcdata=trim(ensfilenam_str)//"-fv3_sfcdata" fv3_filename%couplerres=trim(ensfilenam_str)//"-coupler.res" @@ -299,19 +390,56 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) endif ! ! 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) + if( .not. parallelization_over_ensmembers )then + 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 .or. if_model_dbz) ) then ! Read additional hydrometers and w for dirZDA + call this%general_read_fv3_regional(fv3_filename,ps,u,v,tv,rh,oz) + else + if( l_use_dbz_directDA ) then + 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) + else if( if_model_dbz )then + 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,g_dbz=dbz) + end if + end if end if + if( parallelization_over_ensmembers )then + iope=(n_fv3sar-1)*npe/n_ens_fv3sar + if(mype==iope) then + write(0,'(I0,A,I0,A)') mype,': scatter member ',n_fv3sar,' to other ranks...' + if( if_model_dbz )then + call this%parallel_read_fv3_step2(mype,iope,& + g_ps=ps,g_u=u,g_v=v,g_tv=tv,g_rh=rh,g_ql=ql,& + g_oz=oz,g_w=w,g_qr=qr,g_qs=qs,g_qi=qi,g_qg=qg,g_dbz=dbz,& + gg_ps=gg_ps,gg_tv=gg_tv,gg_u=gg_u,gg_v=gg_v,& + gg_rh=gg_rh,gg_w=gg_w,gg_dbz=gg_dbz,gg_qr=gg_qr,& + gg_qs=gg_qs,gg_qi=gg_qi,gg_qg=gg_qg,gg_ql=gg_cwmr) + else + call this%parallel_read_fv3_step2(mype,iope,& + g_ps=ps,g_u=u,g_v=v,g_tv=tv,g_rh=rh,g_ql=ql,g_oz=oz, & + gg_ps=gg_ps,gg_tv=gg_tv,gg_u=gg_u,gg_v=gg_v,gg_rh=gg_rh) + end if + else + if( if_model_dbz )then + call this%parallel_read_fv3_step2(mype,iope,& + g_ps=ps,g_u=u,g_v=v,g_tv=tv,g_rh=rh,g_ql=ql,& + g_oz=oz,g_w=w,g_qr=qr,g_qs=qs,g_qi=qi,g_qg=qg,g_dbz=dbz) + else + call this%parallel_read_fv3_step2(mype,iope,& + g_ps=ps,g_u=u,g_v=v,g_tv=tv,g_rh=rh,g_ql=ql,g_oz=oz) + endif + endif + + call MPI_Barrier(mpi_comm_world,ierror) + 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) + call gsi_bundlegetpointer(en_perts(n,1,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) @@ -463,6 +591,16 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) end do end do end do + + case('dbz','DBZ') + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = dbz(j,i,k) + x3(j,i,k)=x3(j,i,k)+dbz(j,i,k) + end do + end do + end do end select @@ -471,7 +609,7 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,m),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,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) @@ -536,11 +674,11 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) ! ! ! CONVERT ENSEMBLE MEMBERS TO ENSEMBLE PERTURBATIONS - sig_norm=sqrt(one/max(one,n_ens_fv3sar-one)) + sig_norm=sqrt(weight_ens_fv3sar/max(one,n_ens_fv3sar-one)) do n=imem_start,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 + en_perts(n,1,m)%valuesr4(i)=(en_perts(n,1,m)%valuesr4(i)-en_bar(m)%values(i))*sig_norm end do end do @@ -572,7 +710,7 @@ 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, & - g_ql,g_qi,g_qr,g_qs,g_qg,g_qnr,g_w) + g_ql,g_qi,g_qr,g_qs,g_qg,g_qnr,g_w,g_dbz) !$$$ subprogram documentation block ! first compied from general_read_arw_regional . . . . ! subprogram: general_read_fv3_regional read fv3sar model ensemble members @@ -623,7 +761,7 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g 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 - + use obsmod, only:if_model_dbz implicit none @@ -632,7 +770,7 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g 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_ql,g_qi,g_qr,g_dbz 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 @@ -656,11 +794,13 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g 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_bundle) :: gsibundle_fv3lam_ens_phyvar_nouv type(gsi_grid):: grid_ens character(len=:),allocatable :: grid_spec !='fv3_grid_spec' character(len=:),allocatable :: ak_bk !='fv3_akbk' character(len=:),allocatable :: dynvars !='fv3_dynvars' + character(len=:),allocatable :: phyvars !='fv3_phyvars' character(len=:),allocatable :: tracers !='fv3_tracer' character(len=:),allocatable :: sfcdata !='fv3_sfcdata' character(len=:),allocatable :: couplerres!='coupler.res' @@ -676,6 +816,7 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g grid_spec=fv3_filenameginput%grid_spec ak_bk=fv3_filenameginput%ak_bk dynvars=fv3_filenameginput%dynvars + phyvars=fv3_filenameginput%phyvars tracers=fv3_filenameginput%tracers sfcdata=fv3_filenameginput%sfcdata couplerres=fv3_filenameginput%couplerres @@ -701,7 +842,10 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g endif - + if(allocated(fv3lam_ens_io_phymetvars3d_nouv))then + call gsi_bundlecreate(gsibundle_fv3lam_ens_phyvar_nouv,grid_ens,'gsibundle_fv3lam_ens_phyvar_nouv',istatus, & + names3d=fv3lam_ens_io_phymetvars3d_nouv) + end if if(fv3sar_ensemble_opt == 0 ) then @@ -714,6 +858,10 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g 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) + if( if_model_dbz ) then + call gsi_fv3ncdf_read(grd_fv3lam_ens_phyvar_io_nouv,gsibundle_fv3lam_ens_phyvar_nouv,& + fv3_filenameginput%phyvars,fv3_filenameginput) + end if else call gsi_fv3ncdf_read_v1(grd_fv3lam_ens_dynvar_io_nouv,gsibundle_fv3lam_ens_dynvar_nouv,& fv3_filenameginput%dynvars,fv3_filenameginput) @@ -724,14 +872,17 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g 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 + if (l_use_dbz_directDA .or. if_model_dbz) 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 + if (l_use_dbz_directDA) & 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 + if( if_model_dbz )& + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_phyvar_nouv, 'dbz' , g_dbz ,istatus );ier=ier+istatus end if @@ -834,11 +985,336 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g enddo call gsi_bundledestroy(gsibundle_fv3lam_ens_dynvar_nouv) call gsi_bundledestroy(gsibundle_fv3lam_ens_tracer_nouv) - + call gsi_bundledestroy(gsibundle_fv3lam_ens_phyvar_nouv) return end subroutine general_read_fv3_regional + subroutine general_read_fv3_regional_parallel_over_ens(this,iope,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,g_dbz) + !$$$ subprogram documentation block + ! first compied from general_read_arw_regional . . . . + ! subprogram: general_read_fv3_regional read fv3sar model ensemble members + ! prgmmr: Ting org: emc/ncep date: 2018 + ! + ! abstract: read ensemble members from the fv3sar model in "restart" or "cold start" netcdf format + ! for use with hybrid ensemble option. + ! + ! program history log: + ! 2018- Ting - intial versions + ! 2022-04-01 Y. Wang and X. Wang - read all fields for each member for + ! parallel ensemble IO capability + ! poc: xuguang.wang@ou.edu + ! + ! 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 gridmod, only: eta1_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,mype + 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 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 obsmod, only: if_model_dbz + use gsi_rfv3io_mod, only: gsi_fv3ncdf_read_ens_parallel_over_ens,gsi_fv3ncdf_readuv_ens_parallel_over_ens + + + + implicit none +! +! Declare passed variables + class(get_fv3_regional_ensperts_class), intent(inout) :: this + integer(i_kind), intent (in) :: iope + type (type_fv3regfilenameg) , intent (in) :: fv3_filenameginput + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig),intent(out)::g_u,g_v,g_tv,g_rh,g_oz + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig),optional,intent(out)::g_ql,g_qi,g_qr,g_dbz + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig),optional,intent(out)::g_qs,g_qg,g_qnr,g_w + + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon),intent(out):: g_ps + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig+1) ::g_prsi + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon,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' + + character(len=:),allocatable :: grid_spec !='fv3_grid_spec' + character(len=:),allocatable :: ak_bk !='fv3_akbk' + character(len=:),allocatable :: dynvars !='fv3_dynvars' + character(len=:),allocatable :: phyvars !='fv3_phyvars' + 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 + + if( mype == iope )then + grid_spec=fv3_filenameginput%grid_spec + ak_bk=fv3_filenameginput%ak_bk + dynvars=fv3_filenameginput%dynvars + phyvars=fv3_filenameginput%phyvars + tracers=fv3_filenameginput%tracers + sfcdata=fv3_filenameginput%sfcdata + couplerres=fv3_filenameginput%couplerres + + if(fv3sar_ensemble_opt == 0 ) then + call gsi_fv3ncdf_readuv_ens_parallel_over_ens(g_u,g_v,fv3_filenameginput,iope) + else + write(6,*) "Warning: we can only grab fields from restart files not cold start files for ensemble!" + endif + + if(fv3sar_ensemble_opt == 0) then + if (if_model_dbz) then + call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%dynvars,fv3_filenameginput,delp=g_delp,tsen=g_tsen,w=g_w,iope=iope) + call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%tracers,fv3_filenameginput,q=g_q,oz=g_oz,ql=g_ql,qr=g_qr,& + qs=g_qs,qi=g_qi,qg=g_qg,iope=iope) + call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%phyvars,fv3_filenameginput,dbz=g_dbz,iope=iope) + else + call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%dynvars,fv3_filenameginput,delp=g_delp,tsen=g_tsen,iope=iope) + call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%tracers,fv3_filenameginput,q=g_q,oz=g_oz,iope=iope) + end if + else + write(6,*) "Warning: we can only grab fields from restart files not cold start files for ensemble!" + endif + + + if (fv3sar_ensemble_opt == 0) then + 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_delp(:,:,i)*0.001_r_kind+g_prsi(:,:,i+1) + enddo + g_ps(:,:)=g_prsi(:,:,1) + + endif + + !! tsen2tv !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + do k=1,grd_ens%nsig + do j=1,grd_ens%nlon + do i=1,grd_ens%nlat + g_tv(i,j,k)=g_tsen(i,j,k)*(one+fv*g_q(i,j,k)) + 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%nlon + do i=1,grd_ens%nlat + 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%nlat,grd_ens%nlon,grd_ens%nsig,ice,iderivative) + do k=1,grd_ens%nsig + do j=1,grd_ens%nlon + do i=1,grd_ens%nlat + 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%nlon + do i=1,grd_ens%nlat + g_rh(i,j,k) = g_q(i,j,k) + end do + end do + end do + end if + end if ! mype + + return + end subroutine general_read_fv3_regional_parallel_over_ens + + + subroutine parallel_read_fv3_step2(this,mype,iope, & + g_ps,g_u,g_v,g_tv,g_rh,g_ql,g_oz,g_w,g_qr,g_qs,g_qi,& + g_qg,g_dbz, & + gg_ps,gg_tv,gg_u,gg_v,gg_rh,gg_w,gg_dbz,gg_qr,& + gg_qs,gg_qi,gg_qg,gg_ql) + + !$$$ subprogram documentation block + ! . + ! subprogram: parallel_read_fv3_step2 distribute all fields into all tasks + ! prgmmr: Y. Wang and X. Wang org: OU/MAP date: 2022-04-01 + ! + ! abstract: All fields have been read in by general_read_fv3_regional_parallel_over_ens. + ! Different tasks contain the data from different members. + ! This program will divided the full-domain fields into subdomains + ! and assign them to all tasks. poc: xuguang.wang@ou.edu + ! + ! program history log: + ! + ! 2022-04-01 Y. Wang and X. Wang - Changed from the code for WRF-ARW + ! + ! input argument list: + ! + ! output argument list: + ! + ! attributes: + ! language: f90 + ! machine: ibm RS/6000 SP + ! + !$$$ end documentation block + + use hybrid_ensemble_parameters, only: grd_ens + use mpimod, only: mpi_comm_world,ierror,mpi_rtype + use kinds, only: r_kind,r_single,i_kind + use constants, only: half,zero + + implicit none + + ! + ! Declare passed variables + class(get_fv3_regional_ensperts_class), intent(inout) :: this + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),intent(out):: & + g_u,g_v,g_tv,g_rh,g_ql,g_oz + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),intent(out),optional::& + g_w,g_qr,g_qs,g_qi,g_qg,g_dbz + integer(i_kind), intent(in) :: mype, iope + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2),intent(out):: g_ps + + ! The gg_ arrays are only sent by the rank doing I/O (mype==iope) + real(r_kind),optional,dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig) :: & + gg_u,gg_v,gg_tv,gg_rh + + real(r_kind),optional,dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig) :: & + gg_w,gg_dbz,gg_qr,gg_qs,gg_qi,gg_qg,gg_ql + real(r_kind),optional,dimension(grd_ens%nlat,grd_ens%nlon):: gg_ps + + ! Declare local variables + real(r_kind),allocatable,dimension(:):: wrk_send_2d + integer(i_kind) :: k + + ! transfer data from root to subdomains on each task + ! scatterv used, since full grids exist only on root task. + allocate(wrk_send_2d(grd_ens%itotsub)) + g_oz=zero + ! first PS (output from fill_regional_2d is a column vector with a halo) + if(mype==iope) call this%fill_regional_2d(gg_ps,wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_ps,grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + ! then TV,U,V,RH + do k=1,grd_ens%nsig + if (mype==iope) then + call this%fill_regional_2d(gg_tv(:,:,k),wrk_send_2d) + endif + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_tv(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_u(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_u(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_v(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_v(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_rh(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_rh(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if( present(g_dbz) )then + if (mype==iope) call this%fill_regional_2d(gg_w(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_w(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_dbz(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_dbz(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_qr(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_qr(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_qs(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_qs(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_qi(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_qi(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_qg(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype, & + g_qg(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + if (mype==iope) call this%fill_regional_2d(gg_ql(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_ql(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + end if + enddo + deallocate(wrk_send_2d) + end subroutine parallel_read_fv3_step2 + + subroutine fill_regional_2d(fld_in,fld_out) + !$$$ subprogram documentation block + ! . . . . + ! subprogram: fill_regional_2d + ! prgmmr: mizzi org: ncar/mmm date: 2010-08-11 + ! + ! abstract: create a column vector for the subdomain (including halo) + ! from global 2d grid. + ! + ! + ! program history log: + ! 2010-08-11 parrish, initial documentation + ! 2012-03-12 whitaker, remove nx,ny,itotsub from argument list. + ! + ! input argument list: + ! + ! output argument list: + ! + ! attributes: + ! language: f90 + ! machine: ibm RS/6000 SP + ! + !$$$ end documentation block + use kinds, only: r_kind,i_kind + use hybrid_ensemble_parameters, only: grd_ens + implicit none + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon)::fld_in + real(r_kind),dimension(grd_ens%itotsub)::fld_out + integer(i_kind):: i,j,k + do k=1,grd_ens%itotsub + i=grd_ens%ltosj_s(k) + j=grd_ens%ltosi_s(k) + fld_out(k)=fld_in(j,i) + enddo + return + end subroutine fill_regional_2d + subroutine ens_spread_dualres_regional_fv3_regional(this,mype,en_perts,nelen) !$$$ subprogram documentation block ! . . . . @@ -880,7 +1356,7 @@ subroutine ens_spread_dualres_regional_fv3_regional(this,mype,en_perts,nelen) class(get_fv3_regional_ensperts_class), intent(inout) :: this integer(i_kind),intent(in):: mype - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen type(gsi_bundle):: sube,suba @@ -922,7 +1398,7 @@ subroutine ens_spread_dualres_regional_fv3_regional(this,mype,en_perts,nelen) do n=1,n_ens do i=1,nelen sube%values(i)=sube%values(i) & - +(en_perts(n,1)%valuesr4(i))*(en_perts(n,1)%valuesr4(i)) + +(en_perts(n,1,1)%valuesr4(i))*(en_perts(n,1,1)%valuesr4(i)) end do end do diff --git a/src/gsi/cplr_get_pseudo_ensperts.f90 b/src/gsi/cplr_get_pseudo_ensperts.f90 index 8c59cd0be8..9d12165409 100644 --- a/src/gsi/cplr_get_pseudo_ensperts.f90 +++ b/src/gsi/cplr_get_pseudo_ensperts.f90 @@ -57,7 +57,7 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) implicit none ! Declare passed variables class(get_pseudo_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ) :: nelen @@ -600,12 +600,12 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) ! NOTE: because library perturbation bundle structure is same as ensemble perturbation, ! use same ipc3d and ipc2d indices for lib_perts and en_perts bundles. - call gsi_bundlegetpointer (en_perts(1,1),cvars3d,ipc3d,istatus) + call gsi_bundlegetpointer (en_perts(1,1,1),cvars3d,ipc3d,istatus) if(istatus/=0) then write(6,*) 'get_pseudo_enperts: cannot find 3d pointers' call stop2(999) endif - call gsi_bundlegetpointer (en_perts(1,1),cvars2d,ipc2d,istatus) + call gsi_bundlegetpointer (en_perts(1,1,1),cvars2d,ipc2d,istatus) if(istatus/=0) then write(6,*) 'get_pseudo_enperts: cannot find 2d pointers' call stop2(999) @@ -618,9 +618,9 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do k=1,grd_ens%nsig do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - en_perts(n,1)%r3(ipc3d(ic3))%qr4(i,j,k) = wgt(i,j) * & + en_perts(n,1,1)%r3(ipc3d(ic3))%qr4(i,j,k) = wgt(i,j) * & lib_perts(n)%r3(ipc3d(ic3))%qr4(i,j,k) + & - (one-wgt(i,j))*en_perts(n,1)%r3(ipc3d(ic3))%qr4(i,j,k) + (one-wgt(i,j))*en_perts(n,1,1)%r3(ipc3d(ic3))%qr4(i,j,k) end do end do end do @@ -631,9 +631,9 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - en_perts(n,1)%r2(ipc2d(ic2))%qr4(i,j) = wgt(i,j) * & + en_perts(n,1,1)%r2(ipc2d(ic2))%qr4(i,j) = wgt(i,j) * & lib_perts(n)%r2(ipc2d(ic2))%qr4(i,j) + & - (one-wgt(i,j))*en_perts(n,1)%r2(ipc2d(ic2))%qr4(i,j) + (one-wgt(i,j))*en_perts(n,1,1)%r2(ipc2d(ic2))%qr4(i,j) end do end do @@ -667,12 +667,12 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) write(filename,"('enpert',i3.3)") n - call gsi_bundlegetpointer(en_perts(n,1),cvars3d,ipc3d,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),cvars3d,ipc3d,istatus) if(istatus/=0) then write(6,*) 'mtong: cannot find 3d pointers' call stop2(999) endif - call gsi_bundlegetpointer(en_perts(n,1),cvars2d,ipc2d,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),cvars2d,ipc2d,istatus) if(istatus/=0) then write(6,*) 'mtong: cannot find 2d pointers' call stop2(999) @@ -686,7 +686,7 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do k=1,grd_ens%nsig do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - u(i,j,k) = en_perts(n,1)%r3(ipc3d(ic3))%qr4(i,j,k) + u(i,j,k) = en_perts(n,1,1)%r3(ipc3d(ic3))%qr4(i,j,k) end do end do end do @@ -696,7 +696,7 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do k=1,grd_ens%nsig do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - v(i,j,k) = en_perts(n,1)%r3(ipc3d(ic3))%qr4(i,j,k) + v(i,j,k) = en_perts(n,1,1)%r3(ipc3d(ic3))%qr4(i,j,k) end do end do end do @@ -706,7 +706,7 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do k=1,grd_ens%nsig do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - tv(i,j,k) = en_perts(n,1)%r3(ipc3d(ic3))%qr4(i,j,k) + tv(i,j,k) = en_perts(n,1,1)%r3(ipc3d(ic3))%qr4(i,j,k) end do end do end do @@ -716,7 +716,7 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do k=1,grd_ens%nsig do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - rh(i,j,k) = en_perts(n,1)%r3(ipc3d(ic3))%qr4(i,j,k) + rh(i,j,k) = en_perts(n,1,1)%r3(ipc3d(ic3))%qr4(i,j,k) end do end do end do @@ -731,7 +731,7 @@ subroutine get_pseudo_ensperts_wrf(this,en_perts,nelen) do j=1,grd_ens%lon2 do i=1,grd_ens%lat2 - ps(i,j) = en_perts(n,1)%r2(ipc2d(ic2))%qr4(i,j) + ps(i,j) = en_perts(n,1,1)%r2(ipc2d(ic2))%qr4(i,j) end do end do diff --git a/src/gsi/cplr_get_wrf_mass_ensperts.f90 b/src/gsi/cplr_get_wrf_mass_ensperts.f90 index eb94c6c0f3..775c9c4195 100644 --- a/src/gsi/cplr_get_wrf_mass_ensperts.f90 +++ b/src/gsi/cplr_get_wrf_mass_ensperts.f90 @@ -63,7 +63,7 @@ subroutine get_wrf_mass_ensperts_wrf(this,en_perts,nelen,ps_bar) implicit none class(get_wrf_mass_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_single),dimension(:,:,:),allocatable:: ps_bar @@ -148,7 +148,7 @@ subroutine get_wrf_mass_ensperts_wrf(this,en_perts,nelen,ps_bar) en_bar%values=zero do n=1,n_ens - en_perts(n,it)%valuesr4 = zero + en_perts(n,1,it)%valuesr4 = zero enddo if ( .not. l_use_dbz_directDA ) then !direct reflectivity DA option does not employ this @@ -253,7 +253,7 @@ subroutine get_wrf_mass_ensperts_wrf(this,en_perts,nelen,ps_bar) ! SAVE ENSEMBLE MEMBER DATA IN COLUMN VECTOR member_data_loop: do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,it),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,it),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n call stop2(999) @@ -442,7 +442,7 @@ subroutine get_wrf_mass_ensperts_wrf(this,en_perts,nelen,ps_bar) member_mass_loop: do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,it),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,it),trim(cvars2d(ic2)),w2,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n call stop2(999) @@ -515,7 +515,7 @@ subroutine get_wrf_mass_ensperts_wrf(this,en_perts,nelen,ps_bar) do n=1,n_ens do i=1,nelen - en_perts(n,it)%valuesr4(i)=(en_perts(n,it)%valuesr4(i)-en_bar%values(i))*sig_norm + en_perts(n,1,it)%valuesr4(i)=(en_perts(n,1,it)%valuesr4(i)-en_bar%values(i))*sig_norm end do end do @@ -2147,7 +2147,7 @@ subroutine ens_spread_dualres_regional_wrf(this,mype,en_perts,nelen,en_bar) class(get_wrf_mass_ensperts_class), intent(inout) :: this type(gsi_bundle),OPTIONAL,intent(in):: en_bar integer(i_kind),intent(in):: mype - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen type(gsi_bundle):: sube,suba @@ -2201,7 +2201,7 @@ subroutine ens_spread_dualres_regional_wrf(this,mype,en_perts,nelen,en_bar) do n=1,n_ens do i=1,nelen sube%values(i)=sube%values(i) & - +en_perts(n,1)%valuesr4(i)*en_perts(n,1)%valuesr4(i) + +en_perts(n,1,1)%valuesr4(i)*en_perts(n,1,1)%valuesr4(i) end do end do @@ -2212,7 +2212,7 @@ subroutine ens_spread_dualres_regional_wrf(this,mype,en_perts,nelen,en_bar) do n=1,n_ens do i=1,nelen sube%values(i)=sube%values(i) & - +(en_perts(n,1)%valuesr4(i)-en_bar%values(i))*(en_perts(n,1)%valuesr4(i)-en_bar%values(i)) + +(en_perts(n,1,1)%valuesr4(i)-en_bar%values(i))*(en_perts(n,1,1)%valuesr4(i)-en_bar%values(i)) end do end do diff --git a/src/gsi/cplr_get_wrf_nmm_ensperts.f90 b/src/gsi/cplr_get_wrf_nmm_ensperts.f90 index 9de32ea384..3e30822639 100644 --- a/src/gsi/cplr_get_wrf_nmm_ensperts.f90 +++ b/src/gsi/cplr_get_wrf_nmm_ensperts.f90 @@ -72,7 +72,7 @@ subroutine get_wrf_nmm_ensperts_wrf(this,en_perts,nelen,region_lat_ens,region_lo implicit none class(get_wrf_nmm_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_kind),allocatable, intent(inout):: region_lat_ens(:,:),region_lon_ens(:,:) real(r_single),dimension(:,:,:),allocatable, intent(inout):: ps_bar @@ -689,7 +689,7 @@ subroutine get_wrf_nmm_ensperts_wrf(this,en_perts,nelen,region_lat_ens,region_lo ! SAVE ENSEMBLE MEMBER DATA IN COLUMN VECTOR do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n call stop2(999) @@ -791,7 +791,7 @@ subroutine get_wrf_nmm_ensperts_wrf(this,en_perts,nelen,region_lat_ens,region_lo do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars2d(ic2)),w2,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n call stop2(999) @@ -828,7 +828,7 @@ subroutine get_wrf_nmm_ensperts_wrf(this,en_perts,nelen,region_lat_ens,region_lo if (use_gfs_stratosphere)then do n=1,n_ens do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' & for ensemble member ',n @@ -893,7 +893,7 @@ subroutine get_wrf_nmm_ensperts_wrf(this,en_perts,nelen,region_lat_ens,region_lo do n=1,n_ens do i=1,nelen - en_perts(n,1)%valuesr4(i)=(en_perts(n,1)%valuesr4(i)-en_bar%values(i))*sig_norm + en_perts(n,1,1)%valuesr4(i)=(en_perts(n,1,1)%valuesr4(i)-en_bar%values(i))*sig_norm end do end do @@ -2917,7 +2917,7 @@ subroutine ens_member_mean_dualres_regional(this,en_bar,mype,en_perts,nelen) class(get_wrf_nmm_ensperts_class), intent(inout) :: this type(gsi_bundle),intent(in):: en_bar integer(i_kind),intent(in):: mype - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen type(gsi_bundle):: sube,suba @@ -2961,7 +2961,7 @@ subroutine ens_member_mean_dualres_regional(this,en_bar,mype,en_perts,nelen) do i=1,nelen if(n <= n_ens)then - sube%values(i)=en_perts(n,1)%valuesr4(i)*sig_norm_inv+en_bar%values(i) + sube%values(i)=en_perts(n,1,1)%valuesr4(i)*sig_norm_inv+en_bar%values(i) else sube%values(i)=en_bar%values(i) end if diff --git a/src/gsi/cplr_gfs_ensmod.f90 b/src/gsi/cplr_gfs_ensmod.f90 index 582574b52f..550f85d209 100644 --- a/src/gsi/cplr_gfs_ensmod.f90 +++ b/src/gsi/cplr_gfs_ensmod.f90 @@ -16,12 +16,22 @@ module get_gfs_ensmod_mod ! machine: ibm RS/6000 SP ! !$$$ + use kinds, only: i_kind,r_kind,r_single use mpeu_util, only: die use mpimod, only: mype,npe use abstract_ensmod, only: this_ens_class => abstractEnsemble + use genex_mod, only: genex_info implicit none private + + integer(i_kind) :: ias,iae,iasm,iaem,iaemz,jas,jae,jasm,jaem,jaemz + integer(i_kind) :: kas,kae,kasm,kaem,kaemz,mas,mae,masm,maem,maemz + integer(i_kind) :: ibs,ibe,ibsm,ibem,ibemz,jbs,jbe,jbsm,jbem,jbemz + integer(i_kind) :: kbs,kbe,kbsm,kbem,kbemz,mbs,mbe,mbsm,mbem,mbemz + integer(i_kind) :: n2d + type(genex_info) :: s_a2b + public :: ensemble public :: ensemble_typemold @@ -84,7 +94,6 @@ subroutine get_gfs_Nens(this,grd,members,ntindex,atm_bundle,iret) ! !$$$ - use kinds, only: i_kind,r_kind,r_single use gridmod, only: use_gfs_nemsio, use_gfs_ncio use general_sub2grid_mod, only: sub2grid_info use hybrid_ensemble_parameters, only: ens_fast_read @@ -153,10 +162,10 @@ subroutine get_user_ens_gfs_fastread_(ntindex,atm_bundle, & ! ! input argument list: ! ntindex - time index for ensemble -! ens_atm_bundle - atm bundle w/ fields for ensemble +! atm_bundle - atm bundle w/ fields for ensemble ! ! output argument list: -! ens_atm_bundle - atm bundle w/ fields for ensemble +! atm_bundle - atm bundle w/ fields for ensemble ! iret - return code, 0 for successful read. ! ! attributes: @@ -166,16 +175,16 @@ subroutine get_user_ens_gfs_fastread_(ntindex,atm_bundle, & !$$$ use mpimod, only: mpi_comm_world,ierror,mpi_real8,mpi_integer4,mpi_max - use kinds, only: i_kind,r_single,r_kind use constants, only: zero use general_sub2grid_mod, only: sub2grid_info,general_sub2grid_destroy_info use gsi_4dvar, only: ens_fhrlevs use gsi_bundlemod, only: gsi_bundle + use gsi_bundlemod, only : assignment(=) use hybrid_ensemble_parameters, only: n_ens,grd_ens use hybrid_ensemble_parameters, only: ensemble_path use control_vectors, only: nc2d,nc3d !use control_vectors, only: cvars2d,cvars3d - use genex_mod, only: genex_info,genex_create_info,genex,genex_destroy_info + use genex_mod, only: genex_create_info,genex,genex_destroy_info use gridmod, only: use_gfs_nemsio use jfunc, only: cnvw_option @@ -193,18 +202,13 @@ subroutine get_user_ens_gfs_fastread_(ntindex,atm_bundle, & character(len=*),parameter :: myname_='get_user_ens_gfs_fastread_' character(len=70) :: filename character(len=70) :: filenamesfc - integer(i_kind) :: i,ii,j,jj,k,n + integer(i_kind) :: i,ii,j,k,n integer(i_kind) :: io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em,i_ens - integer(i_kind) :: ip,ips,ipe,jps,jpe - integer(i_kind) :: ias,iae,iasm,iaem,iaemz,jas,jae,jasm,jaem,jaemz - integer(i_kind) :: kas,kae,kasm,kaem,kaemz,mas,mae,masm,maem,maemz - integer(i_kind) :: ibs,ibe,ibsm,ibem,ibemz,jbs,jbe,jbsm,jbem,jbemz - integer(i_kind) :: kbs,kbe,kbsm,kbem,kbemz,mbs,mbe,mbsm,mbem,mbemz - integer(i_kind) :: n2d + integer(i_kind) :: ip integer(i_kind) :: nlon,nlat,nsig - type(genex_info) :: s_a2b + integer(i_kind),dimension(n_ens) :: io_pe0 real(r_single),allocatable,dimension(:,:,:,:) :: en_full,en_loc - real(r_kind),allocatable,dimension(:,:,:) :: en_loc3 + real(r_kind),allocatable,dimension(:) :: sloc integer(i_kind),allocatable,dimension(:) :: m_cvars2dw,m_cvars3dw integer(i_kind) :: m_cvars2d(nc2d),m_cvars3d(nc3d) type(sub2grid_info) :: grd3d @@ -214,61 +218,69 @@ subroutine get_user_ens_gfs_fastread_(ntindex,atm_bundle, & nlon=grd_ens%nlon nsig=grd_ens%nsig + if(ntindex == 1)then ! set up partition of available processors for parallel read - if ( n_ens > npe ) & - call die(myname_, ': ***ERROR*** CANNOT READ ENSEMBLE n_ens > npe, increase npe >= n_ens', 99) + if ( n_ens > npe ) & + call die(myname_, ': ***ERROR*** CANNOT READ ENSEMBLE n_ens > npe, increase npe >= n_ens', 99) - call ens_io_partition_(n_ens,ntindex,io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em,i_ens) - ! setup communicator for scatter to subdomains: - - ! first, define gsi subdomain boundaries in global units: + call ens_io_partition_(n_ens,io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em,io_pe0,i_ens) - ip=1 ! halo width is hardwired at 1 - ips=grd_ens%istart(mype+1) - ipe=ips+grd_ens%lat1-1 - jps=grd_ens%jstart(mype+1) - jpe=jps+grd_ens%lon1-1 + ! setup communicator for scatter to subdomains: + ! first, define gsi subdomain boundaries in global units: !!!!!!!!!!!!NOTE--FOLLOWING HAS MANY VARS TO BE DEFINED--NLAT,NLON ARE ENSEMBLE DOMAIN DIMS !!!!!!!!for example, n2d = nc3d*nsig + nc2d - n2d=nc3d*grd_ens%nsig+nc2d - ias=1 ; iae=0 ; jas=1 ; jae=0 ; kas=1 ; kae=0 ; mas=1 ; mae=0 - if(mype==io_pe) then - iae=nlat - jae=nlon - kae=n2d - mas=n_io_pe_s ; mae=n_io_pe_em - endif - iasm=ias ; iaem=iae ; jasm=jas ; jaem=jae ; kasm=kas ; kaem=kae ; masm=mas ; maem=mae - - ibs =ips ; ibe =ipe ; jbs =jps ; jbe =jpe - ibsm=ibs-ip ; ibem=ibe+ip ; jbsm=jbs-ip ; jbem=jbe+ip - kbs =1 ; kbe =n2d ; mbs =1 ; mbe =n_ens - kbsm=kbs ; kbem=kbe ; mbsm=mbs ; mbem=mbe - iaemz=max(iasm,iaem) ; jaemz=max(jasm,jaem) - kaemz=max(kasm,kaem) ; maemz=max(masm,maem) - ibemz=max(ibsm,ibem) ; jbemz=max(jbsm,jbem) - kbemz=max(kbsm,kbem) ; mbemz=max(mbsm,mbem) - call genex_create_info(s_a2b,ias ,iae ,jas ,jae ,kas ,kae ,mas ,mae , & - ibs ,ibe ,jbs ,jbe ,kbs ,kbe ,mbs ,mbe , & - iasm,iaem,jasm,jaem,kasm,kaem,masm,maem, & - ibsm,ibem,jbsm,jbem,kbsm,kbem,mbsm,mbem) - - write(filename,22) trim(adjustl(ensemble_path)),ens_fhrlevs(ntindex),mas -22 format(a,'sigf',i2.2,'_ens_mem',i3.3) + n2d=nc3d*grd_ens%nsig+nc2d + ias=1 ; iae=0 ; jas=1 ; jae=0 ; kas=1 ; kae=0 ; mas=1 ; mae=0 + if(mype==io_pe) then + iae=nlat + jae=nlon + kae=n2d + mas=n_io_pe_s ; mae=n_io_pe_em + endif + iasm=ias ; iaem=iae ; jasm=jas ; jaem=jae ; kasm=kas ; kaem=kae ; masm=mas ; maem=mae + + ip=1 ! halo width is hardwired at 1 + ibs=grd_ens%istart(mype+1) + ibe=ibs+grd_ens%lat1-1 + jbs=grd_ens%jstart(mype+1) + jbe=jbs+grd_ens%lon1-1 + + ibsm=ibs-ip ; ibem=ibe+ip ; jbsm=jbs-ip ; jbem=jbe+ip + kbs =1 ; kbe =n2d ; mbs =1 ; mbe =n_ens + kbsm=kbs ; kbem=kbe ; mbsm=mbs ; mbem=mbe + iaemz=max(iasm,iaem) ; jaemz=max(jasm,jaem) + kaemz=max(kasm,kaem) ; maemz=max(masm,maem) + ibemz=max(ibsm,ibem) ; jbemz=max(jbsm,jbem) + kbemz=max(kbsm,kbem) ; mbemz=max(mbsm,mbem) + call genex_create_info(s_a2b,ias ,iae ,jas ,jae ,kas ,kae ,mas ,mae , & + ibs ,ibe ,jbs ,jbe ,kbs ,kbe ,mbs ,mbe , & + iasm,iaem,jasm,jaem,kasm,kaem,masm,maem, & + ibsm,ibem,jbsm,jbem,kbsm,kbem,mbsm,mbem) + + if(mype==0)then + do n=1,n_ens + write(6,'(3(a,1x,i5,1x))') 'reading ensemble member', n,'on pe', io_pe0(n) + enddo + end if + end if + if(mype==0) write(6,*) ' reading time level ',ntindex allocate(m_cvars2dw(nc2din),m_cvars3dw(nc3din)) m_cvars2dw=-999 m_cvars3dw=-999 - allocate(en_full(iasm:iaemz,jasm:jaemz,kasm:kaemz,masm:maemz)) + !! read ensembles if ( mas == mae ) then + allocate(en_full(iasm:iaemz,jasm:jaemz,kasm:kaemz,masm:maemz)) + write(filename,22) trim(adjustl(ensemble_path)),ens_fhrlevs(ntindex),mas +22 format(a,'sigf',i2.2,'_ens_mem',i3.3) if ( use_gfs_nemsio ) then if (cnvw_option) then write(filenamesfc,23) trim(adjustl(ensemble_path)),ens_fhrlevs(ntindex),mas @@ -284,54 +296,54 @@ subroutine get_user_ens_gfs_fastread_(ntindex,atm_bundle, & filename,.true.) end if else - call parallel_read_gfsnc_state_(en_full,m_cvars2dw,m_cvars3dw,nlon,nlat,nsig, & + call parallel_read_gfsnc_state_(en_full,m_cvars2dw,m_cvars3dw,nlon,nlat,nsig, & ias,jas,mas, & iasm,iaemz,jasm,jaemz,kasm,kaemz,masm,maemz, & filename) end if + else + allocate(en_full(1,1,1,1)) end if call mpi_allreduce(m_cvars2dw,m_cvars2d,nc2d,mpi_integer4,mpi_max,mpi_comm_world,ierror) call mpi_allreduce(m_cvars3dw,m_cvars3d,nc3d,mpi_integer4,mpi_max,mpi_comm_world,ierror) deallocate(m_cvars2dw,m_cvars3dw) + ! scatter to subdomains: +! en_loc=zero allocate(en_loc(ibsm:ibemz,jbsm:jbemz,kbsm:kbemz,mbsm:mbemz)) - - en_loc=zero call genex(s_a2b,en_full,en_loc) deallocate(en_full) - call genex_destroy_info(s_a2b) ! check on actual routine name -! transfer en_loc to en_loc3 then to atm_bundle - allocate(en_loc3(lat2in,lon2in,nc2d+nc3d*nsig)) +! call genex_destroy_info(s_a2b) ! check on actual routine name + - iret = 0 + allocate(sloc(lat2in*lon2in*(nc2d+nc3d*nsig))) call create_grd23d_(grd3d,nc2d+nc3d*grd%nsig) + + iret=0 do n=1,n_ens + ii=0 do k=1,nc2d+nc3d*nsig - jj=0 do j=jbsm,jbem - jj=jj+1 - ii=0 do i=ibsm,ibem ii=ii+1 - en_loc3(ii,jj,k)=en_loc(i,j,k,n) + sloc(ii)=en_loc(i,j,k,n) enddo enddo enddo - call move2bundle_(grd3d,en_loc3,atm_bundle(n),m_cvars2d,m_cvars3d,iret) + call move2bundle_(grd3d,sloc,atm_bundle(n),m_cvars2d,m_cvars3d,iret) enddo + deallocate(en_loc,sloc) call general_sub2grid_destroy_info(grd3d,grd) - deallocate(en_loc,en_loc3) - end subroutine get_user_ens_gfs_fastread_ -subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) +subroutine move2bundle_(grd3d,sloc,atm_bundle,m_cvars2d,m_cvars3d,iret) !$$$ subprogram documentation block ! . . . . @@ -347,7 +359,7 @@ subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) ! ! input argument list: ! grd - grd info for ensemble -! en_loc3 - ensemble member +! sloc - ensemble member ! atm_bundle - empty atm bundle ! m_cvars2d - maps 3rd index in en_loc3 for start of each 2d variable ! m_cvars3d - maps 3rd index in en_loc3 for start of each 3d variable @@ -361,13 +373,11 @@ subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) ! !$$$ - use kinds, only: i_kind,r_kind,r_single use constants, only: zero,one,two,fv use general_sub2grid_mod, only: sub2grid_info use hybrid_ensemble_parameters, only: en_perts use gsi_bundlemod, only: gsi_bundle use gsi_bundlemod, only: gsi_bundlegetpointer - use gsi_bundlemod, only : assignment(=) use control_vectors, only: cvars2d,cvars3d,nc2d,nc3d use mpeu_util, only: getindex @@ -375,27 +385,28 @@ subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) ! Declare passed variables type(sub2grid_info), intent(in ) :: grd3d - real(r_kind), intent(inout) :: en_loc3(grd3d%lat2,grd3d%lon2,nc2d+nc3d*grd3d%nsig) type(gsi_bundle), intent(inout) :: atm_bundle + real(r_kind), intent(inout) :: sloc(grd3d%lat2*grd3d%lon2*(nc2d+nc3d*grd3d%nsig)) integer(i_kind), intent(in ) :: m_cvars2d(nc2d),m_cvars3d(nc3d) - integer(i_kind), intent( out) :: iret + integer(i_kind), intent(inout) :: iret ! Declare internal variables character(len=*),parameter :: myname_='move2bundle_' character(len=70) :: filename integer(i_kind) :: ierr - integer(i_kind) :: km,m + integer(i_kind) :: km1,m integer(i_kind) :: icw,iql,iqi,iqr,iqs,iqg real(r_kind),pointer,dimension(:,:) :: ps !real(r_kind),pointer,dimension(:,:) :: sst + real(r_kind),dimension(grd3d%lat2,grd3d%lon2,nc2d+nc3d*grd3d%nsig)::en_loc3 real(r_kind),pointer,dimension(:,:,:) :: u,v,tv,q,oz,cwmr real(r_kind),pointer,dimension(:,:,:) :: qlmr,qimr,qrmr,qsmr,qgmr real(r_kind),parameter :: r0_001 = 0.001_r_kind !--- now update halo values of all variables using general_sub2grid - call update_halos_(grd3d,en_loc3) + call update_halos_(grd3d,sloc,en_loc3) ! Check hydrometeors in control variables icw=getindex(cvars3d,'cw') @@ -405,12 +416,16 @@ subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) iqs=getindex(cvars3d,'qs') iqg=getindex(cvars3d,'qg') -! initialize atm_bundle to zero +! atm_bundle to zero done earlier - atm_bundle=zero + call gsi_bundlegetpointer(atm_bundle,'ps',ps, ierr); iret = iret+ierr + !call gsi_bundlegetpointer(atm_bundle,'sst',sst, ierr); iret = iret+ierr + do m=1,nc2d +! convert ps from Pa to cb + if(trim(cvars2d(m))=='ps') ps=r0_001*en_loc3(:,:,m_cvars2d(m)) +! if(trim(cvars2d(m))=='sst') sst=en_loc3(:,:,m_cvars2d(m)) !no sst for now + enddo - call gsi_bundlegetpointer(atm_bundle,'ps',ps, ierr); iret = ierr - !call gsi_bundlegetpointer(atm_bundle,'sst',sst, ierr); iret = ierr call gsi_bundlegetpointer(atm_bundle,'sf',u , ierr); iret = ierr + iret call gsi_bundlegetpointer(atm_bundle,'vp',v , ierr); iret = ierr + iret call gsi_bundlegetpointer(atm_bundle,'t' ,tv, ierr); iret = ierr + iret @@ -425,7 +440,7 @@ subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) if ( iret /= 0 ) then if ( mype == 0 ) then write(6,'(A)') trim(myname_) // ': ERROR!' - write(6,'(A)') trim(myname_) // ': For now, GFS requires all MetFields: ps,u,v,(sf,vp)tv,q,oz,cw' + write(6,'(A)') trim(myname_) // ': For now, GFS requires all MetFields: ps,u,v,(sf,vp)tv,q,oz' write(6,'(A)') trim(myname_) // ': but some have not been found. Aborting ... ' write(6,'(A)') trim(myname_) // ': WARNING!' write(6,'(3A,I5)') trim(myname_) // ': Trouble reading ensemble file : ', trim(filename), ', IRET = ', iret @@ -433,38 +448,31 @@ subroutine move2bundle_(grd3d,en_loc3,atm_bundle,m_cvars2d,m_cvars3d,iret) return endif - - do m=1,nc2d -! convert ps from Pa to cb - if(trim(cvars2d(m))=='ps') ps=r0_001*en_loc3(:,:,m_cvars2d(m)) -! if(trim(cvars2d(m))=='sst') sst=en_loc3(:,:,m_cvars2d(m)) !no sst for now - enddo - - km = en_perts(1,1)%grid%km + km1 = en_perts(1,1,1)%grid%km - 1 !$omp parallel do schedule(dynamic,1) private(m) do m=1,nc3d if(trim(cvars3d(m))=='sf')then - u = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + u = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='vp') then - v = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + v = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='t') then - tv = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + tv = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='q') then - q = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + q = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='oz') then - oz = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + oz = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='cw') then - cwmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + cwmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='ql') then - qlmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + qlmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='qi') then - qimr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + qimr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='qr') then - qrmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + qrmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='qs') then - qsmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + qsmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) else if(trim(cvars3d(m))=='qg') then - qgmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km) + qgmr = en_loc3(:,:,m_cvars3d(m):m_cvars3d(m)+km1) end if enddo @@ -477,7 +485,6 @@ end subroutine move2bundle_ subroutine create_grd23d_(grd23d,nvert) - use kinds, only: i_kind use general_sub2grid_mod, only: sub2grid_info,general_sub2grid_create_info use hybrid_ensemble_parameters, only: grd_ens @@ -498,21 +505,20 @@ subroutine create_grd23d_(grd23d,nvert) end subroutine create_grd23d_ -subroutine update_halos_(grd,s) +subroutine update_halos_(grd,sloc,s) - use kinds, only: i_kind,r_kind use general_sub2grid_mod, only: sub2grid_info,general_sub2grid,general_grid2sub implicit none ! Declare passed variables type(sub2grid_info), intent(in ) :: grd - real(r_kind), intent(inout) :: s(grd%lat2,grd%lon2,grd%num_fields) + real(r_kind), intent( out) :: s(grd%lat2,grd%lon2,grd%num_fields) + real(r_kind), intent(inout) :: sloc(grd%lat2*grd%lon2*grd%num_fields) ! Declare local variables - integer(i_kind) inner_vars,lat2,lon2,nlat,nlon,nvert,kbegin_loc,kend_loc,kend_alloc + integer(i_kind) inner_vars,lat2,lon2,nlat,nlon,nvert,kbegin_loc,kend_alloc integer(i_kind) ii,i,j,k - real(r_kind),allocatable,dimension(:) :: sloc real(r_kind),allocatable,dimension(:,:,:,:) :: work lat2=grd%lat2 @@ -522,22 +528,16 @@ subroutine update_halos_(grd,s) nvert=grd%num_fields inner_vars=grd%inner_vars kbegin_loc=grd%kbegin_loc - kend_loc=grd%kend_loc kend_alloc=grd%kend_alloc - allocate(sloc(lat2*lon2*nvert)) + + + allocate(work(inner_vars,nlat,nlon,kbegin_loc:kend_alloc)) - ii=0 - do k=1,nvert - do j=1,lon2 - do i=1,lat2 - ii=ii+1 - sloc(ii)=s(i,j,k) - enddo - enddo - enddo call general_sub2grid(grd,sloc,work) call general_grid2sub(grd,work,sloc) + deallocate(work) + ii=0 do k=1,nvert do j=1,lon2 @@ -548,33 +548,30 @@ subroutine update_halos_(grd,s) enddo enddo - deallocate(sloc,work) - end subroutine update_halos_ -subroutine ens_io_partition_(n_ens,ntindex,io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em,i_ens) +subroutine ens_io_partition_(n_ens,io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em,io_pe0,i_ens) ! do computation on all processors, then assign final local processor ! values. - use kinds, only: r_kind,i_kind use constants, only: half implicit none ! Declare passed variables - integer(i_kind),intent(in ) :: n_ens,ntindex + integer(i_kind),intent(in ) :: n_ens integer(i_kind),intent( out) :: io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em,i_ens + integer(i_kind),intent( out) :: io_pe0(n_ens) ! Declare local variables - integer(i_kind) :: io_pe0(n_ens) integer(i_kind) :: iskip,jskip,nextra,ipe,n integer(i_kind) :: nsig i_ens=-1 nsig=1 iskip=npe/n_ens - nextra=npe-iskip*n_ens + nextra=npe-iskip*(n_ens-1)-1 jskip=iskip io_pe=-1 io_pe0=-1 @@ -589,13 +586,12 @@ subroutine ens_io_partition_(n_ens,ntindex,io_pe,n_io_pe_s,n_io_pe_e,n_io_pe_em, else jskip=iskip endif + if(ipe > npe) then + write(6,*)' ens_io_partition_: ***ERROR*** ',ipe,jskip,' processor error: PROGRAM STOPS' + call stop2(999) + end if ipe=ipe+jskip enddo - if(mype==0)then - do n=1,n_ens - write(6,'(3(a,1x,i5,1x))') 'reading ensemble member', n,' time level',ntindex,'on pe', io_pe0(n) - enddo - end if do n=1,n_ens if(mype==io_pe0(n)) then @@ -614,7 +610,6 @@ subroutine parallel_read_nemsio_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsi iasm,iaemz,jasm,jaemz,kasm,kaemz,masm,maemz, & filename,init_head,filenamesfc) - use kinds, only: i_kind,r_kind,r_single use constants, only: r60,r3600,zero,one,half,deg2rad use nemsio_module, only: nemsio_init,nemsio_open,nemsio_close use ncepnems_io, only: error_msg,imp_physics @@ -641,7 +636,6 @@ subroutine parallel_read_nemsio_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsi ! Declare local variables integer(i_kind) i,ii,j,jj,k,lonb,latb,levs,latb2,lonb2 integer(i_kind) k2,k3,k3u,k3v,k3t,k3q,k3cw,k3oz,kf - integer(i_kind) k3ql,k3qi,k3qr,k3qs,k3qg integer(i_kind) iret integer(i_kind) :: istop = 101 integer(i_kind),dimension(7):: idate @@ -726,23 +720,40 @@ subroutine parallel_read_nemsio_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsi allocate(work(nlon*(nlat-2))) if (imp_physics == 11) allocate(work2(nlon*(nlat-2))) allocate(temp3(nlat,nlon,nsig,nc3d)) - allocate(temp2(nlat,nlon,nc2d)) + temp3=zero k3u=0 ; k3v=0 ; k3t=0 ; k3q=0 ; k3cw=0 ; k3oz=0 - k3ql=0; k3qi=0; k3qr=0; k3qs=0; k3qg=0 do k3=1,nc3d - if(cvars3d(k3)=='sf') k3u=k3 - if(cvars3d(k3)=='vp') k3v=k3 - if(cvars3d(k3)=='t') k3t=k3 - if(cvars3d(k3)=='q') k3q=k3 - if(cvars3d(k3)=='cw') k3cw=k3 - if(cvars3d(k3)=='oz') k3oz=k3 - if(cvars3d(k3)=='ql') k3ql=k3 - if(cvars3d(k3)=='qi') k3qi=k3 - if(cvars3d(k3)=='qr') k3qr=k3 - if(cvars3d(k3)=='qs') k3qs=k3 - if(cvars3d(k3)=='qg') k3qg=k3 do k=1,nsig - if(trim(cvars3d(k3))=='cw') then + if(trim(cvars3d(k3))=='t') then + k3t=k3 + call nemsio_readrecv(gfile,'tmp','mid layer',k,work,iret=iret) + if (iret /= 0) call error_msg(trim(myname_),trim(filename),'tmp','read',istop+3,iret,.true.) + call move1_(work,temp3(:,:,k,k3),nlon,nlat) + call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) + elseif(trim(cvars3d(k3))=='sf') then + k3u=k3 + call nemsio_readrecv(gfile,'ugrd','mid layer',k,work,iret=iret) + if (iret /= 0) call error_msg(trim(myname_),trim(filename),'ugrd','read',istop+1,iret,.true.) + call move1_(work,temp3(:,:,k,k3),nlon,nlat) + elseif(trim(cvars3d(k3))=='vp') then + k3v=k3 + call nemsio_readrecv(gfile,'vgrd','mid layer',k,work,iret=iret) + if (iret /= 0) call error_msg(trim(myname_),trim(filename),'vgrd','read',istop+2,iret,.true.) + call move1_(work,temp3(:,:,k,k3),nlon,nlat) + elseif(trim(cvars3d(k3))=='q') then + k3q=k3 + call nemsio_readrecv(gfile,'spfh','mid layer',k,work,iret=iret) + if (iret /= 0) call error_msg(trim(myname_),trim(filename),trim(cvars3d(k3)),'read',istop+4,iret,.true.) + call move1_(work,temp3(:,:,k,k3),nlon,nlat) + call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) + elseif(trim(cvars3d(k3))=='oz') then + k3oz=k3 + call nemsio_readrecv(gfile,'o3mr','mid layer',k,work,iret=iret) + if (iret /= 0) call error_msg(trim(myname_),trim(filename),'o3mr','read',istop+5,iret,.true.) + call move1_(work,temp3(:,:,k,k3),nlon,nlat) + call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) + elseif(trim(cvars3d(k3))=='cw') then + k3cw=k3 call nemsio_readrecv(gfile,'clwmr','mid layer',k,work,iret=iret) if (iret /= 0) call error_msg(trim(myname_),trim(filename),'clwmr','read',istop+6,iret,.true.) if (imp_physics == 11) then @@ -789,30 +800,7 @@ subroutine parallel_read_nemsio_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsi if (iret /= 0) call error_msg(trim(myname_),trim(filename),'grle','read',istop+12,iret) call move1_(work,temp3(:,:,k,k3),nlon,nlat) call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - elseif(trim(cvars3d(k3))=='oz') then - call nemsio_readrecv(gfile,'o3mr','mid layer',k,work,iret=iret) - if (iret /= 0) call error_msg(trim(myname_),trim(filename),'o3mr','read',istop+5,iret,.true.) - call move1_(work,temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - elseif(trim(cvars3d(k3))=='q') then - call nemsio_readrecv(gfile,'spfh','mid layer',k,work,iret=iret) - if (iret /= 0) call error_msg(trim(myname_),trim(filename),trim(cvars3d(k3)),'read',istop+4,iret,.true.) - call move1_(work,temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - elseif(trim(cvars3d(k3))=='t') then - call nemsio_readrecv(gfile,'tmp','mid layer',k,work,iret=iret) - if (iret /= 0) call error_msg(trim(myname_),trim(filename),'tmp','read',istop+3,iret,.true.) - call move1_(work,temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - elseif(trim(cvars3d(k3))=='sf') then - call nemsio_readrecv(gfile,'ugrd','mid layer',k,work,iret=iret) - if (iret /= 0) call error_msg(trim(myname_),trim(filename),'ugrd','read',istop+1,iret,.true.) - call move1_(work,temp3(:,:,k,k3),nlon,nlat) - elseif(trim(cvars3d(k3))=='vp') then - call nemsio_readrecv(gfile,'vgrd','mid layer',k,work,iret=iret) - if (iret /= 0) call error_msg(trim(myname_),trim(filename),'vgrd','read',istop+2,iret,.true.) - call move1_(work,temp3(:,:,k,k3),nlon,nlat) - endif + end if enddo enddo do k=1,nsig @@ -822,10 +810,29 @@ subroutine parallel_read_nemsio_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsi if (k3u==0.or.k3v==0.or.k3t==0.or.k3q==0.or.k3oz==0) & write(6,'(" WARNING, problem with one of k3-")') +! move temp3 to en_full + kf=0 + do k3=1,nc3d + m_cvars3d(k3)=kf+1 + do k=1,nsig + kf=kf+1 + jj=jas-1 + do j=1,nlon + jj=jj+1 + ii=ias-1 + do i=1,nlat + ii=ii+1 + en_full(ii,jj,kf,mas)=temp3(i,j,k,k3) + enddo + enddo + enddo + enddo + deallocate(temp3) ! convert T to Tv: postpone this calculation ! temp3(:,:,:,k3t)=temp3(:,:,:,k3t)*(one+fv*temp3(:,:,:,k3q)) + allocate(temp2(nlat,nlon,nc2d)) temp2=zero do k2=1,nc2d !if(trim(cvars2d(k2))=='sst') then @@ -844,24 +851,7 @@ subroutine parallel_read_nemsio_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsi deallocate(work) if (imp_physics == 11) deallocate(work2) -! move temp2,temp3 to en_full - kf=0 - do k3=1,nc3d - m_cvars3d(k3)=kf+1 - do k=1,nsig - kf=kf+1 - jj=jas-1 - do j=1,nlon - jj=jj+1 - ii=ias-1 - do i=1,nlat - ii=ii+1 - en_full(ii,jj,kf,mas)=temp3(i,j,k,k3) - enddo - enddo - enddo - enddo - deallocate(temp3) +! move temp2 to en_full do k2=1,nc2d m_cvars2d(k2)=kf+1 kf=kf+1 @@ -894,7 +884,6 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig ! !$$$ - use kinds, only: i_kind,r_kind,r_single use constants, only: r60,r3600,zero,one,half,deg2rad use control_vectors, only: cvars2d,cvars3d,nc2d,nc3d use general_sub2grid_mod, only: sub2grid_info @@ -914,9 +903,9 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig character(len=*), intent(in ) :: filename ! Declare local variables + logical :: file_exist integer(i_kind) i,ii,j,jj,k,lonb,latb,levs,kr,ierror integer(i_kind) k2,k3,k3u,k3v,k3t,k3q,k3cw,k3oz,kf - integer(i_kind) k3ql,k3qi,k3qr,k3qs,k3qg character(len=120) :: myname_ = 'parallel_read_gfsnc_state_' real(r_single),allocatable,dimension(:,:,:) :: rwork3d1, rwork3d2 real(r_single),allocatable,dimension(:,:) :: temp2,rwork2d @@ -927,10 +916,18 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig type(Dataset) :: atmges type(Dimension) :: ncdim +! Check to see if requested file exists + inquire(file=filename,exist=file_exist) + if (.not.file_exist) then + write(6,*)' PARALLEL_READ_GFSNC_STATE: ***FATAL ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' + call die(myname_, ': ***FATAL ERROR*** insufficient ens fcst for hybrid',999) + endif + ierror=0 +! If file exists, open and process atmges = open_dataset(filename,errcode=ierror) if (ierror /=0) then - write(6,*)' PARALLEL_READ_GFSNC_STATE: ***ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' + write(6,*)' PARALLEL_READ_GFSNC_STATE: ***FATAL ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' call stop2(999) endif ! get dimension sizes @@ -960,9 +957,20 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig allocate(rwork3d1(nlon,(nlat-2),nsig)) allocate(temp3(nlat,nlon,nsig,nc3d)) k3u=0 ; k3v=0 ; k3t=0 ; k3q=0 ; k3cw=0 ; k3oz=0 - k3ql=0; k3qi=0; k3qr=0; k3qs=0; k3qg=0 do k3=1,nc3d - if (trim(cvars3d(k3))=='cw') then + if(trim(cvars3d(k3))=='t') then + k3t=k3 + call read_vardata(atmges, 'tmp', rwork3d1) + else if(trim(cvars3d(k3))=='sf') then + k3u=k3 + call read_vardata(atmges, 'ugrd', rwork3d1) + else if(trim(cvars3d(k3))=='vp') then + k3v=k3 + call read_vardata(atmges, 'vgrd', rwork3d1) + else if(trim(cvars3d(k3))=='q') then + k3q=k3 + call read_vardata(atmges, 'spfh', rwork3d1) + else if (trim(cvars3d(k3))=='cw') then k3cw=k3 call read_vardata(atmges, 'clwmr', rwork3d1) allocate(rwork3d2(nlon,(nlat-2),nsig)) @@ -970,90 +978,25 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig call read_vardata(atmges, 'icmr', rwork3d2) rwork3d1 = rwork3d1 + rwork3d2 deallocate(rwork3d2) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do + else if(trim(cvars3d(k3))=='oz') then + k3oz=k3 + call read_vardata(atmges, 'o3mr', rwork3d1) else if(trim(cvars3d(k3))=='ql') then - k3ql=k3 call read_vardata(atmges, 'clwmr', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do else if(trim(cvars3d(k3))=='qi') then - k3qi=k3 call read_vardata(atmges, 'icmr', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do else if(trim(cvars3d(k3))=='qr') then - k3qr=k3 call read_vardata(atmges, 'rwmr', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do else if(trim(cvars3d(k3))=='qs') then - k3qs=k3 call read_vardata(atmges, 'snmr', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do else if(trim(cvars3d(k3))=='qg') then - k3qg=k3 call read_vardata(atmges, 'grle', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do - else if(trim(cvars3d(k3))=='oz') then - k3oz=k3 - call read_vardata(atmges, 'o3mr', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do - else if(trim(cvars3d(k3))=='q') then - k3q=k3 - call read_vardata(atmges, 'spfh', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do - else if(trim(cvars3d(k3))=='t') then - k3t=k3 - call read_vardata(atmges, 'tmp', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) - end do - else if(trim(cvars3d(k3))=='sf') then - k3u=k3 - call read_vardata(atmges, 'ugrd', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - end do - else if(trim(cvars3d(k3))=='vp') then - k3v=k3 - call read_vardata(atmges, 'vgrd', rwork3d1) - do k=1,nsig - kr = levs+1-k - call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) - end do end if +!$omp parallel do schedule(dynamic,1) private(k,kr) + do k=1,nsig + kr = levs+1-k + call move1_(rwork3d1(:,:,kr),temp3(:,:,k,k3),nlon,nlat) + end do enddo deallocate(rwork3d1) @@ -1061,13 +1004,20 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig if (k3u==0.or.k3v==0.or.k3t==0.or.k3q==0.or.k3oz==0) & write(6,'(" WARNING, problem with one of k3-")') +!$omp parallel do schedule(dynamic,1) private(k,k3) do k=1,nsig call fillpoles_sv_(temp3(:,:,k,k3u),temp3(:,:,k,k3v),nlon,nlat,clons,slons) end do -! move temp2,temp3 to en_full - kf=0 +! move temp3 to en_full +!$omp parallel do schedule(dynamic,1) private(k3,k,kf,j,jj,i,ii) do k3=1,nc3d + if(k3 /= k3u .and. k3 /= k3v)then + do k=1,nsig + call fillpoles_ss_(temp3(:,:,k,k3),nlon,nlat) + end do + end if + kf=(k3-1)*nsig m_cvars3d(k3)=kf+1 do k=1,nsig kf=kf+1 @@ -1086,6 +1036,7 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig deallocate(temp3) allocate(temp2(nlat,nlon)) allocate(rwork2d(nlon,(nlat-2))) + kf=nc3d*nsig do k2=1,nc2d if(trim(cvars2d(k2))=='ps') then call read_vardata(atmges, 'pressfc', rwork2d) @@ -1095,6 +1046,7 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig temp2=zero endif +! move temp2 to en_full kf=kf+1 m_cvars2d(k2)=kf jj=jas-1 @@ -1107,6 +1059,7 @@ subroutine parallel_read_gfsnc_state_(en_full,m_cvars2d,m_cvars3d,nlon,nlat,nsig enddo enddo enddo +! call close_dataset(atmges) deallocate(rwork2d) deallocate(temp2) @@ -1139,7 +1092,6 @@ subroutine fillpoles_ss_(temp,nlon,nlat) ! !$$$ - use kinds, only: i_kind,r_kind,r_single use constants, only: zero,one implicit none @@ -1149,6 +1101,7 @@ subroutine fillpoles_ss_(temp,nlon,nlat) integer(i_kind) nlatm1,i real(r_kind) sumn,sums,rnlon + real(r_single) sumn_sing,sums_sing ! Compute mean along southern and northern latitudes sumn=zero @@ -1159,13 +1112,13 @@ subroutine fillpoles_ss_(temp,nlon,nlat) sums=sums+temp(2,i) end do rnlon=one/float(nlon) - sumn=sumn*rnlon - sums=sums*rnlon + sumn_sing=sumn*rnlon + sums_sing=sums*rnlon ! Load means into local work array do i=1,nlon - temp(1,i) =sums - temp(nlat,i)=sumn + temp(1,i) =sums_sing + temp(nlat,i)=sumn_sing end do end subroutine fillpoles_ss_ @@ -1197,13 +1150,12 @@ subroutine fillpoles_sv_(tempu,tempv,nlon,nlat,clons,slons) ! !$$$ - use kinds, only: i_kind,r_kind,r_single use constants, only: zero implicit none integer(i_kind),intent(in ) :: nlon,nlat - real(r_single), intent(inout) :: tempu(nlat,nlon),tempv(nlat,nlon) + real(r_single), intent(inout) :: tempu(nlat,nlon),tempv(nlat,nlon) real(r_kind), intent(in ) :: clons(nlon),slons(nlon) integer(i_kind) i @@ -1258,7 +1210,6 @@ subroutine move1_(work,temp,nlon,nlat) ! !$$$ - use kinds, only: i_kind,r_kind,r_single use constants, only: zero implicit none @@ -1308,7 +1259,6 @@ subroutine get_gfs_ens(this,grd,member,ntindex,atm_bundle,iret) ! !$$$ - use kinds, only: i_kind,r_kind use gridmod, only: use_gfs_nemsio, use_gfs_ncio use general_sub2grid_mod, only: sub2grid_info use gsi_4dvar, only: ens_fhrlevs @@ -1412,7 +1362,6 @@ subroutine put_gfs_ens(this,grd,member,ntindex,pert,iret) ! !$$$ - use kinds, only: i_kind use general_sub2grid_mod, only: sub2grid_info use gsi_bundlemod, only: gsi_bundle use gsi_4dvar, only: ens_fhrlevs @@ -1475,7 +1424,6 @@ end subroutine put_gfs_ens subroutine non_gaussian_ens_grid_gfs(this,elats,elons) - use kinds, only: r_kind use hybrid_ensemble_parameters, only: sp_ens implicit none @@ -1507,7 +1455,6 @@ end subroutine non_gaussian_ens_grid_gfs subroutine create_sub2grid_info(s2gi,nsig,npe,s2gi_ref) !> Create temporary communication information object for read ensemble routines - use kinds, only: i_kind use gridmod, only: regional use general_sub2grid_mod, only: sub2grid_info use general_sub2grid_mod, only: general_sub2grid_create_info diff --git a/src/gsi/cplr_gfs_nstmod.f90 b/src/gsi/cplr_gfs_nstmod.f90 index b482085aac..220fa55af1 100644 --- a/src/gsi/cplr_gfs_nstmod.f90 +++ b/src/gsi/cplr_gfs_nstmod.f90 @@ -139,15 +139,15 @@ subroutine deter_nst_(dlat_earth,dlon_earth,obstime,zob,tref,dtw,dtc,tz_tr) integer(i_kind):: itnst,itnstp integer(i_kind):: ix,iy,ixp,iyp,j real(r_kind):: dx,dy,dx1,dy1,w00,w10,w01,w11,dtnst,dtnstp - real(r_kind):: tref_00,tref_01,tref_10,tref_11,tr_tmp - real(r_kind):: dt_cool_00,dt_cool_01,dt_cool_10,dt_cool_11 - real(r_kind):: z_c_00,z_c_01,z_c_10,z_c_11 - real(r_kind):: dt_warm_00,dt_warm_01,dt_warm_10,dt_warm_11 - real(r_kind):: z_w_00,z_w_01,z_w_10,z_w_11,z_w_tmp - real(r_kind):: c_0_00,c_0_01,c_0_10,c_0_11 - real(r_kind):: c_d_00,c_d_01,c_d_10,c_d_11 - real(r_kind):: w_0_00,w_0_01,w_0_10,w_0_11 - real(r_kind):: w_d_00,w_d_01,w_d_10,w_d_11 + real(r_kind):: tref_tt,tref2 + real(r_kind):: dt_cool_tt + real(r_kind):: z_c_tt + real(r_kind):: dt_warm_tt + real(r_kind):: z_w_tt + real(r_kind):: c_0_tt + real(r_kind):: c_d_tt + real(r_kind):: w_0_tt + real(r_kind):: w_d_tt real(r_kind):: wgtavg,dlat,dlon logical outside @@ -199,138 +199,137 @@ subroutine deter_nst_(dlat_earth,dlon_earth,obstime,zob,tref,dtw,dtc,tz_tr) ! ! Use the time interpolation factors for nst files ! - tref_00 = tref_full (ix ,iy ,itnst)*dtnst + tref_full (ix ,iy ,itnstp)*dtnstp - tref_01 = tref_full (ix ,iyp,itnst)*dtnst + tref_full (ix ,iyp,itnstp)*dtnstp - tref_10 = tref_full (ixp,iy ,itnst)*dtnst + tref_full (ixp,iy ,itnstp)*dtnstp - tref_11 = tref_full (ixp,iyp,itnst)*dtnst + tref_full (ixp,iyp,itnstp)*dtnstp - - dt_cool_00 = dt_cool_full(ix ,iy ,itnst)*dtnst + dt_cool_full(ix ,iy ,itnstp)*dtnstp - dt_cool_01 = dt_cool_full(ix ,iyp,itnst)*dtnst + dt_cool_full(ix ,iyp,itnstp)*dtnstp - dt_cool_10 = dt_cool_full(ixp,iy ,itnst)*dtnst + dt_cool_full(ixp,iy ,itnstp)*dtnstp - dt_cool_11 = dt_cool_full(ixp,iyp,itnst)*dtnst + dt_cool_full(ixp,iyp,itnstp)*dtnstp - - z_c_00 = z_c_full (ix ,iy ,itnst)*dtnst + z_c_full (ix ,iy ,itnstp)*dtnstp - z_c_01 = z_c_full (ix ,iyp,itnst)*dtnst + z_c_full (ix ,iyp,itnstp)*dtnstp - z_c_10 = z_c_full (ixp,iy ,itnst)*dtnst + z_c_full (ixp,iy ,itnstp)*dtnstp - z_c_11 = z_c_full (ixp,iyp,itnst)*dtnst + z_c_full (ixp,iyp,itnstp)*dtnstp - - dt_warm_00 = dt_warm_full(ix ,iy ,itnst)*dtnst + dt_warm_full(ix ,iy ,itnstp)*dtnstp - dt_warm_01 = dt_warm_full(ix ,iyp,itnst)*dtnst + dt_warm_full(ix ,iyp,itnstp)*dtnstp - dt_warm_10 = dt_warm_full(ixp,iy ,itnst)*dtnst + dt_warm_full(ixp,iy ,itnstp)*dtnstp - dt_warm_11 = dt_warm_full(ixp,iyp,itnst)*dtnst + dt_warm_full(ixp,iyp,itnstp)*dtnstp - - z_w_00 = z_w_full (ix ,iy ,itnst)*dtnst + z_w_full (ix ,iy ,itnstp)*dtnstp - z_w_01 = z_w_full (ix ,iyp,itnst)*dtnst + z_w_full (ix ,iyp,itnstp)*dtnstp - z_w_10 = z_w_full (ixp,iy ,itnst)*dtnst + z_w_full (ixp,iy ,itnstp)*dtnstp - z_w_11 = z_w_full (ixp,iyp,itnst)*dtnst + z_w_full (ixp,iyp,itnstp)*dtnstp - - c_0_00 = c_0_full (ix ,iy ,itnst)*dtnst + c_0_full (ix ,iy ,itnstp)*dtnstp - c_0_01 = c_0_full (ix ,iyp,itnst)*dtnst + c_0_full (ix ,iyp,itnstp)*dtnstp - c_0_10 = c_0_full (ixp,iy ,itnst)*dtnst + c_0_full (ixp,iy ,itnstp)*dtnstp - c_0_11 = c_0_full (ixp,iyp,itnst)*dtnst + c_0_full (ixp,iyp,itnstp)*dtnstp - - c_d_00 = c_d_full (ix ,iy ,itnst)*dtnst + c_d_full (ix ,iy ,itnstp)*dtnstp - c_d_01 = c_d_full (ix ,iyp,itnst)*dtnst + c_d_full (ix ,iyp,itnstp)*dtnstp - c_d_10 = c_d_full (ixp,iy ,itnst)*dtnst + c_d_full (ixp,iy ,itnstp)*dtnstp - c_d_11 = c_d_full (ixp,iyp,itnst)*dtnst + c_d_full (ixp,iyp,itnstp)*dtnstp - - w_0_00 = w_0_full (ix ,iy ,itnst)*dtnst + w_0_full (ix ,iy ,itnstp)*dtnstp - w_0_01 = w_0_full (ix ,iyp,itnst)*dtnst + w_0_full (ix ,iyp,itnstp)*dtnstp - w_0_10 = w_0_full (ixp,iy ,itnst)*dtnst + w_0_full (ixp,iy ,itnstp)*dtnstp - w_0_11 = w_0_full (ixp,iyp,itnst)*dtnst + w_0_full (ixp,iyp,itnstp)*dtnstp - - w_d_00 = w_d_full (ix ,iy ,itnst)*dtnst + w_d_full (ix ,iy ,itnstp)*dtnstp - w_d_01 = w_d_full (ix ,iyp,itnst)*dtnst + w_d_full (ix ,iyp,itnstp)*dtnstp - w_d_10 = w_d_full (ixp,iy ,itnst)*dtnst + w_d_full (ixp,iy ,itnstp)*dtnstp - w_d_11 = w_d_full (ixp,iyp,itnst)*dtnst + w_d_full (ixp,iyp,itnstp)*dtnstp ! Interpolate nst variables to obs location (water surface only) wgtavg = zero - tr_tmp = zero + tref2 = zero dt_cool = zero - z_c = zero dt_warm = zero - z_w_tmp = zero + z_c = zero + z_w = zero c_0 = zero c_d = zero w_0 = zero w_d = zero + tz_tr = one + dtw = zero + dtc = zero if (istyp00 == 0)then + tref_tt = tref_full (ix ,iy ,itnst)*dtnst + tref_full (ix ,iy ,itnstp)*dtnstp + dt_cool_tt = dt_cool_full(ix ,iy ,itnst)*dtnst + dt_cool_full(ix ,iy ,itnstp)*dtnstp + dt_warm_tt = dt_warm_full(ix ,iy ,itnst)*dtnst + dt_warm_full(ix ,iy ,itnstp)*dtnstp + z_c_tt = z_c_full (ix ,iy ,itnst)*dtnst + z_c_full (ix ,iy ,itnstp)*dtnstp + z_w_tt = z_w_full (ix ,iy ,itnst)*dtnst + z_w_full (ix ,iy ,itnstp)*dtnstp + c_0_tt = c_0_full (ix ,iy ,itnst)*dtnst + c_0_full (ix ,iy ,itnstp)*dtnstp + c_d_tt = c_d_full (ix ,iy ,itnst)*dtnst + c_d_full (ix ,iy ,itnstp)*dtnstp + w_0_tt = w_0_full (ix ,iy ,itnst)*dtnst + w_0_full (ix ,iy ,itnstp)*dtnstp + w_d_tt = w_d_full (ix ,iy ,itnst)*dtnst + w_d_full (ix ,iy ,itnstp)*dtnstp wgtavg = wgtavg + w00 - tr_tmp = tr_tmp + w00*tref_00 - dt_cool = dt_cool + w00*dt_cool_00 - z_c = z_c + w00*z_c_00 - dt_warm = dt_warm + w00*dt_warm_00 - z_w_tmp = z_w_tmp + w00*z_w_00 - c_0 = c_0 + w00*c_0_00 - c_d = c_d + w00*c_d_00 - w_0 = w_0 + w00*w_0_00 - w_d = w_d + w00*w_d_00 + tref2 = tref2 + w00*tref_tt + dt_cool = dt_cool + w00*dt_cool_tt + dt_warm = dt_warm + w00*dt_warm_tt + z_c = z_c + w00*z_c_tt + z_w = z_w + w00*z_w_tt + c_0 = c_0 + w00*c_0_tt + c_d = c_d + w00*c_d_tt + w_0 = w_0 + w00*w_0_tt + w_d = w_d + w00*w_d_tt endif if(istyp01 == 0)then + tref_tt = tref_full (ix ,iyp,itnst)*dtnst + tref_full (ix ,iyp,itnstp)*dtnstp + dt_cool_tt = dt_cool_full(ix ,iyp,itnst)*dtnst + dt_cool_full(ix ,iyp,itnstp)*dtnstp + dt_warm_tt = dt_warm_full(ix ,iyp,itnst)*dtnst + dt_warm_full(ix ,iyp,itnstp)*dtnstp + z_c_tt = z_c_full (ix ,iyp,itnst)*dtnst + z_c_full (ix ,iyp,itnstp)*dtnstp + z_w_tt = z_w_full (ix ,iyp,itnst)*dtnst + z_w_full (ix ,iyp,itnstp)*dtnstp + c_0_tt = c_0_full (ix ,iyp,itnst)*dtnst + c_0_full (ix ,iyp,itnstp)*dtnstp + c_d_tt = c_d_full (ix ,iyp,itnst)*dtnst + c_d_full (ix ,iyp,itnstp)*dtnstp + w_0_tt = w_0_full (ix ,iyp,itnst)*dtnst + w_0_full (ix ,iyp,itnstp)*dtnstp + w_d_tt = w_d_full (ix ,iyp,itnst)*dtnst + w_d_full (ix ,iyp,itnstp)*dtnstp wgtavg = wgtavg + w01 - tr_tmp = tr_tmp + w01*tref_01 - dt_cool = dt_cool + w01*dt_cool_01 - z_c = z_c + w01*z_c_01 - dt_warm = dt_warm + w01*dt_warm_01 - z_w_tmp = z_w_tmp + w01*z_w_01 - c_0 = c_0 + w01*c_0_01 - c_d = c_d + w01*c_d_01 - w_0 = w_0 + w01*w_0_01 - w_d = w_d + w01*w_d_01 + tref2 = tref2 + w01*tref_tt + dt_cool = dt_cool + w01*dt_cool_tt + dt_warm = dt_warm + w01*dt_warm_tt + z_c = z_c + w01*z_c_tt + z_w = z_w + w01*z_w_tt + c_0 = c_0 + w01*c_0_tt + c_d = c_d + w01*c_d_tt + w_0 = w_0 + w01*w_0_tt + w_d = w_d + w01*w_d_tt end if if(istyp10 == 0)then + tref_tt = tref_full (ixp,iy ,itnst)*dtnst + tref_full (ixp,iy ,itnstp)*dtnstp + dt_cool_tt = dt_cool_full(ixp,iy ,itnst)*dtnst + dt_cool_full(ixp,iy ,itnstp)*dtnstp + dt_warm_tt = dt_warm_full(ixp,iy ,itnst)*dtnst + dt_warm_full(ixp,iy ,itnstp)*dtnstp + z_c_tt = z_c_full (ixp,iy ,itnst)*dtnst + z_c_full (ixp,iy ,itnstp)*dtnstp + z_w_tt = z_w_full (ixp,iy ,itnst)*dtnst + z_w_full (ixp,iy ,itnstp)*dtnstp + c_0_tt = c_0_full (ixp,iy ,itnst)*dtnst + c_0_full (ixp,iy ,itnstp)*dtnstp + c_d_tt = c_d_full (ixp,iy ,itnst)*dtnst + c_d_full (ixp,iy ,itnstp)*dtnstp + w_0_tt = w_0_full (ixp,iy ,itnst)*dtnst + w_0_full (ixp,iy ,itnstp)*dtnstp + w_d_tt = w_d_full (ixp,iy ,itnst)*dtnst + w_d_full (ixp,iy ,itnstp)*dtnstp wgtavg = wgtavg + w10 - tr_tmp = tr_tmp + w10*tref_10 - dt_cool = dt_cool + w10*dt_cool_10 - z_c = z_c + w10*z_c_10 - dt_warm = dt_warm + w10*dt_warm_10 - z_w_tmp = z_w_tmp + w10*z_w_10 - c_0 = c_0 + w10*c_0_10 - c_d = c_d + w10*c_d_10 - w_0 = w_0 + w10*w_0_10 - w_d = w_d + w10*w_d_10 + tref2 = tref2 + w10*tref_tt + dt_cool = dt_cool + w10*dt_cool_tt + dt_warm = dt_warm + w10*dt_warm_tt + z_c = z_c + w10*z_c_tt + z_w = z_w + w10*z_w_tt + c_0 = c_0 + w10*c_0_tt + c_d = c_d + w10*c_d_tt + w_0 = w_0 + w10*w_0_tt + w_d = w_d + w10*w_d_tt end if if(istyp11 == 0)then + tref_tt = tref_full (ixp,iyp,itnst)*dtnst + tref_full (ixp,iyp,itnstp)*dtnstp + dt_cool_tt = dt_cool_full(ixp,iyp,itnst)*dtnst + dt_cool_full(ixp,iyp,itnstp)*dtnstp + dt_warm_tt = dt_warm_full(ixp,iyp,itnst)*dtnst + dt_warm_full(ixp,iyp,itnstp)*dtnstp + z_c_tt = z_c_full (ixp,iyp,itnst)*dtnst + z_c_full (ixp,iyp,itnstp)*dtnstp + z_w_tt = z_w_full (ixp,iyp,itnst)*dtnst + z_w_full (ixp,iyp,itnstp)*dtnstp + c_0_tt = c_0_full (ixp,iyp,itnst)*dtnst + c_0_full (ixp,iyp,itnstp)*dtnstp + c_d_tt = c_d_full (ixp,iyp,itnst)*dtnst + c_d_full (ixp,iyp,itnstp)*dtnstp + w_0_tt = w_0_full (ixp,iyp,itnst)*dtnst + w_0_full (ixp,iyp,itnstp)*dtnstp + w_d_tt = w_d_full (ixp,iyp,itnst)*dtnst + w_d_full (ixp,iyp,itnstp)*dtnstp wgtavg = wgtavg + w11 - tr_tmp = tr_tmp + w11*tref_11 - dt_cool = dt_cool + w11*dt_cool_11 - z_c = z_c + w11*z_c_11 - dt_warm = dt_warm + w11*dt_warm_11 - z_w_tmp = z_w_tmp + w11*z_w_11 - c_0 = c_0 + w11*c_0_11 - c_d = c_d + w11*c_d_11 - w_0 = w_0 + w11*w_0_11 - w_d = w_d + w11*w_d_11 + tref2 = tref2 + w11*tref_tt + dt_cool = dt_cool + w11*dt_cool_tt + dt_warm = dt_warm + w11*dt_warm_tt + z_c = z_c + w11*z_c_tt + z_w = z_w + w11*z_w_tt + c_0 = c_0 + w11*c_0_tt + c_d = c_d + w11*c_d_tt + w_0 = w_0 + w11*w_0_tt + w_d = w_d + w11*w_d_tt end if + if(wgtavg < 1.e-6)return - if(wgtavg > zero)then - tr_tmp = tr_tmp/wgtavg - tref = tr_tmp - - z_w_tmp = z_w_tmp/wgtavg - z_w = z_w_tmp + tref = tref2/wgtavg + z_w = z_w/wgtavg + z_c = z_c/wgtavg - dt_cool = dt_cool/wgtavg - z_c = z_c/wgtavg - dt_warm = dt_warm/wgtavg + if(fac_tsl == 1)then c_0 = c_0/wgtavg c_d = c_d/wgtavg + dt_cool = dt_cool/wgtavg + if(z_c > zero)dtc = dt_cool*(one-min(zob,z_c)/z_c) + else + c_0 = zero + c_d = zero + dt_cool = zero + end if + if(fac_dtl == 1)then w_0 = w_0/wgtavg w_d = w_d/wgtavg + dt_warm = dt_warm/wgtavg + if(z_w > zero)dtw = dt_warm*(one-min(zob,z_w)/z_w) + else + w_0 = zero + w_d = zero + dt_warm = zero + end if - dtw = fac_dtl*dt_warm*(one-min(zob,z_w)/z_w) - if ( z_c > zero ) then - dtc = fac_tsl*dt_cool*(one-min(zob,z_c)/z_c) - else - dtc = zero - endif - call cal_tztr_(dt_warm,c_0,c_d,w_0,w_d,z_c,z_w,zob,tz_tr) + call cal_tztr_(dt_warm,c_0,c_d,w_0,w_d,z_c,z_w,zob,tz_tr) - end if end subroutine deter_nst_ !******************************************************************************************* @@ -343,10 +342,10 @@ subroutine cal_tztr_(dt_warm,c_0,c_d,w_0,w_d,zc,zw,z,tztr) ! ! dt_warm : diurnal warming amount at the surface ! xz : DTL depth (M) -! c_0 : coefficint 1 to calculate d(Tc)/d(Ts) -! c_d : coefficint 2 to calculate d(Tc)/d(Ts) -! w_0 : coefficint 1 to calculate d(Tw)/d(Ts) -! w_d : coefficint 2 to calculate d(Tw)/d(Ts) +! c_0 : coefficient 1 to calculate d(Tc)/d(Ts) +! c_d : coefficient 2 to calculate d(Tc)/d(Ts) +! w_0 : coefficient 1 to calculate d(Tw)/d(Ts) +! w_d : coefficient 2 to calculate d(Tw)/d(Ts) ! ! output variables ! @@ -354,34 +353,39 @@ subroutine cal_tztr_(dt_warm,c_0,c_d,w_0,w_d,zc,zw,z,tztr) use kinds, only: r_kind use constants, only: one,two,half,zero - use gsi_nstcouplermod, only: fac_dtl,fac_tsl real(kind=r_kind), intent(in) :: dt_warm,c_0,c_d,w_0,w_d,zc,zw,z real(kind=r_kind), intent(out) :: tztr ! local variables - real(kind=r_kind) :: c1,c2,c3 + real(kind=r_kind) :: c1,c2,c3,fact - c1 = one-two*(fac_dtl*w_0-fac_tsl*c_0)-(fac_dtl*w_d-fac_tsl*c_d)*z - c2 = one-two*(fac_dtl*w_0-fac_tsl*c_0)-fac_dtl*w_d*z - c3 = one+fac_tsl*two*c_0+fac_dtl*c_d*z tztr = one + c1 = zero + c2 = zero + c3 = zero if ( dt_warm > zero ) then - if ( z <= zc .and. c1 /= zero ) then - tztr = (one-fac_dtl*w_0+fac_tsl*c_0)/c1 - elseif ( z > zc .and. z < zw .and. c2 /= zero ) then - tztr = (one-fac_dtl*w_0+fac_tsl*c_0)/c2 + fact = (one-w_0+c_0) + if ( z <= zc) then + c1 = one-two*(w_0-c_0)-(w_d-c_d)*z + if ( c1 /= zero ) tztr = fact/c1 + elseif ( z > zc .and. z < zw) then + c2 = one-two*(w_0-c_0)-w_d*z + if (c2 /= zero ) tztr = fact/c2 + else endif - elseif ( dt_warm == zero .and. c3 /= zero ) then - if ( z <= zc ) then - tztr = (one+fac_tsl*c_0)/c3 + elseif (dt_warm == zero) then + if ( z <= zc) then + c3 = one+two*c_0+c_d*z + if (c3 /= zero) tztr = (one+c_0)/c3 endif endif - if ( tztr <= -1.0_r_kind .or. tztr > 4.0_r_kind ) then - write(6,100) fac_dtl,fac_tsl,c1,c2,c3,dt_warm,c_0,c_d,w_0,w_d,zc,zw,z,tztr -100 format('CAL_TZTR compute ',2(i2,1x),12(g13.6,1x),' RESET tztr to 1.0') - tztr = one + if ( tztr < 0.5_r_kind .or. tztr > 1.5_r_kind ) then + write(6,100) c1,c2,c3,dt_warm,c_0,c_d,w_0,w_d,zc,zw,z,tztr +100 format('CAL_TZTR compute ',12(g13.6,1x),' RESET tztr to 0.5 .or. 1.5') + tztr = min(1.5_r_kind,tztr) + tztr = max(0.5_r_kind,tztr) endif end subroutine cal_tztr_ diff --git a/src/gsi/cwhydromod.f90 b/src/gsi/cwhydromod.f90 index a27bba545f..d2bde78129 100644 --- a/src/gsi/cwhydromod.f90 +++ b/src/gsi/cwhydromod.f90 @@ -100,14 +100,23 @@ subroutine cw2hydro(sval,clouds,nclouds) call gsi_bundlegetpointer (sval,clouds(ic),sv_rank3,istatus) if (istatus/=0) cycle sv_rank3=zero - do k=1,nsig - do j=1,lon2 - do i=1,lat2 - if (clouds(ic)=='ql') sv_rank3(i,j,k)=cwgues(i,j,k)*(one-work(i,j,k)) - if (clouds(ic)=='qi') sv_rank3(i,j,k)=cwgues(i,j,k)*work(i,j,k) + if (clouds(ic)=='ql') then + do k=1,nsig + do j=1,lon2 + do i=1,lat2 + sv_rank3(i,j,k)=cwgues(i,j,k)*(one-work(i,j,k)) + end do end do end do - end do + else if (clouds(ic)=='qi') then + do k=1,nsig + do j=1,lon2 + do i=1,lat2 + sv_rank3(i,j,k)=cwgues(i,j,k)*work(i,j,k) + end do + end do + end do + end if end do return @@ -174,16 +183,25 @@ subroutine cw2hydro_tl(sval,wbundle,clouds,nclouds) call gsi_bundlegetpointer (sval,clouds(ic),sv_rank3,istatus) if (istatus/=0) cycle sv_rank3=zero - do k=1,nsig - do j=1,lon2 - do i=1,lat2 -! if (clouds(ic)=='ql') sv_rank3(i,j,k)=cv_cw(i,j,k)*(one-work0(i,j,k))-cwgues(i,j,k)*work(i,j,k) -! if (clouds(ic)=='qi') sv_rank3(i,j,k)=cv_cw(i,j,k)*work0(i,j,k)+cwgues(i,j,k)*work(i,j,k) - if (clouds(ic)=='ql') sv_rank3(i,j,k)=cv_cw(i,j,k)*(one-work0(i,j,k)) - if (clouds(ic)=='qi') sv_rank3(i,j,k)=cv_cw(i,j,k)*work0(i,j,k) + if (clouds(ic)=='ql') then + do k=1,nsig + do j=1,lon2 + do i=1,lat2 +! sv_rank3(i,j,k)=cv_cw(i,j,k)*(one-work0(i,j,k))-cwgues(i,j,k)*work(i,j,k) + sv_rank3(i,j,k)=cv_cw(i,j,k)*(one-work0(i,j,k)) + end do end do end do - end do + else if (clouds(ic)=='qi') then + do k=1,nsig + do j=1,lon2 + do i=1,lat2 +! sv_rank3(i,j,k)=cv_cw(i,j,k)*work0(i,j,k)+cwgues(i,j,k)*work(i,j,k) + sv_rank3(i,j,k)=cv_cw(i,j,k)*work0(i,j,k) + end do + end do + end do + end if end do return @@ -226,8 +244,6 @@ subroutine cw2hydro_ad(rval,wbundle,clouds,nclouds) real(r_kind),pointer,dimension(:,:,:) :: cv_cw ! Get pointer to required control variable -call gsi_bundlegetpointer (wbundle,'cw',cv_cw,istatus) -cv_cw=zero do k=1,nsig do j=1,lon2 @@ -239,25 +255,30 @@ subroutine cw2hydro_ad(rval,wbundle,clouds,nclouds) end do end do +call gsi_bundlegetpointer (wbundle,'cw',cv_cw,istatus) do ic=1,nclouds call gsi_bundlegetpointer (rval,clouds(ic),rv_rank3,istatus) if (istatus/=0) cycle - do k=1,nsig - do j=1,lon2 - do i=1,lat2 - if (clouds(ic)=='ql') then + if (clouds(ic)=='ql') then + do k=1,nsig + do j=1,lon2 + do i=1,lat2 cv_cw(i,j,k)=cv_cw(i,j,k)+rv_rank3(i,j,k)*(one-work0(i,j,k)) rv_rank3(i,j,k)=zero - end if - - if (clouds(ic)=='qi') then + end do + end do + end do + else if (clouds(ic)=='qi') then + do k=1,nsig + do j=1,lon2 + do i=1,lat2 cv_cw(i,j,k)=cv_cw(i,j,k)+rv_rank3(i,j,k)*work0(i,j,k) rv_rank3(i,j,k)=zero - end if - + end do end do end do - end do + end if + end do return diff --git a/src/gsi/deter_sfc_mod.f90 b/src/gsi/deter_sfc_mod.f90 index 3c88aabb2a..e4e77283a4 100644 --- a/src/gsi/deter_sfc_mod.f90 +++ b/src/gsi/deter_sfc_mod.f90 @@ -207,7 +207,6 @@ subroutine deter_sfc(alat,alon,dlat_earth,dlon_earth,obstime,isflg, & sfcpct(istyp10)=sfcpct(istyp10)+w10 sfcpct(istyp11)=sfcpct(istyp11)+w11 - isflg = 0 if(sfcpct(0) > 0.99_r_kind)then isflg = 0 else if(sfcpct(1) > 0.99_r_kind)then @@ -517,7 +516,6 @@ subroutine deter_sfc_type(dlat_earth,dlon_earth,obstime,isflg,tsavg) sfcpct(istyp10)=sfcpct(istyp10)+w10 sfcpct(istyp11)=sfcpct(istyp11)+w11 - isflg = 0 if(sfcpct(0) > 0.99_r_kind)then isflg = 0 else if(sfcpct(1) > 0.99_r_kind)then @@ -1109,7 +1107,7 @@ subroutine deter_sfc_fov(fov_flag,ifov,instr,ichan,sat_aziang,dlat_earth_deg,& do i = min_i(j), max_i(j) call reduce2full(i,j,ifull) call time_int_sfc(ifull,j,itsfc,itsfcp,dtsfc,dtsfcp,sfc_mdl) -!$omp parallel do schedule(dynamic,1)private(jjj,iii,lat_mdl,lon_mdl) +!$omp parallel do schedule(dynamic,1) private(jjj,iii,lat_mdl,lon_mdl) do jjj = 1, subgrid_lengths_y if (y_off(jjj) >= zero) then lat_mdl = (one-y_off(jjj))*rlats_sfc(j)+y_off(jjj)*rlats_sfc(j+1) @@ -1316,7 +1314,6 @@ subroutine deter_sfc_amsre_low(dlat_earth,dlon_earth,isflg,sfcpct) ! sfcpct(3)=min(sfcpct(3),sfcpct(1)) ! sfcpct(1)=max(zero,sfcpct(1)-sfcpct(3)) - isflg = 0 if(sfcpct(0) > 0.99_r_kind)then isflg = 0 else if(sfcpct(1) > 0.99_r_kind)then @@ -1482,7 +1479,6 @@ subroutine deter_sfc_gmi(dlat_earth,dlon_earth,isflg,sfcpct) ! sfcpct(3)=min(sfcpct(3),sfcpct(1)) ! sfcpct(1)=max(zero,sfcpct(1)-sfcpct(3)) - isflg = 0 if(sfcpct(0) > 0.99_r_kind)then isflg = 0 else if(sfcpct(1) > 0.99_r_kind)then @@ -1986,7 +1982,6 @@ subroutine calc_sfc(sfc_sum,isflg,idomsfc,sfcpct,vfr,sty,vty,sm, & sfcr = sfc_sum%sfcr/count_tot zz = sfc_sum%zz/count_tot - isflg = 0 if(sfcpct(0) > 0.99_r_kind)then isflg = 0 ! open water else if(sfcpct(1) > 0.99_r_kind)then diff --git a/src/gsi/en_perts_io.f90 b/src/gsi/en_perts_io.f90 index 1a9dc58a50..f873a8520f 100644 --- a/src/gsi/en_perts_io.f90 +++ b/src/gsi/en_perts_io.f90 @@ -124,7 +124,7 @@ subroutine en_perts_get_from_save_fulldomain do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n call stop2(999) @@ -142,7 +142,7 @@ subroutine en_perts_get_from_save_fulldomain do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars2d(ic2)),w2,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n call stop2(999) @@ -221,7 +221,7 @@ subroutine en_perts_get_from_save ! do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n call stop2(999) @@ -238,7 +238,7 @@ subroutine en_perts_get_from_save do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars2d(ic2)),w2,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n call stop2(999) @@ -289,6 +289,7 @@ subroutine en_perts_save use kinds, only: r_kind,i_kind,r_single use gsi_bundlemod, only: GSI_BundleGetPointer use mpeu_util, only: die + use hybrid_ensemble_parameters, only: nsclgrp implicit none real(r_single),pointer,dimension(:,:,:):: w3 @@ -300,6 +301,10 @@ subroutine en_perts_save integer(i_kind) ic3,ic2 integer(i_kind) iunit + if(nsclgrp>1) then + write(6,*)"nsclgrp >1 is not considerred in this part, stop" + stop + endif iunit=20 write(filename,'(a,I4.4)') 'saved_en_perts.pe',mype @@ -312,7 +317,7 @@ subroutine en_perts_save ! do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n call stop2(999) @@ -324,7 +329,7 @@ subroutine en_perts_save end do do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars2d(ic2)),w2,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n call stop2(999) diff --git a/src/gsi/ens_spread_mod.f90 b/src/gsi/ens_spread_mod.f90 index afab9737ac..da70d31ab0 100644 --- a/src/gsi/ens_spread_mod.f90 +++ b/src/gsi/ens_spread_mod.f90 @@ -90,7 +90,7 @@ subroutine ens_spread_dualres_regional(en_bar) do n=1,n_ens do i=1,nelen sube%values(i)=sube%values(i) & - +en_perts(n,1)%valuesr4(i)*en_perts(n,1)%valuesr4(i) + +en_perts(n,1,1)%valuesr4(i)*en_perts(n,1,1)%valuesr4(i) end do end do @@ -101,7 +101,7 @@ subroutine ens_spread_dualres_regional(en_bar) do n=1,n_ens do i=1,nelen sube%values(i)=sube%values(i) & - +(en_perts(n,1)%valuesr4(i)-en_bar%values(i))*(en_perts(n,1)%valuesr4(i)-en_bar%values(i)) + +(en_perts(n,1,1)%valuesr4(i)-en_bar%values(i))*(en_perts(n,1,1)%valuesr4(i)-en_bar%values(i)) end do end do diff --git a/src/gsi/ensctl2model.f90 b/src/gsi/ensctl2model.f90 index 525bf33af6..12e1fe374e 100644 --- a/src/gsi/ensctl2model.f90 +++ b/src/gsi/ensctl2model.f90 @@ -43,6 +43,7 @@ subroutine ensctl2model(xhat,mval,eval) use gsi_metguess_mod, only: gsi_metguess_get use mod_strong, only: tlnmc_option use timermod, only: timer_ini,timer_fnl +use hybrid_ensemble_parameters,only: naensgrp implicit none ! Declare passed variables @@ -58,7 +59,7 @@ subroutine ensctl2model(xhat,mval,eval) integer(i_kind), parameter :: ncvars = 5 integer(i_kind) :: icps(ncvars) type(gsi_bundle):: wbundle_c ! work bundle -type(gsi_bundle),allocatable :: ebundle(:) +type(gsi_bundle),allocatable :: ebundle(:,:) character(len=3), parameter :: mycvars(ncvars) = (/ & ! vars from CV needed here 'sf ', 'vp ', 'ps ', 't ', & 'q '/) @@ -77,6 +78,7 @@ subroutine ensctl2model(xhat,mval,eval) logical :: do_getprs_tl,do_normal_rh_to_q,do_tv_to_tsen,do_getuv,lstrong_bk_vars logical :: do_tlnmc,do_q_copy +integer(i_kind) :: ig ! **************************************************************************** ! Initialize timer @@ -117,17 +119,21 @@ subroutine ensctl2model(xhat,mval,eval) do_tlnmc = lstrong_bk_vars .and. ( (tlnmc_option==3) .or. & (jj==ibin_anl .and. tlnmc_option==2) ) - allocate(ebundle(n_ens)) - do nn=1,n_ens - call gsi_bundlecreate (ebundle(nn),xhat%aens(1,1),'c2m ensemble work',istatus) - if(istatus/=0) then - write(6,*) trim(myname), ': trouble creating work ens-bundle' - call stop2(999) - endif + allocate(ebundle(naensgrp,n_ens)) + do ig=1,naensgrp + do nn=1,n_ens + call gsi_bundlecreate (ebundle(ig,nn),xhat%aens(1,1,1),'c2m ensemble work',istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble creating work ens-bundle' + call stop2(999) + endif + enddo enddo ! Apply square-root of ensemble error covariance - call ckgcov_a_en_new_factorization(xhat%aens(jj,1)%values(:),ebundle) + do ig=1,naensgrp + call ckgcov_a_en_new_factorization(ig,xhat%aens(jj,ig,1)%values(:),ebundle(ig,:)) + enddo call sqrt_beta_e_mult(ebundle) ! Initialize ensemble contribution to zero @@ -230,12 +236,14 @@ subroutine ensctl2model(xhat,mval,eval) call stop2(999) endif - do nn=n_ens,1,-1 ! first in; last out - call gsi_bundledestroy(ebundle(nn),istatus) - if(istatus/=0) then - write(6,*) trim(myname), ': trouble destroying work ens bundle, ', istatus - call stop2(999) - endif + do ig=1,naensgrp + do nn=n_ens,1,-1 ! first in; last out + call gsi_bundledestroy(ebundle(ig,nn),istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble destroying work ens bundle, ', istatus + call stop2(999) + endif + enddo enddo deallocate(ebundle) diff --git a/src/gsi/ensctl2model_ad.f90 b/src/gsi/ensctl2model_ad.f90 index 8c491b6de8..706dafc59c 100644 --- a/src/gsi/ensctl2model_ad.f90 +++ b/src/gsi/ensctl2model_ad.f90 @@ -42,6 +42,7 @@ subroutine ensctl2model_ad(eval,mval,grad) use gsi_metguess_mod, only: gsi_metguess_get use mod_strong, only: tlnmc_option use timermod, only: timer_ini,timer_fnl +use hybrid_ensemble_parameters,only: naensgrp implicit none ! Declare passed variables @@ -57,7 +58,7 @@ subroutine ensctl2model_ad(eval,mval,grad) integer(i_kind), parameter :: ncvars = 5 integer(i_kind) :: icps(ncvars) type(gsi_bundle):: wbundle_c ! work bundle -type(gsi_bundle),allocatable :: ebundle(:) +type(gsi_bundle),allocatable :: ebundle(:,:) real(r_kind) :: grade(nval_lenz_en) character(len=3), parameter :: mycvars(ncvars) = (/ & ! vars from CV needed here 'sf ', 'vp ', 'ps ', 't ', & @@ -77,7 +78,7 @@ subroutine ensctl2model_ad(eval,mval,grad) logical :: do_getuv,do_tv_to_tsen_ad,do_normal_rh_to_q_ad,do_getprs_ad logical :: do_tlnmc,lstrong_bk_vars,do_q_copy - +integer(i_kind) :: ig !**************************************************************************** ! Initialize timer @@ -122,13 +123,15 @@ subroutine ensctl2model_ad(eval,mval,grad) (jj==ibin_anl .and. tlnmc_option==2) ) !allocate(grade(nval_lenz_en)) - allocate(ebundle(n_ens)) - do nn=1,n_ens - call gsi_bundlecreate (ebundle(nn),grad%aens(1,1),'m2c ensemble work',istatus) - if(istatus/=0) then - write(6,*) trim(myname), ': trouble creating work ens-bundle' - call stop2(999) - endif + allocate(ebundle(naensgrp,n_ens)) + do ig=1,naensgrp + do nn=1,n_ens + call gsi_bundlecreate (ebundle(ig,nn),grad%aens(1,1,1),'m2c ensemble work',istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble creating work ens-bundle' + call stop2(999) + endif + enddo enddo ! Create a temporary bundle similar to grad, and copy contents of grad into it @@ -210,8 +213,10 @@ subroutine ensctl2model_ad(eval,mval,grad) if(do_getprs_ad) call getprs_ad(cv_ps,cv_tv,rv_prse) end if - do nn=1,n_ens - ebundle(nn)%values=grad%aens(jj,nn)%values + do ig=1,naensgrp + do nn=1,n_ens + ebundle(ig,nn)%values=grad%aens(jj,ig,nn)%values + enddo enddo if(dual_res) then call ensemble_forward_model_ad_dual_res(wbundle_c,ebundle,jj) @@ -222,7 +227,23 @@ subroutine ensctl2model_ad(eval,mval,grad) ! Apply square-root of ensemble error covariance call sqrt_beta_e_mult(ebundle) - call ckgcov_a_en_new_factorization_ad(grade,ebundle) + do ig=1,naensgrp + call ckgcov_a_en_new_factorization_ad(ig,grade,ebundle(ig,:)) + + do ii=1,n_ens + grad%aens(jj,ig,ii)%values=grad%aens(jj,ig,ii)%values + grade + enddo + enddo + + do ig=1,naensgrp + do nn=n_ens,1,-1 ! first in; last out + call gsi_bundledestroy(ebundle(ig,nn),istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble destroying work ens bundle', ig, nn, istatus + call stop2(999) + endif + enddo + enddo call gsi_bundledestroy(wbundle_c,istatus) if (istatus/=0) then @@ -230,20 +251,6 @@ subroutine ensctl2model_ad(eval,mval,grad) call stop2(999) endif - do ii=1,n_ens - grad%aens(jj,ii)%values=grad%aens(jj,ii)%values + grade - enddo -! do ii=1,nval_lenz_en -! grad%aens(jj,1)%values(ii)=grad%aens(jj,1)%values(ii)+grade(ii) -! enddo - - do nn=n_ens,1,-1 ! first in; last out - call gsi_bundledestroy(ebundle(nn),istatus) - if(istatus/=0) then - write(6,*) trim(myname), ': trouble destroying work ens bundle', nn, istatus - call stop2(999) - endif - enddo deallocate(ebundle) ! deallocate(grade) diff --git a/src/gsi/ensctl2state.f90 b/src/gsi/ensctl2state.f90 index 4214b01d85..0d6d3042c5 100644 --- a/src/gsi/ensctl2state.f90 +++ b/src/gsi/ensctl2state.f90 @@ -165,9 +165,9 @@ subroutine ensctl2state(xhat,mval,eval) ! For 4densvar, this is the "3D/Time-invariant contribution from static B" if(dual_res) then - call ensemble_forward_model_dual_res(wbundle_c,xhat%aens(1,:),jj) + call ensemble_forward_model_dual_res(wbundle_c,xhat%aens(1,:,:),jj) else - call ensemble_forward_model(wbundle_c,xhat%aens(1,:),jj) + call ensemble_forward_model(wbundle_c,xhat%aens(1,:,:),jj) end if ! Get pointers to required state variables diff --git a/src/gsi/ensctl2state_ad.f90 b/src/gsi/ensctl2state_ad.f90 index 212d0312c9..4c038c8c6e 100644 --- a/src/gsi/ensctl2state_ad.f90 +++ b/src/gsi/ensctl2state_ad.f90 @@ -260,9 +260,9 @@ subroutine ensctl2state_ad(eval,mval,grad) !$omp end parallel sections if(dual_res) then - call ensemble_forward_model_ad_dual_res(wbundle_c,grad%aens(1,:),jj) + call ensemble_forward_model_ad_dual_res(wbundle_c,grad%aens(1,:,:),jj) else - call ensemble_forward_model_ad(wbundle_c,grad%aens(1,:),jj) + call ensemble_forward_model_ad(wbundle_c,grad%aens(1,:,:),jj) end if end do diff --git a/src/gsi/evaljgrad.f90 b/src/gsi/evaljgrad.f90 index 788454034d..e66ca11b8c 100644 --- a/src/gsi/evaljgrad.f90 +++ b/src/gsi/evaljgrad.f90 @@ -73,6 +73,7 @@ subroutine evaljgrad(xhat,fjcost,gradx,lupdfgs,nprt,calledby) use xhat_vordivmod, only : xhat_vordiv_init, xhat_vordiv_calc, xhat_vordiv_clean use mpeu_util, only: die use mpl_allreducemod, only: mpl_allreduce +use intradmod, only: setrad implicit none @@ -195,6 +196,7 @@ subroutine evaljgrad(xhat,fjcost,gradx,lupdfgs,nprt,calledby) end do qpred=zero_quad +call setrad(sval(1)) ! Compare obs to solution and transpose back to grid (H^T R^{-1} H) call intjo(rval,qpred,sval,sbias) diff --git a/src/gsi/general_read_gfsatm.f90 b/src/gsi/general_read_gfsatm.f90 index 39db75db73..ffdcd90c79 100755 --- a/src/gsi/general_read_gfsatm.f90 +++ b/src/gsi/general_read_gfsatm.f90 @@ -411,6 +411,77 @@ subroutine general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & return end subroutine general_reload2 + +! 2m reload +subroutine general_reload_sfc(grd,g_t2m, g_q2m,g_ps,icount,iflag,work) +! !USES: + use kinds, only: r_kind,i_kind + use mpimod, only: npe,mpi_comm_world,ierror,mpi_rtype + use general_sub2grid_mod, only: sub2grid_info + + implicit none +! !INPUT PARAMETERS: + + type(sub2grid_info), intent(in ) :: grd + integer(i_kind), intent(inout) :: icount + integer(i_kind),dimension(npe), intent(inout) :: iflag + real(r_kind),dimension(grd%itotsub),intent(in ) :: work + +! !OUTPUT PARAMETERS: + + real(r_kind),dimension(grd%lat2,grd%lon2), intent( out) :: g_t2m,& + g_q2m, g_ps + +! !DESCRIPTION: version of general_reload, for 2m variables. +! +! !REVISION HISTORY: +! 2023-03-2 Draper +!------------------------------------------------------------------------- + + integer(i_kind) i,j,ij,k + real(r_kind),dimension(grd%lat2*grd%lon2,npe):: sub + + call mpi_alltoallv(work,grd%sendcounts_s,grd%sdispls_s,mpi_rtype,& + sub,grd%recvcounts_s,grd%rdispls_s,mpi_rtype,& + mpi_comm_world,ierror) + +!$omp parallel do schedule(dynamic,1) private(k,i,j,ij) + + do k=1,icount + if ( iflag(k) == 2 ) then + ij=0 + do j=1,grd%lon2 + do i=1,grd%lat2 + ij=ij+1 + g_t2m(i,j)=sub(ij,k) + enddo + enddo + elseif ( iflag(k) == 3 ) then + ij=0 + do j=1,grd%lon2 + do i=1,grd%lat2 + ij=ij+1 + g_q2m(i,j)=sub(ij,k) + enddo + enddo + elseif ( iflag(k) == 4 ) then + ij=0 + do j=1,grd%lon2 + do i=1,grd%lat2 + ij=ij+1 + g_ps(i,j)=sub(ij,k) + enddo + enddo + endif + enddo ! do k=1,icount + + icount=0 + iflag=0 + + return + +end subroutine general_reload_sfc + end module gfsreadmod subroutine general_read_gfsatm(grd,sp_a,sp_b,filename,uvflag,vordivflag,zflag, & @@ -431,6 +502,7 @@ subroutine general_read_gfsatm(grd,sp_a,sp_b,filename,uvflag,vordivflag,zflag, & ! 2014-11-30 todling - genelize interface to handle bundle instead of fields; ! internal code should be generalized ! 2014-12-03 derber - introduce vordivflag, zflag and optimize routines +! 2023-03-23 draper - added option to read sfc files (for 2m variables) ! ! input argument list: ! grd - structure variable containing information about grid @@ -1892,7 +1964,7 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & use gsi_bundlemod, only: gsi_bundlegetpointer use module_ncio, only: Dataset, Variable, Dimension, open_dataset,& close_dataset, get_dim, read_vardata,get_idate_from_time_units - use gfsreadmod, only: general_reload + use gfsreadmod, only: general_reload, general_reload_sfc implicit none @@ -1910,6 +1982,7 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & real(r_kind),pointer,dimension(:,:) :: ptr2d real(r_kind),pointer,dimension(:,:,:) :: ptr3d real(r_kind),pointer,dimension(:,:) :: g_ps + real(r_kind),pointer,dimension(:,:) :: g_t2m, g_q2m real(r_kind),pointer,dimension(:,:,:) :: g_vor,g_div,& g_cwmr,g_q,g_oz,g_tv @@ -1942,10 +2015,9 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & logical :: procuse,diff_res,eqspace type(egrid2agrid_parm) :: p_high logical,dimension(1) :: vector - type(Dataset) :: atmges + type(Dataset) :: filges type(Dimension) :: ncdim - - + logical :: read_2m, read_z !****************************************************************************** ! Initialize variables used below @@ -1959,6 +2031,19 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & mype_use=-1 icount=0 procuse=.false. + + if (filename(1:3) == 'sfc') then + read_2m = .true. + read_z = .false. + if ( mype == 0 ) write(6,* ) & + trim(my_name), ': reading 2m variables from ', trim(filename) + else + read_2m = .false. + read_z = zflag + if ( mype == 0 ) write(6,* ) & + trim(my_name), ': reading atmos variables from ', trim(filename) + endif + if ( mype == 0 ) procuse = .true. do i=1,npe if ( grd%recvcounts_s(i-1) > 0 ) then @@ -1992,20 +2077,21 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & if ( procuse ) then - atmges = open_dataset(filename, paropen=.true., mpicomm=mpi_comm_read) + filges = open_dataset(filename, paropen=.true., mpicomm=mpi_comm_read) ! get dimension sizes - ncdim = get_dim(atmges, 'grid_xt'); lonb = ncdim%len - ncdim = get_dim(atmges, 'grid_yt'); latb = ncdim%len - ncdim = get_dim(atmges, 'pfull'); levs = ncdim%len + ncdim = get_dim(filges, 'grid_xt'); lonb = ncdim%len + ncdim = get_dim(filges, 'grid_yt'); latb = ncdim%len + if (.not. read_2m) & + ncdim = get_dim(filges, 'pfull'); levs = ncdim%len ! get time information - idate = get_idate_from_time_units(atmges) + idate = get_idate_from_time_units(filges) odate(1) = idate(4) !hour odate(2) = idate(2) !month odate(3) = idate(3) !day odate(4) = idate(1) !year - call read_vardata(atmges, 'time', fhour) ! might need to change this to attribute later + call read_vardata(filges, 'time', fhour) ! might need to change this to attribute later ! depends on model changes from ! Jeff Whitaker fhour = float(nint(fhour)) @@ -2030,11 +2116,13 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & trim(my_name),grd%nlon,lonb !call stop2(101) endif - if ( levs /= grd%nsig ) then - if ( mype == 0 ) write(6, & - '(a,'': inconsistent spatial dimension nsig = '',i4,tr1,''levs = '',i4)') & - trim(my_name),grd%nsig,levs - call stop2(101) + if (.not. read_2m) then + if ( levs /= grd%nsig ) then + if ( mype == 0 ) write(6, & + '(a,'': inconsistent spatial dimension nsig = '',i4,tr1,''levs = '',i4)') & + trim(my_name),grd%nsig,levs + call stop2(101) + endif endif allocate( spec_vor(sp_a%nc), spec_div(sp_a%nc) ) @@ -2047,8 +2135,8 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & allocate(rwork3d1(lonb,latb,1)) allocate(rwork2d(lonb,latb)) allocate(rlats(latb+2),rlons(lonb),clons(lonb),slons(lonb)) - call read_vardata(atmges, 'grid_xt', rlons_tmp) - call read_vardata(atmges, 'grid_yt', rlats_tmp) + call read_vardata(filges, 'grid_xt', rlons_tmp) + call read_vardata(filges, 'grid_yt', rlats_tmp) do j=1,latb rlats(latb+2-j)=deg2rad*rlats_tmp(j) end do @@ -2073,57 +2161,73 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & endif ! if ( procuse ) ! Get pointer to relevant variables (this should be made flexible and general) - iredundant=0 - call gsi_bundlegetpointer(gfs_bundle,'sf',g_div ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - call gsi_bundlegetpointer(gfs_bundle,'div',g_div ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - if ( iredundant==2 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_nems: ERROR' - write(6,*) 'cannot handle having both sf and div' - write(6,*) 'Aborting ... ' - endif - call stop2(999) - endif - iredundant=0 - call gsi_bundlegetpointer(gfs_bundle,'vp',g_vor ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - call gsi_bundlegetpointer(gfs_bundle,'vor',g_vor ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - if ( iredundant==2 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_nems: ERROR' - write(6,*) 'cannot handle having both vp and vor' - write(6,*) 'Aborting ... ' - endif - call stop2(999) - endif - iredundant=0 - call gsi_bundlegetpointer(gfs_bundle,'t' ,g_tv ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - call gsi_bundlegetpointer(gfs_bundle,'tv',g_tv ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - if ( iredundant==2 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_nems: ERROR' - write(6,*) 'cannot handle having both t and tv' - write(6,*) 'Aborting ... ' - endif - call stop2(999) - endif - istatus=0 - call gsi_bundlegetpointer(gfs_bundle,'ps',g_ps ,ier);istatus=istatus+ier - call gsi_bundlegetpointer(gfs_bundle,'q' ,g_q ,ier);istatus=istatus+ier - call gsi_bundlegetpointer(gfs_bundle,'oz',g_oz ,ier);istatus=istatus+ier - call gsi_bundlegetpointer(gfs_bundle,'cw',g_cwmr,ier);istatus=istatus+ier - if ( istatus /= 0 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_nems: ERROR' - write(6,*) 'Missing some of the required fields' - write(6,*) 'Aborting ... ' - endif - call stop2(999) + if (.not. read_2m) then + iredundant=0 + call gsi_bundlegetpointer(gfs_bundle,'sf',g_div ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + call gsi_bundlegetpointer(gfs_bundle,'div',g_div ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + if ( iredundant==2 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_nc: ERROR' + write(6,*) 'cannot handle having both sf and div' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + iredundant=0 + call gsi_bundlegetpointer(gfs_bundle,'vp',g_vor ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + call gsi_bundlegetpointer(gfs_bundle,'vor',g_vor ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + if ( iredundant==2 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_nc: ERROR' + write(6,*) 'cannot handle having both vp and vor' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + iredundant=0 + call gsi_bundlegetpointer(gfs_bundle,'t' ,g_tv ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + call gsi_bundlegetpointer(gfs_bundle,'tv',g_tv ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + if ( iredundant==2 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_nc: ERROR' + write(6,*) 'cannot handle having both t and tv' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + + istatus=0 + call gsi_bundlegetpointer(gfs_bundle,'ps',g_ps ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'q' ,g_q ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'oz',g_oz ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'cw',g_cwmr,ier);istatus=istatus+ier + if ( istatus /= 0 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_nc: ERROR' + write(6,*) 'Missing some of the required fields' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + else ! read 2m vars + istatus=0 + call gsi_bundlegetpointer(gfs_bundle,'t2m',g_t2m ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'q2m',g_q2m ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'ps',g_ps ,ier);istatus=istatus+ier + if ( istatus /= 0 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_nc: ERROR' + write(6,*) 'Missing 2m required variables' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif endif allocate(g_u(grd%lat2,grd%lon2,grd%nsig),g_v(grd%lat2,grd%lon2,grd%nsig)) allocate(g_z(grd%lat2,grd%lon2)) @@ -2135,8 +2239,8 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & ! Once on the grid, fields need to be scattered from the full domain to ! sub-domains. - ! Only read Terrain when zflag is true. - if ( zflag ) then + ! Only read Terrain when read_z is true. + if ( read_z ) then icount=icount+1 iflag(icount)=1 @@ -2145,7 +2249,7 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & ! Terrain: spectral --> grid transform, scatter to all mpi tasks if (mype==mype_use(icount)) then ! read hs - call read_vardata(atmges, 'hgtsfc', rwork2d) + call read_vardata(filges, 'hgtsfc', rwork2d) if ( diff_res ) then grid_b=rwork2d vector(1)=.false. @@ -2161,415 +2265,498 @@ subroutine general_read_gfsatm_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & call general_fill_ns(grd,grid,work) endif endif - if ( icount == icm ) then + if ( icount == icm ) then call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & icount,iflag,ilev,work,uvflag,vordivflag) endif endif - icount=icount+1 - iflag(icount)=2 - ilev(icount)=1 + if (.not. read_2m) then + + icount=icount+1 + iflag(icount)=2 + ilev(icount)=1 + + ! Surface pressure: same procedure as terrain + if (mype==mype_use(icount)) then + ! read ps + call read_vardata(filges, 'pressfc', rwork2d) + rwork2d = r0_001*rwork2d ! convert Pa to cb + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + + ! Thermodynamic variable: s-->g transform, communicate to all tasks + ! For multilevel fields, each task handles a given level. Periodic + ! mpi_alltoallv calls communicate the grids to all mpi tasks. + ! Finally, the grids are loaded into guess arrays used later in the + ! code. + + do k=1,nlevs + + icount=icount+1 + iflag(icount)=3 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'spfh', rwork3d1, nslice=kr, slicedim=3) + call read_vardata(filges, 'tmp', rwork3d0, nslice=kr, slicedim=3) + rwork2d = rwork3d0(:,:,1) * (one+fv*rwork3d1(:,:,1)) + if ( diff_res ) then + grid_b=rwork2d + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + + if ( vordivflag .or. .not. uvflag ) then + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + icount=icount+1 + iflag(icount)=4 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + ! Vorticity + ! Convert grid u,v to div and vor + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work_v(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid_v(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) + endif + allocate( grid_vor(grd%nlon,nlatm2)) + call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) + call general_sptez_s_b(sp_a,sp_a,spec_vor,grid_vor,1) + ! Load values into rows for south and north pole + call general_fill_ns(grd,grid_vor,work) + deallocate(grid_vor) + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + + end do + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + + icount=icount+1 + iflag(icount)=5 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + ! Divergence + ! Convert grid u,v to div and vor + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work_v(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid_v(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) + endif + allocate( grid_div(grd%nlon,nlatm2) ) + call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) + call general_sptez_s_b(sp_a,sp_a,spec_div,grid_div,1) + ! Load values into rows for south and north pole + call general_fill_ns(grd,grid_div,work) + deallocate(grid_div) + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + + end do + endif ! if ( vordivflag .or. .not. uvflag ) + if ( uvflag ) then + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + icount=icount+1 + iflag(icount)=6 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) + endif + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + + icount=icount+1 + iflag(icount)=7 + ilev(icount)=k + + if (mype==mype_use(icount)) then + ! V + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + ! Note work_v and work are switched because output must be in work. + call general_filluv_ns(grd,slons,clons,grid,grid_v,work_v,work) + endif + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + endif ! if ( uvflag ) + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + icount=icount+1 + iflag(icount)=8 + ilev(icount)=k + + if (mype==mype_use(icount)) then + ! Specific humidity + call read_vardata(filges, 'spfh', rwork3d0, nslice=kr, slicedim=3) + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid = rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + + icount=icount+1 + iflag(icount)=9 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'o3mr', rwork3d0, nslice=kr, slicedim=3) + ! Ozone mixing ratio + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + + do k=1,nlevs + icount=icount+1 + iflag(icount)=10 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'clwmr', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'icmr', rwork3d1, nslice=kr, slicedim=3) + ! Cloud condensate mixing ratio. + rwork2d = rwork3d0(:,:,1)+rwork3d1(:,:,1) + if ( diff_res ) then + grid_b=rwork2d + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + + endif + + if ( icount == icm .or. k == nlevs ) then + call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & + icount,iflag,ilev,work,uvflag,vordivflag) + endif + + enddo ! do k=1,nlevs + else ! read_2m + + icount=icount+1 + iflag(icount)=2 + + ! 2m temperature from sfc file + if (mype==mype_use(icount)) then + call read_vardata(filges, 'tmp2m', rwork2d) + + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + + icount=icount + 1 + iflag(icount)=3 + + ! 2m humidity from sfc file + if (mype==mype_use(icount)) then + call read_vardata(filges, 'spfh2m', rwork2d) + + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + + icount=icount + 1 + iflag(icount)=4 + + if (mype==mype_use(icount)) then + ! read ps + call read_vardata(filges, 'pressfc', rwork2d) + rwork2d = r0_001*rwork2d ! convert Pa to cb + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + + ! not using all procs. doesn't trigger. todo: figure out trigger + ! for when reading fewer vars. + !if ( icount == icm ) then + call general_reload_sfc(grd,g_t2m, g_q2m, g_ps, icount,iflag,work) + !endif + + endif ! read_2m - ! Surface pressure: same procedure as terrain - if (mype==mype_use(icount)) then - ! read ps - call read_vardata(atmges, 'pressfc', rwork2d) - rwork2d = r0_001*rwork2d ! convert Pa to cb - if ( diff_res ) then - vector(1)=.false. - grid_b=rwork2d - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork2d - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) + if ( procuse ) then + if ( diff_res) deallocate(grid_b,grid_b2,grid_c,grid_c2,grid2) + call destroy_egrid2agrid(p_high) + deallocate(spec_div,spec_vor) + deallocate(rwork3d1,rwork3d0,clons,slons) + deallocate(rwork2d) + deallocate(grid,grid_v) + call close_dataset(filges) endif + deallocate(work) - ! Thermodynamic variable: s-->g transform, communicate to all tasks - ! For multilevel fields, each task handles a given level. Periodic - ! mpi_alltoallv calls communicate the grids to all mpi tasks. - ! Finally, the grids are loaded into guess arrays used later in the - ! code. - - do k=1,nlevs + ! Convert dry temperature to virtual temperature + !do k=1,grd%nsig + ! do j=1,grd%lon2 + ! do i=1,grd%lat2 + ! g_tv(i,j,k) = g_tv(i,j,k)*(one+fv*g_q(i,j,k)) + ! enddo + ! enddo + !enddo - icount=icount+1 - iflag(icount)=3 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip + ! Load u->div and v->vor slot when uv are used instead + if ( .not. read_2m ) then + if ( uvflag ) then + call gsi_bundlegetpointer(gfs_bundle,'u' ,ptr3d,ier) + if ( ier == 0 ) then + ptr3d=g_u + call gsi_bundlegetpointer(gfs_bundle,'v' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_v + else ! in this case, overload: return u/v in sf/vp slot + call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) + if ( ier == 0 ) then + ptr3d=g_u + call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_v + endif + endif + else ! in this case, overload: return u/v in sf/vp slot + call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_u + call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_v + endif + endif ! read_2m + if (read_z) then + call gsi_bundlegetpointer(gfs_bundle,'z' ,ptr2d,ier) + if ( ier == 0 ) ptr2d=g_z + endif - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'spfh', rwork3d1, nslice=kr, slicedim=3) - call read_vardata(atmges, 'tmp', rwork3d0, nslice=kr, slicedim=3) - rwork2d = rwork3d0(:,:,1) * (one+fv*rwork3d1(:,:,1)) - if ( diff_res ) then - grid_b=rwork2d - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork2d - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do + ! Clean up + deallocate(g_z) + deallocate(g_u,g_v) - if ( vordivflag .or. .not. uvflag ) then - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - icount=icount+1 - iflag(icount)=4 - ilev(icount)=k + ! Print date/time stamp + if ( mype == 0 ) then + write(6,700) lonb,latb,nlevs,grd%nlon,nlatm2,& + fhour,odate,trim(filename) +700 format('GENERAL_READ_GFSATM_NC: read lonb,latb,levs=',& + 3i6,', scatter nlon,nlat=',2i6,', hour=',f6.1,', idate=',4i5,1x,a) + endif - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - ! Vorticity - ! Convert grid u,v to div and vor - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work_v(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid_v(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) - endif - allocate( grid_vor(grd%nlon,nlatm2)) - call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) - call general_sptez_s_b(sp_a,sp_a,spec_vor,grid_vor,1) - ! Load values into rows for south and north pole - call general_fill_ns(grd,grid_vor,work) - deallocate(grid_vor) - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif + return - end do - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip +end subroutine general_read_gfsatm_nc - icount=icount+1 - iflag(icount)=5 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - ! Divergence - ! Convert grid u,v to div and vor - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work_v(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid_v(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) - endif - allocate( grid_div(grd%nlon,nlatm2) ) - call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) - call general_sptez_s_b(sp_a,sp_a,spec_div,grid_div,1) - ! Load values into rows for south and north pole - call general_fill_ns(grd,grid_div,work) - deallocate(grid_div) - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - - end do - endif ! if ( vordivflag .or. .not. uvflag ) - if ( uvflag ) then - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - icount=icount+1 - iflag(icount)=6 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) - endif - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - - icount=icount+1 - iflag(icount)=7 - ilev(icount)=k - - if (mype==mype_use(icount)) then - ! V - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - ! Note work_v and work are switched because output must be in work. - call general_filluv_ns(grd,slons,clons,grid,grid_v,work_v,work) - endif - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - endif ! if ( uvflag ) - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - icount=icount+1 - iflag(icount)=8 - ilev(icount)=k - - if (mype==mype_use(icount)) then - ! Specific humidity - call read_vardata(atmges, 'spfh', rwork3d0, nslice=kr, slicedim=3) - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid = rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - - icount=icount+1 - iflag(icount)=9 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'o3mr', rwork3d0, nslice=kr, slicedim=3) - ! Ozone mixing ratio - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - - do k=1,nlevs - icount=icount+1 - iflag(icount)=10 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'clwmr', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'icmr', rwork3d1, nslice=kr, slicedim=3) - ! Cloud condensate mixing ratio. - rwork2d = rwork3d0(:,:,1)+rwork3d1(:,:,1) - if ( diff_res ) then - grid_b=rwork2d - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork2d - call general_fill_ns(grd,grid,work) - endif - - endif - - if ( icount == icm .or. k == nlevs ) then - call general_reload(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz,g_cwmr, & - icount,iflag,ilev,work,uvflag,vordivflag) - endif - - enddo ! do k=1,nlevs - - if ( procuse ) then - if ( diff_res) deallocate(grid_b,grid_b2,grid_c,grid_c2,grid2) - call destroy_egrid2agrid(p_high) - deallocate(spec_div,spec_vor) - deallocate(rwork3d1,rwork3d0,clons,slons) - deallocate(rwork2d) - deallocate(grid,grid_v) - call close_dataset(atmges) - endif - deallocate(work) - - ! Convert dry temperature to virtual temperature - !do k=1,grd%nsig - ! do j=1,grd%lon2 - ! do i=1,grd%lat2 - ! g_tv(i,j,k) = g_tv(i,j,k)*(one+fv*g_q(i,j,k)) - ! enddo - ! enddo - !enddo - - ! Load u->div and v->vor slot when uv are used instead - if ( uvflag ) then - call gsi_bundlegetpointer(gfs_bundle,'u' ,ptr3d,ier) - if ( ier == 0 ) then - ptr3d=g_u - call gsi_bundlegetpointer(gfs_bundle,'v' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_v - else ! in this case, overload: return u/v in sf/vp slot - call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) - if ( ier == 0 ) then - ptr3d=g_u - call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_v - endif - endif - else ! in this case, overload: return u/v in sf/vp slot - call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_u - call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_v - endif - if (zflag) then - call gsi_bundlegetpointer(gfs_bundle,'z' ,ptr2d,ier) - if ( ier == 0 ) ptr2d=g_z - endif - - ! Clean up - deallocate(g_z) - deallocate(g_u,g_v) - - ! Print date/time stamp - if ( mype == 0 ) then - write(6,700) lonb,latb,nlevs,grd%nlon,nlatm2,& - fhour,odate,trim(filename) -700 format('GENERAL_READ_GFSATM_NC: read lonb,latb,levs=',& - 3i6,', scatter nlon,nlat=',2i6,', hour=',f6.1,', idate=',4i5,1x,a) - endif - - return - -end subroutine general_read_gfsatm_nc subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,zflag, & gfs_bundle,iret_read) !$$$ subprogram documentation block @@ -2618,7 +2805,7 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z use gsi_bundlemod, only: gsi_bundlegetpointer use module_ncio, only: Dataset, Variable, Dimension, open_dataset,& close_dataset, get_dim, read_vardata,get_idate_from_time_units - use gfsreadmod, only: general_reload2 + use gfsreadmod, only: general_reload2, general_reload_sfc use ncepnems_io, only: imp_physics implicit none @@ -2637,6 +2824,7 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z real(r_kind),pointer,dimension(:,:) :: ptr2d real(r_kind),pointer,dimension(:,:,:) :: ptr3d real(r_kind),pointer,dimension(:,:) :: g_ps + real(r_kind),pointer,dimension(:,:) :: g_t2m, g_q2m real(r_kind),pointer,dimension(:,:,:) :: g_vor,g_div,& g_q,g_oz,g_tv real(r_kind),pointer,dimension(:,:,:) :: g_ql,g_qi,g_qr,g_qs,g_qg @@ -2668,8 +2856,9 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z logical :: procuse,diff_res,eqspace type(egrid2agrid_parm) :: p_high logical,dimension(1) :: vector - type(Dataset) :: atmges + type(Dataset) :: filges type(Dimension) :: ncdim + logical :: read_2m, read_z @@ -2685,6 +2874,19 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z mype_use=-1 icount=0 procuse=.false. + + if (filename(1:3) == 'sfc') then + read_2m = .true. + read_z = .false. + if ( mype == 0 ) write(6,* ) & + trim(my_name), ': reading 2m variables from ', trim(filename) + else + read_2m = .false. + read_z = zflag + if ( mype == 0 ) write(6,* ) & + trim(my_name), ': reading atmos variables from ', trim(filename) + endif + if ( mype == 0 ) procuse = .true. do i=1,npe if ( grd%recvcounts_s(i-1) > 0 ) then @@ -2694,26 +2896,26 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z endif enddo icm=icount - allocate( work(grd%itotsub),work_v(grd%itotsub) ) + allocate( work(grd%itotsub)) work=zero - work_v=zero if ( procuse ) then - atmges = open_dataset(filename, paropen=.true.) + filges = open_dataset(filename, paropen=.true.) ! get dimension sizes - ncdim = get_dim(atmges, 'grid_xt'); lonb = ncdim%len - ncdim = get_dim(atmges, 'grid_yt'); latb = ncdim%len - ncdim = get_dim(atmges, 'pfull'); levs = ncdim%len + ncdim = get_dim(filges, 'grid_xt'); lonb = ncdim%len + ncdim = get_dim(filges, 'grid_yt'); latb = ncdim%len + if (.not. read_2m) & + ncdim = get_dim(filges, 'pfull'); levs = ncdim%len ! get time information - idate = get_idate_from_time_units(atmges) + idate = get_idate_from_time_units(filges) odate(1) = idate(4) !hour odate(2) = idate(2) !month odate(3) = idate(3) !day odate(4) = idate(1) !year - call read_vardata(atmges, 'time', fhour) ! might need to change this to attribute later + call read_vardata(filges, 'time', fhour) ! might need to change this to attribute later ! depends on model changes from ! Jeff Whitaker fhour = float(nint(fhour)) @@ -2738,11 +2940,13 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z trim(my_name),grd%nlon,lonb !call stop2(101) endif - if ( levs /= grd%nsig ) then - if ( mype == 0 ) write(6, & - '(a,'': inconsistent spatial dimension nsig = '',i4,tr1,''levs = '',i4)') & - trim(my_name),grd%nsig,levs - call stop2(101) + if (.not. read_2m) then + if ( levs /= grd%nsig ) then + if ( mype == 0 ) write(6, & + '(a,'': inconsistent spatial dimension nsig = '',i4,tr1,''levs = '',i4)') & + trim(my_name),grd%nsig,levs + call stop2(101) + endif endif allocate( spec_vor(sp_a%nc), spec_div(sp_a%nc) ) @@ -2755,8 +2959,8 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z allocate(rwork3d1(lonb,latb,1)) allocate(rwork2d(lonb,latb)) allocate(rlats(latb+2),rlons(lonb),clons(lonb),slons(lonb)) - call read_vardata(atmges, 'grid_xt', rlons_tmp) - call read_vardata(atmges, 'grid_yt', rlats_tmp) + call read_vardata(filges, 'grid_xt', rlons_tmp) + call read_vardata(filges, 'grid_yt', rlats_tmp) do j=1,latb rlats(latb+2-j)=deg2rad*rlats_tmp(j) end do @@ -2781,63 +2985,79 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z endif ! if ( procuse ) ! Get pointer to relevant variables (this should be made flexible and general) - iredundant=0 - call gsi_bundlegetpointer(gfs_bundle,'sf',g_div ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - call gsi_bundlegetpointer(gfs_bundle,'div',g_div ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - if ( iredundant==2 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' - write(6,*) 'cannot handle having both sf and div' - write(6,*) 'Aborting ... ' - endif - call stop2(999) - endif - iredundant=0 - call gsi_bundlegetpointer(gfs_bundle,'vp',g_vor ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - call gsi_bundlegetpointer(gfs_bundle,'vor',g_vor ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - if ( iredundant==2 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' - write(6,*) 'cannot handle having both vp and vor' - write(6,*) 'Aborting ... ' - endif - call stop2(999) - endif - iredundant=0 - call gsi_bundlegetpointer(gfs_bundle,'t' ,g_tv ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - call gsi_bundlegetpointer(gfs_bundle,'tv',g_tv ,ier) - if ( ier == 0 ) iredundant = iredundant + 1 - if ( iredundant==2 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' - write(6,*) 'cannot handle having both t and tv' - write(6,*) 'Aborting ... ' - endif - call stop2(999) - endif - istatus=0 - call gsi_bundlegetpointer(gfs_bundle,'ps',g_ps ,ier);istatus=istatus+ier - call gsi_bundlegetpointer(gfs_bundle,'q' ,g_q ,ier);istatus=istatus+ier - call gsi_bundlegetpointer(gfs_bundle,'oz',g_oz ,ier);istatus=istatus+ier -! call gsi_bundlegetpointer(gfs_bundle,'cw',g_cwmr,ier);istatus=istatus+ier - call gsi_bundlegetpointer(gfs_bundle,'ql',g_ql ,ier);istatus1=istatus1+ier - call gsi_bundlegetpointer(gfs_bundle,'qi',g_qi ,ier);istatus1=istatus1+ier - call gsi_bundlegetpointer(gfs_bundle,'qr',g_qr ,ier);istatus1=istatus1+ier - call gsi_bundlegetpointer(gfs_bundle,'qs',g_qs ,ier);istatus1=istatus1+ier - call gsi_bundlegetpointer(gfs_bundle,'qg',g_qg ,ier);istatus1=istatus1+ier -! call gsi_bundlegetpointer(gfs_bundle,'cf',g_cf ,ier);istatus1=istatus1+ier - if ( istatus1 /= 0 ) then - if ( mype == 0 ) then - write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' - write(6,*) 'Missing some of the required hydrometeor fields for imp_physics = ', imp_physics - write(6,*) 'Aborting ... ' - endif - call stop2(999) + if (.not. read_2m) then + iredundant=0 + call gsi_bundlegetpointer(gfs_bundle,'sf',g_div ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + call gsi_bundlegetpointer(gfs_bundle,'div',g_div ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + if ( iredundant==2 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' + write(6,*) 'cannot handle having both sf and div' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + iredundant=0 + call gsi_bundlegetpointer(gfs_bundle,'vp',g_vor ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + call gsi_bundlegetpointer(gfs_bundle,'vor',g_vor ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + if ( iredundant==2 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' + write(6,*) 'cannot handle having both vp and vor' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + iredundant=0 + call gsi_bundlegetpointer(gfs_bundle,'t' ,g_tv ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + call gsi_bundlegetpointer(gfs_bundle,'tv',g_tv ,ier) + if ( ier == 0 ) iredundant = iredundant + 1 + if ( iredundant==2 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' + write(6,*) 'cannot handle having both t and tv' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + istatus=0 + call gsi_bundlegetpointer(gfs_bundle,'ps',g_ps ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'q' ,g_q ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'oz',g_oz ,ier);istatus=istatus+ier + ! call gsi_bundlegetpointer(gfs_bundle,'cw',g_cwmr,ier);istatus=istatus+ier + istatus1=0 + call gsi_bundlegetpointer(gfs_bundle,'ql',g_ql ,ier);istatus1=istatus1+ier + call gsi_bundlegetpointer(gfs_bundle,'qi',g_qi ,ier);istatus1=istatus1+ier + call gsi_bundlegetpointer(gfs_bundle,'qr',g_qr ,ier);istatus1=istatus1+ier + call gsi_bundlegetpointer(gfs_bundle,'qs',g_qs ,ier);istatus1=istatus1+ier + call gsi_bundlegetpointer(gfs_bundle,'qg',g_qg ,ier);istatus1=istatus1+ier + ! call gsi_bundlegetpointer(gfs_bundle,'cf',g_cf ,ier);istatus1=istatus1+ier + if ( istatus1 /= 0 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' + write(6,*) 'Missing some of the required hydrometeor fields for imp_physics = ', imp_physics + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif + else ! read 2m vars + istatus=0 + call gsi_bundlegetpointer(gfs_bundle,'t2m',g_t2m ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'q2m',g_q2m ,ier);istatus=istatus+ier + call gsi_bundlegetpointer(gfs_bundle,'ps',g_ps ,ier);istatus=istatus+ier + if ( istatus /= 0 ) then + if ( mype == 0 ) then + write(6,*) 'general_read_gfsatm_allhydro_nc: ERROR' + write(6,*) 'Missing 2m required variables' + write(6,*) 'Aborting ... ' + endif + call stop2(999) + endif endif allocate(g_u(grd%lat2,grd%lon2,grd%nsig),g_v(grd%lat2,grd%lon2,grd%nsig)) @@ -2852,7 +3072,7 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z ! Only read Terrain when zflag is true. - if ( zflag ) then + if ( read_z ) then icount=icount+1 iflag(icount)=1 @@ -2861,7 +3081,7 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z ! Terrain: spectral --> grid transform, scatter to all mpi tasks if (mype==mype_use(icount)) then ! read hs - call read_vardata(atmges, 'hgtsfc', rwork2d) + call read_vardata(filges, 'hgtsfc', rwork2d) if ( diff_res ) then grid_b=rwork2d vector(1)=.false. @@ -2883,465 +3103,470 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z endif endif - icount=icount+1 - iflag(icount)=2 - ilev(icount)=1 - - ! Surface pressure: same procedure as terrain - if (mype==mype_use(icount)) then - ! read ps - call read_vardata(atmges, 'pressfc', rwork2d) - rwork2d = r0_001*rwork2d ! convert Pa to cb - if ( diff_res ) then - vector(1)=.false. - grid_b=rwork2d - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork2d - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - - ! Thermodynamic variable: s-->g transform, communicate to all tasks - ! For multilevel fields, each task handles a given level. Periodic - ! mpi_alltoallv calls communicate the grids to all mpi tasks. - ! Finally, the grids are loaded into guess arrays used later in the - ! code. - - do k=1,nlevs - - icount=icount+1 - iflag(icount)=3 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'spfh', rwork3d1, nslice=kr, slicedim=3) - call read_vardata(atmges, 'tmp', rwork3d0, nslice=kr, slicedim=3) - rwork2d = rwork3d0(:,:,1) * (one+fv*rwork3d1(:,:,1)) - if ( diff_res ) then - grid_b=rwork2d - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork2d - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - - if ( vordivflag .or. .not. uvflag ) then - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - icount=icount+1 - iflag(icount)=4 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - ! Vorticity - ! Convert grid u,v to div and vor - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work_v(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid_v(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) - endif - allocate( grid_vor(grd%nlon,nlatm2)) - call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) - call general_sptez_s_b(sp_a,sp_a,spec_vor,grid_vor,1) - ! Load values into rows for south and north pole - call general_fill_ns(grd,grid_vor,work) - deallocate(grid_vor) - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - - icount=icount+1 - iflag(icount)=5 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - ! Divergence - ! Convert grid u,v to div and vor - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work_v(kk)=grid2(i,j,1) - enddo - do j=1,grd%nlon - do i=2,grd%nlat-1 - grid_v(j,grd%nlat-i)=grid2(i,j,1) - enddo - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) - endif - allocate( grid_div(grd%nlon,nlatm2) ) - call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) - call general_sptez_s_b(sp_a,sp_a,spec_div,grid_div,1) - ! Load values into rows for south and north pole - call general_fill_ns(grd,grid_div,work) - deallocate(grid_div) - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - - end do - endif ! if ( vordivflag .or. .not. uvflag ) - - if ( uvflag ) then - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - icount=icount+1 - iflag(icount)=6 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - - icount=icount+1 - iflag(icount)=7 - ilev(icount)=k - - if (mype==mype_use(icount)) then - ! V - call read_vardata(atmges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) - call read_vardata(atmges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) - if ( diff_res ) then - grid_b = rwork3d0(:,:,1) - grid_b2 = rwork3d1(:,:,1) - vector(1)=.true. - call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) - call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid = rwork3d0(:,:,1) - grid_v = rwork3d1(:,:,1) - ! Note work_v and work are switched because output must be in work. - call general_filluv_ns(grd,slons,clons,grid,grid_v,work_v,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - endif ! if ( uvflag ) - - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - icount=icount+1 - iflag(icount)=8 - ilev(icount)=k - - if (mype==mype_use(icount)) then - ! Specific humidity - call read_vardata(atmges, 'spfh', rwork3d0, nslice=kr, slicedim=3) - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid = rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - - do k=1,nlevs - kr = levs+1-k ! netcdf is top to bottom, need to flip - - icount=icount+1 - iflag(icount)=9 - ilev(icount)=k - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'o3mr', rwork3d0, nslice=kr, slicedim=3) - ! Ozone mixing ratio - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - end do - - do k=1,nlevs - icount=icount+1 - iflag(icount)=10 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'clwmr', rwork3d0, nslice=kr, slicedim=3) - ! Cloud liquid water mixing ratio. - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - enddo ! do k=1,nlevs - - do k=1,nlevs - icount=icount+1 - iflag(icount)=11 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'icmr', rwork3d0, nslice=kr, slicedim=3) - ! Cloud ice water mixing ratio. - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - enddo ! do k=1,nlevs - - do k=1,nlevs - icount=icount+1 - iflag(icount)=12 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'rwmr', rwork3d0, nslice=kr, slicedim=3) - ! Rain water mixing ratio. - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - enddo ! do k=1,nlevs - - do k=1,nlevs - icount=icount+1 - iflag(icount)=13 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'snmr', rwork3d0, nslice=kr, slicedim=3) - ! Snow water mixing ratio. - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm ) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - enddo ! do k=1,nlevs - - do k=1,nlevs - icount=icount+1 - iflag(icount)=14 - ilev(icount)=k - kr = levs+1-k ! netcdf is top to bottom, need to flip - - if (mype==mype_use(icount)) then - call read_vardata(atmges, 'grle', rwork3d0, nslice=kr, slicedim=3) - ! Graupel mixing ratio. - if ( diff_res ) then - grid_b=rwork3d0(:,:,1) - vector(1)=.false. - call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) - call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) - do kk=1,grd%itotsub - i=grd%ltosi_s(kk) - j=grd%ltosj_s(kk) - work(kk)=grid2(i,j,1) - enddo - else - grid=rwork3d0(:,:,1) - call general_fill_ns(grd,grid,work) - endif - endif - if ( icount == icm .or. k==nlevs) then - call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & - g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) - endif - enddo ! do k=1,nlevs + if (.not. read_2m) then + + allocate( work_v(grd%itotsub) ) + work_v=zero + + icount=icount+1 + iflag(icount)=2 + ilev(icount)=1 + + ! Surface pressure: same procedure as terrain + if (mype==mype_use(icount)) then + ! read ps + call read_vardata(filges, 'pressfc', rwork2d) + rwork2d = r0_001*rwork2d ! convert Pa to cb + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + + ! Thermodynamic variable: s-->g transform, communicate to all tasks + ! For multilevel fields, each task handles a given level. Periodic + ! mpi_alltoallv calls communicate the grids to all mpi tasks. + ! Finally, the grids are loaded into guess arrays used later in the + ! code. + + do k=1,nlevs + + icount=icount+1 + iflag(icount)=3 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'spfh', rwork3d1, nslice=kr, slicedim=3) + call read_vardata(filges, 'tmp', rwork3d0, nslice=kr, slicedim=3) + rwork2d = rwork3d0(:,:,1) * (one+fv*rwork3d1(:,:,1)) + if ( diff_res ) then + grid_b=rwork2d + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + + if ( vordivflag .or. .not. uvflag ) then + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + icount=icount+1 + iflag(icount)=4 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + ! Vorticity + ! Convert grid u,v to div and vor + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work_v(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid_v(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) + endif + allocate( grid_vor(grd%nlon,nlatm2)) + call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) + call general_sptez_s_b(sp_a,sp_a,spec_vor,grid_vor,1) + ! Load values into rows for south and north pole + call general_fill_ns(grd,grid_vor,work) + deallocate(grid_vor) + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + + icount=icount+1 + iflag(icount)=5 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + ! Divergence + ! Convert grid u,v to div and vor + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work_v(kk)=grid2(i,j,1) + enddo + do j=1,grd%nlon + do i=2,grd%nlat-1 + grid_v(j,grd%nlat-i)=grid2(i,j,1) + enddo + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) + endif + allocate( grid_div(grd%nlon,nlatm2) ) + call general_sptez_v(sp_a,spec_div,spec_vor,grid,grid_v,-1) + call general_sptez_s_b(sp_a,sp_a,spec_div,grid_div,1) + ! Load values into rows for south and north pole + call general_fill_ns(grd,grid_div,work) + deallocate(grid_div) + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + + end do + endif ! if ( vordivflag .or. .not. uvflag ) + + if ( uvflag ) then + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + icount=icount+1 + iflag(icount)=6 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + call general_filluv_ns(grd,slons,clons,grid,grid_v,work,work_v) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + + icount=icount+1 + iflag(icount)=7 + ilev(icount)=k + + if (mype==mype_use(icount)) then + ! V + call read_vardata(filges, 'ugrd', rwork3d0, nslice=kr, slicedim=3) + call read_vardata(filges, 'vgrd', rwork3d1, nslice=kr, slicedim=3) + if ( diff_res ) then + grid_b = rwork3d0(:,:,1) + grid_b2 = rwork3d1(:,:,1) + vector(1)=.true. + call filluv2_ns(grid_b,grid_b2,grid_c(:,:,1),grid_c2(:,:,1),latb+2,lonb,slons,clons) + call g_egrid2agrid(p_high,grid_c2,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid = rwork3d0(:,:,1) + grid_v = rwork3d1(:,:,1) + ! Note work_v and work are switched because output must be in work. + call general_filluv_ns(grd,slons,clons,grid,grid_v,work_v,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + endif ! if ( uvflag ) + + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + icount=icount+1 + iflag(icount)=8 + ilev(icount)=k + + if (mype==mype_use(icount)) then + ! Specific humidity + call read_vardata(filges, 'spfh', rwork3d0, nslice=kr, slicedim=3) + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid = rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + + do k=1,nlevs + kr = levs+1-k ! netcdf is top to bottom, need to flip + + icount=icount+1 + iflag(icount)=9 + ilev(icount)=k + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'o3mr', rwork3d0, nslice=kr, slicedim=3) + ! Ozone mixing ratio + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + end do + + do k=1,nlevs + icount=icount+1 + iflag(icount)=10 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'clwmr', rwork3d0, nslice=kr, slicedim=3) + ! Cloud liquid water mixing ratio. + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + enddo ! do k=1,nlevs + + do k=1,nlevs + icount=icount+1 + iflag(icount)=11 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'icmr', rwork3d0, nslice=kr, slicedim=3) + ! Cloud ice water mixing ratio. + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + enddo ! do k=1,nlevs + + do k=1,nlevs + icount=icount+1 + iflag(icount)=12 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'rwmr', rwork3d0, nslice=kr, slicedim=3) + ! Rain water mixing ratio. + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + enddo ! do k=1,nlevs + + do k=1,nlevs + icount=icount+1 + iflag(icount)=13 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'snmr', rwork3d0, nslice=kr, slicedim=3) + ! Snow water mixing ratio. + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm ) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + enddo ! do k=1,nlevs + + do k=1,nlevs + icount=icount+1 + iflag(icount)=14 + ilev(icount)=k + kr = levs+1-k ! netcdf is top to bottom, need to flip + + if (mype==mype_use(icount)) then + call read_vardata(filges, 'grle', rwork3d0, nslice=kr, slicedim=3) + ! Graupel mixing ratio. + if ( diff_res ) then + grid_b=rwork3d0(:,:,1) + vector(1)=.false. + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork3d0(:,:,1) + call general_fill_ns(grd,grid,work) + endif + endif + if ( icount == icm .or. k==nlevs) then + call general_reload2(grd,g_z,g_ps,g_tv,g_vor,g_div,g_u,g_v,g_q,g_oz, & + g_ql,g_qi,g_qr,g_qs,g_qg,icount,iflag,ilev,work,uvflag,vordivflag) + endif + enddo ! do k=1,nlevs ! do k=1,nlevs ! icount=icount+1 @@ -3350,7 +3575,7 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z ! kr = levs+1-k ! netcdf is top to bottom, need to flip ! ! if (mype==mype_use(icount)) then -! call read_vardata(atmges, 'cld_amt', rwork3d0, nslice=kr, slicedim=3) +! call read_vardata(filges, 'cld_amt', rwork3d0, nslice=kr, slicedim=3) ! ! Cloud amount (cloud fraction). ! if ( diff_res ) then ! grid_b=rwork3d0(:,:,1) @@ -3374,6 +3599,87 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z ! endif ! enddo ! do k=1,nlevs + else ! read_2m + + icount=icount+1 + iflag(icount)=2 + + ! 2m temperature from sfc file + if (mype==mype_use(icount)) then + call read_vardata(filges, 'tmp2m', rwork2d) + + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + + icount=icount + 1 + iflag(icount)=3 + + ! 2m humidity from sfc file + if (mype==mype_use(icount)) then + call read_vardata(filges, 'spfh2m', rwork2d) + + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + + icount=icount + 1 + iflag(icount)=4 + + if (mype==mype_use(icount)) then + ! read ps + call read_vardata(filges, 'pressfc', rwork2d) + rwork2d = r0_001*rwork2d ! convert Pa to cb + if ( diff_res ) then + vector(1)=.false. + grid_b=rwork2d + call fill2_ns(grid_b,grid_c(:,:,1),latb+2,lonb) + call g_egrid2agrid(p_high,grid_c,grid2,1,1,vector) + do kk=1,grd%itotsub + i=grd%ltosi_s(kk) + j=grd%ltosj_s(kk) + work(kk)=grid2(i,j,1) + enddo + else + grid=rwork2d + call general_fill_ns(grd,grid,work) + endif + endif + + ! not necessarily using all assigned tasks (fewer vars), so below doesn't trigger. + ! todo: figure out what icm should be here. + !if ( icount == icm ) then + call general_reload_sfc(grd,g_t2m, g_q2m, g_ps, icount,iflag,work) + !endif + + endif ! read_2m + + + if ( procuse ) then if ( diff_res) deallocate(grid_b,grid_b2,grid_c,grid_c2,grid2) call destroy_egrid2agrid(p_high) @@ -3381,9 +3687,10 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z deallocate(rwork3d1,rwork3d0,clons,slons) deallocate(rwork2d) deallocate(grid,grid_v) - call close_dataset(atmges) + call close_dataset(filges) endif - deallocate(work, work_v) + deallocate(work) + if (allocated(work_v)) deallocate(work_v) ! Convert dry temperature to virtual temperature !do k=1,grd%nsig @@ -3395,27 +3702,29 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z !enddo ! Load u->div and v->vor slot when uv are used instead - if ( uvflag ) then - call gsi_bundlegetpointer(gfs_bundle,'u' ,ptr3d,ier) - if ( ier == 0 ) then - ptr3d=g_u - call gsi_bundlegetpointer(gfs_bundle,'v' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_v - else ! in this case, overload: return u/v in sf/vp slot - call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) - if ( ier == 0 ) then - ptr3d=g_u - call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_v - endif - endif - else ! in this case, overload: return u/v in sf/vp slot - call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_u - call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) - if ( ier == 0 ) ptr3d=g_v - endif - if (zflag) then + if ( .not. read_2m ) then + if ( uvflag ) then + call gsi_bundlegetpointer(gfs_bundle,'u' ,ptr3d,ier) + if ( ier == 0 ) then + ptr3d=g_u + call gsi_bundlegetpointer(gfs_bundle,'v' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_v + else ! in this case, overload: return u/v in sf/vp slot + call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) + if ( ier == 0 ) then + ptr3d=g_u + call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_v + endif + endif + else ! in this case, overload: return u/v in sf/vp slot + call gsi_bundlegetpointer(gfs_bundle,'sf' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_u + call gsi_bundlegetpointer(gfs_bundle,'vp' ,ptr3d,ier) + if ( ier == 0 ) ptr3d=g_v + endif + endif !read_2m + if (read_z) then call gsi_bundlegetpointer(gfs_bundle,'z' ,ptr2d,ier) if ( ier == 0 ) ptr2d=g_z endif @@ -3428,7 +3737,7 @@ subroutine general_read_gfsatm_allhydro_nc(grd,sp_a,filename,uvflag,vordivflag,z if ( mype == 0 ) then write(6,700) lonb,latb,nlevs,grd%nlon,nlatm2,& fhour,odate,trim(filename) -700 format('GENERAL_READ_GFSATM_NC: read lonb,latb,levs=',& +700 format('GENERAL_READ_GFSATM_ALLHYDRO_NC: read lonb,latb,levs=',& 3i6,', scatter nlon,nlat=',2i6,', hour=',f6.1,', idate=',4i5,1x,a) endif diff --git a/src/gsi/general_specmod.f90 b/src/gsi/general_specmod.f90 index 439e26e431..c90187bf70 100644 --- a/src/gsi/general_specmod.f90 +++ b/src/gsi/general_specmod.f90 @@ -64,6 +64,7 @@ module general_specmod ! set subroutines to public public :: general_init_spec_vars public :: general_destroy_spec_vars + public :: general_spec_multwgt ! set passed variables to public public :: spec_vars public :: spec_cut @@ -306,6 +307,36 @@ subroutine general_init_spec_vars(sp,jcap,jcap_test,nlat_a,nlon_a,eqspace) return end subroutine general_init_spec_vars + subroutine general_spec_multwgt(sp,spcwrk,spcwgt) +! 2017-03-30 J. Kay, X. Wang - add general_spec_multwgt for scale-dependent +! weighting of mixed resolution ensemble, +! POC: xuguang.wang@ou.edu +! + implicit none + type(spec_vars),intent(in) :: sp + real(r_kind),dimension(sp%nc),intent(inout) :: spcwrk + real(r_kind),dimension(0:sp%jcap),intent(in) :: spcwgt + + integer(i_kind) l,jmax,ks,n + +!! Code borrowed from spvar in splib + jmax=sp%jcap + + do n=0,jmax + ks=2*n + spcwrk(ks+1)=spcwrk(ks+1)*spcwgt(n) + end do + do n=0,jmax + do l=MAX(1,n-jmax),MIN(n,jmax) + ks=l*(2*jmax+(-1)*(l-1))+2*n + spcwrk(ks+1) = spcwrk(ks+1)*spcwgt(n) + spcwrk(ks+2) = spcwrk(ks+2)*spcwgt(n) + end do + end do + + return + end subroutine general_spec_multwgt + subroutine general_destroy_spec_vars(sp) !$$$ subprogram documentation block ! . . . . diff --git a/src/gsi/genqsat.f90 b/src/gsi/genqsat.f90 index ed0eb152e6..bc33187497 100644 --- a/src/gsi/genqsat.f90 +++ b/src/gsi/genqsat.f90 @@ -145,9 +145,9 @@ subroutine genqsat(qsat,tsen,prsl,lat2,lon2,nsig,ice,iderivative) esw = psat * (tr**xa) * exp(xb*(one-tr)) esi = psat * (tr**xai) * exp(xbi*(one-tr)) w = (tdry - tmix) / (ttp - tmix) -! es = w * esw + (one-w) * esi - es = w * psat * (tr**xa) * exp(xb*(one-tr)) & - + (one-w) * psat * (tr**xai) * exp(xbi*(one-tr)) + es = w * esw + (one-w) * esi +! es = w * psat * (tr**xa) * exp(xb*(one-tr)) & +! + (one-w) * psat * (tr**xai) * exp(xbi*(one-tr)) endif diff --git a/src/gsi/genstats_gps.f90 b/src/gsi/genstats_gps.f90 index ce90d06f50..1e27cb252b 100644 --- a/src/gsi/genstats_gps.f90 +++ b/src/gsi/genstats_gps.f90 @@ -64,6 +64,15 @@ module m_gpsStats integer(i_kind) :: idv,iob ! device id and obs index for sorting real (r_kind) :: elat, elon ! earth lat-lon for redistribution !real (r_kind) :: dlat, dlon ! earth lat-lon for redistribution + !> xuanli + real(r_kind),dimension(:),pointer :: tsenges => NULL() + real(r_kind),dimension(:),pointer :: tvirges => NULL() + real(r_kind),dimension(:),pointer :: sphmges => NULL() + real(r_kind),dimension(:),pointer :: hgtlges => NULL() + real(r_kind),dimension(:),pointer :: hgtiges => NULL() + real(r_kind),dimension(:),pointer :: prslges => NULL() + real(r_kind),dimension(:),pointer :: prsiges => NULL() + !< xuanli end type gps_all_ob_type type gps_all_ob_head @@ -427,7 +436,10 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) end do END DO if(icnt > 0)then - nreal =22 +!> xuanli +! nreal =22 + nreal =34 +!< xuanli ioff =nreal if (lobsdiagsave) nreal=nreal+4*miter+1 if (save_jacobian) then @@ -537,7 +549,8 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) if(ratio_errors*data_ier > tiny_r_kind) then ! obs was good if (luse) then if(conv_diagsave) then - gps_allptr%rdiag(10) = four + !gps_allptr%rdiag(10) = four + gps_allptr%rdiag(10) = 8 gps_allptr%rdiag(12) = -one gps_allptr%rdiag(16) = zero if(lobsdiagsave) gps_allptr%rdiag(mreal+jiter) = -one @@ -760,33 +773,52 @@ subroutine contents_netcdf_diag_ ! Observation class character(7),parameter :: obsclass = ' gps' - call nc_diag_metadata("Station_ID", gps_allptr%cdiag ) - call nc_diag_metadata("Observation_Class", obsclass ) + call nc_diag_metadata("Station_ID", gps_allptr%cdiag ) + call nc_diag_metadata("Observation_Class", obsclass ) obstype = gps_allptr%rdiag(1) obssubtype = gps_allptr%rdiag(2) - call nc_diag_metadata("Observation_Type", obstype ) - call nc_diag_metadata("Observation_Subtype", obssubtype ) - call nc_diag_metadata("Latitude", sngl(gps_allptr%rdiag(3)) ) - call nc_diag_metadata("Longitude", sngl(gps_allptr%rdiag(4)) ) - call nc_diag_metadata("Incremental_Bending_Angle", sngl(gps_allptr%rdiag(5)) ) - call nc_diag_metadata("Pressure", sngl(gps_allptr%rdiag(6)) ) - call nc_diag_metadata("Height", sngl(gps_allptr%rdiag(7)) ) - call nc_diag_metadata("Time", sngl(gps_allptr%rdiag(8)) ) - call nc_diag_metadata("Model_Elevation", sngl(gps_allptr%rdiag(9)) ) - call nc_diag_metadata("Setup_QC_Mark", sngl(gps_allptr%rdiag(10)) ) - call nc_diag_metadata("Prep_Use_Flag", sngl(gps_allptr%rdiag(11)) ) - call nc_diag_metadata("Analysis_Use_Flag", sngl(gps_allptr%rdiag(12)) ) - - call nc_diag_metadata("Nonlinear_QC_Rel_Wgt", sngl(gps_allptr%rdiag(13)) ) - call nc_diag_metadata("Errinv_Input", sngl(gps_allptr%rdiag(14)) ) - call nc_diag_metadata("Errinv_Adjust", sngl(gps_allptr%rdiag(15)) ) - call nc_diag_metadata("Errinv_Final", sngl(gps_allptr%rdiag(16)) ) - call nc_diag_metadata("Observation", sngl(gps_allptr%rdiag(17)) ) - call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(gps_allptr%rdiag(17))*sngl(gps_allptr%rdiag(5)) ) - call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(gps_allptr%rdiag(17))*sngl(gps_allptr%rdiag(5)) ) - call nc_diag_metadata("GPS_Type", sngl(gps_allptr%rdiag(20)) ) - call nc_diag_metadata("Temperature_at_Obs_Location", sngl(gps_allptr%rdiag(18)) ) - call nc_diag_metadata("Specific_Humidity_at_Obs_Location", sngl(gps_allptr%rdiag(21)) ) + call nc_diag_metadata("Observation_Type", obstype ) +! xuanli rename it to be consistent with GMAO gsi_ncdiag + call nc_diag_metadata("Observation_Subtype", obssubtype ) + call nc_diag_metadata("record_number", obssubtype ) + call nc_diag_metadata("Latitude", sngl(gps_allptr%rdiag(3)) ) + call nc_diag_metadata("Longitude", sngl(gps_allptr%rdiag(4)) ) + call nc_diag_metadata("Incremental_Bending_Angle", sngl(gps_allptr%rdiag(5)) ) + call nc_diag_metadata("Pressure", sngl(gps_allptr%rdiag(6)*100.0) ) +! xuanli rename the variable as impact_height +! call nc_diag_metadata("Height", sngl(gps_allptr%rdiag(7)) ) + call nc_diag_metadata("Impact_Height", sngl(gps_allptr%rdiag(7)) ) + call nc_diag_metadata("Time", sngl(gps_allptr%rdiag(8)) ) + call nc_diag_metadata("surface_geopotential_height", sngl(gps_allptr%rdiag(9)) ) + call nc_diag_metadata("Setup_QC_Mark", sngl(gps_allptr%rdiag(10)) ) + call nc_diag_metadata("Prep_Use_Flag", sngl(gps_allptr%rdiag(11)) ) + call nc_diag_metadata("Analysis_Use_Flag", sngl(gps_allptr%rdiag(12)) ) + + call nc_diag_metadata("Nonlinear_QC_Rel_Wgt", sngl(gps_allptr%rdiag(13)) ) + call nc_diag_metadata("Errinv_Input", sngl(gps_allptr%rdiag(14)) ) + call nc_diag_metadata("Errinv_Adjust", sngl(gps_allptr%rdiag(15)) ) + call nc_diag_metadata("Errinv_Final", sngl(gps_allptr%rdiag(16)) ) + call nc_diag_metadata("Observation", sngl(gps_allptr%rdiag(17)) ) + call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(gps_allptr%rdiag(17))*sngl(gps_allptr%rdiag(5)) ) + call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(gps_allptr%rdiag(17))*sngl(gps_allptr%rdiag(5)) ) + call nc_diag_metadata("GPS_Type", sngl(gps_allptr%rdiag(20)) ) + call nc_diag_metadata("Temperature_at_Obs_Location", sngl(gps_allptr%rdiag(18)) ) + call nc_diag_metadata("Specific_Humidity_at_Obs_Location", sngl(gps_allptr%rdiag(21)) ) +!> xuanli + call nc_diag_metadata("impact_parameter", sngl(gps_allptr%rdiag(23)) ) + call nc_diag_metadata("pccf", sngl(gps_allptr%rdiag(24)) ) + call nc_diag_metadata("reference_sat_id", int(gps_allptr%rdiag(25)) ) + call nc_diag_metadata("earth_radius_of_curvature", sngl(gps_allptr%rdiag(26)) ) + call nc_diag_metadata("geoid_height_above_reference_ellipsoid", sngl(gps_allptr%rdiag(27)) ) + call nc_diag_metadata("qfro", int(gps_allptr%rdiag(28)) ) + call nc_diag_metadata("ascending_flag", int(gps_allptr%rdiag(29)) ) + call nc_diag_metadata("sensor_azimuth_angle", sngl(gps_allptr%rdiag(30)) ) + call nc_diag_metadata("sat_constellation", int(gps_allptr%rdiag(31)) ) + call nc_diag_metadata("occulting_sat", int(gps_allptr%rdiag(32)) ) + call nc_diag_metadata("process_center", int(gps_allptr%rdiag(33)) ) + call nc_diag_metadata("atmospheric_refractivity", sngl(gps_allptr%rdiag(34)) ) + call nc_diag_metadata("surface_altitude", sngl(gps_allptr%rdiag(9)) ) +!< xuanli if (save_jacobian) then call readarray(dhx_dx, gps_allptr%rdiag(ioff+1:nreal)) @@ -794,6 +826,15 @@ subroutine contents_netcdf_diag_ call nc_diag_data2d("Observation_Operator_Jacobian_endind", dhx_dx%end_ind(1:dhx_dx%nind)) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val(1:dhx_dx%nnz),r_single)) endif +!> xuanli + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(gps_allptr%prslges)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(gps_allptr%prsiges)) + call nc_diag_data2d("air_temperature", sngl(gps_allptr%tsenges)) + call nc_diag_data2d("virtual_temperature", sngl(gps_allptr%tvirges)) + call nc_diag_data2d("specific_humidity", sngl(gps_allptr%sphmges)) + call nc_diag_data2d("geopotential_height", sngl(gps_allptr%hgtlges)) + call nc_diag_data2d("geopotential_height_levels", sngl(gps_allptr%hgtiges)) +!< xuanli diff --git a/src/gsi/gesinfo.F90 b/src/gsi/gesinfo.F90 index 792900b628..0aefd34c76 100644 --- a/src/gsi/gesinfo.F90 +++ b/src/gsi/gesinfo.F90 @@ -148,7 +148,7 @@ subroutine gesinfo write(filename,'("sigf",i2.2)')nhr_assimilation inquire(file=filename,exist=fexist) if(.not.fexist) then - write(6,*)' GESINFO: ***ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' + write(6,*)' GESINFO: ***FATAL ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' call stop2(99) stop end if @@ -339,12 +339,12 @@ subroutine gesinfo ! open the netCDF file atmges = open_dataset(filename,errcode=iret) if (iret /=0) then - write(6,*)'GESINFO: ***ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' + write(6,*)'GESINFO: ***FATAL ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' call stop2(99) endif sfcges = open_dataset(sfilename,errcode=iret) if (iret /=0) then - write(6,*)'GESINFO: ***ERROR*** ',trim(sfilename),' NOT AVAILABLE: PROGRAM STOPS' + write(6,*)'GESINFO: ***FATAL ERROR*** ',trim(sfilename),' NOT AVAILABLE: PROGRAM STOPS' call stop2(99) endif ! get dimension sizes @@ -451,7 +451,7 @@ subroutine gesinfo ! Check for consistency with namelist settings if (gfshead%jcap/=jcap_b.and..not.regional .or. gfshead%levs/=nsig) then if (gfshead%levs/=nsig) then - write(6,*)'GESINFO: ***ERROR*** guess levels inconsistent with namelist' + write(6,*)'GESINFO: ***FATAL ERROR*** guess levels inconsistent with namelist' write(6,*)' guess nsig=',gfshead%levs write(6,*)' namelist nsig=',nsig fatal = .true. @@ -466,7 +466,7 @@ subroutine gesinfo fatal = .false. else if ( mype == mype_out ) & - write(6,*)'GESINFO: ***ERROR*** guess jcap inconsistent with namelist' + write(6,*)'GESINFO: ***FATAL ERROR*** guess jcap inconsistent with namelist' fatal = .true. endif if ( mype == mype_out ) & diff --git a/src/gsi/get_gefs_ensperts_dualres.f90 b/src/gsi/get_gefs_ensperts_dualres.f90 index c547a9f062..e244fa9f53 100644 --- a/src/gsi/get_gefs_ensperts_dualres.f90 +++ b/src/gsi/get_gefs_ensperts_dualres.f90 @@ -64,10 +64,12 @@ subroutine get_gefs_ensperts_dualres use gsi_bundlemod, only: gsi_bundlegetpointer use gsi_bundlemod, only: gsi_bundledestroy use gsi_bundlemod, only: gsi_gridcreate + use gsi_bundlemod, only : assignment(=) use gsi_enscouplermod, only: gsi_enscoupler_get_user_nens use gsi_enscouplermod, only: gsi_enscoupler_create_sub2grid_info use gsi_enscouplermod, only: gsi_enscoupler_destroy_sub2grid_info use general_sub2grid_mod, only: sub2grid_info,general_sub2grid_create_info,general_sub2grid_destroy_info + use hybrid_ensemble_parameters, only: nsclgrp,sp_ens,spc_multwgt,global_spectral_filter_sd implicit none real(r_kind),pointer,dimension(:,:) :: ps @@ -78,6 +80,8 @@ subroutine get_gefs_ensperts_dualres real(r_kind),pointer,dimension(:,:):: x2 type(gsi_bundle),allocatable,dimension(:) :: en_read type(gsi_bundle):: en_bar + type(gsi_bundle) :: en_pertstmp1 + type(gsi_bundle) :: en_pertstmp2 ! type(gsi_grid) :: grid_ens real(r_kind) bar_norm,sig_norm,kapr,kap1 ! real(r_kind),allocatable,dimension(:,:):: z,sst2 @@ -91,34 +95,35 @@ subroutine get_gefs_ensperts_dualres ! integer(i_kind) il,jl logical ice,hydrometeor type(sub2grid_info) :: grd_tmp + integer(i_kind) :: ig ! Create perturbations grid and get variable names from perturbations - if(en_perts(1,1)%grid%im/=grd_ens%lat2.or. & - en_perts(1,1)%grid%jm/=grd_ens%lon2.or. & - en_perts(1,1)%grid%km/=grd_ens%nsig ) then + if(en_perts(1,1,1)%grid%im/=grd_ens%lat2.or. & + en_perts(1,1,1)%grid%jm/=grd_ens%lon2.or. & + en_perts(1,1,1)%grid%km/=grd_ens%nsig ) then if (mype==0) then write(6,*) 'get_gefs_ensperts_dualres: grd_ens ', grd_ens%lat2,grd_ens%lon2,grd_ens%nsig - write(6,*) 'get_gefs_ensperts_dualres: pertgrid', en_perts(1,1)%grid%im, en_perts(1,1)%grid%jm, en_perts(1,1)%grid%km + write(6,*) 'get_gefs_ensperts_dualres: pertgrid', en_perts(1,1,1)%grid%im, en_perts(1,1,1)%grid%jm, en_perts(1,1,1)%grid%km write(6,*) 'get_gefs_ensperts_dualres: inconsistent dims, aborting ...' endif call stop2(999) endif - call gsi_bundlegetpointer (en_perts(1,1),cvars3d,ipc3d,istatus) + call gsi_bundlegetpointer (en_perts(1,1,1),cvars3d,ipc3d,istatus) if(istatus/=0) then write(6,*) ' get_gefs_ensperts_dualres',': cannot find 3d pointers' call stop2(999) endif - call gsi_bundlegetpointer (en_perts(1,1),cvars2d,ipc2d,istatus) + call gsi_bundlegetpointer (en_perts(1,1,1),cvars2d,ipc2d,istatus) if(istatus/=0) then write(6,*) ' get_gefs_ensperts_dualres',': cannot find 2d pointers' call stop2(999) endif - im=en_perts(1,1)%grid%im - jm=en_perts(1,1)%grid%jm - km=en_perts(1,1)%grid%km + im=en_perts(1,1,1)%grid%im + jm=en_perts(1,1,1)%grid%jm + km=en_perts(1,1,1)%grid%km bar_norm = one/float(n_ens) sig_norm=sqrt(one/max(one,n_ens-one)) @@ -126,16 +131,27 @@ subroutine get_gefs_ensperts_dualres call gsi_enscoupler_create_sub2grid_info(grd_tmp,km,npe,grd_ens) ! Allocate bundle to hold mean of ensemble members - call gsi_bundlecreate(en_bar,en_perts(1,1)%grid,'ensemble',istatus,names2d=cvars2d,names3d=cvars3d) + call gsi_bundlecreate(en_bar,en_perts(1,1,1)%grid,'ensemble',istatus,names2d=cvars2d,names3d=cvars3d) if ( istatus /= 0 ) & call die('get_gefs_ensperts_dualres',': trouble creating en_bar bundle, istatus =',istatus) +! Allocate bundle used for temporary usage + if( nsclgrp > 1 .and. global_spectral_filter_sd )then + call gsi_bundlecreate(en_pertstmp1,en_perts(1,1,1)%grid,'aux-ens-read',istatus,names2d=cvars2d,names3d=cvars3d) + call gsi_bundlecreate(en_pertstmp2,en_perts(1,1,1)%grid,'aux-ens-read',istatus,names2d=cvars2d,names3d=cvars3d) + if(istatus/=0) then + write(6,*)' get_gefs_ensperts_dualres: trouble creating en_read like tempbundle' + call stop2(999) + endif + end if + ! Allocate bundle used for reading members allocate(en_read(n_ens)) do n=1,n_ens - call gsi_bundlecreate(en_read(n),en_perts(1,1)%grid,'ensemble member',istatus,names2d=cvars2d,names3d=cvars3d) + call gsi_bundlecreate(en_read(n),en_perts(1,1,1)%grid,'ensemble member',istatus,names2d=cvars2d,names3d=cvars3d) if ( istatus /= 0 ) & call die('get_gefs_ensperts_dualres',': trouble creating en_read bundle, istatus =',istatus) + en_read(n) = zero end do ! allocate(z(im,jm)) @@ -144,14 +160,6 @@ subroutine get_gefs_ensperts_dualres ! sst2=zero ! for now, sst not used in ensemble perturbations, so if sst array is called for ! then sst part of en_perts will be zero when sst2=zero -!$omp parallel do schedule(dynamic,1) private(m,n) - do m=1,ntlevs_ens - do n=1,n_ens - en_perts(n,m)%valuesr4=zero_single - end do - end do - - ntlevs_ens_loop: do m=1,ntlevs_ens call gsi_enscoupler_get_user_Nens(grd_tmp,n_ens,m,en_read,iret) @@ -166,28 +174,39 @@ subroutine get_gefs_ensperts_dualres cycle endif + en_bar%values=zero if (.not.q_hyb_ens) then !use RH - kap1=rd_over_cp+one - kapr=one/rd_over_cp - do n=1,n_ens + allocate(pri(im,jm,km+1)) + allocate(prsl(im,jm,km),tsen(im,jm,km)) + allocate(qs(im,jm,km)) + end if + do n=1,n_ens + call gsi_bundlegetpointer(en_read(n),'q' ,q ,ier);istatus=istatus+ier + do k=1,km + do j=1,jm + do i=1,im + q(i,j,k)=max(q(i,j,k),zero) + end do + end do + end do + if (.not.q_hyb_ens) then !use RH call gsi_bundlegetpointer(en_read(n),'ps',ps,ier);istatus=ier call gsi_bundlegetpointer(en_read(n),'t' ,tv,ier);istatus=istatus+ier - call gsi_bundlegetpointer(en_read(n),'q' ,q ,ier);istatus=istatus+ier ! Compute RH ! Get 3d pressure field now on interfaces - allocate(pri(im,jm,km+1)) call general_getprs_glb(ps,tv,pri) - allocate(prsl(im,jm,km),tsen(im,jm,km),qs(im,jm,km)) ! Get sensible temperature and 3d layer pressure if (idsl5 /= 2) then + kap1=rd_over_cp+one + kapr=one/rd_over_cp !$omp parallel do schedule(dynamic,1) private(k,j,i) do k=1,km do j=1,jm do i=1,im prsl(i,j,k)=((pri(i,j,k)**kap1-pri(i,j,k+1)**kap1)/& (kap1*(pri(i,j,k)-pri(i,j,k+1))))**kapr - tsen(i,j,k)= tv(i,j,k)/(one+fv*max(zero,q(i,j,k))) + tsen(i,j,k)= tv(i,j,k)/(one+fv*q(i,j,k)) end do end do end do @@ -197,12 +216,11 @@ subroutine get_gefs_ensperts_dualres do j=1,jm do i=1,im prsl(i,j,k)=(pri(i,j,k)+pri(i,j,k+1))*half - tsen(i,j,k)= tv(i,j,k)/(one+fv*max(zero,q(i,j,k))) + tsen(i,j,k)= tv(i,j,k)/(one+fv*q(i,j,k)) end do end do end do end if - deallocate(pri) ice=.true. iderivative=0 @@ -214,14 +232,7 @@ subroutine get_gefs_ensperts_dualres end do end do end do - deallocate(tsen,prsl,qs) - enddo - end if - - - en_bar%values=zero - - n_ens_loop: do n=1,n_ens + end if !$omp parallel do schedule(dynamic,1) private(i,k,j,ic3,hydrometeor,istatus,p3) @@ -232,14 +243,14 @@ subroutine get_gefs_ensperts_dualres trim(cvars3d(ic3))=='qs' .or. trim(cvars3d(ic3))=='qg' .or. & trim(cvars3d(ic3))=='qh' - call gsi_bundlegetpointer(en_read(n),trim(cvars3d(ic3)),p3,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' from read in member ',n,m - call stop2(999) - end if if ( hydrometeor ) then + call gsi_bundlegetpointer(en_read(n),trim(cvars3d(ic3)),p3,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' from read in member ',n,m + call stop2(999) + end if do k=1,km do j=1,jm do i=1,im @@ -249,13 +260,17 @@ subroutine get_gefs_ensperts_dualres end do else if ( trim(cvars3d(ic3)) == 'oz' .and. oz_univ_static ) then + call gsi_bundlegetpointer(en_read(n),trim(cvars3d(ic3)),p3,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' from read in member ',n,m + call stop2(999) + end if p3 = zero end if end do !c3d do i=1,nelen - en_perts(n,m)%valuesr4(i)=en_read(n)%values(i) - en_bar%values(i)=en_bar%values(i)+en_read(n)%values(i) + en_bar%values(i)=en_bar%values(i)+en_read(n)%values(i)*bar_norm end do @@ -265,14 +280,14 @@ subroutine get_gefs_ensperts_dualres ! know who would want to commented out code below but be mindful ! of how it interacts with option sst_staticB, please - Todling. - end do n_ens_loop ! end do over ensemble - - do i=1,nelen - en_bar%values(i)=en_bar%values(i)*bar_norm - end do + end do ! end do over ensembles + if (.not.q_hyb_ens) then !use RH + deallocate(pri) + deallocate(tsen,prsl) + deallocate(qs) + end if ! Before converting to perturbations, get ensemble spread - !-- if (m == 1 .and. write_ens_sprd ) call ens_spread_dualres(en_bar,1) !!! it is not clear of the next statement is thread/$omp safe. if (write_ens_sprd ) call ens_spread_dualres(en_bar,m) @@ -283,7 +298,6 @@ subroutine get_gefs_ensperts_dualres ! Copy pbar to module array. ps_bar may be needed for vertical localization ! in terms of scale heights/normalized p/p -! Convert to mean do j=1,jm do i=1,im ps_bar(i,j,m)=x2(i,j) @@ -295,7 +309,7 @@ subroutine get_gefs_ensperts_dualres !$omp parallel do schedule(dynamic,1) private(n,i,ic3,ipic,k,j) do n=1,n_ens do i=1,nelen - en_perts(n,m)%valuesr4(i)=en_perts(n,m)%valuesr4(i)-en_bar%values(i) + en_perts(n,1,m)%valuesr4(i)=en_read(n)%values(i)-en_bar%values(i) end do if(.not. q_hyb_ens) then do ic3=1,nc3d @@ -304,8 +318,8 @@ subroutine get_gefs_ensperts_dualres do k=1,km do j=1,jm do i=1,im - en_perts(n,m)%r3(ipic)%qr4(i,j,k) = min(en_perts(n,m)%r3(ipic)%qr4(i,j,k),limqens) - en_perts(n,m)%r3(ipic)%qr4(i,j,k) = max(en_perts(n,m)%r3(ipic)%qr4(i,j,k),-limqens) + en_perts(n,1,m)%r3(ipic)%qr4(i,j,k) = min(en_perts(n,1,m)%r3(ipic)%qr4(i,j,k),limqens) + en_perts(n,1,m)%r3(ipic)%qr4(i,j,k) = max(en_perts(n,1,m)%r3(ipic)%qr4(i,j,k),-limqens) end do end do end do @@ -313,17 +327,36 @@ subroutine get_gefs_ensperts_dualres end do end if do i=1,nelen - en_perts(n,m)%valuesr4(i)=en_perts(n,m)%valuesr4(i)*sig_norm + en_perts(n,1,m)%valuesr4(i)=en_perts(n,1,m)%valuesr4(i)*sig_norm end do end do end do ntlevs_ens_loop !end do over bins + call gsi_bundledestroy(en_bar,istatus) + if(nsclgrp > 1 .and. global_spectral_filter_sd) then + do m=1,ntlevs_ens + do n=1,n_ens + en_pertstmp1%values=en_perts(n,1,m)%valuesr4 + do ig=1,nsclgrp + call apply_scaledepwgts(grd_ens,sp_ens,en_pertstmp1,spc_multwgt(:,ig),en_pertstmp2) + en_perts(n,ig,m)%valuesr4=en_pertstmp2%values + enddo + enddo + enddo + endif + do n=n_ens,1,-1 call gsi_bundledestroy(en_read(n),istatus) if ( istatus /= 0 ) & call die('get_gefs_ensperts_dualres',': trouble destroying en_read bundle, istatus = ', istatus) end do deallocate(en_read) + if(nsclgrp > 1 .and. global_spectral_filter_sd) then + call gsi_bundledestroy(en_pertstmp1,istatus) + call gsi_bundledestroy(en_pertstmp2,istatus) + if ( istatus /= 0 ) & + call die('get_gefs_ensperts_dualres',': trouble destroying en_pertstmp2 bundle, istatus = ', istatus) + end if call gsi_enscoupler_destroy_sub2grid_info(grd_tmp) ! mm1=mype+1 @@ -455,7 +488,7 @@ subroutine ens_spread_dualres(en_bar,ibin) do n=1,n_ens do i=1,nelen sube%values(i)=sube%values(i) & - +(en_perts(n,ibin)%valuesr4(i)-en_bar%values(i))*(en_perts(n,ibin)%valuesr4(i)-en_bar%values(i)) + +(en_perts(n,1,ibin)%valuesr4(i)-en_bar%values(i))*(en_perts(n,1,ibin)%valuesr4(i)-en_bar%values(i)) end do end do @@ -693,8 +726,6 @@ subroutine general_getprs_glb(ps,tv,prs) real(r_kind),parameter:: ten = 10.0_r_kind - kapr=one/rd_over_cp - if (regional) then if(wrf_nmm_regional.or.nems_nmmb_regional) then do k=1,nsig+1 @@ -735,32 +766,45 @@ subroutine general_getprs_glb(ps,tv,prs) end do endif else - k=1 - k2=nsig+1 - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - prs(i,j,k)=ps(i,j) - prs(i,j,k2)=zero - end do - end do if (idvc5 /= 3) then !$omp parallel do schedule(dynamic,1) private(k,j,i) - do k=2,nsig - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - prs(i,j,k)=ak5(k)+bk5(k)*ps(i,j) + do k=1,nsig + if(k == 1)then + k2=nsig+1 + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + prs(i,j,k)=ps(i,j) + prs(i,j,k2)=zero + end do end do - end do + else + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + prs(i,j,k)=ak5(k)+bk5(k)*ps(i,j) + end do + end do + end if end do else + kapr=one/rd_over_cp !$omp parallel do schedule(dynamic,1) private(k,j,i,trk) - do k=2,nsig - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - trk=(half*(tv(i,j,k-1)+tv(i,j,k))/tref5(k))**kapr - prs(i,j,k)=ak5(k)+(bk5(k)*ps(i,j))+(ck5(k)*trk) + do k=1,nsig + if(k == 1)then + k2=nsig+1 + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + prs(i,j,k)=ps(i,j) + prs(i,j,k2)=zero + end do end do - end do + else + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + trk=(half*(tv(i,j,k-1)+tv(i,j,k))/tref5(k))**kapr + prs(i,j,k)=ak5(k)+(bk5(k)*ps(i,j))+(ck5(k)*trk) + end do + end do + end if end do end if end if diff --git a/src/gsi/get_gefs_for_regional.f90 b/src/gsi/get_gefs_for_regional.f90 index 958849a177..43a88ef300 100644 --- a/src/gsi/get_gefs_for_regional.f90 +++ b/src/gsi/get_gefs_for_regional.f90 @@ -41,7 +41,7 @@ subroutine get_gefs_for_regional fv3_regional use hybrid_ensemble_parameters, only: region_lat_ens,region_lon_ens use hybrid_ensemble_parameters, only: en_perts,ps_bar,nelen - use hybrid_ensemble_parameters, only: n_ens_gfs,grd_ens,grd_a1,grd_e1,p_e2a,uv_hyb_ens,dual_res + use hybrid_ensemble_parameters, only: n_ens_gfs,weight_ens_gfs,grd_ens,grd_a1,grd_e1,p_e2a,uv_hyb_ens,dual_res use hybrid_ensemble_parameters, only: full_ensemble,q_hyb_ens,l_ens_in_diff_time,write_ens_sprd use hybrid_ensemble_parameters, only: ntlevs_ens,ensemble_path,jcap_ens use control_vectors, only: cvars2d,cvars3d,nc2d,nc3d @@ -1311,7 +1311,7 @@ subroutine get_gefs_for_regional ! 2*J_b = x^T * (beta1*B + beta2*P_ens)^(-1) * x ! where P_ens is the ensemble covariance which is the sum of outer products of the ! ensemble perturbations (unnormalized) divided by n_ens-1 (or n_ens, depending on who you read). - sig_norm=sqrt(one/max(one,n_ens_temp-one)) + sig_norm=sqrt(weight_ens_gfs/max(one,n_ens_temp-one)) ! if(n_ens_temp==n_ens.and.n==n_ens+1) sig_norm=one ! if(n==1 .or. n==2 .or. n==50) then @@ -1333,9 +1333,9 @@ subroutine get_gefs_for_regional do ic3=1,nc3d if(ntlevs_ens > 1) then - call gsi_bundlegetpointer(en_perts(n,it),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,it),trim(cvars3d(ic3)),w3,istatus) else - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) endif if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n @@ -1422,9 +1422,9 @@ subroutine get_gefs_for_regional do ic2=1,nc2d if(ntlevs_ens > 1) then - call gsi_bundlegetpointer(en_perts(n,it),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,it),trim(cvars2d(ic2)),w2,istatus) else - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars2d(ic2)),w2,istatus) endif if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n diff --git a/src/gsi/get_nmmb_ensperts.f90 b/src/gsi/get_nmmb_ensperts.f90 index 93d23c837d..ece1780c03 100644 --- a/src/gsi/get_nmmb_ensperts.f90 +++ b/src/gsi/get_nmmb_ensperts.f90 @@ -59,7 +59,7 @@ subroutine get_nmmb_ensperts endif do n=1,n_ens - en_perts(n,1)%valuesr4=zero + en_perts(n,1,1)%valuesr4=zero end do en_bar%values=zero @@ -116,7 +116,7 @@ subroutine get_nmmb_ensperts do ic3=1,nc3d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars3d(ic3)),w3,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars3d(ic3)),w3,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars3d(ic3)),' for ensemble member ',n,' in get_nmmb_ensperts' call stop2(999) @@ -277,7 +277,7 @@ subroutine get_nmmb_ensperts do ic2=1,nc2d - call gsi_bundlegetpointer(en_perts(n,1),trim(cvars2d(ic2)),w2,istatus) + call gsi_bundlegetpointer(en_perts(n,1,1),trim(cvars2d(ic2)),w2,istatus) if(istatus/=0) then write(6,*)' error retrieving pointer to ',trim(cvars2d(ic2)),' for ensemble member ',n, ' in get_nmmb_ensperts' call stop2(999) @@ -344,7 +344,7 @@ subroutine get_nmmb_ensperts do n=1,n_ens do i=1,nelen - en_perts(n,1)%valuesr4(i)=(en_perts(n,1)%valuesr4(i)-en_bar%values(i))*sig_norm + en_perts(n,1,1)%valuesr4(i)=(en_perts(n,1,1)%valuesr4(i)-en_bar%values(i))*sig_norm end do end do diff --git a/src/gsi/getsiga.f90 b/src/gsi/getsiga.f90 index 788e0652d7..ad47017be1 100644 --- a/src/gsi/getsiga.f90 +++ b/src/gsi/getsiga.f90 @@ -198,6 +198,7 @@ subroutine view_cv_ad (xhat,mydate,filename,readcv) use state_vectors, only: allocate_state,deallocate_state,prt_state_norms use bias_predictors, only: predictors,allocate_preds,deallocate_preds,assignment(=) use bias_predictors, only: read_preds +use control2state_mod, only: control2state_ad implicit none type(control_vector) :: xhat integer(i_kind), intent(in) :: mydate(5) ! as in iadate or ibdate, or similar diff --git a/src/gsi/gridmod.F90 b/src/gsi/gridmod.F90 index 928b9e9c43..559a3f576d 100644 --- a/src/gsi/gridmod.F90 +++ b/src/gsi/gridmod.F90 @@ -130,6 +130,7 @@ module gridmod public :: vectosub public :: reload public :: strip_periodic + public :: minmype ! set passed variables to public public :: nnnn1o,iglobal,itotsub,ijn,ijn_s,lat2,lon2,lat1,lon1,nsig,nsig_soil @@ -267,6 +268,7 @@ module gridmod integer(i_kind) jcap ! spectral triangular truncation of ncep global analysis integer(i_kind) jcap_b ! spectral triangular truncation of ncep global background integer(i_kind) nthreads ! number of threads used (currently only used in calctends routines) + integer(i_kind) minmype ! processor with minimum size subdomain logical periodic ! logical flag for periodic e/w domains @@ -574,7 +576,7 @@ subroutine init_grid_vars(jcap,npe,cvars3d,cvars2d,cvars,mype) integer(i_kind) n3d,n2d,nvars,tid,nth integer(i_kind) ipsf,ipvp,jpsf,jpvp,isfb,isfe,ivpb,ivpe integer(i_kind) istatus,icw,iql,iqi - integer(i_kind) icw_cv,iql_cv,iqi_cv + integer(i_kind) icw_cv,iql_cv,iqi_cv,minmax logical,allocatable,dimension(:):: vector logical print_verbose @@ -687,6 +689,8 @@ subroutine init_grid_vars(jcap,npe,cvars3d,cvars2d,cvars,mype) periodic=grd_a%periodic + minmype=0 + minmax=grd_a%ilat1(1)*grd_a%jlon1(1) do i=1,npe istart(i) =grd_a%istart(i) jstart(i) =grd_a%jstart(i) @@ -699,7 +703,12 @@ subroutine init_grid_vars(jcap,npe,cvars3d,cvars2d,cvars,mype) displs_s(i) =grd_a%displs_s(i) ijn(i) =grd_a%ijn(i) displs_g(i) =grd_a%displs_g(i) + if(grd_a%ilat1(i)*grd_a%jlon1(i)< minmax)then + minmax=grd_a%ilat1(i)*grd_a%jlon1(i) + minmype=i-1 + end if end do + if(mype == minmype) write(6,*) ' minmype = ',minmype !#omp parallel private(nth,tid) nth = omp_get_max_threads() diff --git a/src/gsi/gsi_dbzOper.F90 b/src/gsi/gsi_dbzOper.F90 index 74d9bdf65d..4a63d0995f 100644 --- a/src/gsi/gsi_dbzOper.F90 +++ b/src/gsi/gsi_dbzOper.F90 @@ -83,6 +83,10 @@ subroutine setup_(self, lunin, mype, is, nobs, init_pass,last_pass) use jfunc , only: jiter use mpeu_util, only: die + + use directDA_radaruse_mod, only: l_use_dbz_directDA + use obsmod, only: dirname, ianldate + implicit none class(dbzOper ), intent(inout):: self integer(i_kind), intent(in):: lunin @@ -99,8 +103,25 @@ subroutine setup_(self, lunin, mype, is, nobs, init_pass,last_pass) character(len=len_isis ):: isis integer(i_kind):: nreal,nchanl,ier,nele logical:: diagsave + integer(i_kind):: lu_diag + character(128):: diag_file + character(80):: string + + if(nobs == 0) then - if(nobs == 0) return + if( (mype == 0) .and. init_pass .and. (.not. l_use_dbz_directDA) ) then + write(string,600) jiter +600 format('radardbz_',i2.2) + diag_file=trim(dirname) // trim(string) + write(6,*) 'write ianldate to ', diag_file + open(newunit=lu_diag,file=trim(diag_file),form='unformatted',status='unknown',position='rewind') + write(lu_diag) ianldate + close(lu_diag) + endif + + return + + endif read(lunin,iostat=ier) obstype,isis,nreal,nchanl if(ier/=0) call die(myname_,'read(obstype,...), iostat =',ier) diff --git a/src/gsi/gsi_files.cmake b/src/gsi/gsi_files.cmake index 461b49ddf6..b98cd2d0da 100644 --- a/src/gsi/gsi_files.cmake +++ b/src/gsi/gsi_files.cmake @@ -87,6 +87,7 @@ anisofilter_glb.f90 antcorr_application.f90 antest_maps0.f90 antest_maps0_glb.f90 +apply_scaledepwgts.f90 atms_spatial_average_mod.f90 balmod.f90 berror.f90 @@ -123,7 +124,6 @@ constants.f90 control2model.f90 control2model_ad.f90 control2state.f90 -control2state_ad.f90 control_vectors.f90 convb_ps.f90 convb_q.f90 diff --git a/src/gsi/gsi_rfv3io_mod.f90 b/src/gsi/gsi_rfv3io_mod.f90 index 6f50d13861..4fcb2aba1d 100644 --- a/src/gsi/gsi_rfv3io_mod.f90 +++ b/src/gsi/gsi_rfv3io_mod.f90 @@ -21,7 +21,8 @@ module gsi_rfv3io_mod ! 2022-03-15 Hu - add code to read/write 2m T and Q for they will be ! used as background for surface observation operator ! 2022-04-15 Wang - add IO for regional FV3-CMAQ (RRFS-CMAQ) model - +! 2022-08-10 Wang - add IO for regional FV3-SMOKE (RRFS-SMOKE) model +! ! subroutines included: ! sub gsi_rfv3io_get_grid_specs ! sub read_fv3_files @@ -54,6 +55,8 @@ module gsi_rfv3io_mod use guess_grids, only: nfldsig,ntguessig,ifilesig use rapidrefresh_cldsurf_mod, only: i_use_2mq4b,i_use_2mt4b use chemmod, only: naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3,laeroana_fv3cmaq + use chemmod, only: naero_smoke_fv3,aeronames_smoke_fv3,laeroana_fv3smoke + implicit none public type_fv3regfilenameg public bg_fv3regfilenameg @@ -65,6 +68,7 @@ module gsi_rfv3io_mod character(len=:),allocatable :: ak_bk !='fv3_akbk' character(len=:),allocatable :: dynvars !='fv3_dynvars' character(len=:),allocatable :: tracers !='fv3_tracer' + character(len=:),allocatable :: phyvars !='fv3_phyvars' character(len=:),allocatable :: sfcdata !='fv3_sfcdata' character(len=:),allocatable :: couplerres!='coupler.res' contains @@ -87,22 +91,26 @@ module gsi_rfv3io_mod type(sub2grid_info) :: grd_fv3lam_dynvar_ionouv type(sub2grid_info) :: grd_fv3lam_tracer_ionouv type(sub2grid_info) :: grd_fv3lam_tracerchem_ionouv + type(sub2grid_info) :: grd_fv3lam_tracersmoke_ionouv + type(sub2grid_info) :: grd_fv3lam_phyvar_ionouv type(sub2grid_info) :: grd_fv3lam_uv - integer(i_kind) ,parameter:: ndynvarslist=13, ntracerslist=8 + integer(i_kind) ,parameter:: ndynvarslist=13, ntracerslist=8, nphyvarslist=1 character(len=max_varname_length), dimension(ndynvarslist), parameter :: & vardynvars = [character(len=max_varname_length) :: & "u","v","u_w","u_s","v_w","v_s","t","tv","tsen","w","delp","ps","delzinc"] - character(len=max_varname_length), dimension(ntracerslist+naero_cmaq_fv3+7), parameter :: & + character(len=max_varname_length), dimension(ntracerslist+naero_cmaq_fv3+7+naero_smoke_fv3), parameter :: & vartracers = [character(len=max_varname_length) :: & - 'q','oz','ql','qi','qr','qs','qg','qnr',aeronames_cmaq_fv3,'pm25at','pm25ac','pm25co','pm2_5','amassi','amassj','amassk'] - character(len=max_varname_length), dimension(15+naero_cmaq_fv3+7), parameter :: & + 'q','oz','ql','qi','qr','qs','qg','qnr',aeronames_cmaq_fv3,'pm25at','pm25ac','pm25co','pm2_5','amassi','amassj','amassk',aeronames_smoke_fv3] + character(len=max_varname_length), dimension(nphyvarslist), parameter :: & + varphyvars = [character(len=max_varname_length) :: 'dbz'] + character(len=max_varname_length), dimension(16+naero_cmaq_fv3+7+naero_smoke_fv3), parameter :: & varfv3name = [character(len=max_varname_length) :: & - 'u','v','W','T','delp','sphum','o3mr','liq_wat','ice_wat','rainwat','snowwat','graupel','rain_nc','ps','DZ', & - aeronames_cmaq_fv3,'pm25at','pm25ac','pm25co','pm2_5','amassi','amassj','amassk'], & + 'u','v','W','T','delp','sphum','o3mr','liq_wat','ice_wat','rainwat','snowwat','graupel','rain_nc','ref_f3d','ps','DZ', & + aeronames_cmaq_fv3,'pm25at','pm25ac','pm25co','pm2_5','amassi','amassj','amassk',aeronames_smoke_fv3], & vgsiname = [character(len=max_varname_length) :: & - 'u','v','w','tsen','delp','q','oz','ql','qi','qr','qs','qg','qnr','ps','delzinc', & - aeronames_cmaq_fv3,'pm25at','pm25ac','pm25co','pm2_5','amassi','amassj','amassk'] + 'u','v','w','tsen','delp','q','oz','ql','qi','qr','qs','qg','qnr','dbz','ps','delzinc', & + aeronames_cmaq_fv3,'pm25at','pm25ac','pm25co','pm2_5','amassi','amassj','amassk',aeronames_smoke_fv3] character(len=max_varname_length),dimension(:),allocatable:: name_metvars2d character(len=max_varname_length),dimension(:),allocatable:: name_metvars3d character(len=max_varname_length),dimension(:),allocatable:: name_chemvars3d @@ -115,6 +123,8 @@ module gsi_rfv3io_mod public :: gsi_fv3ncdf_read_v1 public :: gsi_fv3ncdf_readuv public :: gsi_fv3ncdf_readuv_v1 + public :: gsi_fv3ncdf_read_ens_parallel_over_ens + public :: gsi_fv3ncdf_readuv_ens_parallel_over_ens public :: read_fv3_files public :: read_fv3_netcdf_guess public :: wrfv3_netcdf @@ -125,7 +135,9 @@ 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,k_t2m,k_q2m public :: ijns,ijns2d,displss,displss2d,ijnz,displsz_g - public :: fv3lam_io_dynmetvars3d_nouv,fv3lam_io_tracermetvars3d_nouv,fv3lam_io_tracerchemvars3d_nouv + public :: fv3lam_io_dynmetvars3d_nouv,fv3lam_io_tracermetvars3d_nouv + public :: fv3lam_io_tracerchemvars3d_nouv,fv3lam_io_tracersmokevars3d_nouv + public :: fv3lam_io_phymetvars3d_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 @@ -153,7 +165,9 @@ module gsi_rfv3io_mod ! 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_phymetvars3d_nouv character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_io_tracerchemvars3d_nouv + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_io_tracersmokevars3d_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 @@ -163,10 +177,13 @@ module gsi_rfv3io_mod !to define names in gsibundle character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_names_gsibundle_tracer_nouv !to define names in gsibundle + character(len=max_varname_length),allocatable,dimension(:) :: fv3lam_names_gsibundle_phyvar_nouv type(gsi_bundle):: gsibundle_fv3lam_dynvar_nouv type(gsi_bundle):: gsibundle_fv3lam_tracer_nouv + type(gsi_bundle):: gsibundle_fv3lam_phyvar_nouv type(gsi_bundle):: gsibundle_fv3lam_tracerchem_nouv - + type(gsi_bundle):: gsibundle_fv3lam_tracersmoke_nouv + contains subroutine fv3regfilename_init(this,it) implicit None @@ -197,6 +214,12 @@ subroutine fv3regfilename_init(this,it) write(filename,"(A11,I2.2)") 'fv3_tracer_',ifilesig(it) this%tracers=trim(filename) endif + if (it == ntguessig) then + this%phyvars='fv3_phyvars' + else + write(filename,"(A12,I2.2)") 'fv3_phyvars_',ifilesig(it) + this%phyvars=trim(filename) + endif if (it == ntguessig) then this%sfcdata='fv3_sfcdata' else @@ -515,7 +538,7 @@ subroutine read_fv3_files(mype) ! Declare local variables logical(4) fexist character(6) filename - character(14) filenames + character(19) filenames integer(i_kind) in_unit integer(i_kind) i,j,iwan,npem1 integer(i_kind) nhr_half @@ -550,11 +573,19 @@ subroutine read_fv3_files(mype) in_unit=15 iwan=0 !WWWWWW setup for one first guess file for now - do i=0,9 !place holder for FGAT + do i=0,9 !place holder for FGAT if ( i == 6 ) then - write(filenames,"(A11)") 'fv3_dynvars' + if(fv3_io_layout_y > 1) then + write(filenames,"(A16)") 'fv3_dynvars.0000' + else + write(filenames,"(A11)") 'fv3_dynvars' + endif else - write(filenames,"(A12,I2.2)") 'fv3_dynvars_',i + if(fv3_io_layout_y > 1) then + write(filenames,"(A17,I2.2)") 'fv3_dynvars.0000_',i + else + write(filenames,"(A12,I2.2)") 'fv3_dynvars_',i + endif endif INQUIRE(FILE=filenames, EXIST=fexist) if(.not.fexist) cycle @@ -733,6 +764,9 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) ! ! abstract: read guess for FV3 regional model ! program history log: +! 2022-04-01 Y. Wang and X. Wang - add capability to read reflectivity +! for direct radar EnVar DA using reflectivity as state +! variable, poc: xuguang.wang@ou.edu ! attributes: ! language: f90 ! machine: ibm RS/6000 SP @@ -761,6 +795,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) use gsi_metguess_mod, only: gsi_metguess_get use netcdf, only:nf90_open,nf90_close,nf90_inquire,nf90_nowrite, nf90_format_netcdf4 use gsi_chemguess_mod, only: gsi_chemguess_get + use obsmod, only: if_model_dbz implicit none @@ -790,7 +825,7 @@ 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() - + real(r_kind),dimension(:,:,:),pointer::ges_dbz=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_aalj=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_acaj=>NULL() @@ -873,6 +908,9 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) real(r_kind),dimension(:,:,:),pointer::ges_amassj=>NULL() real(r_kind),dimension(:,:,:),pointer::ges_amassk=>NULL() + real(r_kind),dimension(:,:,:),pointer::ges_smoke=>NULL() + real(r_kind),dimension(:,:,:),pointer::ges_dust=>NULL() + character(len=max_varname_length) :: vartem="" character(len=64),dimension(:,:),allocatable:: names !to be same as in the grid the dummy sub2grid_info @@ -880,8 +918,9 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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,ntracerchemio3d + integer(i_kind):: ndynvario2d,ntracerio2d,ilev,jdynvar,jtracer,jphyvar + integer(i_kind):: iuv,ndynvario3d,ntracerio3d,nphyvario3d + integer(i_kind):: ntracerchemio3d,ntracersmokeio3d integer(i_kind):: loc_id,ncfmt !clt this block is still maintained for they would be needed for a certain 2d fields IO @@ -915,7 +954,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) allocate( name_metvars3d(GSI_MetGuess_Bundle(it)%n3d)) end if - if (laeroana_fv3cmaq) then + if (laeroana_fv3cmaq.or.laeroana_fv3smoke) then if (.not.allocated(name_chemvars3d)) then allocate( name_chemvars3d(GSI_ChemGuess_Bundle(it)%n3d)) endif @@ -923,7 +962,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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 (laeroana_fv3cmaq) then + if (laeroana_fv3cmaq.or.laeroana_fv3smoke) then call gsi_bundleinquire (GSI_ChemGuess_Bundle(it),'shortnames::3d', name_chemvars3d,istatus) endif @@ -934,7 +973,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) do i=1,GSI_MetGuess_Bundle(it)%n3d write(6,*)'metvardeb333-3d name ', trim(name_metvars3d(i)) enddo - if (laeroana_fv3cmaq) then + if (laeroana_fv3cmaq.or.laeroana_fv3smoke) then do i=1,GSI_ChemGuess_Bundle(it)%n3d write(6,*)'chemvardeb333-3d name ', trim(name_chemvars3d(i)) enddo @@ -946,6 +985,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) iuv=0 ndynvario3d=0 ntracerio3d=0 + nphyvario3d=0 do i=1,size(name_metvars3d) vartem=trim(name_metvars3d(i)) if(trim(vartem)=='u'.or.trim(vartem)=='v') then @@ -956,6 +996,8 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) ndynvario3d=ndynvario3d+1 else if (ifindstrloc(vartracers,trim(vartem))> 0) then ntracerio3d=ntracerio3d+1 + else if (ifindstrloc(varphyvars,trim(vartem))> 0) then + nphyvario3d=nphyvario3d+1 else write(6,*)'the metvarname1 ',trim(vartem),' has not been considered yet, stop' call stop2(333) @@ -967,6 +1009,12 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) write(6,*)"the set up for met variable is not as expected, abort" call stop2(222) endif + if ( if_model_dbz ) then + if( nphyvario3d<=0 ) then + write(6,*)"the set up for met variable (phyvar) is not as expected, abort" + call stop2(223) + end if + endif if (fv3sar_bg_opt == 0.and.ifindstrloc(name_metvars3d,'delp') <= 0)then ndynvario3d=ndynvario3d+1 ! for delp endif @@ -976,13 +1024,19 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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)) + allocate(fv3lam_io_phymetvars3d_nouv(nphyvario3d)) if (laeroana_fv3cmaq) then allocate(fv3lam_io_tracerchemvars3d_nouv(naero_cmaq_fv3+7)) endif + + if (laeroana_fv3smoke) then + allocate(fv3lam_io_tracersmokevars3d_nouv(naero_smoke_fv3+1)) + endif jdynvar=0 jtracer=0 + jphyvar=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 @@ -997,6 +1051,9 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) else if (ifindstrloc(vartracers,trim(vartem)) > 0) then jtracer=jtracer+1 fv3lam_io_tracermetvars3d_nouv(jtracer)=trim(vartem) + else if (ifindstrloc(varphyvars,trim(vartem)) > 0) then + jphyvar=jphyvar+1 + fv3lam_io_phymetvars3d_nouv(jphyvar)=trim(vartem) else write(6,*)'the metvarname ',vartem,' is not expected, stop' call flush(6) @@ -1012,7 +1069,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) jdynvar=jdynvar+1 fv3lam_io_dynmetvars3d_nouv(jdynvar)="delzinc" endif - if(jdynvar /= ndynvario3d.or.jtracer /= ntracerio3d ) then + if(jdynvar /= ndynvario3d.or.jtracer /= ntracerio3d.or.jphyvar /= nphyvario3d ) then write(6,*)'ndynvario3d is not as expected, stop' call flush(6) call stop2(333) @@ -1020,6 +1077,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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) + write(6,*) ' fv3lam_io_phymetvars3d_nouv is ',(trim(fv3lam_io_phymetvars3d_nouv(i)),i=1,nphyvario3d) endif ndynvario2d=0 @@ -1032,7 +1090,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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' + if(mype == 0) write(6,*)'the metvarname ',trim(vartem),' will be dealt separately' else if(trim(vartem)=='t2m') then else if(trim(vartem)=='q2m') then else @@ -1069,7 +1127,7 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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) + write(6,*)'fv3lam_io_tracermetvars2d_nouv is ',(trim(fv3lam_io_tracermetvars2d_nouv(i)),i=1,ntracerio2d) endif if (laeroana_fv3cmaq) then @@ -1101,6 +1159,36 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) endif !laeroana_fv3cmaq + if (laeroana_fv3smoke) then + jtracer = 0 +!name_chemvars3d chemguess from anainfo + do i=1,size(name_chemvars3d) + vartem=trim(name_chemvars3d(i)) + if (ifindstrloc(aeronames_smoke_fv3,trim(vartem)) > 0) then + jtracer=jtracer+1 + fv3lam_io_tracersmokevars3d_nouv(jtracer)=trim(vartem) + write(6,*)'the chemvarname ',jtracer,vartem,' is found ' + if (trim(vartem) == "pm2_5")then + write(6,*)'the chemvarname ',vartem,' will be calculated.' + endif + + else + if (trim(vartem) /= "pm2_5")then + write(6,*)'the chemvarname ',vartem,' is not in aeronames_smoke_fv3 !!!' + call flush(6) + endif + endif + enddo + ntracersmokeio3d=jtracer+1 + fv3lam_io_tracersmokevars3d_nouv(jtracer+1)="pm2_5" + + if (mype == 0) then + write(6,*) ' fv3lam_io_tracersmokevars3d_nouv is',(trim(fv3lam_io_tracersmokevars3d_nouv(i)),i=1,ntracersmokeio3d) + endif + + endif !laeroana_fv3smoke + + 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) @@ -1120,6 +1208,11 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) ntracerio2d=0 endif + if( if_model_dbz )then + call gsi_bundlecreate(gsibundle_fv3lam_phyvar_nouv,GSI_MetGuess_Bundle(it)%grid,'gsibundle_fv3lam_phyvar_nouv',istatus, & + names3d=fv3lam_io_phymetvars3d_nouv) + end if + if (laeroana_fv3cmaq) then if (allocated(fv3lam_io_tracerchemvars3d_nouv) ) then call gsi_bundlecreate(gsibundle_fv3lam_tracerchem_nouv,GSI_ChemGuess_Bundle(it)%grid,'gsibundle_fv3lam_tracerchem_nouv',istatus, & @@ -1127,6 +1220,14 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) endif endif + if (laeroana_fv3smoke) then + if (allocated(fv3lam_io_tracersmokevars3d_nouv) ) then + call gsi_bundlecreate(gsibundle_fv3lam_tracersmoke_nouv,GSI_ChemGuess_Bundle(it)%grid,'gsibundle_fv3lam_tracersmoke_nouv',istatus,& + names3d=fv3lam_io_tracersmokevars3d_nouv) + endif + endif + + inner_vars=1 numfields=inner_vars*(ndynvario3d*grd_a%nsig+ndynvario2d) allocate(lnames(1,numfields),names(1,numfields)) @@ -1183,6 +1284,41 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) endif + if (laeroana_fv3smoke) then + inner_vars=1 + numfields=inner_vars*(ntracersmokeio3d*grd_a%nsig) + deallocate(lnames,names) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,ntracersmokeio3d + do k=1,grd_a%nsig + lnames(1,ilev)=k + names(1,ilev)=trim(fv3lam_io_tracersmokevars3d_nouv(i)) + ilev=ilev+1 + enddo + enddo + call general_sub2grid_create_info(grd_fv3lam_tracersmoke_ionouv,inner_vars,grd_a%nlat,& + grd_a%nlon,grd_a%nsig,numfields,regional,names=names,lnames=lnames) + + endif + + if ( if_model_dbz )then + inner_vars=1 + numfields=inner_vars*(nphyvario3d*grd_a%nsig) + deallocate(lnames,names) + allocate(lnames(1,numfields),names(1,numfields)) + ilev=1 + do i=1,nphyvario3d + do k=1,grd_a%nsig + lnames(1,ilev)=k + names(1,ilev)=trim(fv3lam_io_phymetvars3d_nouv(i)) + ilev=ilev+1 + enddo + enddo + call general_sub2grid_create_info(grd_fv3lam_phyvar_ionouv,inner_vars,grd_a%nlat,& + grd_a%nlon,grd_a%nsig,numfields,regional,names=names,lnames=lnames) + end if + inner_vars=2 numfields=grd_a%nsig allocate(uvlnames(inner_vars,numfields),uvnames(inner_vars,numfields)) @@ -1207,15 +1343,19 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) 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 + if (l_use_dbz_directDA .or. if_model_dbz) 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 + if (l_use_dbz_directDA) then + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'iqr' ,ges_iqr ,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qnr',ges_qnr ,istatus );ier=ier+istatus + end if + if(if_model_dbz) & + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'dbz' , ges_dbz ,istatus );ier=ier+istatus end if if (ier/=0) call die(trim(myname),'cannot get pointers for fv3 met-fields, ier =',ier) @@ -1254,6 +1394,12 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) if (ier/=0) call die(trim(myname),'cannot get pointers for fv3chem-fields, ier =',ier) end if + if (laeroana_fv3smoke) then + call GSI_BundleGetPointer ( GSI_ChemGuess_Bundle(it),'smoke',ges_smoke,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_ChemGuess_Bundle(it),'dust', ges_dust,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( GSI_ChemGuess_Bundle(it),'pm2_5',ges_pm2_5,istatus );ier=ier+istatus + end if + if( fv3sar_bg_opt == 0) then call gsi_fv3ncdf_readuv(grd_fv3lam_uv,ges_u,ges_v,fv3filenamegin(it)) else @@ -1265,10 +1411,18 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) & ,fv3filenamegin(it)%dynvars,fv3filenamegin(it)) call gsi_fv3ncdf_read(grd_fv3lam_tracer_ionouv,gsibundle_fv3lam_tracer_nouv & & ,fv3filenamegin(it)%tracers,fv3filenamegin(it)) + if( if_model_dbz )then + call gsi_fv3ncdf_read(grd_fv3lam_phyvar_ionouv,gsibundle_fv3lam_phyvar_nouv & + & ,fv3filenamegin(it)%phyvars,fv3filenamegin(it)) + end if if (laeroana_fv3cmaq) then call gsi_fv3ncdf_read(grd_fv3lam_tracerchem_ionouv,gsibundle_fv3lam_tracerchem_nouv & & ,fv3filenamegin(it)%tracers,fv3filenamegin(it)) endif + if (laeroana_fv3smoke) then + call gsi_fv3ncdf_read(grd_fv3lam_tracersmoke_ionouv,gsibundle_fv3lam_tracersmoke_nouv & + & ,fv3filenamegin(it)%tracers,fv3filenamegin(it)) + endif else call gsi_fv3ncdf_read_v1(grd_fv3lam_dynvar_ionouv,gsibundle_fv3lam_dynvar_nouv & & ,fv3filenamegin(it)%dynvars,fv3filenamegin(it)) @@ -1278,6 +1432,10 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) call gsi_fv3ncdf_read_v1(grd_fv3lam_tracerchem_ionouv,gsibundle_fv3lam_tracerchem_nouv & & ,fv3filenamegin(it)%tracers,fv3filenamegin(it)) endif + if (laeroana_fv3smoke) then + call gsi_fv3ncdf_read_v1(grd_fv3lam_tracersmoke_ionouv,gsibundle_fv3lam_tracersmoke_nouv & + & ,fv3filenamegin(it)%tracers,fv3filenamegin(it)) + endif endif if (laeroana_fv3cmaq) then @@ -1324,12 +1482,36 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) enddo end if ! laeroana_fv3cmaq + if (laeroana_fv3smoke) then + ier=0 + call GSI_BundleGetPointer ( gsibundle_fv3lam_tracersmoke_nouv,'smoke',ges_smoke,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( gsibundle_fv3lam_tracersmoke_nouv,'dust',ges_dust,istatus );ier=ier+istatus + call GSI_BundleGetPointer ( gsibundle_fv3lam_tracersmoke_nouv,'pm2_5',ges_pm2_5,istatus );ier=ier+istatus + if (ier/=0) call die(trim(myname),'cannot get pointers for fv3 chem-fields, ier =',ier) + ! Calculate pm2_5 + do k=1,nsig + do j=1,lon2 + do i=1,lat2 + ges_pm2_5(i,j,k)=ges_smoke(i,j,k) + ges_dust(i,j,k) + enddo + enddo + enddo + endif !laeroana_fv3smoke + 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)) + if (laeroana_fv3cmaq) then + call gsi_copy_bundle(gsibundle_fv3lam_tracerchem_nouv,GSI_ChemGuess_Bundle(it)) + endif + if (laeroana_fv3smoke) then + call gsi_copy_bundle(gsibundle_fv3lam_tracersmoke_nouv,GSI_ChemGuess_Bundle(it)) + endif + + if(if_model_dbz) call gsi_copy_bundle(gsibundle_fv3lam_phyvar_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 @@ -1609,6 +1791,8 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z,ges_t2m,ges_q2m) ! abstract: read in 2d fields from fv3_sfcdata file in mype_2d ! Scatter the field to each PE ! program history log: +! 2023-02-14 Hu - Bug fix for read in subdomain surface restart files +! ! input argument list: ! it - time index for 2d fields ! @@ -1640,7 +1824,7 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z,ges_t2m,ges_q2m) real(r_kind),intent(in),dimension(:,:),pointer::ges_q2m type (type_fv3regfilenameg),intent(in) :: fv3filenamegin character(len=max_varname_length) :: name - integer(i_kind),allocatable,dimension(:):: dim_id,dim + integer(i_kind),allocatable,dimension(:):: dim real(r_kind),allocatable,dimension(:):: work real(r_kind),allocatable,dimension(:,:):: a real(r_kind),allocatable,dimension(:,:,:):: sfcn2d @@ -1728,40 +1912,24 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z,ges_t2m,ges_q2m) write(*,*) "wrong dimension number ndim =",ndim call stop2(119) endif - if(allocated(dim_id )) deallocate(dim_id ) - allocate(dim_id(ndim)) 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) + if(allocated(sfc )) deallocate(sfc ) + allocate(sfc(nx,ny_layout_len(nio),1)) + if(ndim >=3) then + iret=nf90_get_var(gfile_loc_layout(nio),i,sfc) + else if (ndim == 2) then + iret=nf90_get_var(gfile_loc_layout(nio),i,sfc(:,:,1)) + endif + sfc_fulldomain(:,ny_layout_b(nio):ny_layout_e(nio))=sfc(:,:,1) enddo else - 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) + allocate(sfc(nx,ny,1)) + if(ndim >=3) then + iret=nf90_get_var(gfile_loc,i,sfc) + else if (ndim == 2) then + iret=nf90_get_var(gfile_loc,i,sfc(:,:,1)) endif sfc_fulldomain(:,:)=sfc(:,:,1) endif @@ -1823,19 +1991,16 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z,ges_t2m,ges_q2m) 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)) 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))) ) + allocate(sfc1(nx,ny_layout_len(nio)) ) 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))) ) + if(allocated(sfc1 )) deallocate(sfc1 ) + allocate(sfc1(nx,ny) ) iret=nf90_get_var(gfile_loc,k,sfc1) sfc_fulldomain=sfc1 endif @@ -1866,8 +2031,9 @@ subroutine gsi_fv3ncdf2d_read(fv3filenamegin,it,ges_z,ges_t2m,ges_q2m) end do end do - deallocate (dim_id,sfc,sfc1,dim) - deallocate (sfc_fulldomain) + if(allocated(sfc1) .and. allocated(sfc)) deallocate (sfc,sfc1) + if(allocated(dim)) deallocate (dim) + if(allocated(sfc_fulldomain)) deallocate (sfc_fulldomain) endif ! mype @@ -2042,13 +2208,15 @@ subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) character(len=max_varname_length) :: varname,vgsiname character(len=max_varname_length) :: name character(len=max_varname_length) :: filenamein2 - + real(r_kind),allocatable,dimension(:,:):: uu2d_tmp + integer(i_kind) :: countloc_tmp(3),startloc_tmp(3) 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) kbgn,kend,len + logical :: phy_smaller_domain integer(i_kind) gfile_loc,iret,var_id - integer(i_kind) nz,nzp1,mm1 + integer(i_kind) nz,nzp1,mm1,nx_phy ! for io_layout > 1 real(r_kind),allocatable,dimension(:,:):: uu2d_layout integer(i_kind) :: nio @@ -2103,6 +2271,22 @@ subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) inative=nzp1-ilev startloc=(/1,1,inative/) countloc=(/nxcase,nycase,1/) + ! Variable ref_f3d in phy_data.nc has a smaller domain size than + ! dynvariables and tracers as well as a reversed order in vertical + if ( trim(adjustl(varname)) == 'ref_f3d' )then + iret=nf90_inquire_dimension(gfile_loc,1,name,len) + if(trim(name)=='xaxis_1') nx_phy=len + if( nx_phy == nxcase )then + allocate(uu2d_tmp(nxcase,nycase)) + countloc_tmp=(/nxcase,nycase,1/) + phy_smaller_domain = .false. + else + allocate(uu2d_tmp(nxcase-6,nycase-6)) + countloc_tmp=(/nxcase-6,nycase-6,1/) + phy_smaller_domain = .true. + end if + startloc_tmp=(/1,1,ilev/) + end if if(fv3_io_layout_y > 1) then do nio=0,fv3_io_layout_y-1 @@ -2115,7 +2299,22 @@ subroutine gsi_fv3ncdf_read(grd_ionouv,cstate_nouv,filenamein,fv3filenamegin) 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) + if ( trim(adjustl(varname)) == 'ref_f3d' )then + uu2d = 0.0_r_kind + iret=nf90_get_var(gfile_loc,var_id,uu2d_tmp,start=startloc_tmp,count=countloc_tmp) + where(uu2d_tmp < 0.0_r_kind) + uu2d_tmp = 0.0_r_kind + endwhere + + if( phy_smaller_domain )then + uu2d(4:nxcase-3,4:nycase-3) = uu2d_tmp + else + uu2d(1:nxcase,1:nycase) = uu2d_tmp + end if + deallocate(uu2d_tmp) + else + iret=nf90_get_var(gfile_loc,var_id,uu2d,start=startloc,count=countloc) + end if endif call fv3_h_to_ll(uu2d,hwork(1,:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) @@ -2533,6 +2732,392 @@ subroutine gsi_fv3ncdf_readuv_v1(grd_uv,ges_u,ges_v,fv3filenamegin) end subroutine gsi_fv3ncdf_readuv_v1 +subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & + delp,tsen,w,q,oz,ql,qr,qs,qi,qg,dbz,iope) +!$$$ subprogram documentation block +! . . . . +! subprogram: gsi_fv3ncdf_read_ens_parallel_over_ens +! program history log: +! 2022-04-01 Y. Wang and X. Wang, changed from gsi_fv3ncdf_read_ens +! for FV3LAM ensemble parallel IO in hybrid EnVar +! poc: xuguang.wang@ou.edu +! +! abstract: read in fields excluding u and v +! program history log: +! +! input argument list: +! filenamein - file name to read from +! iope - pe to read in the field +! +! +! attributes: +! language: f90 +! machine: ibm RS/6000 SP +! +!$$$ end documentation block + + + use kinds, only: r_kind,i_kind + 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 gridmod, only: nsig,nlon,nlat + use mod_fv3_lola, only: fv3_h_to_ll + use gsi_bundlemod, only: gsi_bundle + use general_sub2grid_mod, only: sub2grid_info,general_grid2sub + + implicit none + character(*),intent(in):: filenamein + type (type_fv3regfilenameg),intent(in) ::fv3filenamegin + integer(i_kind) ,intent(in ) :: iope + real(r_kind),allocatable,dimension(:,:):: uu2d, uu2d_tmp + real(r_kind),dimension(nlat,nlon,nsig):: hwork + real(r_kind),dimension(nlat,nlon,nsig),intent(out),optional:: delp,tsen,w,q,oz,ql,qr,qs,qi,qg,dbz + character(len=max_varname_length) :: varname + character(len=max_varname_length) :: name + character(len=max_varname_length), allocatable,dimension(:) :: varname_files + + integer(i_kind) nlatcase,nloncase,nxcase,nycase,countloc(3),startloc(3),countloc_tmp(3),startloc_tmp(3) + integer(i_kind) ilev,ilevtot,inative,ivar + integer(i_kind) kbgn,kend + integer(i_kind) gfile_loc,iret,var_id + integer(i_kind) nz,nzp1,mm1,len,nx_phy + logical :: phy_smaller_domain +! 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=nlon + nlatcase=nlat + nxcase=nx + nycase=ny + kbgn=1 + kend=nsig + + if( mype == iope )then + allocate(uu2d(nxcase,nycase)) + if( present(delp).or.present(tsen).or.present(w) )then ! dynvars + if( present(w) )then + allocate(varname_files(3)) + varname_files = (/'T ','delp','W '/) + else + allocate(varname_files(2)) + varname_files = (/'T ','delp'/) + end if + end if + if( present(q).or.present(ql).or.present(qr) )then ! tracers + if(present(qr))then + allocate(varname_files(7)) + varname_files = (/'sphum ','o3mr ','liq_wat','ice_wat','rainwat','snowwat','graupel'/) + else + allocate(varname_files(2)) + varname_files = (/'sphum',' o3mr'/) + end if + end if + if( present(dbz) )then ! phyvars: dbz + allocate(varname_files(1)) + varname_files = (/'ref_f3d'/) + end if + + 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,*)' 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) + 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 ivar = 1, size(varname_files) + do ilevtot=kbgn,kend + ilev=ilevtot + nz=nsig + nzp1=nz+1 + inative=nzp1-ilev + startloc=(/1,1,inative/) + countloc=(/nxcase,nycase,1/) + varname = trim(varname_files(ivar)) + ! Variable ref_f3d in phy_data.nc has a smaller domain size than + ! dynvariables and tracers as well as a reversed order in vertical + if ( trim(adjustl(varname)) == 'ref_f3d' )then + iret=nf90_inquire_dimension(gfile_loc,1,name,len) + if(trim(name)=='xaxis_1') nx_phy=len + if( nx_phy == nxcase )then + allocate(uu2d_tmp(nxcase,nycase)) + countloc_tmp=(/nxcase,nycase,1/) + phy_smaller_domain = .false. + else + allocate(uu2d_tmp(nxcase-6,nycase-6)) + countloc_tmp=(/nxcase-6,nycase-6,1/) + phy_smaller_domain = .true. + end if + startloc_tmp=(/1,1,ilev/) + end if + + 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) + if ( trim(adjustl(varname)) == 'ref_f3d' )then + uu2d = 0.0_r_kind + iret=nf90_get_var(gfile_loc,var_id,uu2d_tmp,start=startloc_tmp,count=countloc_tmp) + where(uu2d_tmp < 0.0_r_kind) + uu2d_tmp = 0.0_r_kind + endwhere + if(phy_smaller_domain)then + uu2d(4:nxcase-3,4:nycase-3) = uu2d_tmp + else + uu2d = uu2d_tmp + end if + deallocate(uu2d_tmp) + else + iret=nf90_get_var(gfile_loc,var_id,uu2d,start=startloc,count=countloc) + end if + endif + call fv3_h_to_ll(uu2d,hwork(:,:,ilevtot),nxcase,nycase,nloncase,nlatcase,grid_reverse_flag) + enddo ! ilevtot + if( present(delp).or.present(tsen).or.present(w) )then ! dynvars + if(ivar == 1)then + tsen = hwork + else if(ivar == 2)then + delp = hwork + end if + if( present(w) .and. ivar == 3 )then + w = hwork + end if + end if + if( present(q).or.present(ql).or.present(qr) )then ! tracers + if(ivar == 1)then + q = hwork + else if(ivar == 2)then + oz = hwork + end if + if(present(qr))then + if(ivar == 3)then + ql = hwork + else if(ivar == 4)then + qi = hwork + else if(ivar == 5)then + qr = hwork + else if(ivar == 6)then + qs = hwork + else if(ivar == 7)then + qg = hwork + end if + end if + end if + if( present(dbz) )then ! phyvars: dbz + dbz = hwork + end if + + end do + + 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,varname_files) + end if + + return +end subroutine gsi_fv3ncdf_read_ens_parallel_over_ens + +subroutine gsi_fv3ncdf_readuv_ens_parallel_over_ens(ges_u,ges_v,fv3filenamegin,iope) +!$$$ subprogram documentation block +! . . . . +! subprogram: gsi_fv3ncdf_readuv_ens_parallel_over_ens +! program history log: +! 2022-04-01 Y. Wang and X. Wang, changed from gsi_fv3ncdf_readuv_ens +! for FV3LAM ensemble parallel IO in hybrid EnVar +! poc: xuguang.wang@ou.edu +! +! abstract: read in a field from a netcdf FV3 file in mype_u,mype_v +! then scatter the field to each PE +! program history log: +! +! input argument list: +! +! output argument list: +! ges_u - output sub domain u field +! ges_v - output sub domain v field +! +! attributes: +! language: f90 +! machine: ibm RS/6000 SP +! +!$$$ end documentation block + use kinds, only: r_kind,i_kind + use mpimod, only: mpi_comm_world,mpi_rtype,mype,mpi_info_null + use gridmod, only: nsig,nlon,nlat + 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,fv3uv2earth + use general_sub2grid_mod, only: sub2grid_info,general_grid2sub + + implicit none + real(r_kind) ,intent(out ) :: ges_u(nlat,nlon,nsig) + real(r_kind) ,intent(out ) :: ges_v(nlat,nlon,nsig) + type (type_fv3regfilenameg),intent (in) :: fv3filenamegin + integer(i_kind), intent(in) :: iope + real(r_kind),dimension(2,nlat,nlon,nsig):: hwork + character(:), allocatable:: filenamein + real(r_kind),allocatable,dimension(:,:):: u2d,v2d + real(r_kind),allocatable,dimension(:,:):: uc2d,vc2d + 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) 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=nlon + nlatcase=nlat + nxcase=nx + nycase=ny + kbgn=1 + kend=nsig + if( mype == iope )then + allocate(u2d(nxcase,nycase+1)) + allocate(v2d(nxcase+1,nycase)) + allocate(uc2d(nxcase,nycase)) + allocate(vc2d(nxcase,nycase)) + filenamein=fv3filenamegin%dynvars + + 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 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) + if(iret/=nf90_noerr) then + write(6,*)' problem opening ',trim(filenamein),', Status = ',iret + call flush(6) + call stop2(333) + endif + endif + do ilevtot=kbgn,kend + ilev=ilevtot + nz=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/) + + 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) + endif + call fv3uv2earth(u2d(:,:),v2d(:,:),nxcase,nycase,uc2d,vc2d) + + ! 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. + ! + ! Have set the following flag for grid orientation + ! grid_reverse_flag=true: E-W/N-S grid + ! grid_reverse_flag=false: W-E/S-N grid + ! + ! So for preparing the wind transferring, need to reverse the grid + ! from + ! W-E/S-N grid to E-W/N-S grid when grid_reverse_flag=false: + ! + ! if(.not.grid_reverse_flag) call reverse_grid_r_uv + ! + ! and the last input parameter for fv3_h_to_ll is alway true: + ! + ! + 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 ! ilevtot + 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) + ges_u = hwork(1,:,:,:) + ges_v = hwork(2,:,:,:) + end if ! mype + +end subroutine gsi_fv3ncdf_readuv_ens_parallel_over_ens + + subroutine wrfv3_netcdf(fv3filenamegin) !$$$ subprogram documentation block ! . . . . @@ -2544,7 +3129,8 @@ subroutine wrfv3_netcdf(fv3filenamegin) ! program history log: ! 2019-04-18 CAPS(C. Tong) - import direct reflectivity DA capabilities ! 2019-11-22 CAPS(C. Tong) - modify "add_saved" to properly output analyses -! 2021-01-05 x.zhang/lei - add code for updating delz analysis in regional da +! 2021-01-05 x.zhang/lei - add code for updating delz analysis in regional da +! 2022-04-01 Y. Wang and X. Wang - add code for updating reflectivity ! ! input argument list: ! @@ -2571,6 +3157,7 @@ subroutine wrfv3_netcdf(fv3filenamegin) use directDA_radaruse_mod, only: l_cvpnr, cvpnr_pval use gridmod, only: eta1_ll,eta2_ll use constants, only: one + use obsmod, only: if_model_dbz implicit none @@ -2596,6 +3183,7 @@ 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_dbz =>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 @@ -2685,19 +3273,23 @@ subroutine wrfv3_netcdf(fv3filenamegin) 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), 'q' ,ges_q ,istatus);ier=ier+istatus - if (l_use_dbz_directDA) then + if (l_use_dbz_directDA .or. if_model_dbz) 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), 'qs' ,ges_qs ,istatus);ier=ier+istatus call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'qg' ,ges_qg ,istatus);ier=ier+istatus + if (l_use_dbz_directDA) & 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 + if( if_model_dbz )& + call GSI_BundleGetPointer ( GSI_MetGuess_Bundle(it), 'dbz' , ges_dbz ,istatus);ier=ier+istatus end if if(i_use_2mq4b > 0 .and. i_use_2mt4b > 0 ) then call GSI_BundleGetPointer (GSI_MetGuess_Bundle(it),'q2m',ges_q2m,istatus); ier=ier+istatus call GSI_BundleGetPointer (GSI_MetGuess_Bundle(it),'t2m',ges_t2m,istatus );ier=ier+istatus endif + if (ier/=0) call die('wrfv3_netcdf','cannot get pointers for fv3 met-fields, ier =',ier) if (laeroana_fv3cmaq) then call GSI_BundleGetPointer ( GSI_ChemGuess_Bundle(it), 'aalj',ges_aalj,istatus );ier=ier+istatus @@ -2822,9 +3414,14 @@ subroutine wrfv3_netcdf(fv3filenamegin) call gsi_copy_bundle(GSI_MetGuess_Bundle(it),gsibundle_fv3lam_dynvar_nouv) call gsi_copy_bundle(GSI_MetGuess_Bundle(it),gsibundle_fv3lam_tracer_nouv) + if( if_model_dbz ) call gsi_copy_bundle(GSI_MetGuess_Bundle(it),gsibundle_fv3lam_phyvar_nouv) if (laeroana_fv3cmaq) then call gsi_copy_bundle(GSI_ChemGuess_Bundle(it),gsibundle_fv3lam_tracerchem_nouv) end if + if (laeroana_fv3smoke) then + call gsi_copy_bundle(GSI_ChemGuess_Bundle(it),gsibundle_fv3lam_tracersmoke_nouv) + end if + call gsi_bundleputvar (gsibundle_fv3lam_dynvar_nouv,'tsen',ges_tsen(:,:,:,it),istatus) if( fv3sar_bg_opt == 0) then @@ -2866,11 +3463,19 @@ subroutine wrfv3_netcdf(fv3filenamegin) add_saved,fv3filenamegin%dynvars,fv3filenamegin) call gsi_fv3ncdf_write(grd_fv3lam_tracer_ionouv,gsibundle_fv3lam_tracer_nouv, & add_saved,fv3filenamegin%tracers,fv3filenamegin) + if( if_model_dbz ) then + call gsi_fv3ncdf_write(grd_fv3lam_phyvar_ionouv,gsibundle_fv3lam_phyvar_nouv,& + add_saved,fv3filenamegin%phyvars,fv3filenamegin) + end if call gsi_fv3ncdf_writeuv(grd_fv3lam_uv,ges_u,ges_v,add_saved,fv3filenamegin) if (laeroana_fv3cmaq) then call gsi_fv3ncdf_write(grd_fv3lam_tracerchem_ionouv,gsibundle_fv3lam_tracerchem_nouv, & add_saved,fv3filenamegin%tracers,fv3filenamegin) endif + if (laeroana_fv3smoke) then + call gsi_fv3ncdf_write(grd_fv3lam_tracersmoke_ionouv,gsibundle_fv3lam_tracersmoke_nouv,& + add_saved,fv3filenamegin%tracers,fv3filenamegin) + endif else call gsi_fv3ncdf_write_v1(grd_fv3lam_dynvar_ionouv,gsibundle_fv3lam_dynvar_nouv,& @@ -2882,6 +3487,11 @@ subroutine wrfv3_netcdf(fv3filenamegin) call gsi_fv3ncdf_write_v1(grd_fv3lam_tracerchem_ionouv,gsibundle_fv3lam_tracerchem_nouv,& add_saved,fv3filenamegin%tracers,fv3filenamegin) endif + if (laeroana_fv3smoke) then + call gsi_fv3ncdf_write_v1(grd_fv3lam_tracersmoke_ionouv,gsibundle_fv3lam_tracersmoke_nouv,& + add_saved,fv3filenamegin%tracers,fv3filenamegin) + endif + endif if(i_use_2mq4b > 0 .and. i_use_2mt4b > 0 ) then @@ -3476,6 +4086,7 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file 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 netcdf, only: nf90_inquire_dimension use gsi_bundlemod, only: gsi_bundle use general_sub2grid_mod, only: sub2grid_info,general_sub2grid implicit none @@ -3487,16 +4098,19 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file 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 + character(len=max_varname_length) :: varname,vgsiname,name integer(i_kind) nlatcase,nloncase,nxcase,nycase,countloc(3),startloc(3) + integer(i_kind) countloc_tmp(3),startloc_tmp(3) integer(i_kind) kbgn,kend integer(i_kind) inative,ilev,ilevtot integer(i_kind) :: VarId,gfile_loc - integer(i_kind) mm1,nzp1 + integer(i_kind) mm1,nzp1,len,nx_phy,iret + logical :: phy_smaller_domain real(r_kind),allocatable,dimension(:,:):: work_a real(r_kind),allocatable,dimension(:,:):: work_b real(r_kind),allocatable,dimension(:,:):: workb2,worka2 + real(r_kind),allocatable,dimension(:,:):: work_b_tmp ! for io_layout > 1 real(r_kind),allocatable,dimension(:,:):: work_b_layout @@ -3551,7 +4165,20 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file work_a=hwork(1,:,:,ilevtot) - + if( trim(varname) == 'ref_f3d' )then + iret=nf90_inquire_dimension(gfile_loc,1,name,len) + if(trim(name)=='xaxis_1') nx_phy=len + if( nx_phy == nxcase )then + allocate(work_b_tmp(nxcase,nycase)) + countloc_tmp=(/nxcase,nycase,1/) + phy_smaller_domain = .false. + else + allocate(work_b_tmp(nxcase-6,nycase-6)) + countloc_tmp=(/nxcase-6,nycase-6,1/) + phy_smaller_domain = .true. + end if + startloc_tmp=(/1,1,ilev/) + end if call check( nf90_inq_varid(gfile_loc,trim(varname),VarId) ) @@ -3581,16 +4208,29 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file deallocate(work_b_layout) enddo else - call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + if( trim(varname) == 'ref_f3d' )then + work_b = 0.0_r_kind + call check( nf90_get_var(gfile_loc,VarId,work_b_tmp,start = startloc_tmp, count = countloc_tmp) ) + where(work_b_tmp < 0.0_r_kind) + work_b_tmp = 0.0_r_kind + end where + if(phy_smaller_domain)then + work_b(4:nxcase-3,4:nycase-3) = work_b_tmp + else + work_b(1:nxcase,1:nycase) = work_b_tmp + end if + else + call check( nf90_get_var(gfile_loc,VarId,work_b,start = startloc, count = countloc) ) + end if 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 + else call fv3_ll_to_h(work_a(:,:),work_b(:,:),nloncase,nlatcase,nlon_regional,nlat_regional,grid_reverse_flag) - endif + endif endif if(fv3_io_layout_y > 1) then do nio=0,fv3_io_layout_y-1 @@ -3601,7 +4241,20 @@ subroutine gsi_fv3ncdf_write(grd_ionouv,cstate_nouv,add_saved,filenamein,fv3file deallocate(work_b_layout) enddo else - call check( nf90_put_var(gfile_loc,VarId,work_b, start = startloc, count = countloc) ) + if( trim(varname) == 'ref_f3d' )then + if(phy_smaller_domain)then + work_b_tmp = work_b(4:nxcase-3,4:nycase-3) + else + work_b_tmp = work_b(1:nxcase,1:nycase) + end if + where(work_b_tmp < 0.0_r_kind) + work_b_tmp = 0.0_r_kind + end where + call check( nf90_put_var(gfile_loc,VarId,work_b_tmp, start = startloc_tmp, count = countloc_tmp) ) + deallocate(work_b_tmp) + else + call check( nf90_put_var(gfile_loc,VarId,work_b, start = startloc, count = countloc) ) + end if endif enddo !ilevtotl loop @@ -4321,6 +4974,8 @@ subroutine getfv3lamfilevname(vgsinamein,fv3filenamegref,filenameout,vname) filenameout=fv3filenamegref%dynvars else if(ifindstrloc(vartracers,vgsinamein)> 0 ) then filenameout=fv3filenamegref%tracers + else if(ifindstrloc(varphyvars,vgsinamein)> 0) then + filenameout=fv3filenamegref%phyvars else write(6,*)'the filename corresponding to var ',trim(vgsinamein),' is not found, stop ' call stop2(333) diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index ff636bd70f..cf885c2b64 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -24,7 +24,7 @@ module gsimod use obsmod, only: doradaroneob,oneoblat,oneoblon,oneobheight,oneobvalue,oneobddiff,oneobradid,& radar_no_thinning,ens_hx_dbz_cut,static_gsi_nopcp_dbz,rmesh_dbz,& - rmesh_vr,zmesh_dbz,zmesh_vr,if_vterminal, if_model_dbz,if_vrobs_raw,& + rmesh_vr,zmesh_dbz,zmesh_vr,if_vterminal, if_model_dbz,if_vrobs_raw,if_use_w_vr,& minobrangedbz,maxobrangedbz,maxobrangevr,maxtiltvr,missing_to_nopcp,& ntilt_radarfiles,whichradar,& minobrangevr,maxtiltdbz,mintiltvr,mintiltdbz,l2rwthin,hurricane_radar @@ -99,7 +99,7 @@ module gsimod factv,factl,factp,factg,factw10m,facthowv,factcldch,niter,niter_no_qc,biascor,& init_jfunc,qoption,cwoption,switch_on_derivatives,tendsflag,jiterstart,jiterend,R_option,& bcoption,diurnalbc,print_diag_pcg,tsensible,diag_precon,step_start,pseudo_q2,& - clip_supersaturation,cnvw_option + clip_supersaturation,cnvw_option,hofx_2m_sfcfile use state_vectors, only: init_anasv,final_anasv use control_vectors, only: init_anacv,final_anacv,nrf,nvars,nrf_3d,cvars3d,cvars2d,& nrf_var,lcalc_gfdl_cfrac,incvars_to_zero,incvars_zero_strat,incvars_efold @@ -149,8 +149,12 @@ module gsimod 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,limqens - use hybrid_ensemble_parameters,only : l_both_fv3sar_gfs_ens,n_ens_gfs,n_ens_fv3sar + l_ens_in_diff_time,ensemble_path,ens_fast_read,sst_staticB,limqens, & + ntotensgrp,nsclgrp,naensgrp,ngvarloc,ntlevs_ens,naensloc, & + r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl,l_timloc_opt,& + vdl_scale,vloc_varlist,& + global_spectral_filter_sd,assign_vdl_nml,parallelization_over_ensmembers + use hybrid_ensemble_parameters,only : l_both_fv3sar_gfs_ens,n_ens_gfs,n_ens_fv3sar,weight_ens_gfs,weight_ens_fv3sar 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, & @@ -181,7 +185,7 @@ module gsimod oblon_chem,obpres_chem,diag_incr,elev_tolerance,tunable_error,& in_fname,out_fname,incr_fname, & laeroana_gocart, l_aoderr_table, aod_qa_limit, luse_deepblue, lread_ext_aerosol, & - laeroana_fv3cmaq,crtm_aerosol_model,crtm_aerosolcoeff_format,crtm_aerosolcoeff_file, & + laeroana_fv3cmaq,laeroana_fv3smoke,pm2_5_innov_threshold,crtm_aerosol_model,crtm_aerosolcoeff_format,crtm_aerosolcoeff_file, & icvt_cmaq_fv3, raod_radius_mean_scale,raod_radius_std_scale use chemmod, only : wrf_pm2_5,aero_ratios @@ -497,6 +501,7 @@ module gsimod ! 2. fv3_regional = .true. ! 3. fv3_cmaq_regional = .true. ! 4. berror_fv3_cmaq_regional = .true. +! 09-15-2022 yokota - add scale/variable/time-dependent localization ! !EOP !------------------------------------------------------------------------- @@ -760,7 +765,7 @@ module gsimod oneoblon,oneobheight,oneobvalue,oneobddiff,oneobradid,& rmesh_vr,zmesh_dbz,zmesh_vr, ntilt_radarfiles, whichradar,& radar_no_thinning,ens_hx_dbz_cut,static_gsi_nopcp_dbz,rmesh_dbz,& - minobrangevr, maxtiltdbz, mintiltvr,mintiltdbz,if_vterminal,if_vrobs_raw,& + minobrangevr, maxtiltdbz, mintiltvr,mintiltdbz,if_vterminal,if_vrobs_raw,if_use_w_vr,& if_model_dbz,imp_physics,lupp,netcdf_diag,binary_diag,l_wcp_cwm,aircraft_recon,diag_version,& write_fv3_incr,incvars_to_zero,incvars_zero_strat,incvars_efold,diag_version,& cao_check,lcalc_gfdl_cfrac,tau_fcst,efsoi_order,lupdqc,lqcoef,cnvw_option,l2rwthin,hurricane_radar,& @@ -1042,7 +1047,7 @@ module gsimod ! l_foreaft_thin - separate TDR fore/aft scan for thinning namelist/obs_input/dmesh,time_window_max,time_window_rad, & - ext_sonde,l_foreaft_thin + ext_sonde,l_foreaft_thin,hofx_2m_sfcfile ! SINGLEOB_TEST (one observation test case setup): ! maginnov - magnitude of innovation for one ob @@ -1309,9 +1314,19 @@ module gsimod ! 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. +! s_ens_h - horizontal localization correlation length of Gaussian exp(-0.5*(r/L)**2) +! (units of km), default = 2828.0 +! s_ens_v - vertical localization correlation length of Gaussian exp(-0.5*(r/L)**2) +! (grid units if s_ens_v>=0, or units of ln(p) if s_ens_v<0), default = 30.0 +! in scale/variable/time-dependent localization (SDL/VDL/TDL), +! localization length for i-th scale, j-th variable, and k-th time is +! s_ens_[hv]( i + nsclgrp*(j-1) + nsclgrp*ngvarloc*(k-1) ) +! in SDL(nsclgrp>1), i = 1(largest scale) .. nsclgrp(smallest scale) +! in VDL(ngvarloc=2), j = 1(itracer<=10) .. 2(itracer>=11) +! in TDL(l_timloc_opt=true), k = 1(first time bin) .. ntlevs_ens(last time bin) +! in SDL, scale separation length for i-th scale is also set here as +! s_ens_[hv]( naensgrp+i ) - naensgrp is the total number of localization lengths for SDL/VDL/TDL +! in applying SDL only horizontally, set s_ens_v(naensgrp+i)=0.0 ! use_gfs_ens - controls use of global ensemble: .t. use GFS (default); .f. uses user-defined ens ! readin_localization - flag to read (.true.)external localization information file ! readin_beta - flag to read (.true.) the vertically varying beta parameters beta_s and beta_e @@ -1349,14 +1364,65 @@ module gsimod ! ensemble_path - path to ensemble members; default './' ! ens_fast_read - read ensemble in parallel; default '.false.' ! sst_staticB - use only static background error covariance for SST statistic -! -! - namelist/hybrid_ensemble/l_hyb_ens,uv_hyb_ens,q_hyb_ens,aniso_a_en,generate_ens,n_ens,l_both_fv3sar_gfs_ens,n_ens_gfs,n_ens_fv3sar,nlon_ens,nlat_ens,jcap_ens,& +! nsclgrp - number of scale-dependent localization lengths +! l_timloc_opt - if true, then turn on time-dependent localization +! ngvarloc - number of variable-dependent localization lengths +! naensloc - total number of spatial localization lengths and scale separation lengths (should be naensgrp+nsclgrp-1) +! r_ensloccov4tim - factor multiplying to cross-time covariance +! For example, +! =0.0: cross-time covariance is decreased to zero +! =0.5: cross-time covariance is decreased to half +! =1.0: cross-time covariance is retained +! r_ensloccov4var - factor multiplying to cross-variable covariance +! For example, +! =0.0: cross-variable covariance is decreased to zero +! =0.5: cross-variable covariance is decreased to half +! =1.0: cross-variable covariance is retained +! r_ensloccov4scl - factor multiplying to cross-scale covariance +! For example, +! =0.0: cross-scale covariance is decreased to zero +! =0.5: cross-scale covariance is decreased to half +! =1.0: cross-scale covariance is retained +! global_spectral_filter_sd - if true, use spectral filter function for +! scale decomposition in the global application (Huang et al. 2021) +! assign_vdl_nml - if true, vdl_scale, and vloc_varlist will be used for +! assigning variable-dependent localization upon SDL in gsiparm.anl. +! This method described in (Wang and Wang 2022, JAMES) is +! equivalent to, but different from the method associated +! with the parameter r_ensloccov4var. +! vloc_varlist - list of control variables using the same localization length, +! effective only with assign_vdl_nml=.true. For example, +! vloc_varlist(1,:) = 'sf','vp','ps','t', +! vloc_varlist(2,:) = 'q', +! vloc_varlist(3,:) = 'qr','qs','qg','dbz','w','ql','qi', +! vloc_varlist(4,:) = 'sf','vp','ps','t','q', +! vloc_varlist(5,:) = 'qr','qs','qg','dbz','w','ql','qi', +! This example indicates that 3 variable-groups will be adopted for VDL. +! 'sf','vp','ps','t' will share the same localization length of v1L1; +! 'q' will have the localization lenth of v2L1 +! 'qr','qs','qg','dbz','w','ql','qi', use the same localization length of v3L1 +! +! For L2, a different configuration of VDL can be applied: +! ~~~~~~~~~ +! 'sf','vp','ps','t','q' will share the same localization length of v2L2; +! 'qr','qs','qg','dbz','w','ql','qi', use the same localization length of v2L2 +! vdl_scale - number of variables in each variable-group, effective only with assign_vdl_nml=.true. +! if 3 variable-groups with 2 separated scale is set, +! vdl_scale = 3, 3, 3, 2, 2 +! ^ ^ ^ ^ ^ +! s_ens_h = v1L1 v2L1 v3L1 v1L2 v2L2 +! Then localization lengths will be assigned as above. +! + namelist/hybrid_ensemble/l_hyb_ens,uv_hyb_ens,q_hyb_ens,aniso_a_en,generate_ens,n_ens,& + l_both_fv3sar_gfs_ens,n_ens_gfs,n_ens_fv3sar,weight_ens_gfs,weight_ens_fv3sar,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,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,limqens + i_en_perts_io,l_ens_in_diff_time,ensemble_path,ens_fast_read,sst_staticB,limqens, & + nsclgrp,l_timloc_opt,ngvarloc,naensloc,r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl,& + vdl_scale,vloc_varlist,& + global_spectral_filter_sd,assign_vdl_nml,parallelization_over_ensmembers ! rapidrefresh_cldsurf (options for cloud analysis and surface ! enhancement for RR appilcation ): @@ -1542,9 +1608,9 @@ module gsimod oneob_type_chem,oblat_chem,oblon_chem,obpres_chem,& diag_incr,elev_tolerance,tunable_error,& in_fname,out_fname,incr_fname,& - laeroana_gocart, laeroana_fv3cmaq,l_aoderr_table, aod_qa_limit, & + laeroana_gocart, laeroana_fv3cmaq,laeroana_fv3smoke,l_aoderr_table, aod_qa_limit, & crtm_aerosol_model,crtm_aerosolcoeff_format,crtm_aerosolcoeff_file, & - icvt_cmaq_fv3, & + icvt_cmaq_fv3,pm2_5_innov_threshold, & raod_radius_mean_scale,raod_radius_std_scale, luse_deepblue,& aero_ratios,wrf_pm2_5, lread_ext_aerosol @@ -1759,9 +1825,10 @@ subroutine gsimain_initialize n_ens_gfs=n_ens n_ens_fv3sar=0 else - write(6,*)'n_ens_gfs and n_ens_fv3sar won"t be used if not regional_ensemble_option==5' + if(mype == 0)write(6,*)'n_ens_gfs and n_ens_fv3sar won"t be used if not regional_ensemble_option==5' endif - + weight_ens_gfs=one + weight_ens_fv3sar=one endif if(ltlint) then if(vqc .or. njqc .or. nvqc)then @@ -1807,6 +1874,18 @@ subroutine gsimain_initialize call stop2(137) endif + ntotensgrp=nsclgrp*ngvarloc + if(l_timloc_opt) then + naensgrp=ntotensgrp*ntlevs_ens + else + naensgrp=ntotensgrp + endif + if( (.not. global_spectral_filter_sd) .and. (.not. assign_vdl_nml) .and. naensloc zero) then + if(maxval(z_len(:,ig)) > zero) then ! z_len is in grid units do k=1,nsig - aspect(k)=z_len(k)**2 + aspect(k)=z_len(k,ig)**2 enddo do i=1,nxy @@ -265,13 +269,13 @@ subroutine init_rf_z(z_len) do l=1,2 do k=1,nsig do j=1,2 - fmatz(i,j,k,l)=fmatz_tmp(j,k,l) + fmatz(i,j,k,l,ig)=fmatz_tmp(j,k,l) enddo enddo enddo do l=1,2 do k=1,nsig - fmat0z(i,k,l)=fmat0z_tmp(k,l) + fmat0z(i,k,l,ig)=fmat0z_tmp(k,l) enddo enddo enddo @@ -320,7 +324,7 @@ subroutine init_rf_z(z_len) do k=1,nsig dlnp=abs(ln_p_int(k)-ln_p_int(k+1)) - d1=abs(z_len(k))/dlnp + d1=abs(z_len(k,ig))/dlnp d1=min(rnsig,d1) aspect(k)=d1**2 !! if(mype == 0) write(400,'(" k, vertical localization in grid units for ln(p) scaling =",i4,f10.2,f10.2,f10.2)') & @@ -331,18 +335,19 @@ subroutine init_rf_z(z_len) do l=1,2 do k=1,nsig do j=1,2 - fmatz(i,j,k,l)=fmatz_tmp(j,k,l) + fmatz(i,j,k,l,ig)=fmatz_tmp(j,k,l) enddo enddo enddo do l=1,2 do k=1,nsig - fmat0z(i,k,l)=fmat0z_tmp(k,l) + fmat0z(i,k,l,ig)=fmat0z_tmp(k,l) enddo enddo enddo enddo end if + enddo !ig loop deallocate(fmatz_tmp,fmat0z_tmp) return @@ -376,37 +381,41 @@ subroutine init_rf_x(x_len,kl) use hybrid_ensemble_parameters, only: grd_loc use hybrid_ensemble_parameters, only: region_dx_ens,region_dy_ens + use hybrid_ensemble_parameters, only: naensloc use constants, only: half implicit none - real(r_kind),intent(in ) :: x_len(kl) + real(r_kind),intent(in ) :: x_len(kl,naensloc) integer(i_kind),intent(in ) :: kl - integer(i_kind) i,j,k,l,kk + integer(i_kind) i,j,k,l,kk,ig real(r_kind) aspect(grd_loc%nlon) real(r_kind) fmatc(2,grd_loc%nlon,2),fmat0c(grd_loc%nlon,2) ! use new factorization: if(allocated(fmatx)) deallocate(fmatx) if(allocated(fmat0x)) deallocate(fmat0x) - allocate(fmatx(grd_loc%nlat,2,grd_loc%nlon,2,kl),fmat0x(grd_loc%nlat,grd_loc%nlon,2,kl)) - do k=1,kl - do i=1,grd_loc%nlat - do j=1,grd_loc%nlon - aspect(j)=(x_len(k)*region_dy_ens(grd_loc%nlat/2,grd_loc%nlon/2)/region_dx_ens(i,j))**2 ! only works for rotated lat-lon grids - enddo - call get_new_alpha_beta(aspect,grd_loc%nlon,fmatc,fmat0c) - do kk=1,2 + allocate(fmatx(grd_loc%nlat,2,grd_loc%nlon,2,kl,naensloc),fmat0x(grd_loc%nlat,grd_loc%nlon,2,kl,naensloc)) + do ig=1,naensloc + do k=1,kl + do i=1,grd_loc%nlat do j=1,grd_loc%nlon - do l=1,2 - fmatx(i,l,j,kk,k)=fmatc(l,j,kk) + ! only works for rotated lat-lon grids + aspect(j)=(x_len(k,ig)*region_dy_ens(grd_loc%nlat/2,grd_loc%nlon/2)/region_dx_ens(i,j))**2 + enddo + call get_new_alpha_beta(aspect,grd_loc%nlon,fmatc,fmat0c) + do kk=1,2 + do j=1,grd_loc%nlon + do l=1,2 + fmatx(i,l,j,kk,k,ig)=fmatc(l,j,kk) + enddo + fmat0x(i,j,kk,k,ig)=fmat0c(j,kk) enddo - fmat0x(i,j,kk,k)=fmat0c(j,kk) enddo enddo enddo - enddo + enddo !ig loop return end subroutine init_rf_x @@ -438,31 +447,34 @@ subroutine init_rf_y(y_len,kl) !$$$ use hybrid_ensemble_parameters, only: grd_loc + use hybrid_ensemble_parameters, only: naensloc use constants, only: half implicit none - real(r_kind),intent(in ) :: y_len(kl) + real(r_kind),intent(in ) :: y_len(kl,naensloc) integer(i_kind),intent(in ) :: kl real(r_kind) aspect(grd_loc%nlat) - integer(i_kind) i,k + integer(i_kind) i,k,ig ! use new factorization: if(allocated(fmaty)) deallocate(fmaty) if(allocated(fmat0y)) deallocate(fmat0y) - allocate(fmaty(2,grd_loc%nlat,2,kl),fmat0y(grd_loc%nlat,2,kl)) - do k=1,kl - do i=1,grd_loc%nlat - aspect(i)=y_len(k)**2 + allocate(fmaty(2,grd_loc%nlat,2,kl,naensloc),fmat0y(grd_loc%nlat,2,kl,naensloc)) + do ig=1,naensloc + do k=1,kl + do i=1,grd_loc%nlat + aspect(i)=y_len(k,ig)**2 + enddo + call get_new_alpha_beta(aspect,grd_loc%nlat,fmaty(1,1,1,k,ig),fmat0y(1,1,k,ig)) enddo - call get_new_alpha_beta(aspect,grd_loc%nlat,fmaty(1,1,1,k),fmat0y(1,1,k)) - enddo + enddo !ig loop return end subroutine init_rf_y -subroutine new_factorization_rf_z(f,iadvance,iback) +subroutine new_factorization_rf_z(f,iadvance,iback,ig) !$$$ subprogram documentation block ! . . . ! subprogram: new_factorization_rf_z @@ -480,6 +492,7 @@ subroutine new_factorization_rf_z(f,iadvance,iback) ! f - input field to be filtered ! iadvance - =1 for forward operator, =2 for adjoint operator ! iback - =2 for forward operator, =1 for adjoint operator +! ig - number for smoothing scales ! ! output argument list: ! f - filtered output @@ -493,7 +506,7 @@ subroutine new_factorization_rf_z(f,iadvance,iback) use hybrid_ensemble_parameters, only: grd_ens implicit none - integer(i_kind),intent(in ) :: iadvance,iback + integer(i_kind),intent(in ) :: iadvance,iback,ig real(r_kind) ,intent(inout) :: f(grd_ens%latlon11,grd_ens%nsig) integer(i_kind) i,k,l,nxy,nz @@ -502,34 +515,34 @@ subroutine new_factorization_rf_z(f,iadvance,iback) if(iadvance == 1) then do k=1,nz do i=1,nxy - f(i,k)=znorm_new(i,k)*f(i,k) + f(i,k)=znorm_new(i,k,ig)*f(i,k) enddo enddo end if do k=1,nz do l=1,min(2,k-1) do i=1,nxy - f(i,k)=f(i,k)-fmatz(i,l,k,iadvance)*f(i,k-l) + f(i,k)=f(i,k)-fmatz(i,l,k,iadvance,ig)*f(i,k-l) enddo enddo do i=1,nxy - f(i,k)=fmat0z(i,k,iadvance)*f(i,k) + f(i,k)=fmat0z(i,k,iadvance,ig)*f(i,k) enddo enddo do k=nz,1,-1 do l=1,min(2,nz-k) do i=1,nxy - f(i,k)=f(i,k)-fmatz(i,l,k+l,iback)*f(i,k+l) + f(i,k)=f(i,k)-fmatz(i,l,k+l,iback,ig)*f(i,k+l) enddo enddo do i=1,nxy - f(i,k)=fmat0z(i,k,iback)*f(i,k) + f(i,k)=fmat0z(i,k,iback,ig)*f(i,k) enddo enddo if(iadvance == 2) then do k=1,nz do i=1,nxy - f(i,k)=znorm_new(i,k)*f(i,k) + f(i,k)=znorm_new(i,k,ig)*f(i,k) enddo enddo end if @@ -537,7 +550,7 @@ subroutine new_factorization_rf_z(f,iadvance,iback) end subroutine new_factorization_rf_z -subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) +subroutine new_factorization_rf_x(f,iadvance,iback,nlevs,ig) !$$$ subprogram documentation block ! . . . ! subprogram: new_factorization_rf_x @@ -556,6 +569,8 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) ! f - input field to be filtered ! iadvance - =1 for forward operator, =2 for adjoint operator ! iback - =2 for forward operator, =1 for adjoint operator +! nlevs - number of vertical levels for smoothing +! ig - number for smoothing scales ! ! output argument list: ! f - filtered output @@ -568,7 +583,7 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) use hybrid_ensemble_parameters, only: grd_loc,vvlocal implicit none - integer(i_kind),intent(in ) :: iadvance,iback,nlevs + integer(i_kind),intent(in ) :: iadvance,iback,nlevs,ig real(r_kind) ,intent(inout) :: f(grd_loc%nlat,grd_loc%nlon,max(nlevs,1)) integer(i_kind) i,j,k,l,ny,nx,nz @@ -582,7 +597,7 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) if(iadvance == 1) then do j=1,nx do i=1,ny - f(i,j,k)=xnorm_new(i,j,k)*f(i,j,k) + f(i,j,k)=xnorm_new(i,j,k,ig)*f(i,j,k) enddo enddo end if @@ -590,29 +605,29 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) do j=1,nx do l=1,min(2,j-1) do i=1,ny - f(i,j,k)=f(i,j,k)-fmatx(i,l,j,iadvance,k)*f(i,j-l,k) + f(i,j,k)=f(i,j,k)-fmatx(i,l,j,iadvance,k,ig)*f(i,j-l,k) enddo enddo do i=1,ny - f(i,j,k)=fmat0x(i,j,iadvance,k)*f(i,j,k) + f(i,j,k)=fmat0x(i,j,iadvance,k,ig)*f(i,j,k) enddo enddo do j=nx,1,-1 do l=1,min(2,nx-j) do i=1,ny - f(i,j,k)=f(i,j,k)-fmatx(i,l,j+l,iback,k)*f(i,j+l,k) + f(i,j,k)=f(i,j,k)-fmatx(i,l,j+l,iback,k,ig)*f(i,j+l,k) enddo enddo do i=1,ny - f(i,j,k)=fmat0x(i,j,iback,k)*f(i,j,k) + f(i,j,k)=fmat0x(i,j,iback,k,ig)*f(i,j,k) enddo enddo if(iadvance == 2) then do j=1,nx do i=1,ny - f(i,j,k)=xnorm_new(i,j,k)*f(i,j,k) + f(i,j,k)=xnorm_new(i,j,k,ig)*f(i,j,k) enddo enddo end if @@ -625,7 +640,7 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) if(iadvance == 1) then do j=1,nx do i=1,ny - f(i,j,k)=xnorm_new(i,j,1)*f(i,j,k) + f(i,j,k)=xnorm_new(i,j,1,ig)*f(i,j,k) enddo enddo end if @@ -633,29 +648,29 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) do j=1,nx do l=1,min(2,j-1) do i=1,ny - f(i,j,k)=f(i,j,k)-fmatx(i,l,j,iadvance,1)*f(i,j-l,k) + f(i,j,k)=f(i,j,k)-fmatx(i,l,j,iadvance,1,ig)*f(i,j-l,k) enddo enddo do i=1,ny - f(i,j,k)=fmat0x(i,j,iadvance,1)*f(i,j,k) + f(i,j,k)=fmat0x(i,j,iadvance,1,ig)*f(i,j,k) enddo enddo do j=nx,1,-1 do l=1,min(2,nx-j) do i=1,ny - f(i,j,k)=f(i,j,k)-fmatx(i,l,j+l,iback,1)*f(i,j+l,k) + f(i,j,k)=f(i,j,k)-fmatx(i,l,j+l,iback,1,ig)*f(i,j+l,k) enddo enddo do i=1,ny - f(i,j,k)=fmat0x(i,j,iback,1)*f(i,j,k) + f(i,j,k)=fmat0x(i,j,iback,1,ig)*f(i,j,k) enddo enddo if(iadvance == 2) then do j=1,nx do i=1,ny - f(i,j,k)=xnorm_new(i,j,1)*f(i,j,k) + f(i,j,k)=xnorm_new(i,j,1,ig)*f(i,j,k) enddo enddo end if @@ -665,7 +680,7 @@ subroutine new_factorization_rf_x(f,iadvance,iback,nlevs) return end subroutine new_factorization_rf_x -subroutine new_factorization_rf_y(f,iadvance,iback,nlevs) +subroutine new_factorization_rf_y(f,iadvance,iback,nlevs,ig) !$$$ subprogram documentation block ! . . . ! subprogram: new_factorization_rf_y @@ -684,6 +699,8 @@ subroutine new_factorization_rf_y(f,iadvance,iback,nlevs) ! f - input field to be filtered ! iadvance - =1 for forward operator, =2 for adjoint operator ! iback - =2 for forward operator, =1 for adjoint operator +! nlevs - number of vertical levels for smoothing +! ig - number for smoothing scales ! ! output argument list: ! f - filtered output @@ -697,7 +714,7 @@ subroutine new_factorization_rf_y(f,iadvance,iback,nlevs) ! use mpimod, only: mype implicit none - integer(i_kind),intent(in ) :: iadvance,iback,nlevs + integer(i_kind),intent(in ) :: iadvance,iback,nlevs,ig real(r_kind) ,intent(inout) :: f(grd_loc%nlat,grd_loc%nlon,max(nlevs,1)) integer(i_kind) i,j,k,l,nx,ny,nz @@ -710,27 +727,27 @@ subroutine new_factorization_rf_y(f,iadvance,iback,nlevs) if(iadvance == 1) then do i=1,ny - f(i,j,k)=ynorm_new(i,k)*f(i,j,k) + f(i,j,k)=ynorm_new(i,k,ig)*f(i,j,k) enddo end if do i=1,ny do l=1,min(2,i-1) - f(i,j,k)=f(i,j,k)-fmaty(l,i,iadvance,k)*f(i-l,j,k) + f(i,j,k)=f(i,j,k)-fmaty(l,i,iadvance,k,ig)*f(i-l,j,k) enddo - f(i,j,k)=fmat0y(i,iadvance,k)*f(i,j,k) + f(i,j,k)=fmat0y(i,iadvance,k,ig)*f(i,j,k) enddo do i=ny,1,-1 do l=1,min(2,ny-i) - f(i,j,k)=f(i,j,k)-fmaty(l,i+l,iback,k)*f(i+l,j,k) + f(i,j,k)=f(i,j,k)-fmaty(l,i+l,iback,k,ig)*f(i+l,j,k) enddo - f(i,j,k)=fmat0y(i,iback,k)*f(i,j,k) + f(i,j,k)=fmat0y(i,iback,k,ig)*f(i,j,k) enddo if(iadvance == 2) then do i=1,ny - f(i,j,k)=ynorm_new(i,k)*f(i,j,k) + f(i,j,k)=ynorm_new(i,k,ig)*f(i,j,k) enddo end if @@ -742,27 +759,27 @@ subroutine new_factorization_rf_y(f,iadvance,iback,nlevs) if(iadvance == 1) then do i=1,ny - f(i,j,k)=ynorm_new(i,1)*f(i,j,k) + f(i,j,k)=ynorm_new(i,1,ig)*f(i,j,k) enddo end if do i=1,ny do l=1,min(2,i-1) - f(i,j,k)=f(i,j,k)-fmaty(l,i,iadvance,1)*f(i-l,j,k) + f(i,j,k)=f(i,j,k)-fmaty(l,i,iadvance,1,ig)*f(i-l,j,k) enddo - f(i,j,k)=fmat0y(i,iadvance,1)*f(i,j,k) + f(i,j,k)=fmat0y(i,iadvance,1,ig)*f(i,j,k) enddo do i=ny,1,-1 do l=1,min(2,ny-i) - f(i,j,k)=f(i,j,k)-fmaty(l,i+l,iback,1)*f(i+l,j,k) + f(i,j,k)=f(i,j,k)-fmaty(l,i+l,iback,1,ig)*f(i+l,j,k) enddo - f(i,j,k)=fmat0y(i,iback,1)*f(i,j,k) + f(i,j,k)=fmat0y(i,iback,1,ig)*f(i,j,k) enddo if(iadvance == 2) then do i=1,ny - f(i,j,k)=ynorm_new(i,1)*f(i,j,k) + f(i,j,k)=ynorm_new(i,1,ig)*f(i,j,k) enddo end if @@ -798,34 +815,37 @@ subroutine normal_new_factorization_rf_z use kinds, only: r_kind,i_kind use hybrid_ensemble_parameters, only: grd_ens + use hybrid_ensemble_parameters, only: naensgrp,naensloc use constants, only: zero,one implicit none - integer(i_kind) k,iadvance,iback,nxy + integer(i_kind) k,iadvance,iback,nxy,ig real(r_kind) f(grd_ens%latlon11,grd_ens%nsig),diag(grd_ens%latlon11,grd_ens%nsig) if(allocated(znorm_new)) deallocate(znorm_new) - allocate(znorm_new(grd_ens%latlon11,grd_ens%nsig)) + allocate(znorm_new(grd_ens%latlon11,grd_ens%nsig,naensloc)) nxy=grd_ens%latlon11 znorm_new=one - do k=1,grd_ens%nsig - f=zero - f(:,k)=one - - iadvance=1 ; iback=2 - call new_factorization_rf_z(f,iadvance,iback) - iadvance=2 ; iback=1 - call new_factorization_rf_z(f,iadvance,iback) + do ig=1,naensgrp + do k=1,grd_ens%nsig + f=zero + f(:,k)=one - diag(:,k)=sqrt(one/f(:,k)) - enddo + iadvance=1 ; iback=2 + call new_factorization_rf_z(f,iadvance,iback,ig) + iadvance=2 ; iback=1 + call new_factorization_rf_z(f,iadvance,iback,ig) + + diag(:,k)=sqrt(one/f(:,k)) + enddo - do k=1,grd_ens%nsig - znorm_new(:,k)=diag(:,k) - enddo + do k=1,grd_ens%nsig + znorm_new(:,k,ig)=diag(:,k) + enddo + enddo !ig loop ! Check result: if(debug)then @@ -834,9 +854,9 @@ subroutine normal_new_factorization_rf_z f(:,k)=one iadvance=1 ; iback=2 - call new_factorization_rf_z(f,iadvance,iback) + call new_factorization_rf_z(f,iadvance,iback,1) iadvance=2 ; iback=1 - call new_factorization_rf_z(f,iadvance,iback) + call new_factorization_rf_z(f,iadvance,iback,1) diag(:,k)=sqrt(one/f(:,k)) enddo @@ -876,11 +896,12 @@ subroutine normal_new_factorization_rf_x use kinds, only: r_kind,i_kind use hybrid_ensemble_parameters, only: grd_loc,vvlocal + use hybrid_ensemble_parameters, only: naensgrp,naensloc use constants, only: zero,one implicit none - integer(i_kind) i,j,k,iadvance,iback,kl + integer(i_kind) i,j,k,iadvance,iback,kl,ig real(r_kind) f(grd_loc%nlat,grd_loc%nlon,grd_loc%kend_alloc+1-grd_loc%kbegin_loc) real(r_kind),allocatable:: diag(:,:,:) ! real(r_kind) diag(grd_loc%nlat,grd_loc%nlon) @@ -896,35 +917,37 @@ subroutine normal_new_factorization_rf_x kl=1 endif if(allocated(xnorm_new)) deallocate(xnorm_new) - allocate(xnorm_new(grd_loc%nlat,grd_loc%nlon,kl)) + allocate(xnorm_new(grd_loc%nlat,grd_loc%nlon,kl,naensloc)) if(allocated(diag)) deallocate(diag) allocate(diag(grd_loc%nlat,grd_loc%nlon,kl)) xnorm_new=one - do j=1,grd_loc%nlon - f=zero - do k=1,kl - do i=1,grd_loc%nlat - f(i,j,k)=one + do ig=1,naensgrp + do j=1,grd_loc%nlon + f=zero + do k=1,kl + do i=1,grd_loc%nlat + f(i,j,k)=one + enddo enddo - enddo - iadvance=1 ; iback=2 - call new_factorization_rf_x(f,iadvance,iback,kl) - iadvance=2 ; iback=1 - call new_factorization_rf_x(f,iadvance,iback,kl) - do k=1,kl - do i=1,grd_loc%nlat - diag(i,j,k)=sqrt(one/f(i,j,k)) + iadvance=1 ; iback=2 + call new_factorization_rf_x(f,iadvance,iback,kl,ig) + iadvance=2 ; iback=1 + call new_factorization_rf_x(f,iadvance,iback,kl,ig) + do k=1,kl + do i=1,grd_loc%nlat + diag(i,j,k)=sqrt(one/f(i,j,k)) + enddo enddo enddo - enddo - do k=1,kl - do j=1,grd_loc%nlon - do i=1,grd_loc%nlat - xnorm_new(i,j,k)=diag(i,j,k) + do k=1,kl + do j=1,grd_loc%nlon + do i=1,grd_loc%nlat + xnorm_new(i,j,k,ig)=diag(i,j,k) + enddo enddo enddo - enddo + enddo !ig loop ! check accuracy of xnorm if(debug) then do j=1,grd_loc%nlon @@ -935,9 +958,9 @@ subroutine normal_new_factorization_rf_x enddo enddo iadvance=1 ; iback=2 - call new_factorization_rf_x(f,iadvance,iback,kl) + call new_factorization_rf_x(f,iadvance,iback,kl,1) iadvance=2 ; iback=1 - call new_factorization_rf_x(f,iadvance,iback,kl) + call new_factorization_rf_x(f,iadvance,iback,kl,1) do k=1,kl do i=1,grd_loc%nlat diag(i,j,k)=f(i,j,k) @@ -977,10 +1000,11 @@ subroutine normal_new_factorization_rf_y use kinds, only: r_kind,i_kind use hybrid_ensemble_parameters, only: grd_loc,vvlocal + use hybrid_ensemble_parameters, only: naensgrp,naensloc use constants, only: zero,one implicit none - integer(i_kind) i,k,lend,lcount,iadvance,iback,kl,loop,ll,iend + integer(i_kind) i,k,lend,lcount,iadvance,iback,kl,loop,ll,iend,ig ! real(r_kind) f(grd_loc%nlat,grd_loc%nlon*(grd_loc%kend_alloc+1-grd_loc%kbegin_loc)),diag(grd_loc%nlat) real(r_kind) f(grd_loc%nlat,grd_loc%nlon,grd_loc%kend_alloc+1-grd_loc%kbegin_loc) real(r_kind),allocatable:: diag(:,:) @@ -997,7 +1021,7 @@ subroutine normal_new_factorization_rf_y endif if(allocated(ynorm_new)) deallocate(ynorm_new) - allocate(ynorm_new(grd_loc%nlat,kl)) + allocate(ynorm_new(grd_loc%nlat,kl,naensloc)) if(allocated(diag)) deallocate(diag) allocate(diag(grd_loc%nlat,kl)) @@ -1012,31 +1036,33 @@ subroutine normal_new_factorization_rf_y iend=grd_loc%nlon endif - do loop=1,lend - ll=(loop-1)*iend - f=zero - do k=1,kl - do i=1,iend - lcount=ll+i - f(lcount,i,k)=one - if(lcount == grd_loc%nlat) exit + do ig=1,naensgrp + do loop=1,lend + ll=(loop-1)*iend + f=zero + do k=1,kl + do i=1,iend + lcount=ll+i + f(lcount,i,k)=one + if(lcount == grd_loc%nlat) exit + enddo enddo - enddo - iadvance=1 ; iback=2 - call new_factorization_rf_y(f,iadvance,iback,kl) - iadvance=2 ; iback=1 - call new_factorization_rf_y(f,iadvance,iback,kl) + iadvance=1 ; iback=2 + call new_factorization_rf_y(f,iadvance,iback,kl,ig) + iadvance=2 ; iback=1 + call new_factorization_rf_y(f,iadvance,iback,kl,ig) - do k=1,kl - do i=1,iend - lcount=ll+i - diag(lcount,k)=sqrt(one/f(lcount,i,k)) - ynorm_new(lcount,k)=diag(lcount,k) - if(lcount == grd_loc%nlat) exit + do k=1,kl + do i=1,iend + lcount=ll+i + diag(lcount,k)=sqrt(one/f(lcount,i,k)) + ynorm_new(lcount,k,ig)=diag(lcount,k) + if(lcount == grd_loc%nlat) exit + enddo enddo enddo - enddo + enddo !ig loop ! check that ynorm is corect if(debug) then do loop=1,lend @@ -1051,9 +1077,9 @@ subroutine normal_new_factorization_rf_y enddo iadvance=1 ; iback=2 - call new_factorization_rf_y(f,iadvance,iback,kl) + call new_factorization_rf_y(f,iadvance,iback,kl,1) iadvance=2 ; iback=1 - call new_factorization_rf_y(f,iadvance,iback,kl) + call new_factorization_rf_y(f,iadvance,iback,kl,1) do k=1,kl do i=1,iend @@ -1094,37 +1120,40 @@ subroutine create_ensemble !$$$ use hybrid_ensemble_parameters, only: n_ens,grd_ens,ntlevs_ens use hybrid_ensemble_parameters, only: nelen,en_perts,ps_bar + use hybrid_ensemble_parameters, only: ntotensgrp implicit none type(gsi_grid) :: grid_ens - integer(i_kind) n,istatus,m + integer(i_kind) n,istatus,m,ig character(len=*),parameter::myname_=trim(myname)//'*create_ensemble' nelen=grd_ens%latlon11*(max(0,nc3d)*grd_ens%nsig+max(0,nc2d)) ! create ensemble perturbations bundles (using newly added r_single capability - allocate(en_perts(n_ens,ntlevs_ens)) + allocate(en_perts(n_ens,ntotensgrp,ntlevs_ens)) call gsi_gridcreate(grid_ens,grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) do m=1,ntlevs_ens - do n=1,n_ens - call gsi_bundlecreate(en_perts(n,m),grid_ens,'ensemble perts',istatus, & - names2d=cvars2d,names3d=cvars3d,bundle_kind=r_single) - if(istatus/=0) then - write(6,*)trim(myname_),': trouble creating en_perts bundle' - call stop2(999) - endif + do ig=1,ntotensgrp + do n=1,n_ens + call gsi_bundlecreate(en_perts(n,ig,m),grid_ens,'ensemble perts',istatus, & + names2d=cvars2d,names3d=cvars3d,bundle_kind=r_single) + if(istatus/=0) then + write(6,*)trim(myname_),': trouble creating en_perts bundle' + call stop2(999) + endif + enddo enddo enddo allocate(ps_bar(grd_ens%lat2,grd_ens%lon2,ntlevs_ens) ) if(debug) then - write(6,*)' in create_ensemble, grd_ens%latlon11,grd_ens%latlon1n,n_ens,ntlevs_ens=', & - grd_ens%latlon11,grd_ens%latlon1n,n_ens,ntlevs_ens - write(6,*)' in create_ensemble, total bytes allocated=',4*nelen*n_ens*ntlevs_ens + write(6,*)' in create_ensemble, grd_ens%latlon11,grd_ens%latlon1n,n_ens,ntotensgrp,ntlevs_ens=', & + grd_ens%latlon11,grd_ens%latlon1n,n_ens,ntotensgrp,ntlevs_ens + write(6,*)' in create_ensemble, total bytes allocated=',4*nelen*n_ens*ntotensgrp*ntlevs_ens end if return @@ -1245,7 +1274,7 @@ subroutine load_ensemble do n=1,n_ens call generate_one_ensemble_perturbation(bundle_anl,bundle_ens,seed) do ii=1,nelen - en_perts(n,m)%valuesr4(ii)=bundle_ens%values(ii) + en_perts(n,1,m)%valuesr4(ii)=bundle_ens%values(ii) en_bar(m)%values(ii)=en_bar(m)%values(ii)+bundle_ens%values(ii) enddo enddo @@ -1276,9 +1305,9 @@ subroutine load_ensemble do m=1,ntlevs_ens do n=1,n_ens do ii=1,nelen - en_perts(n,m)%valuesr4(ii)=(en_perts(n,m)%valuesr4(ii)-en_bar(m)%values(ii)*bar_norm)*sig_norm + en_perts(n,1,m)%valuesr4(ii)=(en_perts(n,1,m)%valuesr4(ii)-en_bar(m)%values(ii)*bar_norm)*sig_norm enddo - call gsi_enscoupler_put_gsi_ens(grd_ens,n,m,en_perts(n,m),istatus) + call gsi_enscoupler_put_gsi_ens(grd_ens,n,m,en_perts(n,1,m),istatus) if(istatus/=0) then write(6,*)trim(myname_),': trouble writing perts' call stop2(999) @@ -1634,15 +1663,16 @@ subroutine rescale_ensemble_rh_perturbations use gridmod, only: regional use hybrid_ensemble_parameters, only: n_ens,grd_ens,grd_anl,grd_a1,grd_e1,p_e2a,ntlevs_ens use hybrid_ensemble_parameters, only: en_perts + use hybrid_ensemble_parameters, only: ntotensgrp use general_sub2grid_mod, only: general_suba2sube use berror, only: qvar3d implicit none - integer(i_kind) i,j,k,n,istatus,m + integer(i_kind) i,j,k,n,istatus,m,ig real(r_kind) qvar3d_ens(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig,1) real(r_single),pointer,dimension(:,:,:):: w3=>NULL() - call gsi_bundlegetpointer(en_perts(1,1),'q',w3,istatus) + call gsi_bundlegetpointer(en_perts(1,1,1),'q',w3,istatus) if(istatus/=0) then write(6,*)' rh variable not available, skip subroutine rescale_ensemble_rh_perturbations' return @@ -1655,17 +1685,19 @@ subroutine rescale_ensemble_rh_perturbations reshape(qvar3d,(/size(qvar3d,1),size(qvar3d,2),size(qvar3d,3),1/)),qvar3d_ens,regional) end if do m=1,ntlevs_ens + do ig=1,ntotensgrp !$omp parallel do schedule(dynamic,1) private(n,i,j,k,w3,istatus) - do n=1,n_ens - call gsi_bundlegetpointer(en_perts(n,m),'q',w3,istatus) - if(istatus/=0) then - write(6,*)' error retrieving pointer to rh variable for ensemble number ',n - call stop2(999) - end if - do k=1,grd_ens%nsig - do j=1,grd_ens%lon2 - do i=1,grd_ens%lat2 - w3(i,j,k)=qvar3d_ens(i,j,k,1)*w3(i,j,k) + do n=1,n_ens + call gsi_bundlegetpointer(en_perts(n,ig,m),'q',w3,istatus) + if(istatus/=0) then + write(6,*)' error retrieving pointer to rh variable for ensemble number ',n + call stop2(999) + end if + do k=1,grd_ens%nsig + do j=1,grd_ens%lon2 + do i=1,grd_ens%lat2 + w3(i,j,k)=qvar3d_ens(i,j,k,1)*w3(i,j,k) + enddo enddo enddo enddo @@ -1699,18 +1731,21 @@ subroutine destroy_ensemble !$$$ use hybrid_ensemble_parameters, only: l_hyb_ens,n_ens,ntlevs_ens use hybrid_ensemble_parameters, only: en_perts,ps_bar + use hybrid_ensemble_parameters, only: ntotensgrp implicit none - integer(i_kind) istatus,n,m + integer(i_kind) istatus,n,m,ig if(l_hyb_ens) then do m=1,ntlevs_ens - do n=1,n_ens - call gsi_bundleunset(en_perts(n,m),istatus) - if(istatus/=0) then - write(6,*)'in destroy_ensemble: trouble destroying en_perts bundle' - call stop2(999) - endif + do ig=1,ntotensgrp + do n=1,n_ens + call gsi_bundleunset(en_perts(n,ig,m),istatus) + if(istatus/=0) then + write(6,*)'in destroy_ensemble: trouble destroying en_perts bundle' + call stop2(999) + endif + enddo enddo enddo deallocate(ps_bar) @@ -1759,24 +1794,26 @@ subroutine ensemble_forward_model(cvec,a_en,ibin) !$$$ use hybrid_ensemble_parameters, only: n_ens,pwgtflg,pwgt use hybrid_ensemble_parameters, only: en_perts + use hybrid_ensemble_parameters, only: ntotensgrp,naensgrp + use hybrid_ensemble_parameters, only: ensgrp2aensgrp use constants, only: zero implicit none type(gsi_bundle),intent(inout) :: cvec - type(gsi_bundle),intent(in) :: a_en(n_ens) + type(gsi_bundle),intent(in) :: a_en(naensgrp,n_ens) integer,intent(in) :: ibin character(len=*),parameter :: myname_=trim(myname)//'*ensemble_forward_model' logical :: nogood integer(i_kind) :: i,j,k,n,im,jm,km,ic2,ic3,ipic,ipx,km_tmp - integer(i_kind) :: ipc3d(nc3d),ipc2d(nc2d),istatus + integer(i_kind) :: ipc3d(nc3d),ipc2d(nc2d),istatus,ig,iaens im=cvec%grid%im jm=cvec%grid%jm km=cvec%grid%km ! Check resolution consistency between static and ensemble components - nogood=im/=a_en(1)%grid%im.or.jm/=a_en(1)%grid%jm.or.km/=a_en(1)%grid%km + nogood=im/=a_en(1,1)%grid%im.or.jm/=a_en(1,1)%grid%jm.or.km/=a_en(1,1)%grid%km if (nogood) then write(6,*) myname_,': static&ensemble vectors have inconsistent dims' call stop2(999) @@ -1798,7 +1835,7 @@ subroutine ensemble_forward_model(cvec,a_en,ibin) ipx=1 -!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ipic) +!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ipic,ig,iaens) do k=1,km do ic3=1,nc3d ipic=ipc3d(ic3) @@ -1807,18 +1844,23 @@ subroutine ensemble_forward_model(cvec,a_en,ibin) cvec%r3(ipic)%q(i,j,k)=zero enddo enddo - do n=1,n_ens - do j=1,jm - do i=1,im - cvec%r3(ipic)%q(i,j,k)=cvec%r3(ipic)%q(i,j,k) & - +a_en(n)%r3(ipx)%q(i,j,k)*en_perts(n,ibin)%r3(ipic)%qr4(i,j,k) + do ig=1,ntotensgrp + iaens=ensgrp2aensgrp(ig,ic3,ibin) + if(iaens>0) then + do n=1,n_ens + do j=1,jm + do i=1,im + cvec%r3(ipic)%q(i,j,k)=cvec%r3(ipic)%q(i,j,k) & + +a_en(iaens,n)%r3(ipx)%q(i,j,k)*en_perts(n,ig,ibin)%r3(ipic)%qr4(i,j,k) + enddo + enddo enddo - enddo + endif ! iaens>0 enddo enddo enddo -!$omp parallel do schedule(dynamic,1) private(j,n,k,i,ic2,ipic) +!$omp parallel do schedule(dynamic,1) private(j,n,k,i,ic2,ipic,ig,iaens) do ic2=1,nc2d ipic=ipc2d(ic2) do j=1,jm @@ -1837,27 +1879,37 @@ subroutine ensemble_forward_model(cvec,a_en,ibin) km_tmp = 1 endif - do n=1,n_ens - do j=1,jm - do k=1,km_tmp - do i=1,im - cvec%r2(ipic)%q(i,j)=cvec%r2(ipic)%q(i,j) & - +a_en(n)%r3(ipx)%q(i,j,k)*en_perts(n,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + do ig=1,ntotensgrp + iaens=ensgrp2aensgrp(ig,ic2+nc3d,ibin) + if(iaens>0) then + do n=1,n_ens + do j=1,jm + do k=1,km_tmp + do i=1,im + cvec%r2(ipic)%q(i,j)=cvec%r2(ipic)%q(i,j) & + +a_en(iaens,n)%r3(ipx)%q(i,j,k)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + enddo + enddo enddo - enddo - enddo - enddo ! enddo n_ens + enddo ! enddo n_ens + endif ! iaens>0 + enddo case('SST') - do n=1,n_ens - do j=1,jm - do i=1,im - cvec%r2(ipic)%q(i,j)=cvec%r2(ipic)%q(i,j) & - +a_en(n)%r3(ipx)%q(i,j,1)*en_perts(n,ibin)%r2(ipic)%qr4(i,j) - enddo - enddo - enddo ! enddo n_ens + do ig=1,ntotensgrp + iaens=ensgrp2aensgrp(ig,ic2+nc3d,ibin) + if(iaens>0) then + do n=1,n_ens + do j=1,jm + do i=1,im + cvec%r2(ipic)%q(i,j)=cvec%r2(ipic)%q(i,j) & + +a_en(iaens,n)%r3(ipx)%q(i,j,1)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j) + enddo + enddo + enddo ! enddo n_ens + endif ! iaens>0 + enddo end select @@ -1909,20 +1961,22 @@ subroutine ensemble_forward_model_dual_res(cvec,a_en,ibin) use hybrid_ensemble_parameters, only: n_ens,pwgtflg,pwgt use hybrid_ensemble_parameters, only: grd_ens,grd_anl,p_e2a use hybrid_ensemble_parameters, only: en_perts + use hybrid_ensemble_parameters, only: ntotensgrp,naensgrp + use hybrid_ensemble_parameters, only: ensgrp2aensgrp use general_sub2grid_mod, only: general_sube2suba use gridmod,only: regional use constants, only: zero implicit none type(gsi_bundle),intent(inout) :: cvec - type(gsi_bundle),intent(in) :: a_en(n_ens) + type(gsi_bundle),intent(in) :: a_en(naensgrp,n_ens) integer,intent(in) :: ibin character(len=*),parameter::myname_=trim(myname)//'*ensemble_forward_model_dual_res' type(gsi_grid) :: grid_ens,grid_anl type(gsi_bundle) :: work_ens,work_anl integer(i_kind) :: i,j,k,n,im,jm,km,ic2,ic3,ipic,ipx,km_tmp - integer(i_kind) :: ipc2d(nc2d),ipc3d(nc3d),istatus + integer(i_kind) :: ipc2d(nc2d),ipc3d(nc3d),istatus,ig,iaens ! Request ensemble-corresponding fields from control vector ! NOTE: because ensemble perturbation bundle structure is same as control vector, use same ipc3d and @@ -1958,7 +2012,7 @@ subroutine ensemble_forward_model_dual_res(cvec,a_en,ibin) im=work_ens%grid%im jm=work_ens%grid%jm km=work_ens%grid%km -!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ipic) +!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ipic,ig,iaens) do k=1,km do ic3=1,nc3d ipic=ipc3d(ic3) @@ -1967,17 +2021,22 @@ subroutine ensemble_forward_model_dual_res(cvec,a_en,ibin) work_ens%r3(ipic)%q(i,j,k)=zero enddo enddo - do n=1,n_ens - do j=1,jm - do i=1,im - work_ens%r3(ipic)%q(i,j,k)=work_ens%r3(ipic)%q(i,j,k) & - +a_en(n)%r3(ipx)%q(i,j,k)*en_perts(n,ibin)%r3(ipic)%qr4(i,j,k) + do ig=1,ntotensgrp + iaens=ensgrp2aensgrp(ig,ic3,ibin) + if(iaens>0) then + do n=1,n_ens + do j=1,jm + do i=1,im + work_ens%r3(ipic)%q(i,j,k)=work_ens%r3(ipic)%q(i,j,k) & + +a_en(iaens,n)%r3(ipx)%q(i,j,k)*en_perts(n,ig,ibin)%r3(ipic)%qr4(i,j,k) + enddo + enddo enddo - enddo + endif ! iaens>0 enddo enddo enddo -!$omp parallel do schedule(dynamic,1) private(j,n,k,i,ic2,ipic) +!$omp parallel do schedule(dynamic,1) private(j,n,k,i,ic2,ipic,ig,iaens) do ic2=1,nc2d ipic=ipc2d(ic2) do j=1,jm @@ -1996,27 +2055,37 @@ subroutine ensemble_forward_model_dual_res(cvec,a_en,ibin) km_tmp = 1 endif - do n=1,n_ens - do k=1,km_tmp - do j=1,jm - do i=1,im - work_ens%r2(ipic)%q(i,j)=work_ens%r2(ipic)%q(i,j) & - +a_en(n)%r3(ipx)%q(i,j,k)*en_perts(n,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + do ig=1,ntotensgrp + iaens=ensgrp2aensgrp(ig,ic2+nc3d,ibin) + if(iaens>0) then + do n=1,n_ens + do k=1,km_tmp + do j=1,jm + do i=1,im + work_ens%r2(ipic)%q(i,j)=work_ens%r2(ipic)%q(i,j) & + +a_en(iaens,n)%r3(ipx)%q(i,j,k)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + enddo + enddo enddo - enddo - enddo - enddo ! enddo n_ens + enddo ! enddo n_ens + endif ! iaens>0 + enddo case('SST') - do n=1,n_ens - do j=1,jm - do i=1,im - work_ens%r2(ipic)%q(i,j)=work_ens%r2(ipic)%q(i,j) & - +a_en(n)%r3(ipx)%q(i,j,1)*en_perts(n,ibin)%r2(ipic)%qr4(i,j) - enddo - enddo - enddo ! enddo n_ens + do ig=1,ntotensgrp + iaens=ensgrp2aensgrp(ig,ic2+nc3d,ibin) + if(iaens>0) then + do n=1,n_ens + do j=1,jm + do i=1,im + work_ens%r2(ipic)%q(i,j)=work_ens%r2(ipic)%q(i,j) & + +a_en(iaens,n)%r3(ipx)%q(i,j,1)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j) + enddo + enddo + enddo ! enddo n_ens + endif ! iaens>0 + enddo end select @@ -2082,22 +2151,24 @@ subroutine ensemble_forward_model_ad(cvec,a_en,ibin) use hybrid_ensemble_parameters, only: n_ens,pwgtflg,pwgt use hybrid_ensemble_parameters, only: en_perts + use hybrid_ensemble_parameters, only: ntotensgrp,naensgrp + use hybrid_ensemble_parameters, only: ensgrp2aensgrp implicit none type(gsi_bundle),intent(inout) :: cvec - type(gsi_bundle),intent(inout) :: a_en(n_ens) + type(gsi_bundle),intent(inout) :: a_en(naensgrp,n_ens) integer,intent(in) :: ibin character(len=*),parameter :: myname_=trim(myname)//'*ensemble_forward_model_ad' logical :: nogood integer(i_kind) :: i,j,k,n,im,jm,km,ic2,ic3,ipx,ipic,km_tmp - integer(i_kind) :: ipc3d(nc3d),ipc2d(nc2d),istatus + integer(i_kind) :: ipc3d(nc3d),ipc2d(nc2d),istatus,ig,iaens im=cvec%grid%im jm=cvec%grid%jm km=cvec%grid%km ! Check resolution consistency between static and ensemble components - nogood=im/=a_en(1)%grid%im.or.jm/=a_en(1)%grid%jm.or.km/=a_en(1)%grid%km + nogood=im/=a_en(1,1)%grid%im.or.jm/=a_en(1,1)%grid%jm.or.km/=a_en(1,1)%grid%km if (nogood) then write(6,*) myname_,': static/ensemble vectors have inconsistent dims' call stop2(999) @@ -2118,51 +2189,58 @@ subroutine ensemble_forward_model_ad(cvec,a_en,ibin) endif ipx=1 -!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ic2,ipic) +!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ic2,ipic,ig,iaens) do n=1,n_ens - do ic3=1,nc3d - ipic=ipc3d(ic3) - do k=1,km - do j=1,jm - do i=1,im - a_en(n)%r3(ipx)%q(i,j,k)=a_en(n)%r3(ipx)%q(i,j,k) & - +cvec%r3(ipic)%q(i,j,k)*en_perts(n,ibin)%r3(ipic)%qr4(i,j,k) - enddo - enddo - enddo - enddo - do ic2=1,nc2d - - ipic=ipc2d(ic2) - select case ( trim(StrUpCase(cvars2d(ic2))) ) - - case('PS') - - if ( pwgtflg ) then - km_tmp = km - else - km_tmp = 1 - endif - - do k=1,km_tmp + do ig=1,ntotensgrp + do ic3=1,nc3d + iaens=ensgrp2aensgrp(ig,ic3,ibin) + if(iaens>0) then + ipic=ipc3d(ic3) + do k=1,km do j=1,jm do i=1,im - a_en(n)%r3(ipx)%q(i,j,k)=a_en(n)%r3(ipx)%q(i,j,k) & - +cvec%r2(ipic)%q(i,j)*en_perts(n,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + a_en(iaens,n)%r3(ipx)%q(i,j,k)=a_en(iaens,n)%r3(ipx)%q(i,j,k) & + +cvec%r3(ipic)%q(i,j,k)*en_perts(n,ig,ibin)%r3(ipic)%qr4(i,j,k) enddo enddo enddo + endif ! iaens>0 + enddo + do ic2=1,nc2d + iaens=ensgrp2aensgrp(ig,ic2+nc3d,ibin) + if(iaens>0) then + ipic=ipc2d(ic2) + select case ( trim(StrUpCase(cvars2d(ic2))) ) + + case('PS') + + if ( pwgtflg ) then + km_tmp = km + else + km_tmp = 1 + endif + + do k=1,km_tmp + do j=1,jm + do i=1,im + a_en(iaens,n)%r3(ipx)%q(i,j,k)=a_en(iaens,n)%r3(ipx)%q(i,j,k) & + +cvec%r2(ipic)%q(i,j)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + enddo + enddo + enddo - case('SST') + case('SST') - do j=1,jm - do i=1,im - a_en(n)%r3(ipx)%q(i,j,1)=a_en(n)%r3(ipx)%q(i,j,1) & - +cvec%r2(ipic)%q(i,j)*en_perts(n,ibin)%r2(ipic)%qr4(i,j) - enddo - enddo + do j=1,jm + do i=1,im + a_en(iaens,n)%r3(ipx)%q(i,j,1)=a_en(iaens,n)%r3(ipx)%q(i,j,1) & + +cvec%r2(ipic)%q(i,j)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j) + enddo + enddo - end select + end select + endif ! iaens>0 + enddo enddo enddo ! enddo n_ens return @@ -2212,20 +2290,22 @@ subroutine ensemble_forward_model_ad_dual_res(cvec,a_en,ibin) use hybrid_ensemble_parameters, only: n_ens,pwgtflg,pwgt use hybrid_ensemble_parameters, only: n_ens,grd_ens,grd_anl,p_e2a use hybrid_ensemble_parameters, only: en_perts + use hybrid_ensemble_parameters, only: ntotensgrp,naensgrp + use hybrid_ensemble_parameters, only: ensgrp2aensgrp use general_sub2grid_mod, only: general_sube2suba_ad use gridmod,only: regional use constants, only: zero implicit none type(gsi_bundle),intent(inout) :: cvec - type(gsi_bundle),intent(inout) :: a_en(n_ens) + type(gsi_bundle),intent(inout) :: a_en(naensgrp,n_ens) integer,intent(in) :: ibin character(len=*),parameter::myname_=trim(myname)//'*ensemble_forward_model_ad_dual_res' type(gsi_grid) :: grid_ens,grid_anl type(gsi_bundle) :: work_ens,work_anl integer(i_kind) :: i,j,k,n,im,jm,km,ic2,ic3,ipx,ipic,km_tmp - integer(i_kind) :: ipc2d(nc2d),ipc3d(nc3d),istatus + integer(i_kind) :: ipc2d(nc2d),ipc3d(nc3d),istatus,ig,iaens ! Request ensemble-corresponding fields from control vector ! NOTE: because ensemble perturbation bundle structure is same as control vector, use same ipc3d and @@ -2271,54 +2351,61 @@ subroutine ensemble_forward_model_ad_dual_res(cvec,a_en,ibin) endif ipx=1 - im=a_en(1)%grid%im - jm=a_en(1)%grid%jm - km=a_en(1)%grid%km -!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ic2,ipic) + im=a_en(1,1)%grid%im + jm=a_en(1,1)%grid%jm + km=a_en(1,1)%grid%km +!$omp parallel do schedule(dynamic,1) private(j,n,ic3,k,i,ic2,ipic,ig,iaens) do n=1,n_ens - do ic3=1,nc3d - ipic=ipc3d(ic3) - do k=1,km - do j=1,jm - do i=1,im - a_en(n)%r3(ipx)%q(i,j,k)=a_en(n)%r3(ipx)%q(i,j,k) & - +work_ens%r3(ipic)%q(i,j,k)*en_perts(n,ibin)%r3(ipic)%qr4(i,j,k) - enddo - enddo - enddo - enddo - do ic2=1,nc2d - - ipic=ipc2d(ic2) - select case ( trim(StrUpCase(cvars2d(ic2))) ) - - case('PS') - - if ( pwgtflg ) then - km_tmp = km - else - km_tmp = 1 - endif - - do k=1,km_tmp + do ig=1,ntotensgrp + do ic3=1,nc3d + iaens=ensgrp2aensgrp(ig,ic3,ibin) + if(iaens>0) then + ipic=ipc3d(ic3) + do k=1,km do j=1,jm do i=1,im - a_en(n)%r3(ipx)%q(i,j,k)=a_en(n)%r3(ipx)%q(i,j,k) & - +work_ens%r2(ipic)%q(i,j)*en_perts(n,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + a_en(iaens,n)%r3(ipx)%q(i,j,k)=a_en(iaens,n)%r3(ipx)%q(i,j,k) & + +work_ens%r3(ipic)%q(i,j,k)*en_perts(n,ig,ibin)%r3(ipic)%qr4(i,j,k) enddo enddo enddo + endif ! iaens>0 + enddo + do ic2=1,nc2d + iaens=ensgrp2aensgrp(ig,ic2+nc3d,ibin) + if(iaens>0) then + ipic=ipc2d(ic2) + select case ( trim(StrUpCase(cvars2d(ic2))) ) + + case('PS') + + if ( pwgtflg ) then + km_tmp = km + else + km_tmp = 1 + endif + + do k=1,km_tmp + do j=1,jm + do i=1,im + a_en(iaens,n)%r3(ipx)%q(i,j,k)=a_en(iaens,n)%r3(ipx)%q(i,j,k) & + +work_ens%r2(ipic)%q(i,j)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j)*pwgt(i,j,k) + enddo + enddo + enddo - case('SST') + case('SST') - do j=1,jm - do i=1,im - a_en(n)%r3(ipx)%q(i,j,1)=a_en(n)%r3(ipx)%q(i,j,1) & - +work_ens%r2(ipic)%q(i,j)*en_perts(n,ibin)%r2(ipic)%qr4(i,j) - enddo - enddo + do j=1,jm + do i=1,im + a_en(iaens,n)%r3(ipx)%q(i,j,1)=a_en(iaens,n)%r3(ipx)%q(i,j,1) & + +work_ens%r2(ipic)%q(i,j)*en_perts(n,ig,ibin)%r2(ipic)%qr4(i,j) + enddo + enddo - end select + end select + endif ! iaens>0 + enddo enddo enddo ! enddo n_ens call gsi_bundledestroy(work_ens,istatus) @@ -2758,6 +2845,7 @@ subroutine sqrt_beta_e_mult_cvec(grady) use kinds, only: r_kind,i_kind use gsi_4dvar, only: nsubwin use hybrid_ensemble_parameters, only: n_ens,sqrt_beta_e,grd_ens + use hybrid_ensemble_parameters, only: naensgrp use control_vectors,only: control_vector use timermod, only: timer_ini,timer_fnl @@ -2770,19 +2858,21 @@ subroutine sqrt_beta_e_mult_cvec(grady) ! Declare local variables character(len=*),parameter::myname_=myname//'*sqrt_beta_e_mult' - integer(i_kind) :: i,j,k,ii,nn + integer(i_kind) :: i,j,k,ii,nn,ig ! Initialize timer call timer_ini('sqrt_beta_e_mult') ! multiply by sqrt_beta_e -!$omp parallel do schedule(dynamic,1) private(nn,k,j,i,ii) +!$omp parallel do schedule(dynamic,1) private(nn,k,j,i,ii,ig) do j=1,grd_ens%lon2 do ii=1,nsubwin - do nn=1,n_ens - do k=1,nsig - do i=1,grd_ens%lat2 - grady%aens(ii,nn)%r3(1)%q(i,j,k) = sqrt_beta_e(k)*grady%aens(ii,nn)%r3(1)%q(i,j,k) + do ig=1,naensgrp + do nn=1,n_ens + do k=1,nsig + do i=1,grd_ens%lat2 + grady%aens(ii,ig,nn)%r3(1)%q(i,j,k) = sqrt_beta_e(k)*grady%aens(ii,ig,nn)%r3(1)%q(i,j,k) + enddo enddo enddo enddo @@ -2823,6 +2913,7 @@ subroutine sqrt_beta_e_mult_bundle(aens) !$$$ end documentation block use kinds, only: r_kind,i_kind use hybrid_ensemble_parameters, only: n_ens,sqrt_beta_e,grd_ens + use hybrid_ensemble_parameters, only: naensgrp use gsi_bundlemod, only: gsi_bundle use timermod, only: timer_ini,timer_fnl use gridmod, only: nsig @@ -2830,22 +2921,24 @@ subroutine sqrt_beta_e_mult_bundle(aens) implicit none ! Declare passed variables - type(gsi_bundle),intent(inout) :: aens(n_ens) + type(gsi_bundle),intent(inout) :: aens(naensgrp,n_ens) ! Declare local variables character(len=*),parameter::myname_=myname//'*sqrt_beta_e_mult' - integer(i_kind) :: i,j,k,nn + integer(i_kind) :: i,j,k,nn,ig ! Initialize timer call timer_ini('sqrt_beta_e_mult') ! multiply by sqrt_beta_e -!$omp parallel do schedule(dynamic,1) private(nn,k,j,i) +!$omp parallel do schedule(dynamic,1) private(nn,k,j,i,ig) do j=1,grd_ens%lon2 - do nn=1,n_ens - do k=1,nsig - do i=1,grd_ens%lat2 - aens(nn)%r3(1)%q(i,j,k) = sqrt_beta_e(k)*aens(nn)%r3(1)%q(i,j,k) + do ig=1,naensgrp + do nn=1,n_ens + do k=1,nsig + do i=1,grd_ens%lat2 + aens(ig,nn)%r3(1)%q(i,j,k) = sqrt_beta_e(k)*aens(ig,nn)%r3(1)%q(i,j,k) + enddo enddo enddo enddo @@ -2885,6 +2978,7 @@ subroutine init_sf_xy(jcap_in) use kinds, only: r_kind,i_kind,r_single use hybrid_ensemble_parameters,only: s_ens_hv,sp_loc,grd_ens,grd_loc,sp_ens,n_ens,p_sploc2ens,grd_sploc use hybrid_ensemble_parameters,only: use_localization_grid + use hybrid_ensemble_parameters,only: naensgrp,naensloc use gridmod,only: use_sp_eqspace use general_specmod, only: general_init_spec_vars use constants, only: zero,half,one,two,three,rearth,pi @@ -2899,7 +2993,7 @@ subroutine init_sf_xy(jcap_in) integer(i_kind),intent(in ) :: jcap_in - integer(i_kind) i,ii,j,k,l,n,jcap,kk,nsigend + integer(i_kind) i,ii,j,k,l,n,jcap,kk,nsigend,ig real(r_kind),allocatable::g(:),gsave(:) real(r_kind) factor real(r_kind),allocatable::rkm(:),f(:,:),f0(:,:) @@ -2925,16 +3019,18 @@ subroutine init_sf_xy(jcap_in) s_ens_h_min=pi*rearth*.001_r_kind/jcap_in do k=1,grd_ens%nsig - if(s_ens_hv(k) < s_ens_h_min) then - if(mype == 0) write(6,*)' s_ens_hv(',k,') = ',s_ens_hv(k),' km--too small, min value = ', & - s_ens_h_min,' km.' - if(mype == 0) write(6,*)' s_ens_hv(',k,') reset to min value' - s_ens_hv(k)=s_ens_h_min - else if(s_ens_hv(k) > 5500._r_kind) then - if(mype == 0) write(6,*)' s_ens_hv(',k,') = ',s_ens_hv(k),' km--too large, max value = 5500 km.' - if(mype == 0) write(6,*)' s_ens_hv(',k,') reset to max value' - s_ens_hv(k)=5500._r_kind - end if + do ig=1,naensloc + if(s_ens_hv(k,ig) < s_ens_h_min) then + if(mype == 0) write(6,*)' s_ens_hv(',k,') = ',s_ens_hv(k,ig),' km--too small, min value = ', & + s_ens_h_min,' km.' + if(mype == 0) write(6,*)' s_ens_hv(',k,') reset to min value' + s_ens_hv(k,ig)=s_ens_h_min + else if(s_ens_hv(k,ig) > 5500._r_kind) then + if(mype == 0) write(6,*)' s_ens_hv(',k,') = ',s_ens_hv(k,ig),' km--too large, max value = 5500 km.' + if(mype == 0) write(6,*)' s_ens_hv(',k,') reset to max value' + s_ens_hv(k,ig)=5500._r_kind + end if + enddo enddo @@ -3059,99 +3155,107 @@ subroutine init_sf_xy(jcap_in) rkm(1+(grd_sploc%nlat-2)/2), & -rkm(grd_sploc%nlat-(grd_sploc%nlat-2)/2)+rkm(1+(grd_sploc%nlat-2)/2),' km' - if(.not.allocated(spectral_filter)) allocate(spectral_filter(sp_loc%nc,grd_sploc%nsig)) - if(.not.allocated(sqrt_spectral_filter)) allocate(sqrt_spectral_filter(sp_loc%nc,grd_sploc%nsig)) + if(.not.allocated(spectral_filter)) allocate(spectral_filter(naensloc,sp_loc%nc,grd_sploc%nsig)) + if(.not.allocated(sqrt_spectral_filter)) allocate(sqrt_spectral_filter(naensloc,sp_loc%nc,grd_sploc%nsig)) allocate(g(sp_loc%nc),gsave(sp_loc%nc)) allocate(pn0_npole(0:sp_loc%jcap)) allocate(ksame(grd_sploc%nsig)) - ksame=.false. - do k=2,grd_sploc%nsig - if(s_ens_hv(k) == s_ens_hv(k-1))ksame(k)=.true. - enddo - spectral_filter=zero - do k=1,grd_sploc%nsig - if(ksame(k))then - spectral_filter(:,k)=spectral_filter(:,k-1) - else - do i=1,grd_sploc%nlat - f0(i,1)=exp(-half*(rkm(i)/s_ens_hv(k))**2) - enddo - - do j=2,grd_sploc%nlon + do ig=1,naensloc + ksame=.false. + do k=2,grd_sploc%nsig + if(s_ens_hv(k,ig) == s_ens_hv(k-1,ig))ksame(k)=.true. + enddo + spectral_filter(ig,:,:)=zero + do k=1,grd_sploc%nsig + if(ksame(k))then + spectral_filter(ig,:,k)=spectral_filter(ig,:,k-1) + else do i=1,grd_sploc%nlat - f0(i,j)=f0(i,1) + f0(i,1)=exp(-half*(rkm(i)/s_ens_hv(k,ig))**2) enddo - enddo - - call general_g2s0(grd_sploc,sp_loc,g,f0) - call general_s2g0(grd_sploc,sp_loc,g,f) - -! adjust so value at np = 1 - f=f/f(grd_sploc%nlat,1) - f0=f - call general_g2s0(grd_sploc,sp_loc,g,f) - call general_s2g0(grd_sploc,sp_loc,g,f) - if(mype == 0)then - nsigend=k - do kk=k+1,grd_sploc%nsig - if(s_ens_hv(kk) /= s_ens_hv(k))exit - nsigend=nsigend+1 + do j=2,grd_sploc%nlon + do i=1,grd_sploc%nlat + f0(i,j)=f0(i,1) + enddo enddo - write(6,900)k,nsigend,sp_loc%jcap,s_ens_hv(k),maxval(abs(f0-f)) - 900 format(' in init_sf_xy, jcap,s_ens_hv(',i5,1x,'-',i5,'), max diff(f0-f)=', & - i10,f10.2,e20.10) - end if -! correct spectrum by dividing by pn0_npole - gsave=g + call general_g2s0(grd_sploc,sp_loc,g,f0) -! obtain pn0_npole - do n=0,sp_loc%jcap - g=zero - g(2*n+1)=one call general_s2g0(grd_sploc,sp_loc,g,f) - pn0_npole(n)=f(grd_sploc%nlat,1) - enddo + +! adjust so value at np = 1 + f=f/f(grd_sploc%nlat,1) + f0=f + call general_g2s0(grd_sploc,sp_loc,g,f) + call general_s2g0(grd_sploc,sp_loc,g,f) + if(mype == 0)then + nsigend=k + do kk=k+1,grd_sploc%nsig + if(s_ens_hv(kk,ig) /= s_ens_hv(k,ig))exit + nsigend=nsigend+1 + enddo + write(6,900)k,nsigend,sp_loc%jcap,s_ens_hv(k,ig),maxval(abs(f0-f)) +900 format(' in init_sf_xy, jcap,s_ens_hv(',i5,1x,'-',i5,'), max diff(f0-f)=', & + i10,f10.2,e20.10) + end if + +! correct spectrum by dividing by pn0_npole + gsave=g + +! obtain pn0_npole + do n=0,sp_loc%jcap + g=zero + g(2*n+1)=one + call general_s2g0(grd_sploc,sp_loc,g,f) + pn0_npole(n)=f(grd_sploc%nlat,1) + enddo - g=zero - do n=0,sp_loc%jcap - g(2*n+1)=gsave(2*n+1)/pn0_npole(n) - enddo + g=zero + do n=0,sp_loc%jcap + g(2*n+1)=gsave(2*n+1)/pn0_npole(n) + enddo -! obtain spectral_filter +! obtain spectral_filter - ii=0 - do l=0,sp_loc%jcap - factor=one - if(l > 0) factor=half - do n=l,sp_loc%jcap - ii=ii+1 - if(sp_loc%factsml(ii)) then - spectral_filter(ii,k)=zero - else - spectral_filter(ii,k)=factor*g(2*n+1) - end if - ii=ii+1 - if(l == 0 .or. sp_loc%factsml(ii)) then - spectral_filter(ii,k)=zero + ii=0 + do l=0,sp_loc%jcap + if(ig>naensgrp) then + factor=one/g(1) else - spectral_filter(ii,k)=factor*g(2*n+1) + factor=one + if(l>0) factor=half end if + do n=l,sp_loc%jcap + ii=ii+1 + if(sp_loc%factsml(ii)) then + spectral_filter(ig,ii,k)=zero + else + spectral_filter(ig,ii,k)=factor*g(2*n+1) + end if + ii=ii+1 + if(l == 0 .or. sp_loc%factsml(ii)) then + spectral_filter(ig,ii,k)=zero + else + spectral_filter(ig,ii,k)=factor*g(2*n+1) + end if + enddo enddo - enddo - end if - enddo + end if + enddo + enddo !ig loop deallocate(g,gsave,pn0_npole,ksame) ! Compute sqrt(spectral_filter). Ensure spectral_filter >=0 zero !$omp parallel do schedule(dynamic,1) private(k,i) - do k=1,grd_sploc%nsig - do i=1,sp_loc%nc - if (spectral_filter(i,k) < zero) spectral_filter(i,k)=zero - sqrt_spectral_filter(i,k) = sqrt(spectral_filter(i,k)) + do ig=1,naensloc + do k=1,grd_sploc%nsig + do i=1,sp_loc%nc + if (spectral_filter(ig,i,k) < zero) spectral_filter(ig,i,k)=zero + sqrt_spectral_filter(ig,i,k) = sqrt(spectral_filter(ig,i,k)) + end do end do - end do + enddo !ig loop ! assign array k_index for each processor, based on grd_loc%kbegin_loc,grd_loc%kend_loc @@ -3167,7 +3271,7 @@ subroutine init_sf_xy(jcap_in) do k=grd_loc%kbegin_loc,grd_loc%kend_loc ftest(grd_ens%nlat/2,grd_ens%nlon/2,k)=one enddo - call sf_xy(ftest,grd_loc%kbegin_loc,grd_loc%kend_loc) + call sf_xy(1,ftest,grd_loc%kbegin_loc,grd_loc%kend_loc) if(mype==0) then do j=1,grd_ens%nlon do i=1,grd_ens%nlat @@ -3183,7 +3287,7 @@ subroutine init_sf_xy(jcap_in) end subroutine init_sf_xy -subroutine sf_xy(f,k_start,k_end) +subroutine sf_xy(ig,f,k_start,k_end) !$$$ subprogram documentation block ! . . . ! subprogram: sf_xy spectral isotropic localization for global domain @@ -3198,6 +3302,7 @@ subroutine sf_xy(f,k_start,k_end) ! 2010-03-11 parrish - adjust dimensions for f to allow for nlevs=0 ! ! input argument list: +! ig - number for smoothing scales ! f - input field to be filtered ! k_start - starting horizontal slab index ! k_end - ending horizontal slab index (k_end can be less than k_start, meaning there is @@ -3216,39 +3321,60 @@ subroutine sf_xy(f,k_start,k_end) use kinds, only: r_kind,i_kind use hybrid_ensemble_parameters, only: grd_ens,sp_loc,p_sploc2ens,grd_sploc use hybrid_ensemble_parameters,only: use_localization_grid - use egrid2agrid_mod,only: g_egrid2agrid,g_egrid2agrid_ad + use hybrid_ensemble_parameters,only: naensgrp + use egrid2agrid_mod,only: g_egrid2agrid,g_egrid2agrid_ad,g_agrid2egrid implicit none + integer(i_kind),intent(in ) :: ig integer(i_kind),intent(in ) :: k_start,k_end real(r_kind) ,intent(inout) :: f(grd_ens%nlat,grd_ens%nlon,k_start:max(k_start,k_end)) + real(r_kind) g(sp_loc%nc) real(r_kind) work(grd_sploc%nlat,grd_sploc%nlon,1) integer(i_kind) k logical vector(k_start:max(k_start,k_end)) if(.not.use_localization_grid) then + if(ig>naensgrp) then + do k=k_start,k_end + call general_g2s0(grd_ens,sp_loc,g,f(:,:,k)) + g(:)=g(:)*spectral_filter(ig,:,k_index(k)) + call general_s2g0(grd_ens,sp_loc,g,f(:,:,k)) + enddo + else !$omp parallel do schedule(dynamic,1) private(k) - do k=k_start,k_end - call sfilter(grd_ens,sp_loc,spectral_filter(1,k_index(k)),f(1,1,k)) - enddo + do k=k_start,k_end + call sfilter(grd_ens,sp_loc,spectral_filter(ig,:,k_index(k)),f(1,1,k)) + enddo + endif else vector=.false. + if(ig>naensgrp) then + do k=k_start,k_end + call g_agrid2egrid(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) + call general_g2s0(grd_ens,sp_loc,g,f(:,:,k)) + g(:)=g(:)*spectral_filter(ig,:,k_index(k)) + call general_s2g0(grd_ens,sp_loc,g,f(:,:,k)) + call g_egrid2agrid(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) + enddo + else !$omp parallel do schedule(dynamic,1) private(k,work) - do k=k_start,k_end - call g_egrid2agrid_ad(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) - call sfilter(grd_ens,sp_loc,spectral_filter(:,k_index(k)),f(1,1,k)) - call g_egrid2agrid(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) - enddo + do k=k_start,k_end + call g_egrid2agrid_ad(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) + call sfilter(grd_ens,sp_loc,spectral_filter(ig,:,k_index(k)),f(1,1,k)) + call g_egrid2agrid(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) + enddo + end if endif return end subroutine sf_xy -subroutine sqrt_sf_xy(z,f,k_start,k_end) +subroutine sqrt_sf_xy(ig,z,f,k_start,k_end) !$$$ subprogram documentation block ! . . . ! subprogram: sqrt_sf_xy sqrt(sf_xy) @@ -3261,6 +3387,7 @@ subroutine sqrt_sf_xy(z,f,k_start,k_end) ! 2011-06-28 parrish initial documentation ! ! input argument list: +! ig - number for smoothing scales ! z - input spectral space variable ! k_start - starting horizontal slab index ! k_end - ending horizontal slab index (k_end can be less than k_start, meaning there is @@ -3282,6 +3409,7 @@ subroutine sqrt_sf_xy(z,f,k_start,k_end) use egrid2agrid_mod,only: g_egrid2agrid implicit none + integer(i_kind),intent(in ) :: ig integer(i_kind),intent(in ) :: k_start,k_end real(r_kind) ,intent(in ) :: z(sp_loc%nc,k_start:max(k_start,k_end)) real(r_kind) ,intent( out) :: f(grd_ens%nlat,grd_ens%nlon,k_start:max(k_start,k_end)) @@ -3294,7 +3422,7 @@ subroutine sqrt_sf_xy(z,f,k_start,k_end) if(.not.use_localization_grid) then do k=k_start,k_end - g(:)=z(:,k)*sqrt_spectral_filter(:,k_index(k)) + g(:)=z(:,k)*sqrt_spectral_filter(ig,:,k_index(k)) call general_s2g0(grd_ens,sp_loc,g,f(:,:,k)) enddo @@ -3302,7 +3430,7 @@ subroutine sqrt_sf_xy(z,f,k_start,k_end) vector=.false. do k=k_start,k_end - g(:)=z(:,k)*sqrt_spectral_filter(:,k_index(k)) + g(:)=z(:,k)*sqrt_spectral_filter(ig,:,k_index(k)) call general_s2g0(grd_sploc,sp_loc,g,work) call g_egrid2agrid(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) enddo @@ -3312,7 +3440,7 @@ subroutine sqrt_sf_xy(z,f,k_start,k_end) end subroutine sqrt_sf_xy -subroutine sqrt_sf_xy_ad(z,f,k_start,k_end) +subroutine sqrt_sf_xy_ad(ig,z,f,k_start,k_end) !$$$ subprogram documentation block ! . . . ! subprogram: sqrt_sf_xy_ad adjoint of sqrt_sf_xy @@ -3325,6 +3453,7 @@ subroutine sqrt_sf_xy_ad(z,f,k_start,k_end) ! 2011-06-28 parrish initial documentation ! ! input argument list: +! ig - number for smoothing scales ! f - grid space variable ! k_start - starting horizontal slab index ! k_end - ending horizontal slab index (k_end can be less than k_start, meaning there is @@ -3347,6 +3476,7 @@ subroutine sqrt_sf_xy_ad(z,f,k_start,k_end) use egrid2agrid_mod,only: g_egrid2agrid_ad implicit none + integer(i_kind),intent(in ) :: ig integer(i_kind),intent(in ) :: k_start,k_end real(r_kind) ,intent(inout) :: z(sp_loc%nc,k_start:max(k_start,k_end)) real(r_kind) ,intent(inout) :: f(grd_ens%nlat,grd_ens%nlon,k_start:max(k_start,k_end)) @@ -3360,7 +3490,7 @@ subroutine sqrt_sf_xy_ad(z,f,k_start,k_end) do k=k_start,k_end call general_s2g0_ad(grd_ens,sp_loc,g,f(:,:,k)) - z(:,k)=g(:)*sqrt_spectral_filter(:,k_index(k)) + z(:,k)=g(:)*sqrt_spectral_filter(ig,:,k_index(k)) enddo else @@ -3369,7 +3499,7 @@ subroutine sqrt_sf_xy_ad(z,f,k_start,k_end) do k=k_start,k_end call g_egrid2agrid_ad(p_sploc2ens,work,f(:,:,k:k),k,k,vector(k:k)) call general_s2g0_ad(grd_sploc,sp_loc,g,work) - z(:,k)=g(:)*sqrt_spectral_filter(:,k_index(k)) + z(:,k)=g(:)*sqrt_spectral_filter(ig,:,k_index(k)) enddo end if @@ -3447,6 +3577,7 @@ subroutine bkerror_a_en(grady) ! program history log: ! 2009-09-17 parrish initial creation of code from a copy of bkerror ! 2010-05-20 todling update to use bundle +! 2022-09-15 yokota add scale/variable/time-dependent localization ! ! input argument list: ! grady - input field @@ -3460,10 +3591,14 @@ subroutine bkerror_a_en(grady) ! !$$$ end documentation block use kinds, only: r_kind,i_kind - use gsi_4dvar, only: nsubwin, lsqrtb + use constants, only: zero + use gsi_4dvar, only: nsubwin use control_vectors, only: control_vector use timermod, only: timer_ini,timer_fnl use hybrid_ensemble_parameters, only: n_ens + use hybrid_ensemble_parameters, only: naensgrp + use hybrid_ensemble_parameters, only: alphacvarsclgrpmat + use hybrid_ensemble_parameters, only: nval_lenz_en use gsi_bundlemod,only: gsi_bundlegetpointer implicit none @@ -3471,18 +3606,15 @@ subroutine bkerror_a_en(grady) type(control_vector),intent(inout) :: grady ! Declare local variables - integer(i_kind) ii,ip,istatus - - if (lsqrtb) then - write(6,*)'bkerror_a_en: not for use with lsqrtb' - call stop2(317) - end if + integer(i_kind) ii,ip,istatus,k,ig,ig2 + real(r_kind),allocatable,dimension(:,:) :: z + real(r_kind),allocatable,dimension(:) :: ztmp ! Initialize timer call timer_ini('bkerror_a_en') ! Put things in grady first since operations change input variables - call gsi_bundlegetpointer ( grady%aens(1,1),'a_en',ip,istatus) + call gsi_bundlegetpointer ( grady%aens(1,1,1),'a_en',ip,istatus) if(istatus/=0) then write(6,*)'bkerror_a_en: trouble getting pointer to ensemble CV' call stop2(317) @@ -3492,17 +3624,33 @@ subroutine bkerror_a_en(grady) call sqrt_beta_e_mult(grady) ! Apply variances, as well as vertical & horizontal parts of background error +! !$omp parallel do schedule(dynamic,1) private(ii) do ii=1,nsubwin - !if(test_sqrt_localization) then - ! write(6,*)' using ckgcov_a_en_new_factorization' - ! allocate(z(nval_lenz_en)) - ! call ckgcov_a_en_new_factorization_ad(z,grady%aens(ii,1:n_ens)) - ! call ckgcov_a_en_new_factorization (z,grady%aens(ii,1:n_ens)) - ! deallocate(z) - !else - ! write(6,*)' using bkgcov_a_en_new_factorization' - call bkgcov_a_en_new_factorization(grady%aens(ii,1:n_ens)) - !end if + if (naensgrp==1) then + call bkgcov_a_en_new_factorization(1,grady%aens(ii,1,1:n_ens)) + else + allocate(z(naensgrp,nval_lenz_en)) + do ig=1,naensgrp + call ckgcov_a_en_new_factorization_ad(ig,z(ig,:),grady%aens(ii,ig,1:n_ens)) + enddo + allocate(ztmp(naensgrp)) + do k=1,nval_lenz_en + ztmp=zero + do ig=1,naensgrp + do ig2=1,naensgrp + ztmp(ig) = ztmp(ig) + z(ig2,k) * alphacvarsclgrpmat(ig,ig2) + enddo + enddo + do ig=1,naensgrp + z(ig,k) = ztmp(ig) + enddo + enddo + deallocate(ztmp) + do ig=1,naensgrp + call ckgcov_a_en_new_factorization(ig,z(ig,:),grady%aens(ii,ig,1:n_ens)) + enddo + deallocate(z) + endif enddo ! multiply by sqrt_beta_e_mult @@ -3514,7 +3662,7 @@ subroutine bkerror_a_en(grady) return end subroutine bkerror_a_en -subroutine bkgcov_a_en_new_factorization(a_en) +subroutine bkgcov_a_en_new_factorization(ig,a_en) !$$$ subprogram documentation block ! . . . . ! subprogram: bkgcov_a_en copy of bkgcov for hybrid ens var a_en @@ -3531,6 +3679,7 @@ subroutine bkgcov_a_en_new_factorization(a_en) ! of horizontal localization length ! ! input argument list: +! ig - number for smoothing scales ! a_en - control variable for ensemble contribution to background error ! nlevs - number of vertical levels for smoothing ! @@ -3553,15 +3702,14 @@ subroutine bkgcov_a_en_new_factorization(a_en) ! Passed Variables ! real(r_kind),dimension(grd_loc%latlon1n,n_ens),intent(inout) :: a_en + integer(i_kind),intent(in ) :: ig type(gsi_bundle),intent(inout) :: a_en(n_ens) ! Local Variables - integer(i_kind) ii,k,iflg,iadvance,iback,is,ie,ipnt,istatus + integer(i_kind) ii,k,iadvance,iback,is,ie,ipnt,istatus real(r_kind) hwork(grd_loc%inner_vars,grd_loc%nlat,grd_loc%nlon,grd_loc%kbegin_loc:grd_loc%kend_alloc) real(r_kind),allocatable,dimension(:):: a_en_work - iflg=1 - call gsi_bundlegetpointer(a_en(1),'a_en',ipnt,istatus) if(istatus/=0) then write(6,*)'bkgcov_a_en_new_factorization: trouble getting pointer to ensemble CV' @@ -3579,7 +3727,7 @@ subroutine bkgcov_a_en_new_factorization(a_en) iadvance=1 ; iback=2 !$omp parallel do schedule(dynamic,1) private(k,ii,is,ie) do k=1,n_ens - call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback) + call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback,ig) ii=(k-1)*a_en(1)%ndim is=ii+1 ie=ii+a_en(1)%ndim @@ -3592,13 +3740,13 @@ subroutine bkgcov_a_en_new_factorization(a_en) ! Apply horizontal smoother for number of horizontal scales if(regional) then iadvance=1 ; iback=2 - call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) - call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) + call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) + call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) iadvance=2 ; iback=1 - call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) - call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) + call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) + call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) else - call sf_xy(hwork,grd_loc%kbegin_loc,grd_loc%kend_loc) + call sf_xy(ig,hwork,grd_loc%kbegin_loc,grd_loc%kend_loc) end if ! Put back onto subdomains @@ -3613,14 +3761,14 @@ subroutine bkgcov_a_en_new_factorization(a_en) is=ii+1 ie=ii+a_en(1)%ndim a_en(k)%values(1:a_en(k)%ndim)=a_en_work(is:ie) - call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback) + call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback,ig) enddo deallocate(a_en_work) return end subroutine bkgcov_a_en_new_factorization -subroutine ckgcov_a_en_new_factorization(z,a_en) +subroutine ckgcov_a_en_new_factorization(ig,z,a_en) !$$$ subprogram documentation block ! . . . . ! subprogram: ckgcov_a_en_new_factorization sqrt(bkgcov_a_en_new_factorization) @@ -3632,6 +3780,7 @@ subroutine ckgcov_a_en_new_factorization(z,a_en) ! 2011-06-27 parrish, initial documentation ! ! input argument list: +! ig - number for smoothing scales ! z - long vector containing sqrt control vector for ensemble extended control variable ! ! output argument list: @@ -3654,6 +3803,7 @@ subroutine ckgcov_a_en_new_factorization(z,a_en) implicit none ! Passed Variables + integer(i_kind),intent(in ) :: ig type(gsi_bundle),intent(inout) :: a_en(n_ens) real(r_kind),dimension(nval_lenz_en),intent(in ) :: z @@ -3685,11 +3835,11 @@ subroutine ckgcov_a_en_new_factorization(z,a_en) ! Make a copy of input variable z to hwork hwork=z iadvance=2 ; iback=1 - call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) - call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) + call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) + call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) else #ifdef LATER - call sqrt_sf_xy(z,hwork,grd_loc%kbegin_loc,grd_loc%kend_loc) + call sqrt_sf_xy(ig,z,hwork,grd_loc%kbegin_loc,grd_loc%kend_loc) #else write(6,*) ' problem with ibm compiler with "use hybrid_ensemble_isotropic, only: sqrt_sf_xy"' #endif /*LATER*/ @@ -3718,14 +3868,14 @@ subroutine ckgcov_a_en_new_factorization(z,a_en) do k=1,n_ens iadvance=2 ; iback=1 - call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback) + call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback,ig) enddo return end subroutine ckgcov_a_en_new_factorization -subroutine ckgcov_a_en_new_factorization_ad(z,a_en) +subroutine ckgcov_a_en_new_factorization_ad(ig,z,a_en) !$$$ subprogram documentation block ! . . . . ! subprogram: ckgcov_a_en_new_factorization_ad adjoint of ckgcov_a_en_new_factorization @@ -3739,6 +3889,7 @@ subroutine ckgcov_a_en_new_factorization_ad(z,a_en) ! 2011-06-27 parrish, initial documentation ! ! input argument list: +! ig - number for smoothing scales ! z - long vector containing sqrt control vector for ensemble extended control variable ! a_en - bundle containing intermediate control variable after multiplication by sqrt(S), the ! ensemble localization correlation. @@ -3764,6 +3915,7 @@ subroutine ckgcov_a_en_new_factorization_ad(z,a_en) implicit none ! Passed Variables + integer(i_kind),intent(in ) :: ig type(gsi_bundle),intent(inout) :: a_en(n_ens) real(r_kind),dimension(nval_lenz_en),intent(inout) :: z @@ -3788,7 +3940,7 @@ subroutine ckgcov_a_en_new_factorization_ad(z,a_en) do k=1,n_ens iadvance=1 ; iback=2 - call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback) + call new_factorization_rf_z(a_en(k)%r3(ipnt)%q,iadvance,iback,ig) enddo @@ -3819,11 +3971,11 @@ subroutine ckgcov_a_en_new_factorization_ad(z,a_en) ! Apply horizontal smoother for number of horizontal scales if(regional) then iadvance=1 ; iback=2 - call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) - call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc) + call new_factorization_rf_x(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) + call new_factorization_rf_y(hwork,iadvance,iback,grd_loc%kend_loc+1-grd_loc%kbegin_loc,ig) z=hwork else - call sqrt_sf_xy_ad(z,hwork,grd_loc%kbegin_loc,grd_loc%kend_loc) + call sqrt_sf_xy_ad(ig,z,hwork,grd_loc%kbegin_loc,grd_loc%kend_loc) end if end if @@ -3871,6 +4023,7 @@ subroutine hybens_grid_setup use constants, only: zero,one use control_vectors, only: cvars3d,nc2d,nc3d use gridmod, only: region_lat,region_lon,region_dx,region_dy + use hybrid_ensemble_parameters, only:nsclgrp,spc_multwgt,spcwgt_params,global_spectral_filter_sd implicit none @@ -3971,6 +4124,28 @@ subroutine hybens_grid_setup end if end if + if(global_spectral_filter_sd .and. nsclgrp > 1)then + allocate(spc_multwgt(0:jcap_ens,nsclgrp)) + allocate(spcwgt_params(4,nsclgrp)) + spc_multwgt=1.0 + + ! The below parameters are used in Huang et al. (2021, MWR) + spcwgt_params(1,1)=4000.0_r_kind + spcwgt_params(2,1)=100000000.0_r_kind + spcwgt_params(3,1)=1.0_r_kind + spcwgt_params(4,1)=3000.0_r_kind + + if( nsclgrp >=3 )then + spcwgt_params(1,3)=0.0_r_kind + spcwgt_params(2,3)=500.0_r_kind + spcwgt_params(3,3)=1.0_r_kind + spcwgt_params(4,3)=500.0_r_kind + end if + + call init_mult_spc_wgts(jcap_ens) + + end if + return end subroutine hybens_grid_setup @@ -3989,6 +4164,9 @@ subroutine hybens_localization_setup ! 12-05-2012 el akkraoui hybrid beta parameters now vertically varying ! 2012-10-16 wu - only call setup_ens_wgt if necessary ! 2014-05-22 wu modification to allow vertically varying localization scales in regional +! 2022-09-15 yokota - add scale/variable/time-dependent localization +! 2022-12-09 Y. Wang and X. Wang - add a variable-dependent localization option (assign_vdl_nml=.true.), +! poc: xuguang.wang@ou.edu ! ! input argument list: ! @@ -4009,15 +4187,31 @@ subroutine hybens_localization_setup 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 hybrid_ensemble_parameters, only: ntotensgrp,naensgrp,naensloc,ntlevs_ens,nsclgrp,assign_vdl_nml + use hybrid_ensemble_parameters, only: en_perts,vdl_scale,vloc_varlist,global_spectral_filter_sd + use hybrid_ensemble_parameters, only: ngvarloc use gsi_io, only: verbose + use string_utility, only: StrLowCase implicit none integer(i_kind),parameter :: lunin = 47 character(len=40),parameter :: fname = 'hybens_info' integer(i_kind) :: k,msig,istat,nz,kl + integer(i_kind) :: n,nk,m,ig,ic3,ic2,ipic,istatus,ii + integer(i_kind) :: ipc3d(nc3d),ipc2d(nc2d) logical :: lexist,print_verbose - real(r_kind),allocatable:: s_ens_h_gu_x(:),s_ens_h_gu_y(:) + real(r_kind),allocatable:: s_ens_h_gu_x(:,:),s_ens_h_gu_y(:,:) + logical :: l_read_success + type(gsi_bundle) :: a_en(n_ens) + type(gsi_bundle) :: en_pertstmp(n_ens,ntlevs_ens) + type(gsi_bundle) :: en_pertstmp1(n_ens,ntlevs_ens) + type(gsi_grid) :: grid_ens + real(r_kind), pointer :: values(:) => NULL() + integer(i_kind) :: iscl, iv, smooth_scales_num + character(len=*),parameter::myname_=myname//'*hybens_localization_setup' + + l_read_success=.false. print_verbose=.false. .and. mype == 0 if(verbose .and. mype == 0)print_verbose=.true. @@ -4044,10 +4238,25 @@ subroutine hybens_localization_setup endif if(mype==0) write(6,'(" LOCALIZATION, BETA_S, BETA_E VERTICAL PROFILES FOLLOW")') do k = 1,grd_ens%nsig - read(lunin,101) s_ens_hv(k), s_ens_vv(k), beta_s(k), beta_e(k) - if(mype==0) write(6,101) s_ens_hv(k), s_ens_vv(k), beta_s(k), beta_e(k) + read(lunin,101) s_ens_hv(k,1), s_ens_vv(k,1), beta_s(k), beta_e(k) + if(mype==0) write(6,101) s_ens_hv(k,1), s_ens_vv(k,1), beta_s(k), beta_e(k) + enddo + do ig=2,naensloc + do k = 1,grd_ens%nsig + read(lunin,101,end=300) s_ens_hv(k,ig),s_ens_vv(k,ig) + enddo enddo + l_read_success=.true. close(lunin) +300 continue + if(.not.l_read_success) then + do ig=2,naensloc + do k = 1,grd_ens%nsig + s_ens_hv(k,ig)=s_ens_hv(k,1) + s_ens_vv(k,ig)=s_ens_vv(k,1) + enddo + enddo + endif else @@ -4060,8 +4269,8 @@ subroutine hybens_localization_setup vvlocal = .true. nz = msig kl = grd_loc%kend_alloc-grd_loc%kbegin_loc+1 - if(.not.allocated(s_ens_h_gu_x)) allocate(s_ens_h_gu_x(grd_loc%nsig*n_ens)) - if(.not.allocated(s_ens_h_gu_y)) allocate(s_ens_h_gu_y(grd_loc%nsig*n_ens)) + if(.not.allocated(s_ens_h_gu_x)) allocate(s_ens_h_gu_x(grd_loc%nsig*n_ens,naensloc)) + if(.not.allocated(s_ens_h_gu_y)) allocate(s_ens_h_gu_y(grd_loc%nsig*n_ens,naensloc)) endif endif ! if ( readin_localization .or. readin_beta ) @@ -4091,10 +4300,12 @@ subroutine hybens_localization_setup if ( .not. readin_localization ) then ! assign all levels to same value, s_ens_h, s_ens_v nz = 1 kl = 1 - if(.not.allocated(s_ens_h_gu_x)) allocate(s_ens_h_gu_x(1)) - if(.not.allocated(s_ens_h_gu_y)) allocate(s_ens_h_gu_y(1)) - s_ens_hv = s_ens_h - s_ens_vv = s_ens_v + if(.not.allocated(s_ens_h_gu_x)) allocate(s_ens_h_gu_x(1,naensloc)) + if(.not.allocated(s_ens_h_gu_y)) allocate(s_ens_h_gu_y(1,naensloc)) + do ig=1,naensloc + s_ens_hv(:,ig) = s_ens_h(ig) + s_ens_vv(:,ig) = s_ens_v(ig) + enddo endif ! Set up localization filters @@ -4103,11 +4314,19 @@ subroutine hybens_localization_setup call normal_new_factorization_rf_z if ( regional ) then ! convert s_ens_h from km to grid units. - call convert_km_to_grid_units(s_ens_h_gu_x,s_ens_h_gu_y,nz) if ( vvlocal ) then - call init_rf_x(s_ens_h_gu_x(grd_loc%kbegin_loc:grd_loc%kend_alloc),kl) - call init_rf_y(s_ens_h_gu_y(grd_loc%kbegin_loc:grd_loc%kend_alloc),kl) + call convert_km_to_grid_units(s_ens_h_gu_x(1:nz,:),s_ens_h_gu_y(1:nz,:),nz) + do n=2,n_ens + nk=(n-1)*nz + do k=1,nz + s_ens_h_gu_x(nk+k,:)=s_ens_h_gu_x(k,:) + s_ens_h_gu_y(nk+k,:)=s_ens_h_gu_y(k,:) + enddo + enddo + call init_rf_x(s_ens_h_gu_x(grd_loc%kbegin_loc:grd_loc%kend_alloc,:),kl) + call init_rf_y(s_ens_h_gu_y(grd_loc%kbegin_loc:grd_loc%kend_alloc,:),kl) else + call convert_km_to_grid_units(s_ens_h_gu_x,s_ens_h_gu_y,nz) call init_rf_x(s_ens_h_gu_x,kl) call init_rf_y(s_ens_h_gu_y,kl) endif @@ -4117,6 +4336,175 @@ subroutine hybens_localization_setup call init_sf_xy(jcap_ens) endif + if(ntotensgrp>1 .and. (.not. global_spectral_filter_sd)) then + call gsi_bundlegetpointer(en_perts(1,1,1),cvars3d,ipc3d,istatus) + if(istatus/=0) then + write(6,*) myname_,': cannot find 3d pointers' + call stop2(999) + endif + call gsi_bundlegetpointer(en_perts(1,1,1),cvars2d,ipc2d,istatus) + if(istatus/=0) then + write(6,*) myname_,': cannot find 2d pointers' + call stop2(999) + endif + if(nsclgrp>1) then + call gsi_gridcreate(grid_ens,grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) + allocate(values(grd_ens%latlon11*grd_ens%nsig*n_ens)) + if( .not. assign_vdl_nml )then + do ig=1,nsclgrp-1 + ii=0 + do n=1,n_ens + a_en(n)%values => values(ii+1:ii+grd_ens%latlon11*grd_ens%nsig) + call gsi_bundleset(a_en(n),grid_ens,'Ensemble Bundle',istatus,names3d=(/'a_en'/),bundle_kind=r_kind) + if (istatus/=0) then + write(6,*) myname_,': error alloc(ensemble bundle)' + call stop2(999) + endif + ii=ii+grd_ens%latlon11*grd_ens%nsig + enddo + do m=1,ntlevs_ens + do n=1,n_ens + en_perts(n,ig+1,m)%valuesr4=en_perts(n,ig,m)%valuesr4 + enddo + do ic3=1,nc3d + ipic=ipc3d(ic3) + do n=1,n_ens + do k=1,grd_ens%nsig + a_en(n)%r3(1)%q(:,:,k)=en_perts(n,ig,m)%r3(ipic)%qr4(:,:,k) + enddo + enddo + call bkgcov_a_en_new_factorization(naensgrp+ig,a_en) + do n=1,n_ens + do k=1,grd_ens%nsig + en_perts(n,ig,m)%r3(ipic)%qr4(:,:,k)=a_en(n)%r3(1)%q(:,:,k) + enddo + enddo + enddo + do ic2=1,nc2d + ipic=ipc2d(ic2) + do n=1,n_ens + do k=1,grd_ens%nsig + a_en(n)%r3(1)%q(:,:,k)=en_perts(n,ig,m)%r2(ipic)%qr4(:,:) + enddo + enddo + call bkgcov_a_en_new_factorization(naensgrp+ig,a_en) + do n=1,n_ens + en_perts(n,ig,m)%r2(ipic)%qr4(:,:)=a_en(n)%r3(1)%q(:,:,1) + enddo + enddo + do n=1,n_ens + en_perts(n,ig+1,m)%valuesr4=en_perts(n,ig+1,m)%valuesr4-en_perts(n,ig,m)%valuesr4 + enddo + enddo + do n=1,n_ens + call gsi_bundleunset(a_en(n),istatus) + enddo + enddo + else ! assign_vdl_nml + smooth_scales_num = naensloc - naensgrp + ngvarloc = 1 ! forced to 1 in this option + do n = 1, n_ens + do m = 1, ntlevs_ens + call gsi_bundlecreate(en_pertstmp(n,m),grid_ens,'ensemble2',istatus,names2d=cvars2d,names3d=cvars3d,bundle_kind=r_single) + call gsi_bundlecreate(en_pertstmp1(n,m),grid_ens,'ensemble1',istatus,names2d=cvars2d,names3d=cvars3d,bundle_kind=r_single) + end do + end do + ig = 1 + do iscl=1,smooth_scales_num + 1 + ii=0 + do n=1,n_ens + a_en(n)%values => values(ii+1:ii+grd_ens%latlon11*grd_ens%nsig) + call gsi_bundleset(a_en(n),grid_ens,'Ensemble Bundle',istatus,names3d=(/'a_en'/),bundle_kind=r_kind) + if (istatus/=0) then + write(6,*) myname_,': error alloc(ensemble bundle)' + call stop2(999) + endif + ii=ii+grd_ens%latlon11*grd_ens%nsig + enddo + + do m=1,ntlevs_ens + if( ig == 1 )then + do n=1,n_ens + en_pertstmp(n,m)%valuesr4=en_perts(n,ig,m)%valuesr4 + enddo + end if + do ic3=1,nc3d + ipic=ipc3d(ic3) + do n=1,n_ens + do k=1,grd_ens%nsig + a_en(n)%r3(1)%q(:,:,k)=en_pertstmp(n,m)%r3(ipic)%qr4(:,:,k) + enddo + enddo + if(iscl <= smooth_scales_num) call bkgcov_a_en_new_factorization(naensgrp+iscl,a_en) + do n=1,n_ens + do k=1,grd_ens%nsig + en_pertstmp1(n,m)%r3(ipic)%qr4(:,:,k)=a_en(n)%r3(1)%q(:,:,k) + if( vdl_scale(ig) == 0 )then + en_perts(n,ig,m)%r3(ipic)%qr4(:,:,k)=a_en(n)%r3(1)%q(:,:,k) + else ! VDL is activated + do iv = 1, vdl_scale(ig) + en_perts(n,ig+iv-1,m)%r3(ipic)%qr4(:,:,k)=0.0_r_single + if( any( trim(StrLowCase(cvars3d(ic3))) == vloc_varlist(ig+iv-1,:) ) ) then + en_perts(n,ig+iv-1,m)%r3(ipic)%qr4(:,:,k)=a_en(n)%r3(1)%q(:,:,k) + end if + end do + end if + enddo + enddo + enddo + do ic2=1,nc2d + ipic=ipc2d(ic2) + do n=1,n_ens + do k=1,grd_ens%nsig + a_en(n)%r3(1)%q(:,:,k)=en_pertstmp(n,m)%r2(ipic)%qr4(:,:) + enddo + enddo + if(iscl <= smooth_scales_num) call bkgcov_a_en_new_factorization(naensgrp+iscl,a_en) + do n=1,n_ens + en_pertstmp1(n,m)%r2(ipic)%qr4(:,:)=a_en(n)%r3(1)%q(:,:,1) + if( vdl_scale(ig) == 0 )then + en_perts(n,ig,m)%r2(ipic)%qr4(:,:)=a_en(n)%r3(1)%q(:,:,1) + else ! VDL is activated + do iv = 1, vdl_scale(ig) + en_perts(n,ig+iv-1,m)%r2(ipic)%qr4(:,:)=0.0_r_single + if( any( trim(StrLowCase(cvars2d(ic2))) == vloc_varlist(ig+iv-1,:) ) ) then + en_perts(n,ig+iv-1,m)%r2(ipic)%qr4(:,:)=a_en(n)%r3(1)%q(:,:,1) + end if + end do + end if + enddo + enddo + do n=1,n_ens + en_pertstmp(n,m)%valuesr4=en_pertstmp(n,m)%valuesr4-en_pertstmp1(n,m)%valuesr4 + enddo + enddo + do n=1,n_ens + call gsi_bundleunset(a_en(n),istatus) + enddo + if( vdl_scale(ig) == 0 )then + ig = ig + 1 + else + ig = ig + vdl_scale(ig) + end if + enddo + do n=1,n_ens + do m=1,ntlevs_ens + call gsi_bundledestroy(en_pertstmp(n,m),istatus) + call gsi_bundledestroy(en_pertstmp1(n,m),istatus) + end do + end do + end if + deallocate(values) + endif + do ig=nsclgrp+1,ntotensgrp + do m=1,ntlevs_ens + do n=1,n_ens + en_perts(n,ig,m)%valuesr4=en_perts(n,ig-nsclgrp,m)%valuesr4 + enddo + enddo + enddo + endif + !!!!!!!! setup beta_s, beta_e!!!!!!!!!!!! ! vertical variation of static and ensemble weights @@ -4138,12 +4526,14 @@ subroutine hybens_localization_setup ! write out final values for s_ens_hv, s_ens_vv, beta_s, beta_e if ( print_verbose ) then - write(6,*) 'HYBENS_LOCALIZATION_SETUP: s_ens_hv,s_ens_vv,beta_s,beta_e' + write(6,*) 'HYBENS_LOCALIZATION_SETUP: s_ens_hv(:,1),s_ens_vv(:,1),beta_s,beta_e' do k=1,grd_ens%nsig - write(6,101) s_ens_hv(k), s_ens_vv(k), beta_s(k), beta_e(k) + write(6,101) s_ens_hv(k,1), s_ens_vv(k,1), beta_s(k), beta_e(k) enddo endif + call setup_ensgrp2aensgrp + return end subroutine hybens_localization_setup @@ -4174,16 +4564,17 @@ subroutine convert_km_to_grid_units(s_ens_h_gu_x,s_ens_h_gu_y,nz) !$$$ use kinds, only: r_kind,i_kind - use hybrid_ensemble_parameters, only: grd_loc,n_ens,s_ens_hv + use hybrid_ensemble_parameters, only: s_ens_hv use hybrid_ensemble_parameters, only: region_dx_ens,region_dy_ens + use hybrid_ensemble_parameters, only: naensloc use gsi_io, only: verbose implicit none integer(i_kind) ,intent(in ) ::nz - real(r_kind),intent( out) ::s_ens_h_gu_x(nz*n_ens),s_ens_h_gu_y(nz*n_ens) + real(r_kind),intent( out) ::s_ens_h_gu_x(nz,naensloc),s_ens_h_gu_y(nz,naensloc) logical :: print_verbose real(r_kind) dxmax,dymax - integer(i_kind) k,n,nk + integer(i_kind) k print_verbose=.false. if(verbose) print_verbose=.true. @@ -4197,25 +4588,14 @@ subroutine convert_km_to_grid_units(s_ens_h_gu_x,s_ens_h_gu_y,nz) end if do k=1,nz - s_ens_h_gu_x(k)=s_ens_hv(k)/(.001_r_kind*dxmax) - s_ens_h_gu_y(k)=s_ens_hv(k)/(.001_r_kind*dymax) - if(print_verbose) write(6,*)' in convert_km_to_grid_units,s_ens_h,s_ens_h_gu_x,y=', & - s_ens_hv(k),s_ens_h_gu_x(k),s_ens_h_gu_y(k) - + s_ens_h_gu_x(k,:)=s_ens_hv(k,:)/(.001_r_kind*dxmax) + s_ens_h_gu_y(k,:)=s_ens_hv(k,:)/(.001_r_kind*dymax) + if(print_verbose) write(6,*)' in convert_km_to_grid_units,s_ens_h(k,1),s_ens_h_gu_x,y(k,1)=', & + s_ens_hv(k,1),s_ens_h_gu_x(k,1),s_ens_h_gu_y(k,1) enddo - if(nz>1)then - do n=2,n_ens - nk=(n-1)*grd_loc%nsig - do k=1,grd_loc%nsig - s_ens_h_gu_x(nk+k)=s_ens_h_gu_x(k) - s_ens_h_gu_y(nk+k)=s_ens_h_gu_y(k) - enddo - enddo - endif return - end subroutine convert_km_to_grid_units subroutine grads1(f,nvert,mype,fname) @@ -5146,4 +5526,95 @@ subroutine setup_pwgt end subroutine setup_pwgt +subroutine setup_ensgrp2aensgrp +!$$$ subprogram documentation block +! . . . . +! subprogram: set a matrix of (naensgrp,naensgrp) +! +! program history log: +! 2022-09-15 yokota - add scale/variable/time-dependent localization +! +! input argument list: +! +! output argument list: +! +! remarks: +! need to reconcile grid in gsi_bundle w/ grid_ens/grid_anl +! +! attributes: +! language: f90 +! machine: ibm RS/6000 SP +! +!$$$ end documentation block + use constants, only: zero,one + use hybrid_ensemble_parameters, only: l_timloc_opt,r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl + use hybrid_ensemble_parameters, only: ensloccov4tim,ensloccov4var,ensloccov4scl + use hybrid_ensemble_parameters, only: ntotensgrp,naensgrp,ntlevs_ens,nsclgrp,ngvarloc + use hybrid_ensemble_parameters, only: ensgrp2aensgrp + use hybrid_ensemble_parameters, only: idaen2d,idaen3d + use hybrid_ensemble_parameters, only: alphacvarsclgrpmat + implicit none + + integer (i_kind):: i,j + integer (i_kind):: ig,ibin,ic,iscl,itim1,itim2,igvar1,igvar2,iscl1,iscl2,ivargrp + integer (i_kind):: ntimloc,interval4aens + + if (l_timloc_opt) then + ntimloc=ntlevs_ens + interval4aens=ntotensgrp + else + ntimloc=1 + interval4aens=0 + endif + if(naensgrp/=ntimloc*ngvarloc*nsclgrp) then + write(6,*)'setup_ensgrp2aensgrp: wrong naensgrp' + call stop2(666) + endif + if(ntotensgrp/=ngvarloc*nsclgrp) then + write(6,*)'setup_ensgrp2aensgrp: wrong ntotensgrp' + call stop2(666) + endif + ensgrp2aensgrp=-999 + do ibin=1,ntlevs_ens + do ic=1,nc3d+nc2d + if(ngvarloc>1) then + if(ic<=nc3d) ivargrp=idaen3d(ic) + if(ic> nc3d) ivargrp=idaen2d(ic-nc3d) + else + ivargrp=1 + endif + do iscl=1,nsclgrp + ig=(ivargrp-1)*nsclgrp+iscl + ensgrp2aensgrp(ig,ic,ibin)=(ibin-1)*interval4aens+(ivargrp-1)*nsclgrp+iscl + enddo + enddo + enddo + + ensloccov4tim=r_ensloccov4tim + ensloccov4tim(1)=one + ensloccov4var=r_ensloccov4var + ensloccov4var(1)=one + ensloccov4scl=r_ensloccov4scl + ensloccov4scl(1)=one + + do itim2=1,ntimloc + do itim1=1,ntimloc + do igvar1=1,ngvarloc + do igvar2=1,ngvarloc + do iscl1=1,nsclgrp + do iscl2=1,nsclgrp + i=(itim1-1)*interval4aens+(igvar1-1)*nsclgrp+iscl1 + j=(itim2-1)*interval4aens+(igvar2-1)*nsclgrp+iscl2 + alphacvarsclgrpmat(i,j)=ensloccov4tim(abs(itim1-itim2)+1) & + *ensloccov4var(abs(igvar1-igvar2)+1) & + *ensloccov4scl(abs(iscl1-iscl2)+1) !first for ttime covariance + enddo + enddo + enddo + enddo + enddo + enddo + +end subroutine setup_ensgrp2aensgrp + end module hybrid_ensemble_isotropic diff --git a/src/gsi/hybrid_ensemble_parameters.f90 b/src/gsi/hybrid_ensemble_parameters.f90 index 9ca7770c41..342dead615 100644 --- a/src/gsi/hybrid_ensemble_parameters.f90 +++ b/src/gsi/hybrid_ensemble_parameters.f90 @@ -90,8 +90,19 @@ module hybrid_ensemble_parameters ! 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 +! s_ens_h: horizontal localization correlation length of Gaussian exp(-0.5*(r/L)**2) +! (units of km), default = 2828.0 +! s_ens_v: vertical localization correlation length of Gaussian exp(-0.5*(r/L)**2) +! (grid units if s_ens_v>=0, or units of ln(p) if s_ens_v<0), default = 30.0 +! in scale/variable/time-dependent localization (SDL/VDL/TDL), +! localization length for i-th scale, j-th variable, and k-th time is +! s_ens_[hv]( i + nsclgrp*(j-1) + nsclgrp*ngvarloc*(k-1) ) +! in SDL(nsclgrp>1), i = 1(largest scale) .. nsclgrp(smallest scale) +! in VDL(ngvarloc=2), j = 1(itracer<=10) .. 2(itracer>=11) +! in TDL(l_timloc_opt=true), k = 1(first time bin) .. ntlevs_ens(last time bin) +! in SDL, scale separation length for i-th scale is also set here as +! s_ens_[hv]( naensgrp+i ) - naensgrp is the total number of localization lengths for SDL/VDL/TDL +! in applying SDL only horizontally, set s_ens_v(naensgrp+i)=0.0 ! generate_ens: if .true., generate ensemble perturbations internally as random samples of background B. ! (used primarily for testing/debugging) ! if .false., read external ensemble perturbations @@ -117,7 +128,27 @@ module hybrid_ensemble_parameters ! function of z, default = .false. ! ensemble_path: path to ensemble members; default './' ! ens_fast_read: read ensemble in parallel; default '.false.' +! parallelization_over_ensmembers: parallelly read ensemble members for FV3-LAM; default '.false' ! sst_staticB: if .true. (default) uses only static part of B error covariance for SST +! nsclgrp: number of scale-dependent localization lengths +! l_timloc_opt: if true, then turn on time-dependent localization +! ngvarloc: number of variable-dependent localization lengths +! naensloc: total number of spatial localization lengths and scale separation lengths (should be naensgrp+nsclgrp-1) +! r_ensloccov4tim: factor multiplying to cross-time covariance +! For example, +! =0.0: cross-time covariance is decreased to zero +! =0.5: cross-time covariance is decreased to half +! =1.0: cross-time covariance is retained +! r_ensloccov4var: factor multiplying to cross-variable covariance +! For example, +! =0.0: cross-variable covariance is decreased to zero +! =0.5: cross-variable covariance is decreased to half +! =1.0: cross-variable covariance is retained +! r_ensloccov4scl: factor multiplying to cross-scale covariance +! For example, +! =0.0: cross-scale covariance is decreased to zero +! =0.5: cross-scale covariance is decreased to half +! =1.0: cross-scale covariance is retained !===================================================================================================== ! ! @@ -151,6 +182,7 @@ module hybrid_ensemble_parameters ! 2015-01-22 Hu - add flag i_en_perts_io to control reading ensemble perturbation. ! 2015-02-11 Hu - add flag l_ens_in_diff_time to force GSI hybrid use ensembles not available at analysis time ! 2015-09-18 todling - add sst_staticB to control use of ensemble SST error covariance +! 2022-09-15 yokota - add scale/variable/time-dependent localization ! ! subroutines included: @@ -174,8 +206,10 @@ module hybrid_ensemble_parameters ! beta_s(:) = beta_s0 , vertically varying weights given to B ; ! beta_e(:) = 1 - beta_s0 , vertically varying weights given to A. ! If (readin_beta) then beta_s and beta_e are read from a file and beta_s0 is not used. -! def s_ens_h - homogeneous isotropic horizontal ensemble localization scale (km) -! def s_ens_v - vertical localization scale (grid units for now) +! def s_ens_h - horizontal localization correlation length of Gaussian exp(-0.5*(r/L)**2) +! (units of km), default = 2828.0 +! def s_ens_v - vertical localization correlation length of Gaussian exp(-0.5*(r/L)**2) +! (grid units if s_ens_v>=0, or units of ln(p) if s_ens_v<0), default = 30.0 ! def readin_localization - flag to read (.true.)external localization information file ! def eqspace_ensgrid - if .true., then ensemble grid is equal spaced, staggered 1/2 grid unit off ! poles. if .false., then Gaussian grid assumed for ensemble (global only) @@ -259,6 +293,7 @@ module hybrid_ensemble_parameters 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 :: n_ens_gfs,n_ens_fv3sar + public :: weight_ens_gfs,weight_ens_fv3sar 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 @@ -292,12 +327,27 @@ module hybrid_ensemble_parameters public :: en_perts,ps_bar public :: region_lat_ens,region_lon_ens public :: region_dx_ens,region_dy_ens + public :: naensgrp,ntotensgrp,nsclgrp,naensloc,ngvarloc + public :: ensgrp2aensgrp + public :: ensloccov4tim,ensloccov4var,ensloccov4scl + public :: alphacvarsclgrpmat + public :: l_timloc_opt + public :: r_ensloccov4tim,r_ensloccov4var,r_ensloccov4scl + public :: idaen3d,idaen2d public :: ens_fast_read + public :: parallelization_over_ensmembers public :: l_both_fv3sar_gfs_ens public :: sst_staticB public :: limqens + public :: spc_multwgt + public :: spcwgt_params + public :: vdl_scale,vloc_varlist + public :: global_spectral_filter_sd + public :: assign_vdl_nml + logical l_hyb_ens,uv_hyb_ens,q_hyb_ens,oz_univ_static,sst_staticB + logical l_timloc_opt logical aniso_a_en logical full_ensemble,pwgtflg logical generate_ens @@ -313,15 +363,22 @@ module hybrid_ensemble_parameters logical vvlocal logical l_ens_in_diff_time logical ens_fast_read + logical parallelization_over_ensmembers logical l_both_fv3sar_gfs_ens integer(i_kind) i_en_perts_io integer(i_kind) n_ens,nlon_ens,nlat_ens,jcap_ens,jcap_ens_test integer(i_kind) n_ens_gfs,n_ens_fv3sar - real(r_kind) beta_s0,beta_e0,s_ens_h,s_ens_v,grid_ratio_ens + real(r_kind) weight_ens_gfs,weight_ens_fv3sar + real(r_kind) beta_s0,beta_e0,grid_ratio_ens + integer(i_kind),parameter::max_naensloc=20 + integer(i_kind),parameter::max_nvars=100 + real(r_kind) s_ens_h(max_naensloc) + real(r_kind) s_ens_v(max_naensloc) 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 - real(r_kind),allocatable,dimension(:) :: s_ens_hv,s_ens_vv + real(r_kind),allocatable,dimension(:,:) :: s_ens_vv + real(r_kind),allocatable,dimension(:,:) :: s_ens_hv real(r_kind),allocatable,dimension(:) :: sqrt_beta_s,sqrt_beta_e real(r_kind),allocatable,dimension(:) :: beta_s,beta_e real(r_kind),allocatable,dimension(:,:,:) :: pwgt @@ -336,6 +393,25 @@ module hybrid_ensemble_parameters integer(i_kind) regional_ensemble_option integer(i_kind) fv3sar_ensemble_opt character(len=512),save :: ensemble_path + real(r_kind),allocatable,dimension(:,:) :: alphacvarsclgrpmat + integer(i_kind),allocatable,dimension(:,:,:) :: ensgrp2aensgrp + real(r_kind),allocatable,dimension(:) :: ensloccov4tim,ensloccov4var,ensloccov4scl + integer(i_kind) :: nsclgrp=1 + integer(i_kind) :: naensgrp=1 + integer(i_kind) :: ntotensgrp=1 + integer(i_kind) :: naensloc=1 + integer(i_kind) :: ngvarloc=1 + real(r_kind) :: r_ensloccov4tim + real(r_kind) :: r_ensloccov4var + real(r_kind) :: r_ensloccov4scl + integer(i_kind),allocatable,dimension(:) :: idaen3d,idaen2d + + real(r_kind),allocatable,dimension(:,:) :: spc_multwgt + real(r_kind),allocatable,dimension(:,:) :: spcwgt_params + character(len=3) vloc_varlist(max_naensloc,max_nvars) + integer(i_kind) vdl_scale(max_naensloc) + logical :: global_spectral_filter_sd + logical :: assign_vdl_nml ! following is for storage of ensemble perturbations: @@ -343,7 +419,7 @@ module hybrid_ensemble_parameters ! def nelen - length of one ensemble perturbation vector integer(i_kind) nelen - type(gsi_bundle),save,allocatable :: en_perts(:,:) + type(gsi_bundle),save,allocatable :: en_perts(:,:,:) real(r_single),dimension(:,:,:),allocatable:: ps_bar real(r_single):: limqens @@ -384,6 +460,7 @@ subroutine init_hybrid_ensemble_parameters implicit none l_hyb_ens=.false. + l_timloc_opt=.false. full_ensemble=.false. pwgtflg=.false. uv_hyb_ens=.false. @@ -423,10 +500,20 @@ subroutine init_hybrid_ensemble_parameters i_en_perts_io=0 ! default for en_pert IO. 0 is no IO ensemble_path = './' ! default for path to ensemble members ens_fast_read=.false. + parallelization_over_ensmembers=.false. limqens=1.0_r_single ! default for limiting ensemble RH (+/-) l_both_fv3sar_gfs_ens=.false. n_ens_gfs=0 n_ens_fv3sar=0 + weight_ens_gfs=one + weight_ens_fv3sar=one + r_ensloccov4tim=one + r_ensloccov4var=one + r_ensloccov4scl=one + vdl_scale = 0 + vloc_varlist = 'aaa' + global_spectral_filter_sd=.false. + assign_vdl_nml=.false. end subroutine init_hybrid_ensemble_parameters @@ -435,15 +522,23 @@ subroutine create_hybens_localization_parameters use constants, only: zero implicit none - allocate( s_ens_hv(grd_ens%nsig),s_ens_vv(grd_ens%nsig) ) + allocate( s_ens_hv(grd_ens%nsig,naensloc),s_ens_vv(grd_ens%nsig,naensloc) ) allocate( beta_s(grd_ens%nsig),beta_e(grd_ens%nsig)) allocate( sqrt_beta_s(grd_ens%nsig),sqrt_beta_e(grd_ens%nsig) ) allocate( pwgt(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig) ) + allocate( alphacvarsclgrpmat(naensgrp,naensgrp) ) + allocate( ensgrp2aensgrp(ntotensgrp,max_nvars,ntlevs_ens) ) + allocate( ensloccov4tim(ntlevs_ens),ensloccov4var(ngvarloc),ensloccov4scl(nsclgrp) ) beta_s =one beta_e =zero sqrt_beta_s=one sqrt_beta_e=zero pwgt=zero + alphacvarsclgrpmat=one + ensgrp2aensgrp=1 + ensloccov4tim=one + ensloccov4var=one + ensloccov4scl=one end subroutine create_hybens_localization_parameters @@ -453,6 +548,8 @@ subroutine destroy_hybens_localization_parameters deallocate(s_ens_vv,s_ens_hv) deallocate(beta_s,beta_e) deallocate(sqrt_beta_s,sqrt_beta_e,pwgt) + deallocate(alphacvarsclgrpmat) + deallocate(ensgrp2aensgrp) end subroutine destroy_hybens_localization_parameters diff --git a/src/gsi/intall.f90 b/src/gsi/intall.f90 index 0f8faa89f8..d10eb1e7e5 100644 --- a/src/gsi/intall.f90 +++ b/src/gsi/intall.f90 @@ -184,13 +184,13 @@ subroutine intall(sval,sbias,rval,rbias) use intjomod, only: intjo use bias_predictors, only : predictors,assignment(=) use state_vectors, only: allocate_state,deallocate_state + use state_vectors, only: qgpresent,qspresent,qrpresent,qipresent,qlpresent + use state_vectors, only: cldchpresent,lcbaspresent,howvpresent,wspd10mpresent,pblhpresent,vispresent,gustpresent use intjcmod, only: intlimq,intlimg,intlimv,intlimp,intlimw10m,intlimhowv,intlimcldch,& intliml,intjcpdry1,intjcpdry2,intjcdfi,intlimqc use timermod, only: timer_ini,timer_fnl use gsi_bundlemod, only: gsi_bundle use gsi_bundlemod, only: assignment(=) - use state_vectors, only: svars2d, svars3d - use mpeu_util, only: getindex use guess_grids, only: ntguessig,nfldsig use mpl_allreducemod, only: mpl_allreduce @@ -238,11 +238,11 @@ subroutine intall(sval,sbias,rval,rbias) end if if (ljclimqc) then if (.not.ljc4tlevs) then - if (getindex(svars3d,'ql')>0) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'ql') - if (getindex(svars3d,'qi')>0) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qi') - if (getindex(svars3d,'qr')>0) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qr') - if (getindex(svars3d,'qs')>0) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qs') - if (getindex(svars3d,'qg')>0) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qg') + if (qlpresent) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'ql') + if (qipresent) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qi') + if (qrpresent) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qr') + if (qspresent) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qs') + if (qgpresent) call intlimqc(rval(ibin_anl),sval(ibin_anl),ntguessig,'qg') else do ibin=1,nobs_bins if (nobs_bins /= nfldsig) then @@ -250,34 +250,34 @@ subroutine intall(sval,sbias,rval,rbias) else it=ibin end if - if (getindex(svars3d,'ql')>0) call intlimqc(rval(ibin),sval(ibin),it,'ql') - if (getindex(svars3d,'qi')>0) call intlimqc(rval(ibin),sval(ibin),it,'qi') - if (getindex(svars3d,'qr')>0) call intlimqc(rval(ibin),sval(ibin),it,'qr') - if (getindex(svars3d,'qs')>0) call intlimqc(rval(ibin),sval(ibin),it,'qs') - if (getindex(svars3d,'qg')>0) call intlimqc(rval(ibin),sval(ibin),it,'qg') + if (qlpresent) call intlimqc(rval(ibin),sval(ibin),it,'ql') + if (qipresent) call intlimqc(rval(ibin),sval(ibin),it,'qi') + if (qrpresent) call intlimqc(rval(ibin),sval(ibin),it,'qr') + if (qspresent) call intlimqc(rval(ibin),sval(ibin),it,'qs') + if (qgpresent) call intlimqc(rval(ibin),sval(ibin),it,'qg') end do end if end if ! ljclimqc ! RHS for gust constraint - if (getindex(svars2d,'gust')>0)call intlimg(rval(1),sval(1)) + if (gustpresent)call intlimg(rval(1),sval(1)) ! RHS for vis constraint - if (getindex(svars2d,'vis')>0) call intlimv(rval(1),sval(1)) + if (vispresent) call intlimv(rval(1),sval(1)) ! RHS for pblh constraint - if (getindex(svars2d,'pblh')>0) call intlimp(rval(1),sval(1)) + if (pblhpresent) call intlimp(rval(1),sval(1)) ! RHS for wspd10m constraint - if (getindex(svars2d,'wspd10m')>0) call intlimw10m(rval(1),sval(1)) + if (wspd10mpresent) call intlimw10m(rval(1),sval(1)) ! RHS for howv constraint - if (getindex(svars2d,'howv')>0) call intlimhowv(rval(1),sval(1)) + if (howvpresent) call intlimhowv(rval(1),sval(1)) ! RHS for lcbas constraint - if (getindex(svars2d,'lcbas')>0) call intliml(rval(1),sval(1)) + if (lcbaspresent) call intliml(rval(1),sval(1)) ! RHS for cldch constraint - if (getindex(svars2d,'cldch')>0) call intlimcldch(rval(1),sval(1)) + if (cldchpresent) call intlimcldch(rval(1),sval(1)) end if @@ -296,7 +296,7 @@ subroutine intall(sval,sbias,rval,rbias) end if -! Take care of background error for bias correction terms +! Sum over all processors for bias correction terms call mpl_allreduce(nrclen,qpvals=qpred) @@ -313,6 +313,7 @@ subroutine intall(sval,sbias,rval,rbias) ! RHS for Jc DFI if (ljcdfi .and. nobs_bins>1) call intjcdfi(rval,sval) +! Put bias correction terms in correct location if(nsclen > 0)then do i=1,nsclen rbias%predr(i)=qpred(i) diff --git a/src/gsi/intgps.f90 b/src/gsi/intgps.f90 index bc78db085e..16ead93d1c 100644 --- a/src/gsi/intgps.f90 +++ b/src/gsi/intgps.f90 @@ -118,6 +118,7 @@ subroutine intgps_(gpshead,rval,sval) real(r_kind) :: w1,w2,w3,w4 real(r_kind) :: p_TL,p_AD,t_TL,t_AD,q_TL,q_AD real(r_kind) :: val,pg_gps + real(r_kind),dimension(nsig) :: valk real(r_kind) ::cg_gps,grad,p0,wnotgross,wgross real(r_kind),pointer,dimension(:) :: st,sq real(r_kind),pointer,dimension(:) :: rt,rq @@ -154,16 +155,19 @@ subroutine intgps_(gpshead,rval,sval) w3=gpsptr%wij(3) w4=gpsptr%wij(4) - - val=zero - ! local refractivity (linear operator) +!$omp parallel do schedule(dynamic,1) private(j,t_TL,q_TL,p_TL) + do j=1,nsig + t_TL=w1*st(i1(j))+w2*st(i2(j))+w3*st(i3(j))+w4*st(i4(j)) + q_TL=w1*sq(i1(j))+w2*sq(i2(j))+w3*sq(i3(j))+w4*sq(i4(j)) + p_TL=w1*sp(i1(j))+w2*sp(i2(j))+w3*sp(i3(j))+w4*sp(i4(j)) + valk(j) = p_TL*gpsptr%jac_p(j) + t_TL*gpsptr%jac_t(j)+q_TL*gpsptr%jac_q(j) + end do + + val=zero do j=1,nsig - t_TL=w1* st(i1(j))+w2* st(i2(j))+w3* st(i3(j))+w4* st(i4(j)) - q_TL=w1* sq(i1(j))+w2* sq(i2(j))+w3* sq(i3(j))+w4* sq(i4(j)) - p_TL=w1* sp(i1(j))+w2* sp(i2(j))+w3* sp(i3(j))+w4* sp(i4(j)) - val = val + p_TL*gpsptr%jac_p(j) + t_TL*gpsptr%jac_t(j)+q_TL*gpsptr%jac_q(j) + val = val+valk(j) end do if (luse_obsdiag)then @@ -204,6 +208,7 @@ subroutine intgps_(gpshead,rval,sval) ! adjoint +!$omp parallel do schedule(dynamic,1) private(j,t_AD,q_AD,p_AD) do j=1,nsig t_AD = grad*gpsptr%jac_t(j) rt(i1(j))=rt(i1(j))+w1*t_AD diff --git a/src/gsi/intjcmod.f90 b/src/gsi/intjcmod.f90 index c0c23151ee..2b093312ac 100644 --- a/src/gsi/intjcmod.f90 +++ b/src/gsi/intjcmod.f90 @@ -740,7 +740,7 @@ subroutine intjcpdry(rval,sval,nbins,pjc) it=ntguessig mass=zero_quad - rcon=one_quad/(two_quad*float(nlon)) + rcon=(one_quad/(two_quad*float(nlon)))**2 mm1=mype+1 do n=1,nbins @@ -805,8 +805,7 @@ subroutine intjcpdry(rval,sval,nbins,pjc) ! Remove water-vapor contribution to get incremental dry ps ! if (mype==0) write(6,*)'intjcpdry: total mass =', mass(n) ! if (mype==0) write(6,*)'intjcpdry: wv mass =', mass(nbins+n) - dmass=mass(n)-mass(nbins+n) - dmass=bamp_jcpdry*dmass*rcon*rcon + dmass=bamp_jcpdry*(mass(n)-mass(nbins+n))*rcon if(present(pjc)) then pjc = dmass*dmass endif @@ -872,7 +871,7 @@ subroutine intjcpdry1(sval,nbins,mass) ! !$$$ use mpimod, only: mype - use gridmod, only: lat2,lon2,nsig,wgtlats,nlon,istart + use gridmod, only: lat2,lon2,nsig,wgtlats,istart use guess_grids, only: ges_prsi,ntguessig use gsi_metguess_mod, only: gsi_metguess_get implicit none @@ -884,7 +883,7 @@ subroutine intjcpdry1(sval,nbins,mass) ! Declare local variables real(r_quad),dimension(nsig) :: mass2 - real(r_quad) rcon,con + real(r_quad) con integer(i_kind) i,j,k,it,ii,mm1,icw,iql,iqi integer(i_kind) iq,iqr,iqs,iqg,iqh,ips real(r_kind),pointer,dimension(:,:,:) :: sq =>NULL() @@ -901,13 +900,11 @@ subroutine intjcpdry1(sval,nbins,mass) it=ntguessig mass=zero_quad - rcon=one_quad/(two_quad*float(nlon)) mm1=mype+1 do n=1,nbins ! Retrieve pointers ! Simply return if any pointer not found - iq=0; icw=0; iql=0; iqi=0; iqr=0; iqs=0; iqg=0; iqh=0 call gsi_bundlegetpointer(sval(n),'q' ,sq, iq ) call gsi_bundlegetpointer(sval(n),'cw',sc, icw ) call gsi_bundlegetpointer(sval(n),'ql',sql, iql ) @@ -1023,11 +1020,10 @@ subroutine intjcpdry2(rval,nbins,mass,pjc) integer(i_kind) :: n it=ntguessig - rcon=one_quad/(two_quad*float(nlon)) + rcon=(one_quad/(two_quad*float(nlon)))**2 mm1=mype+1 do n=1,nbins - iq=0; icw=0; iql=0; iqi=0; iqr=0; iqs=0; iqg=0; iqh=0 call gsi_bundlegetpointer(rval(n),'q' ,rq, iq ) call gsi_bundlegetpointer(rval(n),'cw',rc, icw ) call gsi_bundlegetpointer(rval(n),'ql',rql, iql ) @@ -1037,7 +1033,7 @@ subroutine intjcpdry2(rval,nbins,mass,pjc) call gsi_bundlegetpointer(rval(n),'qg',rqg, iqg ) call gsi_bundlegetpointer(rval(n),'qh',rqh, iqh ) call gsi_bundlegetpointer(rval(n),'ps',rp, ips ) - if( iq*ips /=0 .or. icw*(iql+iqi) /=0 ) then + if( ips /= 0 .or. iq /=0 .or. icw*(iql+iqi) /=0 ) then if (mype==0) write(6,*)'intjcpdry2: warning - missing some required variables' if (mype==0) write(6,*)'intjcpdry2: constraint for dry mass constraint not performed' return @@ -1045,8 +1041,7 @@ subroutine intjcpdry2(rval,nbins,mass,pjc) ! Remove water-vapor contribution to get incremental dry ps ! if (mype==0) write(6,*)'intjcpdry: total mass =', mass(n) ! if (mype==0) write(6,*)'intjcpdry: wv mass =', mass(nbins+n) - dmass=mass(n)-mass(nbins+n) - dmass=bamp_jcpdry*dmass*rcon*rcon + dmass=bamp_jcpdry*(mass(n)-mass(nbins+n))*rcon if(present(pjc)) then pjc = dmass*dmass endif diff --git a/src/gsi/intjo.f90 b/src/gsi/intjo.f90 index e514a38a22..91b811147e 100644 --- a/src/gsi/intjo.f90 +++ b/src/gsi/intjo.f90 @@ -240,8 +240,6 @@ subroutine intjo_(rval,qpred,sval,sbias) use m_obsdiags, only: obOper_destroy use gsi_obOper, only: obOper -use intradmod, only: setrad - implicit none ! Declare passed variables @@ -257,7 +255,6 @@ subroutine intjo_(rval,qpred,sval,sbias) class(obOper),pointer:: it_obOper !****************************************************************************** - call setrad(sval(1)) ! "RHS for jo", as it was labeled in intall(). !$omp parallel do schedule(dynamic,1) private(ibin,it,ix,it_obOper) diff --git a/src/gsi/intpm2_5.f90 b/src/gsi/intpm2_5.f90 index 305215389f..42c05ad3ff 100644 --- a/src/gsi/intpm2_5.f90 +++ b/src/gsi/intpm2_5.f90 @@ -78,6 +78,7 @@ subroutine intpm2_5_(pm2_5head,rval,sval) use gridmod, only: cmaq_regional,wrf_mass_regional,fv3_cmaq_regional use chemmod, only: s_2_5,d_2_5,nh4_mfac,oc_mfac,laeroana_gocart use chemmod, only: naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3,laeroana_fv3cmaq + use chemmod, only: naero_smoke_fv3,aeronames_smoke_fv3,laeroana_fv3smoke implicit none @@ -89,10 +90,9 @@ subroutine intpm2_5_(pm2_5head,rval,sval) ! declare local variables integer(i_kind) j1,j2,j3,j4,j5,j6,j7,j8,ier,istatus real(r_kind) w1,w2,w3,w4,w5,w6,w7,w8 -! real(r_kind) penalty real(r_kind) cg_pm2_5,val,p0,grad,wnotgross,wgross,pm2_5_pg - real(r_kind),pointer,dimension(:) :: spm2_5 - real(r_kind),pointer,dimension(:) :: rpm2_5 + real(r_kind),pointer,dimension(:) :: spm2_5,sdust + real(r_kind),pointer,dimension(:) :: rpm2_5,rdust type(pm2_5Node), pointer :: pm2_5ptr character(len=max_varname_length) :: aeroname @@ -168,7 +168,7 @@ subroutine intpm2_5_(pm2_5head,rval,sval) if( ladtest_obs ) then grad = val else - grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 + grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 end if endif ! adjoint @@ -226,7 +226,7 @@ subroutine intpm2_5_(pm2_5head,rval,sval) w7* spm2_5(j7)+w8* spm2_5(j8) val=val *pm2_5ptr%pm25wc(imodes_cmaq_fv3(iaero)) nullify(spm2_5) -! + do iaero=2, naero_cmaq_fv3 aeroname=aeronames_cmaq_fv3(iaero) call gsi_bundlegetpointer(sval,trim(aeroname),spm2_5,istatus) @@ -275,7 +275,7 @@ subroutine intpm2_5_(pm2_5head,rval,sval) if( ladtest_obs ) then grad = val else - grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 + grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 end if endif @@ -307,6 +307,119 @@ subroutine intpm2_5_(pm2_5head,rval,sval) end if + if (laeroana_fv3smoke) then + !pm2_5ptr => pm2_5head + ier=0 + iaero=1 + aeroname=aeronames_smoke_fv3(iaero) !'smoke' + call gsi_bundlegetpointer(sval,trim(aeroname),spm2_5,istatus);ier=istatus+ier + call gsi_bundlegetpointer(rval,trim(aeroname),rpm2_5,istatus);ier=istatus+ier + iaero=2 + aeroname=aeronames_smoke_fv3(iaero) !'dust' + call gsi_bundlegetpointer(sval,trim(aeroname),sdust,istatus);ier=istatus+ier + call gsi_bundlegetpointer(rval,trim(aeroname),rdust,istatus);ier=istatus+ier + + if (istatus /= 0) then + write(6,*) 'error gsi_bundlegetpointer in intpm2_5 for ',aeronames_smoke_fv3(1:2) + call stop2(454) + endif + + pm2_5ptr => pm2_5Node_typecast(pm2_5head) + do while (associated(pm2_5ptr)) + j1=pm2_5ptr%ij(1) + j2=pm2_5ptr%ij(2) + j3=pm2_5ptr%ij(3) + j4=pm2_5ptr%ij(4) + j5=pm2_5ptr%ij(5) + j6=pm2_5ptr%ij(6) + j7=pm2_5ptr%ij(7) + j8=pm2_5ptr%ij(8) + w1=pm2_5ptr%wij(1) + w2=pm2_5ptr%wij(2) + w3=pm2_5ptr%wij(3) + w4=pm2_5ptr%wij(4) + w5=pm2_5ptr%wij(5) + w6=pm2_5ptr%wij(6) + w7=pm2_5ptr%wij(7) + w8=pm2_5ptr%wij(8) + + iaero=1 + val= (w1*spm2_5(j1)+w2*spm2_5(j2)+ & + w3*spm2_5(j3)+w4*spm2_5(j4)+ & + w5*spm2_5(j5)+w6*spm2_5(j6)+ & + w7*spm2_5(j7)+w8*spm2_5(j8))*pm2_5ptr%pm25wc(iaero) + iaero=2 + val= (w1*sdust(j1)+w2*sdust(j2)+ & + w3*sdust(j3)+w4*sdust(j4)+ & + w5*sdust(j5)+w6*sdust(j6)+ & + w7*sdust(j7)+w8*sdust(j8))*pm2_5ptr%pm25wc(iaero)+ val + + if(luse_obsdiag)then + if (lsaveobsens) then + call obsdiagNode_set(pm2_5ptr%diags,jiter=jiter,obssen=val*pm2_5ptr%raterr2*pm2_5ptr%err2) + else + if (pm2_5ptr%luse) call obsdiagNode_set(pm2_5ptr%diags,jiter=jiter,tldepart=val) + endif + endif + + if (l_do_adjoint) then + if (lsaveobsens) then + call obsdiagNode_get(pm2_5ptr%diags,jiter=jiter,obssen=grad) + + else + if( .not. ladtest_obs ) val=val-pm2_5ptr%res + +! gradient of nonlinear operator + + if (nlnqc_iter .and. pm2_5ptr%pg > tiny_r_kind .and. & + pm2_5ptr%b > tiny_r_kind) then + pm2_5_pg=pm2_5ptr%pg*varqc_iter + cg_pm2_5=cg_term/pm2_5ptr%b + wnotgross= one-pm2_5_pg + wgross=pm2_5_pg*cg_pm2_5/wnotgross ! wgross isi gama in the reference by enderson + p0=wgross/(wgross+exp(-half*pm2_5ptr%err2*val**2)) ! p0 is p in the reference by enderson + val=val*(one-p0) ! term is wqc in the referenc by enderson + endif + + if ( ladtest_obs ) then + grad = val + else + grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 + end if + endif + +! adjoint + iaero=1 + rpm2_5(j1)=rpm2_5(j1)+w1*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j2)=rpm2_5(j2)+w2*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j3)=rpm2_5(j3)+w3*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j4)=rpm2_5(j4)+w4*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j5)=rpm2_5(j5)+w5*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j6)=rpm2_5(j6)+w6*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j7)=rpm2_5(j7)+w7*grad*pm2_5ptr%pm25wc(iaero) + rpm2_5(j8)=rpm2_5(j8)+w8*grad*pm2_5ptr%pm25wc(iaero) + iaero=2 + rdust(j1)=rdust(j1)+w1*grad*pm2_5ptr%pm25wc(iaero) + rdust(j2)=rdust(j2)+w2*grad*pm2_5ptr%pm25wc(iaero) + rdust(j3)=rdust(j3)+w3*grad*pm2_5ptr%pm25wc(iaero) + rdust(j4)=rdust(j4)+w4*grad*pm2_5ptr%pm25wc(iaero) + rdust(j5)=rdust(j5)+w5*grad*pm2_5ptr%pm25wc(iaero) + rdust(j6)=rdust(j6)+w6*grad*pm2_5ptr%pm25wc(iaero) + rdust(j7)=rdust(j7)+w7*grad*pm2_5ptr%pm25wc(iaero) + rdust(j8)=rdust(j8)+w8*grad*pm2_5ptr%pm25wc(iaero) + endif ! l_do_adjoint + + pm2_5ptr => pm2_5Node_nextcast(pm2_5ptr) + + end do + + nullify(spm2_5) + nullify(rpm2_5) + nullify(sdust) + nullify(rdust) + + end if ! laeroana_fv3smoke + if (wrf_mass_regional .and. laeroana_gocart) then !pm2_5ptr => pm2_5head @@ -513,15 +626,15 @@ subroutine intpm2_5_(pm2_5head,rval,sval) pm2_5_pg=pm2_5ptr%pg*varqc_iter cg_pm2_5=cg_term/pm2_5ptr%b wnotgross= one-pm2_5_pg - wgross =pm2_5_pg*cg_pm2_5/wnotgross ! wgross is gama in the reference by enderson + wgross=pm2_5_pg*cg_pm2_5/wnotgross ! wgross is gama in the reference by enderson p0=wgross/(wgross+exp(-half*pm2_5ptr%err2*val**2)) ! p0 is p in the reference by enderson - val=val*(one-p0) ! term is wqc in the referenc by enderson + val=val*(one-p0) ! term is wqc in the referenc by enderson endif if( ladtest_obs ) then grad = val else - grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 + grad = val*pm2_5ptr%raterr2*pm2_5ptr%err2 end if endif diff --git a/src/gsi/intrad.f90 b/src/gsi/intrad.f90 index 689b6c821e..19bb400034 100644 --- a/src/gsi/intrad.f90 +++ b/src/gsi/intrad.f90 @@ -83,13 +83,14 @@ subroutine setrad(sval) use gsi_bundlemod, only: gsi_bundlegetpointer use gsi_metguess_mod, only: gsi_metguess_get use mpeu_util, only: getindex + use mpimod, only: mype implicit none ! Declare passed variables type(gsi_bundle), intent(in ) :: sval ! Declare local variables - integer(i_kind) ier,istatus,indx + integer(i_kind) indx logical look real(r_kind),pointer,dimension(:) :: st,sq,scw,soz,su,sv,sqg,sqh,sqi,sql,sqr,sqs @@ -97,91 +98,110 @@ subroutine setrad(sval) if(done_setting) return -! Retrieve pointers; return when not found (except in case of non-essentials) - ier=0; itsen=0; iqv=0; ius=0; ivs=0; isst=0; ioz=0; icw=0 - iqg=0; iqh=0; iqi=0; iql=0; iqr=0; iqs=0 - call gsi_bundlegetpointer(sval,'u', su, istatus);ius=istatus+ius - call gsi_bundlegetpointer(sval,'v', sv, istatus);ivs=istatus+ivs - call gsi_bundlegetpointer(sval,'tsen' ,st, istatus);itsen=istatus+itsen - call gsi_bundlegetpointer(sval,'q', sq, istatus);iqv=istatus+iqv - call gsi_bundlegetpointer(sval,'cw' ,scw,istatus);icw=istatus+icw - call gsi_bundlegetpointer(sval,'oz' ,soz,istatus);ioz=istatus+ioz - call gsi_bundlegetpointer(sval,'sst',sst,istatus);isst=istatus+isst - call gsi_bundlegetpointer(sval,'qg' ,sqg,istatus);iqg=istatus+iqg - call gsi_bundlegetpointer(sval,'qh' ,sqh,istatus);iqh=istatus+iqh - call gsi_bundlegetpointer(sval,'qi' ,sqi,istatus);iqi=istatus+iqi - call gsi_bundlegetpointer(sval,'ql' ,sql,istatus);iql=istatus+iql - call gsi_bundlegetpointer(sval,'qr' ,sqr,istatus);iqr=istatus+iqr - call gsi_bundlegetpointer(sval,'qs' ,sqs,istatus);iqs=istatus+iqs - lgoback=(ius/=0).and.(ivs/=0).and.(itsen/=0).and.(iqv/=0).and.(ioz/=0).and.(icw/=0).and.(isst/=0) - lgoback=lgoback .and.(iqg/=0).and.(iqh/=0).and.(iqi/=0).and.(iql/=0).and.(iqr/=0).and.(iqs/=0) - if(lgoback)return - ! check to see if variable participates in forward operator ! tsen indx=getindex(radjacnames,'tsen') - look=(itsen==0.and.indx>0) itsen=-1 - if(look) itsen=radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'tsen',st, itsen) + look=itsen==0 + if(look) itsen=radjacindxs(indx) + end if ! q indx=getindex(radjacnames,'q') - look=(iqv==0.and.indx>0) iqv=-1 - if(look) iqv=radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'q', sq, iqv) + look=iqv==0 + if(look) iqv=radjacindxs(indx) + end if ! oz indx=getindex(radjacnames,'oz') - look=(ioz ==0.and.indx>0) ioz=-1 - if(look) ioz =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'oz' , soz,ioz) + look=ioz ==0 + if(look) ioz =radjacindxs(indx) + end if ! cw indx=getindex(radjacnames,'cw') - look=(icw ==0.and.indx>0) icw=-1 - if(look) icw =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'cw' , scw,icw) + look=icw ==0 + if(look) icw =radjacindxs(indx) + end if ! sst indx=getindex(radjacnames,'sst') - look=(isst==0.and.indx>0) isst=-1 - if(look) isst=radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'sst', sst,isst) + look=isst==0 + if(look) isst=radjacindxs(indx) + end if ! us & vs indx=getindex(radjacnames,'u') - look=(ius==0.and.indx>0) ius=-1 - if(look) ius=radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'u', su, ius) + look=ius==0 + if(look) ius=radjacindxs(indx) + end if indx=getindex(radjacnames,'v') - look=(ivs==0.and.indx>0) ivs=-1 - if(look) ivs=radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'v', sv, ivs) + look=ivs==0 + if(look) ivs=radjacindxs(indx) + end if ! qg indx=getindex(radjacnames,'qg') - look=(iqg ==0.and.indx>0) iqg=-1 - if(look) iqg =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'qg' , sqg,iqg) + look=iqg ==0 + if(look) iqg =radjacindxs(indx) + end if ! qh indx=getindex(radjacnames,'qh') - look=(iqh ==0.and.indx>0) iqh=-1 - if(look) iqh =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'qh' , sqh,iqh) + look=iqh ==0 + if(look) iqh =radjacindxs(indx) + end if ! qi indx=getindex(radjacnames,'qi') - look=(iqi ==0.and.indx>0) iqi=-1 - if(look) iqi =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'qi' , sqi,iqi) + look=iqi ==0 + if(look) iqi =radjacindxs(indx) + end if ! ql indx=getindex(radjacnames,'ql') - look=(iql ==0.and.indx>0) iql=-1 - if(look) iql =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'ql' , sql,iql) + look=iql ==0 + if(look) iql =radjacindxs(indx) + end if ! qr indx=getindex(radjacnames,'qr') - look=(iqr ==0.and.indx>0) iqr=-1 - if(look) iqr =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'qr' , sqr,iqr) + look=iqr ==0 + if(look) iqr =radjacindxs(indx) + end if ! qs indx=getindex(radjacnames,'qs') - look=(iqs ==0.and.indx>0) iqs=-1 - if(look) iqs =radjacindxs(indx) + if(indx > 0)then + call gsi_bundlegetpointer(sval,'qs' , sqs,iqs) + look=iqs ==0 + if(look) iqs =radjacindxs(indx) + end if luseu=ius>=0 lusev=ivs>=0 @@ -196,6 +216,26 @@ subroutine setrad(sval) luseqr=iqr>=0 luseqs=iqs>=0 lusesst=isst>=0 + lgoback=.not.(luseu .or. lusev .or. luset .or. luseq .or. luseoz .or. lusecw .or. & + luseql .or. luseqi .or. luseqh .or. luseqg .or. luseqr .or. luseqs .or. & + lusesst) + + if(mype == 0)then + write(6,*) ' following variables are used in int and stp radiance calculations ' + if(luset) write(6,*)'tsen' + if(luseq) write(6,*)'q' + if(luseoz)write(6,*)'oz' + if(luseu) write(6,*)'u' + if(lusev) write(6,*)'v' + if(lusesst) write(6,*)'sst' + if(lusecw) write(6,*)'cw' + if(luseql) write(6,*)'ql' + if(luseqi) write(6,*)'qi' + if(luseqh) write(6,*)'qh' + if(luseqg) write(6,*)'qg' + if(luseqr) write(6,*)'qr' + if(luseqs) write(6,*)'qs' + end if done_setting = .true. @@ -308,7 +348,7 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) ! Declare local variables integer(i_kind) i1,i2,i3,i4,n,k,ic,ix,nn,mm,ncr1,ncr2 - integer(i_kind) ier,istatus + integer(i_kind) istatus integer(i_kind),dimension(nsig) :: i1n,i2n,i3n,i4n real(r_kind),allocatable,dimension(:):: val real(r_kind) w1,w2,w3,w4 @@ -331,7 +371,6 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) call timer_ini('intrad') ! Retrieve pointers; return when not found (except in case of non-essentials) - ier=0 if(luseu)then call gsi_bundlegetpointer(sval,'u', su, istatus) call gsi_bundlegetpointer(rval,'u', ru, istatus) @@ -468,7 +507,6 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) end do - ! For all other configurations ! begin channel specific calculations allocate(val(radptr%nchan)) @@ -487,10 +525,8 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) end do end if -!$omp parallel do schedule(dynamic,1) private(nn,ic,ix,k) +!$omp parallel do schedule(dynamic,1) private(nn,k,ncr1) do nn=1,radptr%nchan - ic=radptr%icx(nn) - ix=(ic-1)*npred ! include observation increment and lapse rate contributions to bias correction val(nn)=zero @@ -499,25 +535,24 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) do k=1,nsigradjac val(nn)=val(nn)+tdir(k)*radptr%dtb_dvar(k,nn) end do - end do - ncr1=0 ! Include contributions from remaining bias correction terms - do nn=1,radptr%nchan if( .not. ladtest_obs) then if(radptr%use_corr_obs)then val_quad = zero_quad do mm=1,nn - ncr1=ncr1+1 + ncr1=radptr%iccerr(nn)+mm val_quad=val_quad+radptr%rsqrtinv(ncr1)*biasvect(mm) enddo val(nn)=val(nn) + val_quad else - val(nn)=val(nn)+biasvect(nn) + val(nn)=val(nn) + biasvect(nn) endif end if + end do - if(luse_obsdiag)then + if(luse_obsdiag)then + do nn=1,radptr%nchan if (lsaveobsens) then val(nn)=val(nn)*radptr%err2(nn)*radptr%raterr2(nn) !-- radptr%diags(nn)%ptr%obssen(jiter) = val(nn) @@ -526,13 +561,14 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) !-- if (radptr%luse) radptr%diags(nn)%ptr%tldepart(jiter) = val(nn) if (radptr%luse) call obsdiagNode_set(radptr%diags(nn)%ptr,jiter=jiter,tldepart=val(nn)) endif - endif - end do + end do + end if if (l_do_adjoint) then - do nn=1,radptr%nchan - ic=radptr%icx(nn) - if (.not. lsaveobsens) then + if (.not. lsaveobsens) then +!$omp parallel do schedule(dynamic,1) private(nn,ic,cg_rad,wnotgross,wgross,p0) + do nn=1,radptr%nchan + ic=radptr%icx(nn) if( .not. ladtest_obs) val(nn)=val(nn)-radptr%res(nn) ! Multiply by variance. @@ -546,51 +582,45 @@ subroutine intrad_(radhead,rval,sval,rpred,spred) endif if(.not.ladtest_obs) val(nn) = val(nn)*radptr%err2(nn)*radptr%raterr2(nn) - endif - enddo + enddo + endif ! Extract contributions from bias correction terms -! use compensated summation if( .not. ladtest_obs) then - if (radptr%use_corr_obs) then - ncr1 = 0 - do mm=1,radptr%nchan - ncr1 = ncr1 + mm - ncr2 = ncr1 - biasvect(mm) = zero - do nn=mm,radptr%nchan - biasvect(mm)=biasvect(mm)+radptr%rsqrtinv(ncr2)*val(nn) - ncr2 = ncr2 + nn - enddo - end do - endif + if(radptr%luse)then + if (radptr%use_corr_obs) then +!$omp parallel do schedule(dynamic,1) private(n,nn,ix,ncr1,ncr2,mm) + do nn=1,radptr%nchan + ncr1 = radptr%iccerr(nn)+nn + ncr2 = ncr1 + biasvect(nn) = zero + do mm=nn,radptr%nchan + biasvect(nn)=biasvect(nn)+radptr%rsqrtinv(ncr2)*val(mm) + ncr2 = ncr2 + mm + enddo - if(radptr%luse)then - if(radptr%use_corr_obs)then - do nn=1,radptr%nchan - ix=(radptr%icx(nn)-1)*npred - do n=1,npred - rpred(ix+n)=rpred(ix+n)+biasvect(nn)*radptr%pred(n,nn) - enddo + ix=(radptr%icx(nn)-1)*npred + do n=1,npred + rpred(ix+n)=rpred(ix+n)+biasvect(nn)*radptr%pred(n,nn) enddo - else - do nn=1,radptr%nchan - ix=(radptr%icx(nn)-1)*npred - do n=1,npred - rpred(ix+n)=rpred(ix+n)+radptr%pred(n,nn)*val(nn) - end do - end do - end if - end if + enddo + else +!$omp parallel do schedule(dynamic,1) private(n,nn,ix) + do nn=1,radptr%nchan + ix=(radptr%icx(nn)-1)*npred + do n=1,npred + rpred(ix+n)=rpred(ix+n)+radptr%pred(n,nn)*val(nn) + end do + end do + end if + end if - deallocate(biasvect) + deallocate(biasvect) end if ! not ladtest_obs - endif ! Begin adjoint - if (l_do_adjoint) then !$omp parallel do schedule(dynamic,1) private(k,nn) do k=1,nsigradjac tval(k)=zero diff --git a/src/gsi/intrw.f90 b/src/gsi/intrw.f90 index df3ec162a9..bac4448c0d 100644 --- a/src/gsi/intrw.f90 +++ b/src/gsi/intrw.f90 @@ -96,7 +96,7 @@ subroutine intrw_(rwhead,rval,sval) !$$$ use kinds, only: r_kind,i_kind use constants, only: half,one,tiny_r_kind,cg_term,r3600 - use obsmod, only: lsaveobsens,l_do_adjoint,luse_obsdiag + use obsmod, only: lsaveobsens,l_do_adjoint,luse_obsdiag,if_use_w_vr use qcmod, only: nlnqc_iter,varqc_iter use jfunc, only: jiter use gsi_bundlemod, only: gsi_bundle @@ -128,7 +128,7 @@ subroutine intrw_(rwhead,rval,sval) call gsi_bundlegetpointer(sval,'u',su,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'v',sv,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'w',sw,istatus) - if (istatus==0) then + if (if_use_w_vr.and.istatus==0) then include_w=.true. else include_w=.false. @@ -136,7 +136,7 @@ subroutine intrw_(rwhead,rval,sval) call gsi_bundlegetpointer(rval,'u',ru,istatus);ier=istatus+ier call gsi_bundlegetpointer(rval,'v',rv,istatus);ier=istatus+ier call gsi_bundlegetpointer(rval,'w',rw,istatus) - if (istatus==0) then + if (if_use_w_vr.and.istatus==0) then include_w=.true. else include_w=.false. diff --git a/src/gsi/intsst.f90 b/src/gsi/intsst.f90 index d910247526..6b255d0d02 100644 --- a/src/gsi/intsst.f90 +++ b/src/gsi/intsst.f90 @@ -79,7 +79,7 @@ subroutine intsst(ssthead,rval,sval) ! !$$$ use kinds, only: r_kind,i_kind - use constants, only: half,one,tiny_r_kind,cg_term + use constants, only: zero,half,one,tiny_r_kind,cg_term use obsmod, only: lsaveobsens, l_do_adjoint,luse_obsdiag use qcmod, only: nlnqc_iter,varqc_iter use gsi_nstcouplermod, only: nst_gsi @@ -100,7 +100,6 @@ subroutine intsst(ssthead,rval,sval) ! real(r_kind) penalty real(r_kind) w1,w2,w3,w4 real(r_kind) val - real(r_kind) tval,tdir real(r_kind) cg_sst,p0,grad,wnotgross,wgross,pg_sst real(r_kind),pointer,dimension(:) :: ssst real(r_kind),pointer,dimension(:) :: rsst @@ -108,15 +107,14 @@ subroutine intsst(ssthead,rval,sval) ! If no sst data return if(.not. associated(ssthead))return + if(.not. nst_gsi > 2) return ! Retrieve pointers ! Simply return if any pointer not found - ier=0 - call gsi_bundlegetpointer(sval,'sst',ssst,istatus);ier=istatus+ier + call gsi_bundlegetpointer(sval,'sst',ssst,istatus);ier=istatus call gsi_bundlegetpointer(rval,'sst',rsst,istatus);ier=istatus+ier if(ier/=0)return - !sstptr => ssthead sstptr => sstNode_typecast(ssthead) do while (associated(sstptr)) j1=sstptr%ij(1) @@ -129,15 +127,9 @@ subroutine intsst(ssthead,rval,sval) w4=sstptr%wij(4) ! Forward model - val=w1*ssst(j1)+w2*ssst(j2)& - +w3*ssst(j3)+w4*ssst(j4) - - if ( nst_gsi > 2 ) then - tdir = w1*ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4) ! Forward - val = tdir*sstptr%tz_tr ! Include contributions from Tz jacobian - else - val = w1*ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4) ! Forward - endif + val=w1*ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4) + + val = val*sstptr%tz_tr ! Include contributions from Tz jacobian if(luse_obsdiag)then @@ -173,18 +165,12 @@ subroutine intsst(ssthead,rval,sval) endif ! Adjoint - if ( nst_gsi > 2 ) then - tval = sstptr%tz_tr*grad ! Extract contributions from surface jacobian - rsst(j1)=rsst(j1)+w1*tval ! Distribute adjoint contributions over surrounding grid points - rsst(j2)=rsst(j2)+w2*tval - rsst(j3)=rsst(j3)+w3*tval - rsst(j4)=rsst(j4)+w4*tval - else - rsst(j1)=rsst(j1)+w1*grad - rsst(j2)=rsst(j2)+w2*grad - rsst(j3)=rsst(j3)+w3*grad - rsst(j4)=rsst(j4)+w4*grad - endif + grad = sstptr%tz_tr*grad ! Extract contributions from surface jacobian + + rsst(j1)=rsst(j1)+w1*grad + rsst(j2)=rsst(j2)+w2*grad + rsst(j3)=rsst(j3)+w3*grad + rsst(j4)=rsst(j4)+w4*grad endif ! if (l_do_adjoint) then diff --git a/src/gsi/intt.f90 b/src/gsi/intt.f90 index 9401026e47..b4082712a9 100644 --- a/src/gsi/intt.f90 +++ b/src/gsi/intt.f90 @@ -145,7 +145,7 @@ subroutine intt_(thead,rval,sval,rpred,spred) ! Declare local variables integer(i_kind) j1,j2,j3,j4,j5,j6,j7,j8,ier,istatus,isst,ix,n - real(r_kind) w1,w2,w3,w4,w5,w6,w7,w8,time_t + real(r_kind) w1,w2,w3,w4,w5,w6,w7,w8 ! real(r_kind) penalty real(r_kind) cg_t,val,grad,rat_err2,error2,t_pg,var_jb real(r_kind) psfc_grad,tg_grad @@ -160,14 +160,13 @@ subroutine intt_(thead,rval,sval,rpred,spred) ! Retrieve pointers ! Simply return if any pointer not found - ier=0; isst=0 - call gsi_bundlegetpointer(sval,'tsen', st,istatus);ier=istatus+ier + call gsi_bundlegetpointer(sval,'tsen', st,istatus);ier=istatus call gsi_bundlegetpointer(sval,'tv', stv,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'q', sq,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'u', su,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'v', sv,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'prse', sp,istatus);ier=istatus+ier - call gsi_bundlegetpointer(sval,'sst',ssst,istatus);isst=istatus+isst + call gsi_bundlegetpointer(sval,'sst',ssst,istatus);isst=istatus if(ier/=0) return call gsi_bundlegetpointer(rval,'tsen', rt,istatus);ier=istatus+ier @@ -179,7 +178,6 @@ subroutine intt_(thead,rval,sval,rpred,spred) call gsi_bundlegetpointer(rval,'sst',rsst,istatus);isst=istatus+isst if(ier/=0) return - time_t=zero !tptr => thead tptr => tNode_typecast(thead) do while (associated(tptr)) @@ -205,20 +203,22 @@ subroutine intt_(thead,rval,sval,rpred,spred) !----------use surface model---------------------- + qs_prime0=w1* sq(j1)+w2* sq(j2)+w3* sq(j3)+w4* sq(j4) + us_prime0=w1* su(j1)+w2* su(j2)+w3* su(j3)+w4* su(j4) + vs_prime0=w1* sv(j1)+w2* sv(j2)+w3* sv(j3)+w4* sv(j4) + psfc_prime0=w1* sp(j1)+w2* sp(j2)+w3* sp(j3)+w4* sp(j4) + if(tptr%tv_ob)then ts_prime0=w1*stv(j1)+w2*stv(j2)+w3*stv(j3)+w4*stv(j4) else ts_prime0=w1*st(j1)+w2*st(j2)+w3*st(j3)+w4*st(j4) end if + if (isst==0) then tg_prime0=w1* ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4) else tg_prime0=zero end if - qs_prime0=w1* sq(j1)+w2* sq(j2)+w3* sq(j3)+w4* sq(j4) - us_prime0=w1* su(j1)+w2* su(j2)+w3* su(j3)+w4* su(j4) - vs_prime0=w1* sv(j1)+w2* sv(j2)+w3* sv(j3)+w4* sv(j4) - psfc_prime0=w1* sp(j1)+w2* sp(j2)+w3* sp(j3)+w4* sp(j4) val=psfc_prime0*tptr%tlm_tsfc(1) + tg_prime0*tptr%tlm_tsfc(2) + & ts_prime0 *tptr%tlm_tsfc(3) + qs_prime0*tptr%tlm_tsfc(4) + & @@ -231,8 +231,8 @@ subroutine intt_(thead,rval,sval,rpred,spred) val=w1*stv(j1)+w2*stv(j2)+w3*stv(j3)+w4*stv(j4)& +w5*stv(j5)+w6*stv(j6)+w7*stv(j7)+w8*stv(j8) else - val=w1* st(j1)+w2* st(j2)+w3* st(j3)+w4* st(j4)& - +w5* st(j5)+w6* st(j6)+w7* st(j7)+w8* st(j8) + val=w1*st(j1)+ w2*st(j2)+ w3*st(j3)+ w4*st(j4)& + +w5*st(j5)+ w6*st(j6)+ w7*st(j7)+ w8*st(j8) end if end if @@ -310,21 +310,7 @@ subroutine intt_(thead,rval,sval,rpred,spred) rp(j2)=rp(j2)+w2*psfc_grad rp(j3)=rp(j3)+w3*psfc_grad rp(j4)=rp(j4)+w4*psfc_grad - vs_grad =tptr%tlm_tsfc(6)*grad - rv(j1)=rv(j1)+w1*vs_grad - rv(j2)=rv(j2)+w2*vs_grad - rv(j3)=rv(j3)+w3*vs_grad - rv(j4)=rv(j4)+w4*vs_grad - us_grad =tptr%tlm_tsfc(5)*grad - ru(j1)=ru(j1)+w1*us_grad - ru(j2)=ru(j2)+w2*us_grad - ru(j3)=ru(j3)+w3*us_grad - ru(j4)=ru(j4)+w4*us_grad - qs_grad =tptr%tlm_tsfc(4)*grad - rq(j1)=rq(j1)+w1*qs_grad - rq(j2)=rq(j2)+w2*qs_grad - rq(j3)=rq(j3)+w3*qs_grad - rq(j4)=rq(j4)+w4*qs_grad + if (isst==0) then tg_grad =tptr%tlm_tsfc(2)*grad rsst(j1)=rsst(j1)+w1*tg_grad @@ -333,22 +319,39 @@ subroutine intt_(thead,rval,sval,rpred,spred) rsst(j4)=rsst(j4)+w4*tg_grad end if - ts_grad =tptr%tlm_tsfc(3)*grad if(tptr%tv_ob)then rtv(j1)=rtv(j1)+w1*ts_grad rtv(j2)=rtv(j2)+w2*ts_grad rtv(j3)=rtv(j3)+w3*ts_grad rtv(j4)=rtv(j4)+w4*ts_grad - else rt(j1)=rt(j1)+w1*ts_grad rt(j2)=rt(j2)+w2*ts_grad rt(j3)=rt(j3)+w3*ts_grad rt(j4)=rt(j4)+w4*ts_grad - end if + qs_grad =tptr%tlm_tsfc(4)*grad + rq(j1)=rq(j1)+w1*qs_grad + rq(j2)=rq(j2)+w2*qs_grad + rq(j3)=rq(j3)+w3*qs_grad + rq(j4)=rq(j4)+w4*qs_grad + + us_grad =tptr%tlm_tsfc(5)*grad + ru(j1)=ru(j1)+w1*us_grad + ru(j2)=ru(j2)+w2*us_grad + ru(j3)=ru(j3)+w3*us_grad + ru(j4)=ru(j4)+w4*us_grad + + vs_grad =tptr%tlm_tsfc(6)*grad + rv(j1)=rv(j1)+w1*vs_grad + rv(j2)=rv(j2)+w2*vs_grad + rv(j3)=rv(j3)+w3*vs_grad + rv(j4)=rv(j4)+w4*vs_grad + + + else !------bypass surface model-------------------------- diff --git a/src/gsi/jfunc.f90 b/src/gsi/jfunc.f90 index d65b4c8fd3..616f835218 100644 --- a/src/gsi/jfunc.f90 +++ b/src/gsi/jfunc.f90 @@ -136,10 +136,12 @@ module jfunc public :: pseudo_q2 public :: varq public :: cnvw_option + public :: hofx_2m_sfcfile logical first,last,switch_on_derivatives,tendsflag,print_diag_pcg,tsensible,diag_precon logical clip_supersaturation,R_option logical pseudo_q2,limitqobs + logical hofx_2m_sfcfile logical cnvw_option integer(i_kind) iout_iter,miter,iguess,nclen,qoption,cwoption integer(i_kind) jiter,jiterstart,jiterend,iter @@ -249,6 +251,9 @@ subroutine init_jfunc ! option for including convective clouds in the all-sky assimilation cnvw_option=.false. +! option to calculate hofx for T2m and q2m by interpolating from 2m vars in sfc file + hofx_2m_sfcfile=.false. + return end subroutine init_jfunc @@ -738,6 +743,7 @@ subroutine set_pointer use gsi_4dvar, only: nsubwin, lsqrtb use bias_predictors, only: setup_predictors use hybrid_ensemble_parameters, only: l_hyb_ens,n_ens,generate_ens,grd_ens,nval_lenz_en + use hybrid_ensemble_parameters, only: naensgrp implicit none integer(i_kind) n_ensz,nval_lenz_tot,nval_lenz_enz @@ -748,8 +754,8 @@ subroutine set_pointer nval_levs=max(0,nc3d)*nsig+max(0,nc2d) nval_len=nval_levs*latlon11 if(l_hyb_ens) then - nval_len=nval_len+n_ens*nsig*grd_ens%latlon11 - nval_levs_ens=nval_levs+n_ens*nsig + nval_len=nval_len+naensgrp*n_ens*nsig*grd_ens%latlon11 + nval_levs_ens=nval_levs+naensgrp*n_ens*nsig end if nsclen=npred*jpch_rad npclen=npredp*npcptype diff --git a/src/gsi/jgrad.f90 b/src/gsi/jgrad.f90 index 2e32556465..c6e2e5415c 100755 --- a/src/gsi/jgrad.f90 +++ b/src/gsi/jgrad.f90 @@ -58,6 +58,7 @@ subroutine jgrad(xhat,yhat,fjcost,gradx,lupdfgs,nprt,calledby) use hybrid_ensemble_parameters,only : l_hyb_ens,ntlevs_ens use mpl_allreducemod, only: mpl_allreduce use obs_sensitivity, only: efsoi_o2_update +use control2state_mod, only: control2state,control2state_ad implicit none diff --git a/src/gsi/lightinfo.f90 b/src/gsi/lightinfo.f90 index b0ebcdacfd..bdd6aee392 100755 --- a/src/gsi/lightinfo.f90 +++ b/src/gsi/lightinfo.f90 @@ -205,11 +205,13 @@ subroutine lightinfo_read else ! File does not exist, write warning message to alert users - if (mype==mype_light) then - open(iout_light) - write(iout_light,*)'LIGHTINFO_READ: ***WARNING*** FILE ',trim(fname),'does not exist' - close(iout_light) - endif +! For many usages light data is not important. Write line to output. +! if (mype==mype_light) then +! open(iout_light) +! write(iout_light,*)'LIGHTINFO_READ: ***WARNING*** FILE ',trim(fname),'does not exist' + if(mype==mype_light)write(6,*)'LIGHTINFO_READ: FILE ',trim(fname),'does not exist' +! close(iout_light) +! endif end if return diff --git a/src/gsi/m_pm2_5Node.F90 b/src/gsi/m_pm2_5Node.F90 index 4531ec4433..715d7aacdd 100644 --- a/src/gsi/m_pm2_5Node.F90 +++ b/src/gsi/m_pm2_5Node.F90 @@ -51,7 +51,7 @@ module m_pm2_5Node real(r_kind) :: pg ! variational quality control parameter real(r_kind) :: wij(8) ! horizontal interpolation weights integer(i_kind) :: ij(8) ! horizontal locations - real(r_kind) :: pm25wc(3) ! weight coes at i,j,k modes + real(r_kind) :: pm25wc(3) ! weights !logical :: luse ! flag indicating if ob is used in pen. !integer(i_kind) :: idv,iob ! device id and obs index for sorting !real (r_kind) :: elat, elon ! earth lat-lon for redistribution diff --git a/src/gsi/m_radNode.F90 b/src/gsi/m_radNode.F90 index 33070e8382..ae4854920a 100644 --- a/src/gsi/m_radNode.F90 +++ b/src/gsi/m_radNode.F90 @@ -57,6 +57,7 @@ module m_radNode ! square root of inverse of R, only used ! if using correlated obs + integer(i_kind),dimension(:),pointer :: iccerr => NULL() integer(i_kind),dimension(:),pointer :: icx => NULL() integer(i_kind),dimension(:),pointer :: ich => NULL() integer(i_kind) :: nchan ! number of channels for this profile @@ -214,6 +215,7 @@ subroutine obsNode_clean_(aNode) if(associated(aNode%Rpred )) deallocate(aNode%Rpred ) if(associated(aNode%rsqrtinv)) deallocate(aNode%rsqrtinv) if(associated(aNode%icx )) deallocate(aNode%icx ) + if(associated(aNode%iccerr )) deallocate(aNode%iccerr ) _EXIT_(myname_) return end subroutine obsNode_clean_ @@ -276,6 +278,7 @@ subroutine obsNode_xread_(aNode,iunit,istat,diagLookup,skip) if(associated(aNode%Rpred )) deallocate(aNode%Rpred) if(associated(aNode%rsqrtinv)) deallocate(aNode%rsqrtinv) if(associated(aNode%icx )) deallocate(aNode%icx ) + if(associated(aNode%iccerr )) deallocate(aNode%iccerr ) nchan=aNode%nchan allocate( aNode%diags(nchan), & @@ -285,7 +288,7 @@ subroutine obsNode_xread_(aNode,iunit,istat,diagLookup,skip) aNode%pred (npred,nchan), & aNode%dtb_dvar(nsigradjac,nchan), & aNode%ich (nchan), & - aNode%icx (nchan) ) + aNode%icx (nchan), aNode%iccerr(nchan) ) read(iunit,iostat=istat) aNode%ich , & aNode%res , & @@ -293,6 +296,7 @@ subroutine obsNode_xread_(aNode,iunit,istat,diagLookup,skip) aNode%raterr2 , & aNode%pred , & aNode%icx , & + aNode%iccerr , & aNode%dtb_dvar, & aNode%wij , & aNode%ij @@ -368,6 +372,7 @@ subroutine obsNode_xwrite_(aNode,junit,jstat) aNode%raterr2 , & aNode%pred , & aNode%icx , & + aNode%iccerr , & aNode%dtb_dvar, & aNode%wij , & aNode%ij diff --git a/src/gsi/m_rerank.f90 b/src/gsi/m_rerank.f90 index fd905c570f..3748a2ef0d 100644 --- a/src/gsi/m_rerank.f90 +++ b/src/gsi/m_rerank.f90 @@ -3,6 +3,7 @@ module m_rerank ! 01Aug2011 - Lueken - changed F90 to f90 (no machine logic ! 28Apr2011 - Todling - overload to handle single precision use kinds, only : r_double,r_single,i_kind + use iso_c_binding implicit none private public :: rerank @@ -31,17 +32,7 @@ function rerank_2in1r4_(i2) result(i1) real(r_single),dimension(:,:),target,intent(in):: i2 real(r_single),pointer,dimension(:):: i1 - interface - function rerank_hack_2in1r4_(ln,i2) result(i1) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_single),dimension(:,:),target,intent(in):: i2 - real(r_single),pointer,dimension(:):: i1 - end function rerank_hack_2in1r4_ - end interface - - i1 => rerank_hack_2in1r4_(size(i2),i2) + call c_f_pointer(c_loc(i2), i1, [size(i2)]) end function rerank_2in1r4_ function rerank_2in1r8_(i2) result(i1) @@ -49,17 +40,7 @@ function rerank_2in1r8_(i2) result(i1) real(r_double),dimension(:,:),target,intent(in):: i2 real(r_double),pointer,dimension(:):: i1 - interface - function rerank_hack_2in1r8_(ln,i2) result(i1) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_double),dimension(:,:),target,intent(in):: i2 - real(r_double),pointer,dimension(:):: i1 - end function rerank_hack_2in1r8_ - end interface - - i1 => rerank_hack_2in1r8_(size(i2),i2) + call c_f_pointer(c_loc(i2), i1, [size(i2)]) end function rerank_2in1r8_ function rerank_3in1r4_(i3) result(i1) @@ -67,17 +48,7 @@ function rerank_3in1r4_(i3) result(i1) real(r_single),dimension(:,:,:),target,intent(in):: i3 real(r_single),pointer,dimension(:):: i1 - interface - function rerank_hack_2in1r4_(ln,i3) result(i1) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_single),dimension(:,:,:),target,intent(in):: i3 - real(r_single),pointer,dimension(:):: i1 - end function rerank_hack_2in1r4_ - end interface - - i1 => rerank_hack_2in1r4_(size(i3),i3) + call c_f_pointer(c_loc(i3), i1, [size(i3)]) end function rerank_3in1r4_ function rerank_3in1r8_(i3) result(i1) @@ -85,17 +56,7 @@ function rerank_3in1r8_(i3) result(i1) real(r_double),dimension(:,:,:),target,intent(in):: i3 real(r_double),pointer,dimension(:):: i1 - interface - function rerank_hack_2in1r8_(ln,i3) result(i1) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_double),dimension(:,:,:),target,intent(in):: i3 - real(r_double),pointer,dimension(:):: i1 - end function rerank_hack_2in1r8_ - end interface - - i1 => rerank_hack_2in1r8_(size(i3),i3) + call c_f_pointer(c_loc(i3), i1, [size(i3)]) end function rerank_3in1r8_ !---- function rerank_4in1r4_(i4) result(i1) @@ -103,17 +64,7 @@ function rerank_4in1r4_(i4) result(i1) real(r_single),dimension(:,:,:,:),target,intent(in):: i4 real(r_single),pointer,dimension(:):: i1 - interface - function rerank_hack_2in1r4_(ln,i4) result(i1) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_single),dimension(:,:,:,:),target,intent(in):: i4 - real(r_single),pointer,dimension(:):: i1 - end function rerank_hack_2in1r4_ - end interface - - i1 => rerank_hack_2in1r4_(size(i4),i4) + call c_f_pointer(c_loc(i4), i1, [size(i4)]) end function rerank_4in1r4_ function rerank_4in1r8_(i4) result(i1) @@ -121,17 +72,7 @@ function rerank_4in1r8_(i4) result(i1) real(r_double),dimension(:,:,:,:),target,intent(in):: i4 real(r_double),pointer,dimension(:):: i1 - interface - function rerank_hack_2in1r8_(ln,i4) result(i1) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_double),dimension(:,:,:,:),target,intent(in):: i4 - real(r_double),pointer,dimension(:):: i1 - end function rerank_hack_2in1r8_ - end interface - - i1 => rerank_hack_2in1r8_(size(i4),i4) + call c_f_pointer(c_loc(i4), i1, [size(i4)]) end function rerank_4in1r8_ !---- function rerank_1in2r4_(i1,mold,shape) result(i2) @@ -141,19 +82,9 @@ function rerank_1in2r4_(i1,mold,shape) result(i2) integer(i_kind),dimension(:),intent(in):: shape real(r_single),pointer,dimension(:,:):: i2 - interface - function rerank_hack_1in2r4_(l1,l2,i1) result(i2) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2 - real(r_single),dimension(l1,l2),target,intent(in):: i1 - real(r_single),pointer,dimension(:,:):: i2 - end function rerank_hack_1in2r4_ - end interface - character(len=*),parameter:: myname_='rerank_1in2_single_' call assert_eq_(size(shape),2,myname_,'size(shape)==2') - i2 => rerank_hack_1in2r4_(shape(1),shape(2),i1) + call c_f_pointer(c_loc(i1), i2, [shape(1), shape(2)]) end function rerank_1in2r4_ function rerank_1in2r8_(i1,mold,shape) result(i2) @@ -163,19 +94,9 @@ function rerank_1in2r8_(i1,mold,shape) result(i2) integer(i_kind),dimension(:),intent(in):: shape real(r_double),pointer,dimension(:,:):: i2 - interface - function rerank_hack_1in2r8_(l1,l2,i1) result(i2) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2 - real(r_double),dimension(l1,l2),target,intent(in):: i1 - real(r_double),pointer,dimension(:,:):: i2 - end function rerank_hack_1in2r8_ - end interface - character(len=*),parameter:: myname_='rerank_1in2_double_' call assert_eq_(size(shape),2,myname_,'size(shape)==2') - i2 => rerank_hack_1in2r8_(shape(1),shape(2),i1) + call c_f_pointer(c_loc(i1), i2, [shape(1), shape(2)]) end function rerank_1in2r8_ function rerank_1in3r4_(i1,mold,shape) result(i3) @@ -185,19 +106,9 @@ function rerank_1in3r4_(i1,mold,shape) result(i3) integer(i_kind),dimension(:),intent(in):: shape real(r_single),pointer,dimension(:,:,:):: i3 - interface - function rerank_hack_1in3r4_(l1,l2,l3,i1) result(i3) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3 - real(r_single),dimension(l1,l2,l3),target,intent(in):: i1 - real(r_single),pointer,dimension(:,:,:):: i3 - end function rerank_hack_1in3r4_ - end interface - character(len=*),parameter:: myname_='rerank_1in3_single_' call assert_eq_(size(shape),3,myname_,'size(shape)==3') - i3 => rerank_hack_1in3r4_(shape(1),shape(2),shape(3),i1) + call c_f_pointer(c_loc(i1), i3, [shape(1), shape(2), shape(3)]) end function rerank_1in3r4_ function rerank_1in3r8_(i1,mold,shape) result(i3) @@ -207,19 +118,9 @@ function rerank_1in3r8_(i1,mold,shape) result(i3) integer(i_kind),dimension(:),intent(in):: shape real(r_double),pointer,dimension(:,:,:):: i3 - interface - function rerank_hack_1in3r8_(l1,l2,l3,i1) result(i3) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3 - real(r_double),dimension(l1,l2,l3),target,intent(in):: i1 - real(r_double),pointer,dimension(:,:,:):: i3 - end function rerank_hack_1in3r8_ - end interface - character(len=*),parameter:: myname_='rerank_1in3_double_' call assert_eq_(size(shape),3,myname_,'size(shape)==3') - i3 => rerank_hack_1in3r8_(shape(1),shape(2),shape(3),i1) + call c_f_pointer(c_loc(i1), i3, [shape(1), shape(2), shape(3)]) end function rerank_1in3r8_ !>>> function rerank_1in4r4_(i1,mold,shape) result(i4) @@ -229,19 +130,9 @@ function rerank_1in4r4_(i1,mold,shape) result(i4) integer(i_kind),dimension(:),intent(in):: shape real(r_single),pointer,dimension(:,:,:,:):: i4 - interface - function rerank_hack_1in4r4_(l1,l2,l3,l4,i1) result(i4) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3,l4 - real(r_single),dimension(l1,l2,l3,l4),target,intent(in):: i1 - real(r_single),pointer,dimension(:,:,:,:):: i4 - end function rerank_hack_1in4r4_ - end interface - character(len=*),parameter:: myname_='rerank_1in4_single_' call assert_eq_(size(shape),4,myname_,'size(shape)==4') - i4 => rerank_hack_1in4r4_(shape(1),shape(2),shape(3),shape(4),i1) + call c_f_pointer(c_loc(i1), i4, [shape(1), shape(2), shape(3), shape(4)]) end function rerank_1in4r4_ function rerank_1in4r8_(i1,mold,shape) result(i4) @@ -251,19 +142,9 @@ function rerank_1in4r8_(i1,mold,shape) result(i4) integer(i_kind),dimension(:),intent(in):: shape real(r_double),pointer,dimension(:,:,:,:):: i4 - interface - function rerank_hack_1in4r8_(l1,l2,l3,l4,i1) result(i4) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3,l4 - real(r_double),dimension(l1,l2,l3,l4),target,intent(in):: i1 - real(r_double),pointer,dimension(:,:,:,:):: i4 - end function rerank_hack_1in4r8_ - end interface - character(len=*),parameter:: myname_='rerank_1in4_double_' call assert_eq_(size(shape),4,myname_,'size(shape)==4') - i4 => rerank_hack_1in4r8_(shape(1),shape(2),shape(3),shape(4),i1) + call c_f_pointer(c_loc(i1), i4, [shape(1), shape(2), shape(3), shape(4)]) end function rerank_1in4r8_ !>>> subroutine assert_eq_(lsize,lrank,who,what) @@ -279,76 +160,3 @@ subroutine assert_eq_(lsize,lrank,who,what) end subroutine assert_eq_ end module m_rerank - -! These must live outside module to trick compiler -function rerank_hack_2in1r8_(ln,i2) result(i1) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_double),dimension(ln),target,intent(in):: i2 - real(r_double),pointer,dimension(:):: i1 - i1 => i2 -end function rerank_hack_2in1r8_ - -function rerank_hack_2in1r4_(ln,i2) result(i1) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: ln - real(r_single),dimension(ln),target,intent(in):: i2 - real(r_single),pointer,dimension(:):: i1 - i1 => i2 -end function rerank_hack_2in1r4_ - -function rerank_hack_1in2r8_(l1,l2,i1) result(i2) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2 - real(r_double),dimension(l1,l2),target,intent(in):: i1 - real(r_double),pointer,dimension(:,:):: i2 - i2 => i1 -end function rerank_hack_1in2r8_ - -function rerank_hack_1in2r4_(l1,l2,i1) result(i2) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2 - real(r_single),dimension(l1,l2),target,intent(in):: i1 - real(r_single),pointer,dimension(:,:):: i2 - i2 => i1 -end function rerank_hack_1in2r4_ - -function rerank_hack_1in3r8_(l1,l2,l3,i1) result(i3) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3 - real(r_double),dimension(l1,l2,l3),target,intent(in):: i1 - real(r_double),pointer,dimension(:,:,:):: i3 - i3 => i1 -end function rerank_hack_1in3r8_ - -function rerank_hack_1in3r4_(l1,l2,l3,i1) result(i3) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3 - real(r_single),dimension(l1,l2,l3),target,intent(in):: i1 - real(r_single),pointer,dimension(:,:,:):: i3 - i3 => i1 -end function rerank_hack_1in3r4_ - -function rerank_hack_1in4r8_(l1,l2,l3,l4,i1) result(i4) - use kinds, only: r_double,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3,l4 - real(r_double),dimension(l1,l2,l3,l4),target,intent(in):: i1 - real(r_double),pointer,dimension(:,:,:,:):: i4 - i4 => i1 -end function rerank_hack_1in4r8_ - -function rerank_hack_1in4r4_(l1,l2,l3,l4,i1) result(i4) - use kinds, only: r_single,i_kind - implicit none - integer(i_kind),intent(in) :: l1,l2,l3,l4 - real(r_single),dimension(l1,l2,l3,l4),target,intent(in):: i1 - real(r_single),pointer,dimension(:,:,:,:):: i4 - i4 => i1 -end function rerank_hack_1in4r4_ diff --git a/src/gsi/ncepgfs_io.f90 b/src/gsi/ncepgfs_io.f90 index 52dcc4e1b5..59be6d3925 100644 --- a/src/gsi/ncepgfs_io.f90 +++ b/src/gsi/ncepgfs_io.f90 @@ -1440,7 +1440,7 @@ subroutine write_gfs(increment,mype_atm,mype_sfc) if ( use_gfs_nemsio ) then if ( write_fv3_incr ) then - call write_fv3_increment(grd_a,sp_a,filename,mype_atm, & + call write_fv3_increment(grd_a,filename,mype_atm, & atm_bundle,itoutsig) else if (fv3_full_hydro) then @@ -1461,7 +1461,7 @@ subroutine write_gfs(increment,mype_atm,mype_sfc) else if ( use_gfs_ncio ) then if ( write_fv3_incr ) then - call write_fv3_increment(grd_a,sp_a,filename,mype_atm, & + call write_fv3_increment(grd_a,filename,mype_atm, & atm_bundle,itoutsig) else call write_gfsncatm(grd_a,sp_a,filename,mype_atm, & diff --git a/src/gsi/netcdfgfs_io.f90 b/src/gsi/netcdfgfs_io.f90 index 41eb05c228..41e8f33e03 100644 --- a/src/gsi/netcdfgfs_io.f90 +++ b/src/gsi/netcdfgfs_io.f90 @@ -105,6 +105,7 @@ subroutine read_ ! ! program history log: ! 2019-09-24 Martin - create routine based on read_nems +! 2022-03-23 Draper - add option to include T2m and q2m in MetGuess ! ! input argument list: ! @@ -129,6 +130,7 @@ subroutine read_ use general_sub2grid_mod, only: sub2grid_info,general_sub2grid_create_info,general_sub2grid_destroy_info use mpimod, only: npe,mype use cloud_efr_mod, only: cloud_calc_gfs,set_cloud_lower_bound + use jfunc, only: hofx_2m_sfcfile use gridmod, only: fv3_full_hydro implicit none @@ -141,6 +143,8 @@ subroutine read_ real(r_kind),pointer,dimension(:,: ):: ges_ps_it =>NULL() real(r_kind),pointer,dimension(:,: ):: ges_z_it =>NULL() + real(r_kind),pointer,dimension(:,: ):: ges_t2m_it =>NULL() + real(r_kind),pointer,dimension(:,: ):: ges_q2m_it =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_u_it =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_v_it =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_div_it =>NULL() @@ -164,8 +168,10 @@ subroutine read_ type(gsi_grid) :: atm_grid integer(i_kind),parameter :: n2d=2 ! integer(i_kind),parameter :: n3d=8 + integer(i_kind),parameter :: n2d_2m=4 integer(i_kind),parameter :: n3d=14 character(len=4), parameter :: vars2d(n2d) = (/ 'z ', 'ps ' /) + character(len=4), parameter :: vars2d_with2m(n2d_2m) = (/ 'z ', 'ps ','t2m ','q2m ' /) ! character(len=4), parameter :: vars3d(n3d) = (/ 'u ', 'v ', & ! 'vor ', 'div ', & ! 'tv ', 'q ', & @@ -189,8 +195,11 @@ subroutine read_ ! Allocate bundle used for reading members call gsi_gridcreate(atm_grid,lat2,lon2,nsig) - - call gsi_bundlecreate(atm_bundle,atm_grid,'aux-atm-read',istatus,names2d=vars2d,names3d=vars3d) + if (hofx_2m_sfcfile) then + call gsi_bundlecreate(atm_bundle,atm_grid,'aux-atm-read',istatus,names2d=vars2d_with2m,names3d=vars3d) + else + call gsi_bundlecreate(atm_bundle,atm_grid,'aux-atm-read',istatus,names2d=vars2d,names3d=vars3d) + endif if(istatus/=0) then write(6,*) myname_,': trouble creating atm_bundle' call stop2(999) @@ -198,9 +207,15 @@ subroutine read_ do it=1,nfldsig - write(filename,'(''sigf'',i2.2)') ifilesig(it) - ! Read background fields into bundle + if (hofx_2m_sfcfile) then + if (mype==0) write(*,*) 'calling general_read_gfsatm_nc for 2m data', it + write(filename,'(''sfcf'',i2.2)') ifilesig(it) + call general_read_gfsatm_nc(grd_t,sp_a,filename,.true.,.true.,.true.,& + atm_bundle,.true.,istatus) + if (mype==0) write(*,*) 'done with general_read_gfsatm_nc for 2m data', it + end if + write(filename,'(''sigf'',i2.2)') ifilesig(it) if (fv3_full_hydro) then if (mype==0) write(*,*) 'calling general_read_gfsatm_allhydro_nc', it call general_read_gfsatm_allhydro_nc(grd_t,sp_a,filename,.true.,.true.,.true.,& @@ -273,6 +288,16 @@ subroutine set_guess_ call gsi_bundlegetpointer (gsi_metguess_bundle(it),'z' ,ges_z_it ,istatus) if(istatus==0) ges_z_it = ptr2d endif + call gsi_bundlegetpointer (atm_bundle,'t2m',ptr2d,istatus) + if (istatus==0) then + call gsi_bundlegetpointer (gsi_metguess_bundle(it),'t2m' ,ges_t2m_it ,istatus) + if(istatus==0) ges_t2m_it = ptr2d + endif + call gsi_bundlegetpointer (atm_bundle,'q2m',ptr2d,istatus) + if (istatus==0) then + call gsi_bundlegetpointer (gsi_metguess_bundle(it),'q2m' ,ges_q2m_it ,istatus) + if(istatus==0) ges_q2m_it = ptr2d + endif call gsi_bundlegetpointer (atm_bundle,'u',ptr3d,istatus) if (istatus==0) then call gsi_bundlegetpointer (gsi_metguess_bundle(it),'u' ,ges_u_it ,istatus) @@ -1300,7 +1325,7 @@ subroutine read_sfc_anl_(isli_anl) ! open the netCDF file sfcges = open_dataset(filename,errcode=iret) if (iret/=0) then - write(6,*) trim(my_name),': ***ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' + write(6,*) trim(my_name),': ***FATAL ERROR*** ',trim(filename),' NOT AVAILABLE: PROGRAM STOPS' call stop2(999) endif @@ -2480,6 +2505,7 @@ subroutine write_sfc_ (filename,mype_sfc,dsfct) jdate(5) = 0 ! analysis minute jdate(6) = 0 ! analysis scaled seconds + allocate(fhour(1)) fhour = zero odate(1) = jdate(4) !hour odate(2) = jdate(2) !month @@ -2750,6 +2776,7 @@ subroutine write_sfc_nst_ (mype_so,dsfct) jdate(5) = 0 ! analysis minute jdate(6) = 0 ! analysis scaled seconds + allocate(fhour(1)) fhour = zero odate(1) = jdate(4) !hour odate(2) = jdate(2) !month diff --git a/src/gsi/obs_sensitivity.f90 b/src/gsi/obs_sensitivity.f90 index 880ee6384a..b6498d09fc 100644 --- a/src/gsi/obs_sensitivity.f90 +++ b/src/gsi/obs_sensitivity.f90 @@ -61,6 +61,7 @@ module obs_sensitivity use hybrid_ensemble_isotropic, only: create_ensemble,load_ensemble,destroy_ensemble use hybrid_ensemble_isotropic, only: hybens_localization_setup use mpeu_util, only: perr,die +use control2state_mod, only: control2state,control2state_ad ! ------------------------------------------------------------------------------ implicit none save diff --git a/src/gsi/obsmod.F90 b/src/gsi/obsmod.F90 index 1fb03d0940..3066cdb5ca 100644 --- a/src/gsi/obsmod.F90 +++ b/src/gsi/obsmod.F90 @@ -435,8 +435,8 @@ module obsmod public :: iout_pcp,iout_rad,iadate,iadatemn,write_diag,reduce_diag,oberrflg,bflag,ndat,dthin,dmesh,l_do_adjoint public :: diag_radardbz public :: lsaveobsens - public :: iout_cldch, mype_cldch - public :: nprof_gps,time_offset,ianldate,tcp_box + public :: iout_cldch, mype_cldch + public :: nprof_gps,time_offset,ianldate,tcp_box public :: iout_oz,iout_co,dsis,ref_obs,obsfile_all,lobserver,tcp_posmatch,perturb_obs,ditype,dsfcalc,dplat public :: time_window,dval,dtype,dfile,dirname,obs_setup,oberror_tune,offtime_data public :: lobsdiagsave,lobsdiag_forenkf,blacklst,hilbert_curve,lobskeep,time_window_max,sfcmodel,ext_sonde @@ -470,7 +470,7 @@ module obsmod ! ==== DBZ DA === public :: ntilt_radarfiles public :: whichradar - public :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw, l2rwthin + public :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw, if_use_w_vr, l2rwthin public :: doradaroneob,oneoblat,oneoblon public :: oneobddiff,oneobvalue,oneobheight,oneobradid @@ -617,7 +617,7 @@ module obsmod logical :: ta2tb logical :: doradaroneob - logical :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw, l2rwthin + logical :: vr_dealisingopt, if_vterminal, if_model_dbz, inflate_obserr, if_vrobs_raw, if_use_w_vr, l2rwthin character(4) :: whichradar,oneobradid real(r_kind) :: oneoblat,oneoblon,oneobddiff,oneobvalue,oneobheight logical :: radar_no_thinning @@ -747,7 +747,8 @@ subroutine init_obsmod_dflts if_vterminal=.false. l2rwthin =.false. if_vrobs_raw=.false. - if_model_dbz=.true. + if_use_w_vr=.true. + if_model_dbz=.false. inflate_obserr=.false. whichradar="KKKK" @@ -831,7 +832,7 @@ subroutine init_obsmod_dflts iout_tcp=214 ! synthetic tc-mslp iout_lag=215 ! lagrangian tracers iout_co=216 ! co tracers - iout_aero=217 ! aerosol product (aod) + iout_aero=217 ! aerosol product (aod) CURRENTLY NOT USED iout_gust=218 ! wind gust iout_vis=219 ! visibility iout_pblh=221 ! pbl height diff --git a/src/gsi/pcgsoi.f90 b/src/gsi/pcgsoi.f90 index a4ae2431b1..fac01c9315 100644 --- a/src/gsi/pcgsoi.f90 +++ b/src/gsi/pcgsoi.f90 @@ -130,8 +130,8 @@ subroutine pcgsoi() iguess,read_guess_solution, & niter_no_qc,print_diag_pcg use gsi_4dvar, only: nobs_bins, nsubwin, l4dvar, iwrtinc, ladtest, & - iorthomax - use gridmod, only: twodvar_regional,periodic + iorthomax,lsqrtb + use gridmod, only: twodvar_regional,periodic,minmype use constants, only: zero,one,tiny_r_kind use mpimod, only: mype use mpl_allreducemod, only: mpl_allreduce @@ -148,15 +148,17 @@ subroutine pcgsoi() use bias_predictors, only: update_bias_preds use xhat_vordivmod, only : xhat_vordiv_init, xhat_vordiv_calc, xhat_vordiv_clean use timermod, only: timer_ini,timer_fnl - use hybrid_ensemble_parameters,only : l_hyb_ens,ntlevs_ens + use hybrid_ensemble_parameters,only : l_hyb_ens,ntlevs_ens,aniso_a_en use gsi_bundlemod, only : gsi_bundle use gsi_bundlemod, only : self_add,assignment(=) use gsi_bundlemod, only : gsi_bundleprint + use gsi_bundlemod, only : gsi_bundlegetpointer use gsi_4dcouplermod, only : gsi_4dcoupler_grtests use rapidrefresh_cldsurf_mod, only: i_gsdcldanal_type use gsi_io, only: verbose use berror, only: vprecond use stpjomod, only: stpjo_setup + use intradmod, only: setrad implicit none @@ -187,7 +189,7 @@ subroutine pcgsoi() type(control_vector), allocatable, dimension(:) :: cglwork type(control_vector), allocatable, dimension(:) :: cglworkhat integer(i_kind) :: iortho - logical :: print_verbose + logical :: print_verbose,ortho,diag_print logical :: lanlerr,read_success ! Step size diagnostic strings @@ -235,7 +237,9 @@ subroutine pcgsoi() nlnqc_iter=.false. call stpjo_setup(nobs_bins) + ortho=.false. if(iorthomax>0) then + ortho=.true. allocate(cglwork(iorthomax+1)) DO ii=1,iorthomax+1 CALL allocate_cv(cglwork(ii)) @@ -252,10 +256,19 @@ subroutine pcgsoi() end do sbias=zero + call setrad(sval(1)) + if(l_hyb_ens .and. .not. aniso_a_en) then + if (lsqrtb) then + write(6,*)'l_hyb_ens: not for use with lsqrtb' + call stop2(317) + end if + end if ! Perform inner iteration inner_iteration: do iter=0,niter(jiter) + + diag_print= iter <= 1 .and. print_diag_pcg -! Gradually turn on variational qc to avoid possible convergence problems +! Gradually turn on old variational qc to avoid possible convergence problems if(vqc) then nlnqc_iter = iter >= niter_no_qc(jiter) if(jiter == jiterstart) then @@ -266,17 +279,11 @@ subroutine pcgsoi() endif end if ! 1. Calculate gradient - do ii=1,nobs_bins - rval(ii)=zero - end do - rbias=zero gradx=zero - llprt=(mype==0).and.(iter<=1) -! Control to state -! call c2s(xhat,sval,sbias,llprt,.true.) + llprt=(mype==minmype).and.(iter<=1) - if (iter<=1 .and. print_diag_pcg) then + if (diag_print) then do ii=1,nobs_bins call prt_state_norms(sval(ii),'sval') enddo @@ -285,7 +292,7 @@ subroutine pcgsoi() ! Compare obs to solution and transpose back to grid call intall(sval,sbias,rval,rbias) - if (iter<=1 .and. print_diag_pcg) then + if (diag_print) then do ii=1,nobs_bins call prt_state_norms(rval(ii),'rval') enddo @@ -295,10 +302,12 @@ subroutine pcgsoi() call c2s_ad(gradx,rval,rbias,llprt) ! Print initial Jo table - if (iter==0 .and. print_diag_pcg .and. luse_obsdiag) then - nprt=2 - call evaljo(zjo,iobs,nprt,llouter) - call prt_control_norms(gradx,'gradx') + if (iter==0) then + if(print_diag_pcg .and. luse_obsdiag) then + nprt=2 + call evaljo(zjo,iobs,nprt,llouter) + call prt_control_norms(gradx,'gradx') + end if endif ! Add contribution from background term @@ -308,7 +317,7 @@ subroutine pcgsoi() ! End of gradient calculation ! Re-orthonormalization if requested - if(iorthomax>0) then + if(ortho) then iortho=min(iorthomax,iter) if(iter .ne. 0) then do ii=iortho,1,-1 @@ -323,13 +332,13 @@ subroutine pcgsoi() ! 2. Multiply by background error call multb(gradx,grady) - if(iorthomax>0) then + if(ortho) then ! save gradients if (iter <= iortho) then - zdla = sqrt(dot_product(gradx,grady,r_quad)) + zdla = one/sqrt(dot_product(gradx,grady,r_quad)) do i=1,nclen - cglwork(iter+1)%values(i)=gradx%values(i)/zdla - cglworkhat(iter+1)%values(i)=grady%values(i)/zdla + cglwork(iter+1)%values(i)=gradx%values(i)*zdla + cglworkhat(iter+1)%values(i)=grady%values(i)*zdla end do end if end if @@ -350,7 +359,7 @@ subroutine pcgsoi() ! 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 + if(mype == minmype)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) @@ -370,7 +379,7 @@ subroutine pcgsoi() gnorm(1)=dprod(1) - if(mype == 0)write(iout_iter,*)'Minimization iteration',iter + if(mype == minmype)write(iout_iter,*)'Minimization iteration',iter ! 4. Calculate b and new search direction b=zero @@ -378,13 +387,13 @@ subroutine pcgsoi() if (iter > 1 .or. .not. read_success)then if (gsave>1.e-16_r_kind) b=gnorm(2)/gsave if (b30.0_r_kind) then - if (mype==0) then + if (mype==minmype) then if (iout_6) write(6,105) gnorm(2),gsave,b write(iout_iter,105) gnorm(2),gsave,b endif b=zero endif - if (mype==0 .and. print_verbose) write(6,888)'pcgsoi: gnorm(1:3),b=',gnorm,b + if (mype==minmype .and. print_verbose) write(6,888)'pcgsoi: gnorm(1:3),b=',gnorm,b end if do i=1,nclen @@ -432,22 +441,20 @@ subroutine pcgsoi() gnormx=gnorm(1)/gnormorig penx=penalty/penorig - if (mype==0) then + if (mype==minmype) then if (iter==0) then zgini=gnorm(1) zfini=penalty write(6,888)'Initial cost function =',zfini write(6,888)'Initial gradient norm =',sqrt(zgini) endif - if(print_verbose)then - write(iout_iter,888)'pcgsoi: gnorm(1:2)',gnorm - write(iout_iter,999)'costterms Jb,Jo,Jc,Jl =',jiter,iter,fjcost - end if istep=1 if (stp= pennorm .or. end_iter)then - if(mype == 0)then + if(mype == minmype)then if(iout_6) write(6,101) write(iout_iter,101) @@ -508,7 +515,7 @@ subroutine pcgsoi() ! End of inner iteration ! Deallocate space for renormalization - if(iorthomax>0) then + if(ortho) then do ii=1,iorthomax+1 call deallocate_cv(cglwork(ii)) enddo @@ -521,7 +528,7 @@ subroutine pcgsoi() ! Calculate adjusted observation error factor if( oberror_tune .and. (.not.l4dvar) ) then - if (mype == 0) write(6,*) 'PCGSOI: call penal for obs perturbation' + if (mype == minmype) write(6,*) 'PCGSOI: call penal for obs perturbation' ! call c2s(xhat,sval,sbias,.false.,.false.) call penal(sval(1)) @@ -535,17 +542,14 @@ subroutine pcgsoi() if (l_tlnmc .and. baldiag_inc) call strong_baldiag_inc(sval,size(sval)) - llprt=(mype==0) + llprt=(mype==minmype) ! call c2s(xhat,sval,sbias,llprt,.false.) if(print_diag_pcg)then ! Evaluate final cost function and gradient - if (mype==0) write(6,*)'Minimization final diagnostics' + if (mype==minmype) write(6,*)'Minimization final diagnostics' - do ii=1,nobs_bins - rval(ii)=zero - end do call intall(sval,sbias,rval,rbias) gradx=zero call c2s_ad(gradx,rval,rbias,llprt) @@ -575,16 +579,16 @@ subroutine pcgsoi() ! fjcost(1) = dot_product(xhatsave,yhatsave,r_quad) end if ! fjcost(2) = zjo - zfend=penaltynew -! if(l_hyb_ens) zfend=zfend+fjcost_e - if (mype==0) then + if (mype==minmype) then + zfend=penaltynew if(l_hyb_ens) then ! If hybrid ensemble run, print out contribution to Jb and Je separately write(iout_iter,999)'costterms Jb,Je,Jo,Jc,Jl =',jiter,iter,fjcostnew(1)- fjcost_e, & fjcost_e,fjcostnew(2:4) +! zfend=zfend+fjcost_e else write(iout_iter,999)'costterms Jb,Jo,Jc,Jl =',jiter,iter,fjcostnew @@ -905,6 +909,7 @@ subroutine c2s(hat,val,bias,llprt,ltest) use gsi_bundlemod, only : gsi_bundle,assignment(=) use gsi_4dvar, only: nobs_bins, nsubwin, l4dvar use gsi_4dcouplermod, only : gsi_4dcoupler_grtests + use control2state_mod, only: control2state,control2state_ad implicit none type(control_vector) ,intent(inout) :: hat @@ -971,6 +976,7 @@ subroutine c2s_ad(hat,val,bias,llprt) use gsi_bundlemod, only : gsi_bundle,assignment(=) use gsi_bundlemod, only : self_add use gsi_4dvar, only: nobs_bins, nsubwin, l4dvar + use control2state_mod, only: control2state_ad implicit none type(control_vector) ,intent(inout) :: hat diff --git a/src/gsi/pvqc.f90 b/src/gsi/pvqc.f90 index 81d27ba99f..3353b091a3 100755 --- a/src/gsi/pvqc.f90 +++ b/src/gsi/pvqc.f90 @@ -382,8 +382,8 @@ subroutine vqch_iii(ia,ib,ik,x,g,w)! [vqch] g=g-ya w=-w/xx else - g=-qx**2/2 - w=1 + g=-qx**2/2_dp + w=1_dp endif g=p*g end subroutine vqch_iii diff --git a/src/gsi/q_diag.f90 b/src/gsi/q_diag.f90 index 925a5775ec..15ef49c6b5 100644 --- a/src/gsi/q_diag.f90 +++ b/src/gsi/q_diag.f90 @@ -38,7 +38,7 @@ subroutine q_diag(it,mype) use mpimod, only: mpi_rtype,mpi_comm_world,mpi_sum,ierror use constants,only: zero,two,one,half use gridmod, only: lat2,lon2,nsig,nlat,nlon,lat1,lon1,iglobal,& - displs_g,ijn,wgtlats,itotsub,strip + displs_g,ijn,wgtlats,itotsub,strip,minmype use derivsmod, only: cwgues use general_commvars_mod, only: load_grid use gridmod, only: regional @@ -67,7 +67,7 @@ subroutine q_diag(it,mype) real(r_kind),pointer,dimension(:,:,:):: ges_q =>NULL() real(r_kind),pointer,dimension(:,:,:):: ges_cwmr_it=>NULL() - mype_out=0 + mype_out=minmype mm1=mype+1 ier=0 diff --git a/src/gsi/qcmod.f90 b/src/gsi/qcmod.f90 index f4afdbae9d..79c3e5894f 100644 --- a/src/gsi/qcmod.f90 +++ b/src/gsi/qcmod.f90 @@ -147,7 +147,7 @@ module qcmod ! !$$$ end documentation block - use kinds, only: i_kind,r_kind,r_double + use kinds, only: i_kind,r_kind,r_double, r_single use constants, only: zero,quarter,half,one,two,three,four,five,tiny_r_kind,rd,grav use constants, only: r0_01,r0_02,r0_03,r0_04,r0_05,r10,r60,r100,h300,r400,r1000,r2000,r2400,r4000 use constants, only: deg2rad,rad2deg,t0c,one_tenth,rearth_equator @@ -193,7 +193,7 @@ module qcmod public :: ifail_iland_det, ifail_isnow_det, ifail_iice_det, ifail_iwater_det,& ifail_imix_det, ifail_iomg_det, ifail_isst_det, ifail_itopo_det,& ifail_iwndspeed_det - public :: cao_check + public :: cao_check, ifail_clrfrac_geocsr_qc !emily public :: buddycheck_t,buddydiag_save public :: vadwnd_l2rw_qc public :: pvis,pcldch,scale_cv,estvisoe,estcldchoe,vis_thres,cldch_thres @@ -247,6 +247,7 @@ module qcmod integer(i_kind),parameter:: ifail_surface_qc=5 ! Reject due to gross check in specific qc routine integer(i_kind),parameter:: ifail_gross_routine_qc=6 + integer(i_kind),parameter:: ifail_gross_routine_nonsea_qc=16 ! Reject due to cloud > limit for channel in qc routine integer(i_kind),parameter:: ifail_cloud_qc=7 ! Reject due to inaccurate emissivity/surface temperature estimate in qc routine @@ -354,7 +355,8 @@ module qcmod ! QC_geocsr ! Reject because of standard deviation in subroutine qc_geocsr - integer(i_kind),parameter:: ifail_std_geocsr_qc=50 + integer(i_kind),parameter:: ifail_std_geocsr_qc=52 !emily change from 50 to 52 + integer(i_kind),parameter:: ifail_clrfrac_geocsr_qc=51 !emily ! QC_avhrr ! Reject because of too large surface temperature physical retrieval in qc routine: tz_retrieval (see tzr_qc) @@ -1085,6 +1087,15 @@ end subroutine tz_retrieval subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & temp,wmix,ts,pems,ierrret,kraintype,tpwc,clw,sgagl,tzbgr, & tbc,tbcnob,tb_ges,tnoise,ssmi,amsre_low,amsre_mid,amsre_hig,ssmis, & + varinv_after_grossroutinechk_over_ocean, & !emily + varinv_after_topo, & !emily + varinv_after_sfcchk, & !emily + varinv_after_ch2chk, & !emily + varinv_after_grossroutinechk,& !emily + varinv_after_scatteringchk, & !emily + varinv_after_nsstret, & !emily + varinv_after_jsfcchk, & !emily + pred9,pred10,pred11, & !emily varinv,errf,aivals,id_qc) ! varinv,errf,aivals,id_qc,radmod) ! all-sky @@ -1197,6 +1208,15 @@ subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & real(r_kind),dimension(nsig,nchanl),intent(in ) :: temp,wmix real(r_kind) ,dimension(nchanl),intent(inout) :: varinv,errf + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_grossroutinechk_over_ocean !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_grossroutinechk !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_topo !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_sfcchk !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_ch2chk !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_scatteringchk !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_nsstret !emily + real(r_kind) ,dimension(nchanl),intent( out) :: varinv_after_jsfcchk !emily + real(r_kind) ,intent( out) :: pred9,pred10,pred11 !emily real(r_kind) ,dimension(40) ,intent(inout) :: aivals ! Declare local variables @@ -1204,7 +1224,7 @@ subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & integer(i_kind) :: l,i real(r_kind) :: efact,vfact,dtempf,dtbf,term real(r_kind),dimension(nchanl) :: demisf_mi,clwcutofx - real(r_kind) :: pred9,pred10,pred11 +! real(r_kind) :: pred9,pred10,pred11 !emily real(r_kind) :: dtz,ts_ave,xindx,tzchks !------------------------------------------------------------------ @@ -1248,6 +1268,15 @@ subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & efact =one vfact =one +!>>emily + do i = 1,24 + varinv_after_grossroutinechk_over_ocean(i) = varinv(i) !emily + varinv_after_topo(i) = varinv(i) !emily + varinv_after_sfcchk(i) = varinv(i) !emily + varinv_after_ch2chk(i) = varinv(i) !emily + varinv_after_grossroutinechk(i) = varinv(i) !emily + enddo +!<= 1.5_r_kind) then ! the data at cloud-affected channels are not used do i =1,2 varinv(i) = zero @@ -1368,13 +1401,16 @@ subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & varinv(i) = zero if(id_qc(i)== igood_qc ) id_qc(i)=ifail_ch2_qc end do + varinv_after_ch2chk(:) = varinv(:) !emily endif !General qc criteria for all channels do i = 1,24 if( abs(tbcnob(i)) >= 3.5_r_kind) then varinv(i) = zero - if(id_qc(i)== igood_qc ) id_qc(i)=ifail_gross_routine_qc + ! if(id_qc(i)== igood_qc ) id_qc(i)=ifail_gross_routine_qc + if(id_qc(i)== igood_qc ) id_qc(i)=ifail_gross_routine_nonsea_qc !emily end if + varinv_after_grossroutinechk(i) = varinv(i) !emily enddo end if @@ -1392,6 +1428,12 @@ subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & end if end if +!>>emily + do i = 1, nchanl + varinv_after_scatteringchk(i) = varinv(i) !emily + enddo +!< two) then varinv(9) =zero if(id_qc(9)== igood_qc) id_qc(9)=ifail_scatt_qc + varinv_after_scatteringchk(9) = varinv(9) !emily end if if(pred10 - tbcnob(10) - tb_ges(10) > two) then varinv(10)=zero if(id_qc(10)== igood_qc) id_qc(10)=ifail_scatt_qc + varinv_after_scatteringchk(10) = varinv(10) !emily end if if(pred11 - tbcnob(11) - tb_ges(11) > two) then varinv(11)=zero if(id_qc(11)== igood_qc) id_qc(11)=ifail_scatt_qc + varinv_after_scatteringchk(11) = varinv(11) !emily end if end if ! @@ -1436,6 +1481,11 @@ subroutine qc_ssmi(nchanl,nsig,ich,sfchgt,luse,sea,mixed, & enddo endif endif +!>>emily + do l=1,nchanl + varinv_after_nsstret(:) = varinv(:) !emily + enddo +!< 0.02_r_kind) then ! QC4 in statsrad if(luse)aivals(11,is) = aivals(11,is) + one varinv(i) = zero - varinv_use(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_cloud_qc end if end do @@ -2353,8 +2401,7 @@ subroutine qc_irsnd(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse,goessndr, & delta=max(r0_05*tnoise(i),r0_02) if(abs(dts*ts(i)) > delta)then ! QC3 in statsrad - if(luse .and. varinv(i) > zero) & - aivals(10,is) = aivals(10,is) + one + if(luse .and. varinv(i) > zero) aivals(10,is) = aivals(10,is) + one varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_sfcir_qc end if @@ -2369,8 +2416,7 @@ subroutine qc_irsnd(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse,goessndr, & do i=1,nchanl if (ts(i) > 0.2_r_kind) then ! QC3 in statsrad - if(luse .and. varinv(i) > zero) & - aivals(10,is) = aivals(10,is) + one + if(luse .and. varinv(i) > zero) aivals(10,is) = aivals(10,is) + one varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_sfcir_qc end if @@ -2435,75 +2481,68 @@ subroutine qc_irsnd(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse,goessndr, & if(hirs) then do i=1,nchanl m=ich(i) - if (iomg_det(m) > 0 .and. i < 4 .and. abs(tbcnob(8)) > 40.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 12 .and. abs(tbcnob(8)) > 10.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif -!90S-60S - if(cenlat >= -90.0_r_kind .and. cenlat < -60.0_r_kind) then - if(iomg_det(m) > 0 .and. i == 4 .and. abs(tbcnob(8)) > 12.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 5 .and. abs(tbcnob(8)) > 6.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 6 .and. abs(tbcnob(8)) > 4.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif -!60S-30S - else if(cenlat >= -60.0_r_kind .and. cenlat < -30.0_r_kind) then - if(iomg_det(m) > 0 .and. i == 4 .and. abs(tbcnob(8)) > 10.0_r_kind) then + if(iomg_det(m) > 0 .and. i >= 4 .and. i <= 12)then + if (i < 4 .and. abs(tbcnob(8)) > 40.0_r_kind) then varinv(i) = zero if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 5 .and. abs(tbcnob(8)) > 2.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 6 .and. abs(tbcnob(8)) > 1.5_r_kind) then + else if(i == 12 .and. abs(tbcnob(8)) > 10.0_r_kind) then varinv(i) = zero if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det endif +!90S-60S + if(cenlat >= -90.0_r_kind .and. cenlat < -60.0_r_kind) then + if(i == 4 .and. abs(tbcnob(8)) > 12.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 5 .and. abs(tbcnob(8)) > 6.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 6 .and. abs(tbcnob(8)) > 4.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + endif +!60S-30S + else if(cenlat >= -60.0_r_kind .and. cenlat < -30.0_r_kind) then + if(i == 4 .and. abs(tbcnob(8)) > 10.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if( i == 5 .and. abs(tbcnob(8)) > 2.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 6 .and. abs(tbcnob(8)) > 1.5_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + endif !30S-30N - else if(cenlat >= -30.0_r_kind .and. cenlat < 30.0_r_kind) then - if(iomg_det(m) > 0 .and. i == 4 .and. abs(tbcnob(8)) > 5.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 5 .and. (tbcnob(8) < -2.0_r_kind .or. tbcnob(8) > 3.0_r_kind)) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 6 .and. (tbcnob(8) < -1.5_r_kind .or. tbcnob(8) > 3.0_r_kind)) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif + else if(cenlat >= -30.0_r_kind .and. cenlat < 30.0_r_kind ) then + if(i == 4 .and. abs(tbcnob(8)) > 5.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 5 .and. (tbcnob(8) < -2.0_r_kind .or. tbcnob(8) > 3.0_r_kind)) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 6 .and. (tbcnob(8) < -1.5_r_kind .or. tbcnob(8) > 3.0_r_kind)) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + endif !30N-60N - else if(cenlat >= 30.0_r_kind .and. cenlat < 60.0_r_kind) then - if(iomg_det(m) > 0 .and. i == 4 .and. abs(tbcnob(8)) > 8.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 5 .and. abs(tbcnob(8)) > 2.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - if(iomg_det(m) > 0 .and. i == 6 .and. abs(tbcnob(8)) > 1.0_r_kind) then - varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det - endif - endif !cenlat + else if(cenlat >= 30.0_r_kind .and. cenlat < 60.0_r_kind) then + if(i == 4 .and. abs(tbcnob(8)) > 8.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 5 .and. abs(tbcnob(8)) > 2.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + else if(i == 6 .and. abs(tbcnob(8)) > 1.0_r_kind) then + varinv(i) = zero + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_iomg_det + endif + endif !cenlat + end if if (itopo_det(m) > 0 .and. zsges > 1500.0_r_kind) then varinv(i) = zero - if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_itopo_det + if ( id_qc(i) == igood_qc ) id_qc(i) = ifail_itopo_det endif end do endif !! if (hirs) @@ -2519,6 +2558,8 @@ end subroutine qc_irsnd subroutine qc_avhrr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & zsges,cenlat,frac_sea,pangs,trop5,tzbgr,tsavg5,tbc,tb_obs,tnoise, & wavenumber,ptau5,prsltmp,tvp,temp,wmix,emissivity_k,ts, & + varinv_after_wavenum,varinv_after_rangechk,varinv_after_topo,varinv_after_transmittop, & !emily + varinv_after_clddet, varinv_after_nsstret, varinv_after_jsfcchk, & !emily id_qc,aivals,errf,varinv,varinv_use,cld,cldp) ! id_qc,aivals,errf,varinv,varinv_use,cld,cldp,radmod) ! all-sky @@ -2600,6 +2641,8 @@ subroutine qc_avhrr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & real(r_kind),dimension(nsig,nchanl),intent(in ) :: ptau5,temp,wmix real(r_kind),dimension(nsig), intent(in ) :: prsltmp,tvp real(r_kind),dimension(nchanl), intent(inout) :: errf,varinv,varinv_use + real(r_kind),dimension(nchanl), intent( out) :: varinv_after_wavenum, varinv_after_rangechk, varinv_after_topo, varinv_after_transmittop !emily + real(r_kind),dimension(nchanl), intent( out) :: varinv_after_clddet, varinv_after_nsstret, varinv_after_jsfcchk !emily ! Declare local parameters @@ -2639,6 +2682,12 @@ subroutine qc_avhrr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & end do endif +!>>emily + do i=1,nchanl + varinv_after_wavenum(i) = varinv(i) + enddo +!< r1000 .or. tb_obs(i) <= zero) then varinv(i)=zero varinv_use(i)=zero + if(id_qc(i) == igood_qc)id_qc(i)=ifail_range_qc !emily_bugfix end if + varinv_after_rangechk(i) = varinv(i) !emily varinv(i) = varinv(i)*(one-(one-sfchgtfact)*ptau5(1,i)) varinv_use(i) = varinv_use(i)*(one-(one-sfchgtfact)*ptau5(1,i)) + varinv_after_topo(i) = varinv(i) !emily ! Modify error based on transmittance at top of model varinv(i)=varinv(i)*ptau5(nsig,i) varinv_use(i)=varinv_use(i)*ptau5(nsig,i) errf(i)=errf(i)*ptau5(nsig,i) + varinv_after_transmittop(i) = varinv(i) !emily ! QC based on presence/absence of cloud sum3=sum3+tbc(i)*tbc(i)*varinv_use(i) @@ -2764,6 +2817,12 @@ subroutine qc_avhrr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & end do end if +!>>emily + do i=1,nchanl + varinv_after_clddet(i) = varinv(i) !emily + enddo +!<>emily + do i=1,nchanl + varinv_after_nsstret(i) = varinv(i) !emily + enddo +!< tiny_r_kind)varinv(i)=varinv(i)/(one+varinv(i)*term) end if end do - +!>>emily + do i=1,nchanl + varinv_after_jsfcchk(i) = varinv(i) !emily + end do +!<= one .and. luse)aivals(13,is) = aivals(13,is) + one factch4=clwx**2+(tbc(ich528)*w2f4)**2 @@ -3021,17 +3095,20 @@ subroutine qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse, & errf(1:ich544)=zero varinv(1:ich544)=zero do i=1,ich544 - if(id_qc(i) == igood_qc)id_qc(i) = ifail_interchan_qc + ! if(id_qc(i) == igood_qc)id_qc(i) = ifail_interchan_qc !orig + if(id_qc(i) == igood_qc)id_qc(i) = ifail_range_qc !emily end do errf(ich890)=zero varinv(ich890)=zero - if(id_qc(ich890) == igood_qc) id_qc(ich890) = ifail_interchan_qc + ! if(id_qc(ich890) == igood_qc) id_qc(ich890) = ifail_interchan_qc !orig + if(id_qc(ich890) == igood_qc) id_qc(ich890) = ifail_range_qc !emily if (latms) then errf(16:22)=zero varinv(16:22)=zero do i=16,22 - if(id_qc(i) == igood_qc)id_qc(i) = ifail_interchan_qc + ! if(id_qc(i) == igood_qc)id_qc(i) = ifail_interchan_qc !orig + if(id_qc(i) == igood_qc)id_qc(i) = ifail_range_qc !emily end do end if @@ -3366,6 +3443,11 @@ subroutine qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse, & end if endif ! all-sky chk +!>>emily + qc4emiss_out = zero + if (qc4emiss) qc4emiss_out = one +!<>emily + do i = 1, nchanl + varinv_grosschk(i) = varinv(i) + enddo +!< r2000) then @@ -3437,6 +3525,12 @@ subroutine qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse, & end if end do +!>>emily + do i=1,nchanl + varinv_after_jsfcchk(i) = varinv(i) !emily + end do +!<>emily + do i=1,nchanl + varinv_sdoei(i) = varinv(i) !emily + enddo +!<>emily + do i=1,nchanl + varinv_after_sdoei(i) = varinv(i) !emily + end do +!<>emily + id_qc,aivals,errf,varinv,varinv_use, & + varinv_after_sfcterrianchk, & + varinv_after_rangechk, & + varinv_after_topo, & + varinv_after_transmittop, & + varinv_after_clddet, & + varinv_after_stdchk, & + varinv_after_grossroutinechk, & + varinv_after_stdadj, & + varinv_after_nsstret, & + varinv_after_jsfcchk, & + cld,cldp,kmax,abi,ahi,seviri) +!< r1000 .or. tb_obs(i) <= zero) then varinv(i)=zero varinv_use(i)=zero + if(id_qc(i) == igood_qc)id_qc(i)=ifail_range_qc !emily_bugfix end if + varinv_after_rangechk(i) = varinv(i) !emily + tmp=one-(one-sfchgtfact)*ptau5(1,i) varinv(i) = varinv(i)*tmp varinv_use(i) = varinv_use(i)*tmp + varinv_after_topo(i) = varinv(i) !emily ! Modify error based on transmittance at top of model varinv(i)=varinv(i)*ptau5(nsig,i) varinv_use(i)=varinv_use(i)*ptau5(nsig,i) errf(i)=errf(i)*ptau5(nsig,i) + varinv_after_transmittop(i) = varinv(i) !emily ! QC based on presence/absence of cloud sum3=sum3+tbc(i)*tbc(i)*varinv_use(i) @@ -4496,7 +4640,6 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & if(id_qc(i) == igood_qc)id_qc(i)=ifail_cloud_qc end if end do - ! If no clouds check surface temperature/emissivity else ! If no cloud was detected, do surface temp/emiss checks sum=zero @@ -4525,7 +4668,19 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & end do end if endif +!>>emily + do i = 1, nchanl + varinv_after_clddet(i) = varinv(i) !emily + end do +!<>emily + do i = 1, nchanl + varinv_after_stdchk(i) = varinv(i) !emily + varinv_after_grossroutinechk(i) = varinv(i) !emily + varinv_after_stdadj(i) = varinv(i) !emily + enddo +!<= 0.5 for chn10.3 @@ -4546,6 +4701,7 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & varinv(i)=zero end if end if + varinv_after_stdchk(i) = varinv(i) !emily ! QC_o-g: If abs(o-g) > 2.0 do not use if ( i/=2 .and. abs(tbc(i)) > two ) then varinv(i) = zero @@ -4553,6 +4709,7 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & ! QC1 in statsrad if(luse)aivals(8,is)= aivals(8,is) + one !hliu check end if + varinv_after_grossroutinechk(i) = varinv(i) !emily end if ! adjust varinv according to the BT standard deviation @@ -4571,7 +4728,7 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & if(seviri .or. ahi) then varinv(i)=varinv(i) end if - + varinv_after_stdadj(i) = varinv(i) !emily end do ! ! Apply Tz retrieval @@ -4600,6 +4757,12 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & endif end if +!>>emily + do i=1,nchanl + varinv_after_nsstret(i) = varinv(i) !emily + enddo +!>>emily + ! Generate q.c. bounds and modified variances. do i=1,nchanl if(varinv(i) > tiny_r_kind)then @@ -4607,8 +4770,8 @@ subroutine qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse, & term = dtbf*dtbf if(term > tiny_r_kind)varinv(i)=varinv(i)/(one+varinv(i)*term) end if + varinv_after_jsfcchk(i) = varinv(i) !emily end do - return diff --git a/src/gsi/radinfo.f90 b/src/gsi/radinfo.f90 index 76a08c39a5..ffc4641696 100644 --- a/src/gsi/radinfo.f90 +++ b/src/gsi/radinfo.f90 @@ -615,7 +615,7 @@ subroutine radinfo_read ! !USES: use obsmod, only: iout_rad - use constants, only: zero,one,zero_quad + use constants, only: zero,one,zero_quad, r10 use mpimod, only: mype use mpeu_util, only: perr,die implicit none @@ -855,7 +855,8 @@ subroutine radinfo_read varA(i,j)=varx(i) end do ostats(j)=ostatsx - if ((any(varx/=zero) .and. iuse_rad(j)>-2) .or. iuse_rad(j)==4) & + if ((all(varx==zero) .and. iuse_rad(j)>-2) .or. iuse_rad(j)==4) cycle read3 + if ((any(varx/=r10) .and. iuse_rad(j)>-2) .or. iuse_rad(j)==4) & inew_rad(j)=.false. cycle read3 end if @@ -1740,7 +1741,7 @@ subroutine init_predx if (.not. (any(inew_rad) .or. any(update_tlapmean))) return if (ndat==0) return - if (mype==0) write(6,*) 'INIT_PREDX: enter routine' +! if (mype==0) write(6,*) 'INIT_PREDX: enter routine' ! Allocate and initialize data arrays if (any(update_tlapmean)) then @@ -1867,6 +1868,7 @@ subroutine init_predx end do end do loop_a + write(6,*) 'INIT_PREDX: inst_sat new_chan = ', trim(fdiag_rad), new_chan if (.not. update .and. new_chan==0) then call close_radiag(fdiag_rad,lndiag) cycle loopf diff --git a/src/gsi/read_atms.f90 b/src/gsi/read_atms.f90 index 9f5efb5301..47b675b3a3 100644 --- a/src/gsi/read_atms.f90 +++ b/src/gsi/read_atms.f90 @@ -511,10 +511,10 @@ subroutine read_atms(mype,val_tovs,ithin,isfcalc,& ALLOCATE(Relative_Time_In_Seconds(Num_Obs)) ALLOCATE(IScan(Num_Obs)) Relative_Time_In_Seconds = 3600.0_r_kind*T4DV_Save(1:Num_Obs) - write(6,*) 'Calling ATMS_Spatial_Average' +! write(6,*) 'Calling ATMS_Spatial_Average' CALL ATMS_Spatial_Average(Num_Obs, NChanl, IFOV_Save(1:Num_Obs), & Relative_Time_In_Seconds, BT_Save(1:nchanl,1:Num_Obs), IScan, IRet) - write(6,*) 'ATMS_Spatial_Average Called with IRet=',IRet +! write(6,*) 'ATMS_Spatial_Average Called with IRet=',IRet DEALLOCATE(Relative_Time_In_Seconds) IF (IRet /= 0) THEN diff --git a/src/gsi/read_bufrtovs.f90 b/src/gsi/read_bufrtovs.f90 index 0aed801ee5..1e92925732 100644 --- a/src/gsi/read_bufrtovs.f90 +++ b/src/gsi/read_bufrtovs.f90 @@ -228,7 +228,7 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& real(r_kind),allocatable,dimension(:,:):: data_all real(crtm_kind),allocatable,dimension(:):: data1b4 - real(r_double),allocatable,dimension(:):: data1b8,data1b8x + real(r_double),allocatable,dimension(:):: data1b8 real(r_double),dimension(n1bhdr):: bfr1bhdr real(r_double),dimension(n2bhdr):: bfr2bhdr @@ -519,7 +519,6 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& ! support multiple spc coefficient files for any given sensor if(amsua .or. amsub .or. mhs)then quiet=.not.verbose - allocate(data1b8x(nchanl)) spc_coeff_versions = 0 spc_coeff_found = .true. do while (spc_coeff_found) @@ -748,13 +747,15 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& ! unless the satellite is n15 or n16, because tranamsua ! does this conversion because the coefficient files exist ! for it to use - data1b8x=data1b8 data1b4=data1b8 !call apply_antcorr(accoeff_sets(spc_coeff_versions),ifov,data1b4) call apply_antcorr(accoeff_sets(1),ifov,data1b4) - data1b8=data1b4 do j=1,nchanl - if(data1b8x(j) > r1000) data1b8(j) = 1000000._r_kind + if(data1b8(j) > r1000)then + data1b8(j) = 1000000._r_kind + else + data1b8(j) = data1b4(j) + end if end do end if else ! EARS / DB @@ -766,14 +767,16 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& ! data originator, ! then convert back to brightness temperature using the version ! of parameters used by the CRTM - data1b8x=data1b8 data1b4=data1b8 call remove_antcorr(accoeff_sets(sacv),ifov,data1b4) !call apply_antcorr(accoeff_sets(spc_coeff_versions),ifov,data1b4) call apply_antcorr(accoeff_sets(1),ifov,data1b4) - data1b8=data1b4 do j=1,nchanl - if(data1b8x(j) > r1000) data1b8(j) = 1000000._r_kind + if(data1b8(j) > r1000) then + data1b8(j) = 1000000._r_kind + else + data1b8(j)=data1b4(j) + end if end do end if end if @@ -785,12 +788,14 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& else ! EARS / DB call ufbrep(lnbufr,data1b8,1,nchanl,iret,'TMBRST') if ( amsua .or. amsub .or. mhs )then - data1b8x=data1b8 data1b4=data1b8 call remove_antcorr(accoeff_sets(1),ifov,data1b4) - data1b8=data1b4 do j=1,nchanl - if(data1b8x(j) > r1000)data1b8(j) = 1000000._r_kind + if(data1b8(j) > r1000)then + data1b8(j) = 1000000._r_kind + else + data1b8(j) = data1b4(j) + end if end do end if end if @@ -1053,8 +1058,6 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& call closbf(lnbufr) close(lnbufr) - if (allocated(data1b8x)) deallocate(data1b8x) - end do ears_db_loop deallocate(data1b8,data1b4) @@ -1080,6 +1083,11 @@ subroutine read_bufrtovs(mype,val_tovs,ithin,isfcalc,& 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(6,*)'emily checking jsatid = ', jsatid +! write(6,*)'emily checking nread = ', nread +! write(6,*)'emily checking ndata = ', ndata +! write(6,*)'emily checking ndata*nchanl = ', ndata*nchanl +! write(6,*)'emily checking nodata = ', nodata end if ! Deallocate local arrays diff --git a/src/gsi/read_dbz_nc.f90 b/src/gsi/read_dbz_nc.f90 index 89eebde8b6..cddbd14de4 100644 --- a/src/gsi/read_dbz_nc.f90 +++ b/src/gsi/read_dbz_nc.f90 @@ -71,7 +71,7 @@ subroutine read_dbz_nc(nread,ndata,nodata,infile,lunout,obstype,sis,hgtl_full,no one_tenth,r1000,r60,r60inv,r100,r400,grav_equator, & eccentricity,somigliana,grav_ratio,grav,semi_major_axis,flattening use gridmod, only: tll2xy,nsig,nlat,nlon - use obsmod, only: iadate,doradaroneob, & + use obsmod, only: iadate,doradaroneob,oneoblat,oneoblon,oneobheight, & mintiltdbz,maxtiltdbz,minobrangedbz,maxobrangedbz,& static_gsi_nopcp_dbz,rmesh_dbz,zmesh_dbz use hybrid_ensemble_parameters,only : l_hyb_ens @@ -380,6 +380,12 @@ subroutine read_dbz_nc(nread,ndata,nodata,infile,lunout,obstype,sis,hgtl_full,no thislon = lon(i,j) thislat = lat(i,j) + + if(doradaroneob) then + thislat=oneoblat + thislon=oneoblon + thishgt=oneobheight + endif !-Check format of longitude and correct if necessary diff --git a/src/gsi/read_diag.f90 b/src/gsi/read_diag.f90 index 6a7fa44cb9..e389a708d5 100644 --- a/src/gsi/read_diag.f90 +++ b/src/gsi/read_diag.f90 @@ -1165,7 +1165,9 @@ subroutine read_radiag_data_nc(diag_status,header_fix,data_fix,data_chan,data_ex data_fix = diag_status%all_data_fix(diag_status%cur_ob_idx) data_chan(:) = diag_status%all_data_chan(diag_status%cur_ob_idx,:) - data_extra(:,:) = diag_status%all_data_extra(diag_status%cur_ob_idx,:,:) + if (header_fix%iextra > 0) then + data_extra(:,:) = diag_status%all_data_extra(diag_status%cur_ob_idx,:,:) + endif diag_status%cur_ob_idx = diag_status%cur_ob_idx + 1 diff --git a/src/gsi/read_files.f90 b/src/gsi/read_files.f90 index 93ddd17bf7..5d29efbace 100644 --- a/src/gsi/read_files.f90 +++ b/src/gsi/read_files.f90 @@ -620,7 +620,7 @@ subroutine read_files(mype) endif if (l4densvar .and. nfldsig/=ntlevs_ens) then if (mype==0) then - write(6,*)'READ_FILES: ***ERROR*** insufficient atm fcst for 4densvar: PROGRAM STOPS' + write(6,*)'READ_FILES: ***FATAL ERROR*** insufficient atm fcst for 4densvar: PROGRAM STOPS' do i=1,ntlevs_ens ihr=nhr_obsbin*(i-1)+nhr_half present=.false. @@ -629,7 +629,7 @@ subroutine read_files(mype) end do if (.not.present) then write(filename,'(''sigf'',i2.2)')ihr - write(6,*)'READ_FILES: ***ERROR*** file ',trim(filename),' missing: PROGRAM STOPS' + write(6,*)'READ_FILES: ***FATAL ERROR*** file ',trim(filename),' missing: PROGRAM STOPS' endif end do endif @@ -652,7 +652,7 @@ subroutine read_files(mype) endif if (l4densvar .and. nfldsfc/=ntlevs_ens) then if (mype==0) then - write(6,*)'READ_FILES: ***ERROR*** insufficient sfc fcst for 4densvar: PROGRAM STOPS' + write(6,*)'READ_FILES: ***FATAL ERROR*** insufficient sfc fcst for 4densvar: PROGRAM STOPS' do i=1,ntlevs_ens ihr=nhr_obsbin*(i-1)+nhr_half present=.false. @@ -661,7 +661,7 @@ subroutine read_files(mype) end do if (.not.present) then write(filename,'(''sfcf'',i2.2)')ihr - write(6,*)'READ_FILES: ***ERROR*** file ',trim(filename),' missing: PROGRAM STOPS' + write(6,*)'READ_FILES: ***FATAL ERROR*** file ',trim(filename),' missing: PROGRAM STOPS' endif end do endif diff --git a/src/gsi/read_gps.f90 b/src/gsi/read_gps.f90 index 3d8379ee3b..d90fb8b489 100644 --- a/src/gsi/read_gps.f90 +++ b/src/gsi/read_gps.f90 @@ -137,21 +137,32 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & bend_error,ref_error,bend_pccf,ref_pccf real(r_kind),allocatable,dimension(:,:):: cdata_all - - integer(i_kind),parameter:: n1ahdr=10 + +!> xuanli +! integer(i_kind),parameter:: n1ahdr=10 + integer(i_kind),parameter:: n1ahdr=13 +!< xuanli real(r_double),dimension(n1ahdr):: bfr1ahdr real(r_double),dimension(50,maxlevs):: data1b real(r_double),dimension(50,maxlevs):: data2a real(r_double),dimension(maxlevs):: nreps_this_ROSEQ2 + +!> xuanli + real(r_kind):: azm_ang, sat_ascd, sat_constid, siid, ogce +!< xuanli data lnbufr/10/ - data hdr1a / 'YEAR MNTH DAYS HOUR MINU PCCF ELRC SAID PTID GEODU' / +! data hdr1a / 'YEAR MNTH DAYS HOUR MINU PCCF ELRC SAID PTID GEODU' / + data hdr1a / 'YEAR MNTH DAYS HOUR MINU PCCF ELRC SAID PTID GEODU SCLF SIID OGCE' / data nemo /'QFRO'/ !*********************************************************************************** maxobs=2e6 - nreal=maxinfo +!> xuanli +! nreal=maxinfo + nreal=23 +!< xuanli nchanl=0 ilon=2 ilat=3 @@ -170,7 +181,6 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & write(6,*)'READ GPS: CONVINFO DOES NOT INCLUDE ANY ',trim(sis),' DATA' return end if - ! Open file for input, then read bufr data open(lnbufr,file=trim(infile),form='unformatted') call openbf(lnbufr,'IN',lnbufr) @@ -214,16 +224,19 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & call ufbint(lnbufr,qfro,1,1,iret,nemo) ! observation time in minutes - idate5(1) = bfr1ahdr(1) ! year - idate5(2) = bfr1ahdr(2) ! month - idate5(3) = bfr1ahdr(3) ! day - idate5(4) = bfr1ahdr(4) ! hour - idate5(5) = bfr1ahdr(5) ! minute - pcc=bfr1ahdr(6) ! profile per cent confidence - roc=bfr1ahdr(7) ! Earth local radius of curvature - said=bfr1ahdr(8) ! Satellite identifier - ptid=bfr1ahdr(9) ! Platform transmitter ID number - geoid=bfr1ahdr(10) ! Geoid undulation + idate5(1) = bfr1ahdr(1) ! year + idate5(2) = bfr1ahdr(2) ! month + idate5(3) = bfr1ahdr(3) ! day + idate5(4) = bfr1ahdr(4) ! hour + idate5(5) = bfr1ahdr(5) ! minute + pcc=bfr1ahdr(6) ! profile per cent confidence + roc=bfr1ahdr(7) ! Earth local radius of curvature + said=bfr1ahdr(8) ! Satellite identifier + ptid=bfr1ahdr(9) ! Platform transmitter ID number + geoid=bfr1ahdr(10) ! Geoid undulation + sat_constid=bfr1ahdr(11) ! Satellite classification + siid=bfr1ahdr(12) ! Satellite instrument + ogce = bfr1ahdr(13) ! Identification of originating/generating centre call w3fs21(idate5,minobs) ! Locate satellite id in convinfo file @@ -296,6 +309,16 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & endif endif +!> xuanli ascending flag: when qfro bit3 is set, occultation is ascending +! bit3 is clear, occultation is descending + sat_ascd = 0.0 + call upftbv(lnbufr,nemo,qfro,mxib,ibit,nib) + if(nib > 0) then + do i=1,nib + if(ibit(i) .eq. 3) sat_ascd=1.0 + enddo + endif +!< xuanli ! Read bending angle information ! Get the number of occurences of sequence ROSEQ2 in this subset @@ -345,6 +368,7 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & nread=nread+1 ! count observations rlat=data1b(1,k) ! earth relative latitude (degrees) rlon=data1b(2,k) ! earth relative longitude (degrees) + azm_ang=data1b(3,k) ! azimuth angle !xuanli height=data2a(1,k) ref=data2a(2,k) ref_error=data2a(4,k) @@ -368,8 +392,7 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & good=.true. if((abs(rlat)>90._r_kind).or.(abs(rlon)>r360).or.(height<=zero)) then good=.false. - endif - if (ref_obs) then + else if (ref_obs) then if ((ref>=1.e+9_r_kind).or.(ref<=zero).or.(height>=1.e+9_r_kind)) then good=.false. endif @@ -440,7 +463,15 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & cdata_all(14,ndata)= dlon_earth_deg ! earth relative longitude (degrees) cdata_all(15,ndata)= dlat_earth_deg ! earth relative latitude (degrees) cdata_all(16,ndata)= geoid ! geoid undulation (m) - +!> xuanli + cdata_all(17,ndata)= qfro ! qfro + cdata_all(18,ndata)= sat_ascd ! ascending flag + cdata_all(19,ndata)= azm_ang ! azimuth angle + cdata_all(20,ndata)= sat_constid ! satellite classification + cdata_all(21,ndata)= siid ! occulting satellite + cdata_all(22,ndata)= ogce ! Identification of originating/generating centre + cdata_all(23,ndata)= ref ! refractivity obs (units of N) +!< xuanli else notgood = notgood + 1 end if @@ -466,8 +497,9 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & write(6,*)'READ_GPS: # bad or missing data=', notgood do i=1,ngpsro_type if (nmrecs_id(i)>0) & - write(6,1020)'READ_GPS: LEO_id,nprof_gps = ',gpsro_itype(i),nmrecs_id(i) + write(6,1021)'READ_GPS: LEO_id,nprof_gps = ',gpsro_itype(i),nmrecs_id(i) end do +1021 format(a31,i6,i6) write(6,1020)'READ_GPS: ref_obs,nprof_gps= ',ref_obs,nprof_gps 1020 format(a31,L,i6) diff --git a/src/gsi/read_iasi.f90 b/src/gsi/read_iasi.f90 index 367c224508..208b333f49 100644 --- a/src/gsi/read_iasi.f90 +++ b/src/gsi/read_iasi.f90 @@ -175,7 +175,6 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& character(len=4) :: senname character(len=80) :: allspotlist character(len=40) :: infile2 - integer(i_kind) :: jstart integer(i_kind) :: iret,ireadsb,ireadmg,irec,next, nrec_startx integer(i_kind),allocatable,dimension(:) :: nrec @@ -202,6 +201,7 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& real(r_kind),dimension(0:3) :: ts real(r_kind),dimension(10) :: sscale real(crtm_kind),allocatable,dimension(:) :: temperature + real(r_kind),allocatable,dimension(:) :: scalef real(r_kind),allocatable,dimension(:,:):: data_all real(r_kind) cdist,disterr,disterrmax,dlon00,dlat00 @@ -238,7 +238,7 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& integer(i_kind),parameter :: ilon = 3 integer(i_kind),parameter :: ilat = 4 real(r_kind) :: ptime,timeinflat,crit0 - integer(i_kind) :: ithin_time,n_tbin,it_mesh + integer(i_kind) :: ithin_time,n_tbin,it_mesh,jstart logical print_verbose print_verbose=.false. @@ -396,6 +396,7 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& allocate(temperature(1)) ! dependent on # of channels in the bufr file allocate(allchan(2,1)) ! actual values set after ireadsb allocate(bufr_chan_test(1))! actual values set after ireadsb + allocate(scalef(1)) ! Big loop to read data file next=0 @@ -442,10 +443,11 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& bufr_size = size(temperature,1) if ( bufr_size /= bufr_nchan ) then ! Re-allocation if number of channels has changed ! Allocate the arrays needed for the channel and radiance array - deallocate(temperature,allchan,bufr_chan_test) + deallocate(temperature,allchan,bufr_chan_test,scalef) allocate(temperature(bufr_nchan)) ! dependent on # of channels in the bufr file allocate(allchan(2,bufr_nchan)) allocate(bufr_chan_test(bufr_nchan)) + allocate(scalef(bufr_nchan)) bufr_chan_test(:)=0 endif ! allocation if @@ -675,6 +677,18 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& ! Read IASI channel number(CHNM) and radiance (SCRA) call ufbseq(lnbufr,allchan,2,bufr_nchan,iret,'IASICHN') + jstart=1 + scalef=one + do i=1,bufr_nchan + scaleloop: do j=jstart,10 + if(allchan(1,i) >= cscale(1,j) .and. allchan(1,i) <= cscale(2,j))then + scalef(i) = sscale(j) + jstart=j + exit scaleloop + end if + end do scaleloop + end do + if (iret /= bufr_nchan) then write(6,*)'READ_IASI: ### ERROR IN READING ', senname, ' BUFR DATA:', & iret, ' CH DATA IS READ INSTEAD OF ',bufr_nchan @@ -703,52 +717,47 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& cycle read_loop endif - iskip = 0 - jstart=1 +!$omp parallel do schedule(dynamic,1) private(i,sc_chan,bufr_chan,radiance) channel_loop: do i=1,satinfo_nchan - sc_chan = sc_index(i) - if ( bufr_index(i) == 0 ) cycle channel_loop bufr_chan = bufr_index(i) + if (bufr_chan > 0 ) then ! check that channel number is within reason - if (( allchan(2,bufr_chan) > zero .and. allchan(2,bufr_chan) < 99999._r_kind)) then ! radiance bounds - radiance = allchan(2,bufr_chan) - scaleloop: do j=jstart,10 - if(allchan(1,bufr_chan) >= cscale(1,j) .and. allchan(1,bufr_chan) <= cscale(2,j))then - radiance = allchan(2,bufr_chan)*sscale(j) - jstart=j - exit scaleloop - end if - end do scaleloop - call crtm_planck_temperature(sensorindex,sc_chan,radiance,temperature(bufr_chan)) - else - temperature(bufr_chan) = tbmin - endif + if (( allchan(2,bufr_chan) > zero .and. allchan(2,bufr_chan) < 99999._r_kind)) then ! radiance bounds + radiance = allchan(2,bufr_chan)*scalef(bufr_chan) + sc_chan = sc_index(i) + call crtm_planck_temperature(sensorindex,sc_chan,radiance,temperature(bufr_chan)) + else + temperature(bufr_chan) = tbmin + endif + end if end do channel_loop ! Check for reasonable temperature values + iskip = 0 skip_loop: do i=1,satinfo_nchan if ( bufr_index(i) == 0 ) cycle skip_loop bufr_chan = bufr_index(i) if(temperature(bufr_chan) <= tbmin .or. temperature(bufr_chan) > tbmax ) then - temperature(bufr_chan) = min(tbmax,max(zero,temperature(bufr_chan))) + temperature(bufr_chan) = min(tbmax,max(tbmin,temperature(bufr_chan))) if(iuse_rad(ioff+i) >= 0)iskip = iskip + 1 endif end do skip_loop - if(iskip > 0 .and. print_verbose)write(6,*) ' READ_IASI : iskip > 0 ',iskip - if( iskip > 0 )cycle read_loop + if(iskip > 0)then + if(print_verbose)write(6,*) ' READ_IASI : iskip > 0 ',iskip + cycle read_loop + end if - crit1=crit1 + ten*float(iskip) +! crit1=crit1 + ten*float(iskip) ! If the surface channel exists (~960.0 cm-1) and the AVHRR cloud information is missing, use an ! estimate of the surface temperature to determine if the profile may be clear. if (.not. cloud_info) then pred = tsavg*0.98_r_kind - temperature(sfc_channel_index) pred = max(pred,zero) + crit1=crit1 + pred endif - crit1=crit1 + pred - ! Map obs to grids if (pred == zero) then call finalcheck(dist1,crit1,itx,iuse) @@ -818,11 +827,7 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& ! Put satinfo defined channel temperatures into data array do l=1,satinfo_nchan i = bufr_index(l) - if ( bufr_index(l) /= 0 ) then - data_all(l+nreal,itx) = temperature(i) ! brightness temerature - else - data_all(l+nreal,itx) = tbmin - endif + data_all(l+nreal,itx) = temperature(i) ! brightness temerature end do nrec(itx)=irec @@ -835,7 +840,7 @@ subroutine read_iasi(mype,val_iasi,ithin,isfcalc,rmesh,jsatid,gstime,& end do ears_db_loop - deallocate(temperature, allchan, bufr_chan_test) + deallocate(temperature, allchan, bufr_chan_test,scalef) deallocate(channel_number,sc_index) deallocate(bufr_index) ! deallocate crtm info diff --git a/src/gsi/read_obs.F90 b/src/gsi/read_obs.F90 index 53b0723953..9017c498c2 100644 --- a/src/gsi/read_obs.F90 +++ b/src/gsi/read_obs.F90 @@ -221,9 +221,8 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) lexist=.false. end if if(lexist)then - if(jsatid == '')then - kidsat=0 - else if(jsatid == 'metop-a')then + kidsat=0 + if(jsatid == 'metop-a')then kidsat=4 else if(jsatid == 'metop-b')then kidsat=3 @@ -335,8 +334,6 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) ! kidsat = 288 else if ( jsatid == 'meghat' ) then kidsat = 440 - else - kidsat = 0 end if call closbf(lnbufr) @@ -346,8 +343,8 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) call datelen(10) if(kidsat /= 0)then - lexist = .false. - satloop: do while(ireadmg(lnbufr,subset,idate2) >= 0) + lexist = .false. + satloop: do while(ireadmg(lnbufr,subset,idate2) >= 0) if(ireadsb(lnbufr)==0)then call ufbint(lnbufr,satid,1,1,iret,'SAID') end if @@ -356,8 +353,8 @@ subroutine read_obs_check (lexist,filename,jsatid,dtype,minuse,nread) exit satloop end if nread = nread + 1 - end do satloop - else if(trim(filename) == 'prepbufr')then ! RTod: wired-in filename is not a good idea + end do satloop + else if(trim(filename) == 'prepbufr')then lexist = .false. fileloop: do while(ireadmg(lnbufr,subset,idate2) >= 0) do while(ireadsb(lnbufr)>=0) diff --git a/src/gsi/read_ozone.f90 b/src/gsi/read_ozone.f90 index c7062abbcf..acd1609317 100644 --- a/src/gsi/read_ozone.f90 +++ b/src/gsi/read_ozone.f90 @@ -154,6 +154,7 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & integer(i_kind) JULIAN,IDAYYR,IDAYWK integer(i_kind) ikx integer(i_kind) decimal,binary(14),binary_mls(18) + integer(i_kind) :: iuseflag !emily 1: used; -1: not used integer(i_kind) itx,itt,ipoq7 @@ -220,7 +221,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & !************************************************************************** ! Set constants. Initialize variables rsat=999._r_kind - maxobs=1e6 + maxobs=1e6 !orig +! maxobs=1e7 !emily ilon=3 ilat=4 ipoq7=0 @@ -231,7 +233,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & if (obstype == 'sbuv2' .or. obstype == 'ompsnp') then - nreal=9 +! nreal=9 !orig + nreal=10 !emily open(lunin,file=trim(infile),form='unformatted') nmrecs=0 call openbf(lunin,'IN',lunin) @@ -272,6 +275,7 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & endif read_loop1: do + iuseflag = 1 !emily call readsb(lunin,iret) if (iret/=0) then call readmg(lunin,subset,jdate,iret) @@ -396,15 +400,20 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & if (version8) then call ufbint(lunin,toq,1,1,iret,'SBUVTOQ') call ufbint(lunin,poq,1,1,iret,'SBUVPOQ') - if (toq/=0 .and. toq/=2) cycle read_loop1 - if (poq/=0 .and. poq/=1 .and. poq/=ipoq7) cycle read_loop1 +!!emily if (toq/=0 .and. toq/=2) cycle read_loop1 +!!emily if (poq/=0 .and. poq/=1 .and. poq/=ipoq7) cycle read_loop1 +!>>emily + if (toq/=0 .and. toq/=2) iuseflag = -1 + if (poq/=0 .and. poq/=1 .and. poq/=ipoq7) iuseflag = -1 +!<badoz) cycle read_loop1 +!!emily if (poz(k)>badoz) cycle read_loop1 + if (poz(k)>badoz) iuseflag = -1 end do - + ! Write ozone record to output file ndata=min(ndata+1,maxobs) nodata=nodata+nloz+1 @@ -417,8 +426,10 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ozout(7,ndata)=toq ! total ozone error flag ozout(8,ndata)=poq ! profile ozone error flag ozout(9,ndata)=solzen ! solar zenith angle + ozout(10,ndata)=iuseflag ! solar zenith angle !emily do k=1,nloz+1 - ozout(k+9,ndata)=poz(k) +! ozout(k+9,ndata)=poz(k) !orig + ozout(k+10,ndata)=poz(k) !emily end do ! Loop back to read next profile @@ -626,6 +637,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ! Set dependent variables and allocate arrays ! nreal=14 !orig nreal=15 !emily (add AFBO) + nreal=16 !emily (add iuseflag) + iuseflag=1 !emily nloz=0 nchanl=1 nozdat=nreal+nchanl @@ -642,6 +655,7 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ihh=0 read_loop2: do + iuseflag = 1 call readsb(lunin,iret) if (iret/=0) then call readmg(lunin,subset,jdate,iret) @@ -703,7 +717,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ! extract total ozone call ufbint(lunin,totoz,1,1,iret,'OZON') - if (totoz > badoz ) cycle read_loop2 + if (totoz > badoz ) iuseflag = -1 !emily +!!emily if (totoz > badoz ) cycle read_loop2 ! QC for omi_aura if (obstype == 'omi') then @@ -711,18 +726,22 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ! Bit 10 in TOQF represents row anomaly. decimal=int(hdrozo2(6)) call dec2bin(decimal,binary,14) - if (binary(10) == 1 ) cycle read_loop2 + if (binary(10) == 1 ) iuseflag = -1 !emily +!!emily if (binary(10) == 1 ) cycle read_loop2 ! remove the bad scan position data: fovn beyond 25 - if (hdrozo2(7) >=25.0_r_double) cycle read_loop2 + if (hdrozo2(7) >=25.0_r_double) iuseflag = -1 !emily +!!emily if (hdrozo2(7) >=25.0_r_double) cycle read_loop2 end if ! only accept flag 0 1, flag 2 is high SZA data which is not used for now toq=hdrozo2(5) - if (toq/=0 .and. toq/=1) cycle read_loop2 + if (toq/=0 .and. toq/=1) iuseflag = -1 !emily +!!emily if (toq/=0 .and. toq/=1) cycle read_loop2 ! remove the data in which the C-pair algorithm ((331 and 360 nm) is used. - if (hdrozo2(8) == 3_r_double .or. hdrozo2(8) == 13_r_double) cycle read_loop2 + if (hdrozo2(8) == 3_r_double .or. hdrozo2(8) == 13_r_double) iuseflag = -1 !emily +!!emily if (hdrozo2(8) == 3_r_double .or. hdrozo2(8) == 13_r_double) cycle read_loop2 ! thin OMI/OMPS-NM(or TC8) data @@ -747,7 +766,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ozout(7,itx)=hdrozo2(5) ! total ozone quality code ozout(8,itx)=hdrozo(10) ! solar zenith angle if (obstype == 'omi') then - ozout(9,itx)=binary(10) ! row anomaly flag +! ozout(9,itx)=binary(10) ! row anomaly flag !orig + ozout(9,itx)=hdrozo2(6) ! total ozone quality flag !emily end if ozout(10,itx)=hdrozo2(1) ! cloud amount ozout(11,itx)=hdrozo2(4) ! vzan @@ -755,7 +775,8 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ozout(13,itx)=hdrozo2(3) ! ascending/descending ozout(14,itx)=hdrozo2(7) ! scan position ozout(15,itx)=hdrozo2(8) ! AFBO !emily - ozout(16,itx)=totoz !emily + ozout(16,itx)=iuseflag !emily + ozout(17,itx)=totoz !emily !orig ozout(15,itx)=totoz ! End of loop over observations @@ -1255,7 +1276,6 @@ subroutine read_ozone(nread,ndata,nodata,jsatid,infile,gstime,lunout, & ndata=kk nodata=ndata endif - ! Write header record and data to output file for further processing call count_obs(ndata,nozdat,ilat,ilon,ozout,nobs) write(lunout) obstype,sis,nreal,nchanl,ilat,ilon diff --git a/src/gsi/read_prepbufr.f90 b/src/gsi/read_prepbufr.f90 index 3157d5ccf6..9284b1552a 100644 --- a/src/gsi/read_prepbufr.f90 +++ b/src/gsi/read_prepbufr.f90 @@ -148,6 +148,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& ! ! 2020-05-04 wu - no rotate_wind for fv3_regional ! 2020-09-05 CAPS(C. Tong) - add flag for new vadwind obs to assimilate around the analysis time only +! 2023-03-23 draper - add code for processing T2m and q2m for global system ! input argument list: ! infile - unit from which to read BUFR data @@ -212,7 +213,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& use hilbertcurve,only: init_hilbertcurve, accum_hilbertcurve, & apply_hilbertcurve,destroy_hilbertcurve use ndfdgrids,only: init_ndfdgrid,destroy_ndfdgrid,relocsfcob,adjust_error - use jfunc, only: tsensible + use jfunc, only: tsensible, hofx_2m_sfcfile use deter_sfc_mod, only: deter_sfc_type,deter_sfc2 use gsi_nstcouplermod, only: nst_gsi,nstinfo use gsi_nstcouplermod, only: gsi_nstcoupler_deter @@ -263,7 +264,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& logical tob,qob,uvob,spdob,sstob,pwob,psob,gustob,visob,tdob,mxtmob,mitmob,pmob,howvob,cldchob logical metarcldobs,goesctpobs,tcamtob,lcbasob logical outside,driftl,convobs,inflate_error - logical sfctype + logical sfctype, global_2m_land logical luse,ithinp,windcorr logical patch_fog logical aircraftset,aircraftobs,aircraftobst,aircrafttype @@ -476,6 +477,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& nreal=25 else if(uvob) then nreal=34 +! nreal=26 !orig else if(spdob) then nreal=24 else if(psob) then @@ -1614,10 +1616,15 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& pmq(k)=nint(qcmark(8,k)) end do +! 181, 183, 187, and 188 are the screen-level obs over land + global_2m_land = ( (kx==181 .or. kx==183 .or. kx==188 .or. kx==188 ) .and. hofx_2m_sfcfile ) + ! If temperature ob, extract information regarding virtual ! versus sensible temperature if(tob) then - if (.not. twodvar_regional .or. .not.tsensible) then + ! use tvirtual if tsensible flag not set, and not in either 2Dregional or global_2m DA mode + if ( (.not. tsensible) .and. .not. (twodvar_regional .or. global_2m_land) ) then + write(6,*)'emily checking vtcd = ', vtcd do k=1,levs tvflg(k)=one ! initialize as sensible do j=1,20 @@ -1914,6 +1921,26 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& ! Missing Values ==> Cycling! In this case for howv only. #ww3 if (howvob .and. owave(1,k) > r0_1_bmiss) cycle LOOP_K_LEVS +! Over-ride QM=9 and hard-wire errors for land obs and hofx_sfc_file option +! Can be deleted once prepbufr processing updated. + if ( global_2m_land ) then + if (tob .and. qm==9 ) then + pqm(k)=2 ! otherwise, type 183 will be discarded. + qm=2 + tqm(k)=2 + if (kx==187) obserr(3,k)=2.2 + if (kx==181) obserr(3,k)=1.5 + if (kx==183) obserr(3,k)=2.6 + endif + if (qob .and. qm == 9 ) then + qm = 2 + ! qob err specified as fraction of qsat, multiplied by 10. + if (kx==187) obserr(2,k)=1.0 + if (kx==181) obserr(2,k)=1.0 + if (kx==183) obserr(2,k)=1.0 + endif + + endif ! Set usage variable usage = zero if(icuse(nc) <= 0)usage=100._r_kind @@ -1957,6 +1984,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& if(obsdat(12,k) > 32.2_r_kind) usage=118._r_kind ! > 90F endif endif + ! to-do: should we add qob checks from above for landsfctype too? if ((kx>129.and.kx<140).or.(kx>229.and.kx<240) ) then call get_aircraft_usagerj(kx,obstype,c_station_id,usage) @@ -2239,8 +2267,8 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& cdata_all(25,iout)=var_jb(5,k) ! non linear qc parameter cdata_all(26,iout)=one ! hilbert curve weight, modified later if(perturb_obs)then - cdata_all(28,iout)=ran01dom()*perturb_fact ! u perturbation - cdata_all(29,iout)=ran01dom()*perturb_fact ! v perturbation + cdata_all(27,iout)=ran01dom()*perturb_fact ! u perturbation + cdata_all(28,iout)=ran01dom()*perturb_fact ! v perturbation endif else if(spdob) then @@ -3057,7 +3085,11 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& do k=1,ndata ikx=nint(cdata_out(10,k)) - itype=ictype(ikx) + if (ikx>0) then + itype=ictype(ikx) + else + itype=0 + endif if( itype ==230 .or. itype ==231 .or. itype ==233) then prest=r10*exp(cdata_out(4,k)) if (prest <100.0_r_kind) cycle diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index af9357814f..7ef51ea691 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -74,8 +74,6 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis ! or hilber curve downweighting ! ! 2020-05-04 wu - no rotate_wind for fv3_regional -! 2021-07-25 Genkova - read GOES-17 AMVQ flag:8-mitigated height -! 16-mit.target, 24-mit.target & height; write in diag ! 2021-07-25 Genkova - added code for Metop-B/C winds in new BUFR,NC005081 ! ! 2022-01-20 Genkova - added missing station_id for polar winds ! 2022-01-20 Genkova - added code for Meteosat and Himawari AMVs in new BUFR @@ -212,7 +210,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis real(r_kind),dimension(nsig):: presl real(r_double),dimension(13):: hdrdat - real(r_double),dimension(5):: obsdat + real(r_double),dimension(4):: obsdat real(r_double),dimension(2) :: hdrdat_test real(r_double),dimension(3,5) :: heightdat real(r_double),dimension(6,4) :: derdwdat @@ -242,8 +240,8 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis data hdrtr_v2 /'SAID CLATH CLONH YEAR MNTH DAYS HOUR MINU SWCM SAZA OGCE SCCF SWQM'/ ! OGCE replaces GCLONG, OGCE exists in old and new BUFR ! SWQM doesn't exist in the new BUFR, so qm is initialized to '2' manually - data obstr_v1 /'HAMD PRLC WDIR WSPD AMVQ'/ - data obstr_v2 /'EHAM PRLC WDIR WSPD AMVQ'/ + data obstr_v1 /'HAMD PRLC WDIR WSPD'/ + data obstr_v2 /'EHAM PRLC WDIR WSPD'/ ! data heightr/'MDPT '/ ! data derdwtr/'TWIND'/ data qcstr /' OGCE GNAP PCCF'/ @@ -272,6 +270,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis werrmin=one nsattype=0 nreal=34 +! nreal=26 !orig if(perturb_obs ) nreal=nreal+2 ntread=1 ntmatch=0 @@ -644,10 +643,10 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis call ufbint(lunin,hdrdat_test,2,1,iret, 'CLAT CLON') if ( hdrdat_test(1) > 100000000.0_r_kind .and. hdrdat_test(2) > 100000000.0_r_kind ) then call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v2) - call ufbint(lunin,obsdat,5,1,iret,obstr_v2) + call ufbint(lunin,obsdat,4,1,iret,obstr_v2) else call ufbint(lunin,hdrdat,13,1,iret,hdrtr_v1) - call ufbint(lunin,obsdat,5,1,iret,obstr_v1) + call ufbint(lunin,obsdat,4,1,iret,obstr_v1) endif ppb=obsdat(2) @@ -1208,7 +1207,7 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis else if(itype==240 .or. itype==245 .or. itype==246 .or. itype==251) then ! types 245 and 246 have been used to determine the acceptable pct1 range, but that pct1 range is applied to all GOES-R winds - if (pct1 < 0.04_r_kind) qm=15 + if (pct1 < 0.04_r_kind) qm=15 if (pct1 > 0.50_r_kind) qm=15 endif endif @@ -1599,6 +1598,12 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis if(perturb_obs)then cdata_all(35,iout)=ran01dom()*perturb_fact ! u perturbation cdata_all(36,iout)=ran01dom()*perturb_fact ! v perturbation + +!>>orig +! if(perturb_obs)then +! cdata_all(27,iout)=ran01dom()*perturb_fact ! u perturbation +! cdata_all(28,iout)=ran01dom()*perturb_fact ! v perturbation +!< xuanli + use guess_grids, only: ges_tsen +!< xuanli use gridmod, only: nsig use gridmod, only: get_ij,latlon11 use constants, only: fv,n_a,n_b,n_c,deg2rad,tiny_r_kind,r0_01,r18,r61,r63,r10000 use constants, only: zero,half,one,two,eccentricity,semi_major_axis,& grav_equator,somigliana,flattening,grav_ratio,grav,rd,eps,three,four,five,& - r100,r400 + r100,r400,r1000 use lagmod, only: setq, setq_TL use lagmod, only: slagdw, slagdw_TL use jfunc, only: jiter,miter,jiterstart @@ -225,10 +229,14 @@ subroutine setupbend(obsLL,odiagLL, & real(r_kind),dimension(nele,nobs):: data real(r_kind),dimension(nsig):: dbenddn,dbenddxi real(r_kind) pressure,hob_s,d_ref_rad,d_ref_rad_TL,hob_s_top + real(r_kind) hobb real(r_kind),dimension(4) :: w4,dw4,dw4_TL - + +!> xuanli integer(i_kind) ier,ilon,ilat,ihgt,igps,itime,ikx,iuse, & - iprof,ipctc,iroc,isatid,iptid,ilate,ilone,ioff,igeoid + iprof,ipctc,iroc,isatid,iptid,ilate,ilone,ioff,igeoid,iqfro + integer(i_kind) iascd, iazm, iconstid, isiid, iogce, iref +!< xuanli integer(i_kind) i,j,k,kk,mreal,nreal,jj,ikxx,ibin integer(i_kind) mm1,nsig_up,ihob,istatus,nsigstart integer(i_kind) kprof,istat,k1,k2,nobs_out,top_layer_SR,bot_layer_SR,count_SR @@ -239,7 +247,10 @@ subroutine setupbend(obsLL,odiagLL, & integer(i_kind) :: iz, t_ind, q_ind, p_ind, nnz, nind real(r_kind),dimension(3,nsig+nsig_ext) :: q_w,q_w_tl - real(r_kind),dimension(nsig) :: hges,irefges,zges,dhdt,dhdp +! xuanli correct the dimension of hges +! real(r_kind),dimension(nsig) :: hges,irefges,zges,dhdt,dhdp + real(r_kind),dimension(nsig) :: irefges,zges,dhdt,dhdp + real(r_kind),dimension(nsig+1) :: hges real(r_kind),dimension(nsig+1) :: prsltmp real(r_kind),dimension(nsig,nsig)::dndp,dxidp real(r_kind),dimension(nsig,nsig)::dndt,dxidt,dndq,dxidq @@ -264,6 +275,13 @@ subroutine setupbend(obsLL,odiagLL, & real(r_kind),allocatable,dimension(:,:,:,:) :: ges_tv real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q +!> xuanli + real(r_kind),dimension(nsig, nobs) :: Tsen,Tvir,sphm,hgtl,prslnl + real(r_kind),dimension(nsig+1,nobs) :: hgti,prslni + integer(i_kind),dimension(nobs) :: qc_superr, qc_layer, qc_ddnj + integer(i_kind),dimension(nobs) :: qc_stat,qc_largeBA,qc_metop +!< xuanli + type(obsLList),pointer,dimension(:):: gpshead logical:: commdat gpshead => obsLL(:) @@ -328,6 +346,21 @@ subroutine setupbend(obsLL,odiagLL, & ilone=14 ! index of earth relative longitude (degrees) ilate=15 ! index of earth relative latitude (degrees) igeoid=16 ! index of geoid undulation (a value per profile, m) +!> xuanli + iqfro=17 ! index of qfro (integer) + iascd=18 ! index of ascending flag (integer) + iazm=19 ! index of azimuth angle + iconstid=20 ! index of classification ID (integer) + isiid=21 ! index of occulting sat (integer) + iogce=22 ! index of identification of originating (integer) + iref=23 ! index of refractivity + qc_superr(:) = 0 + qc_stat(:) = 0 + qc_largeBA(:) = 0 + qc_metop(:) = 0 + qc_layer(:) = 0 + qc_ddnj(:) = 0 +!< xuanli ! Intialize variables nsig_up=nsig+nsig_ext ! extend nsig_ext levels above interface level nsig @@ -345,7 +378,8 @@ subroutine setupbend(obsLL,odiagLL, & allocate(ddnj(grids_dim),grid_s(grids_dim),ref_rad_s(grids_dim)) ! Allocate arrays for output to diagnostic file - mreal=22 +! mreal=22 ! xuanli + mreal=34 ! xuanli nreal=mreal if (lobsdiagsave) nreal=nreal+4*miter+1 if (save_jacobian) then @@ -451,7 +485,20 @@ subroutine setupbend(obsLL,odiagLL, & call tintrp2a11(ges_z,zsges,dlat,dlon,dtime,hrdifsig,& mype,nfldsig) - prsltmp_o(1:nsig,i)=prsltmp(1:nsig) ! needed in minimization + prsltmp_o(1:nsig,i)=prsltmp(1:nsig) ! needed in minimization + + call tintrp2a1(ges_tsen, Tsen(1:nsig,i), dlat,dlon,dtime,hrdifsig, & + nsig, mype,nfldsig) + call tintrp2a1(geop_hgtl, hgtl(1:nsig,i), dlat,dlon,dtime,hrdifsig, & + nsig, mype,nfldsig) + call tintrp2a1(ges_lnprsl,prslnl(1:nsig,i),dlat,dlon,dtime,hrdifsig, & + nsig, mype,nfldsig) + + Tvir(1:nsig,i) = tges(1:nsig) ! virtual temperature + sphm(1:nsig,i) = qges(1:nsig) ! specific humidity + hgtl(1:nsig,i) = hgtl(1:nsig,i) + zsges ! mid level geopotential height + hgti(1:nsig+1,i) = hges(1:nsig+1) + zsges ! interface level geopotential height + prslni(1:nsig+1,i) = prsltmp(1:nsig+1) ! interface level log(pressure) ! Compute refractivity index-radius product at interface ! @@ -573,7 +620,11 @@ subroutine setupbend(obsLL,odiagLL, & rdiagbuf(2,i) = data(iprof,i) ! profile identifier rdiagbuf(3,i) = data(ilate,i) ! lat in degrees rdiagbuf(4,i) = data(ilone,i) ! lon in degrees +!> xuanli: modified imph in the diag file. In jedi: imph=impp-roc-geoid rdiagbuf(7,i) = tpdpres(i)-rocprof ! impact height in meters +! rdiagbuf(7,i) = tpdpres(i)-rocprof-unprof ! impact height in meters -- defination in JEDI +!< xuanli + ! rdiagbuf(7,i) = tpdpres(i) ! impact parameter in meters rdiagbuf(8,i) = dtime-time_offset ! obs time (hours relative to analysis time) ! rdiagbuf(9,i) = data(ipctc,i) ! input bufr qc - index of per cent confidence @@ -582,6 +633,20 @@ subroutine setupbend(obsLL,odiagLL, & rdiagbuf(17,i) = data(igps,i) ! bending angle observation (radians) rdiagbuf(19,i) = hob ! model vertical grid (interface) if monotone grid rdiagbuf(22,i) = 1.e+10_r_kind ! spread (filled in by EnKF) +!> xuanli + rdiagbuf(23,i) = tpdpres(i) ! impact parameter in meters + rdiagbuf(24,i) = data(ipctc,i) ! input bufr qc - index of per cent confidence + rdiagbuf(25,i) = data(iptid,i) ! transmitter occ id + rdiagbuf(26,i) = rocprof ! local radius of curvature (m) + rdiagbuf(27,i) = unprof ! geoid undulation (m) + rdiagbuf(28,i) = data(iqfro,i) ! qfro + rdiagbuf(29,i) = data(iascd,i) ! ascending flag + rdiagbuf(30,i) = data(iazm,i) ! azimuth angle + rdiagbuf(31,i) = data(iconstid,i) ! satellite classification + rdiagbuf(32,i) = data(isiid,i) ! occulting satellite + rdiagbuf(33,i) = data(iogce,i) ! Identification of processing center + rdiagbuf(34,i) = data(iref,i) ! refractivity +!< xuanli - if(ratio_errors(i) > tiny_r_kind) then ! obs inside model grid @@ -590,6 +655,7 @@ subroutine setupbend(obsLL,odiagLL, & if ((tpdpres(i)ref_rad(top_layer_SR+5)) then ! obs above SR/close-to-SR layer qcfail(i)=.false. if(hob < top_layer_SR+1) then !location might be aliased to the lower section of the non-monotonicity @@ -601,6 +667,7 @@ subroutine setupbend(obsLL,odiagLL, & endif else ! obs inside model SR/shadow or close-to-SR layer qcfail(i)=.true. + qc_superr(i)=1 endif endif @@ -608,6 +675,7 @@ subroutine setupbend(obsLL,odiagLL, & if ( data(igps,i) >= 0.03_r_kind .and. qc_layer_SR) then kprof = data(iprof,i) toss_gps_sub(kprof) = max (toss_gps_sub(kprof),data(igps,i)) + qc_layer(i)=1 endif endif @@ -624,8 +692,10 @@ subroutine setupbend(obsLL,odiagLL, & qrefges=qges_o(k1)*(one-delz)+qges_o(k2)*delz !Lidia rdiagbuf( 6,i) = ten*exp(dpressure) ! pressure at obs location (hPa) if monotone grid + ! atmosphere_pressure_coordinate rdiagbuf(18,i) = trefges ! temperature at obs location (Kelvin) if monotone grid rdiagbuf(21,i) = qrefges ! specific humidity at obs location (kg/kg) if monotone grid + commdat=.false. if (data(isatid,i)>=265 .and. data(isatid,i)<=269) commdat=.true. if (.not. qcfail(i)) then ! not SR @@ -716,7 +786,6 @@ subroutine setupbend(obsLL,odiagLL, & enddo muse(i)=nint(data(iuse,i)) <= jiter - ! Get refractivity index-radius and [d(ln(n))/dx] in new grid. intloop: do j=1,grids_dim ref_rad_s(j)=sqrt(grid_s(j)*grid_s(j)+tpdpres(i)*tpdpres(i)) !x_j @@ -752,8 +821,15 @@ subroutine setupbend(obsLL,odiagLL, & ihob=ihob-1 endif ddnj(j)=dot_product(dw4,nrefges(ihob-1:ihob+2,i))!derivative (dN/dx)_j + if(ddnj(j)>zero) then +!> xuanli -- set dbend, rdiagbuf(5), rdiagbuf(17) as JEDI missing + dbend=-3.368795e+38 + rdiagbuf( 5,i) = -3.368795e+38 + rdiagbuf( 17,i) = -3.368795e+38 +!< xuanli qcfail(i)=.true. + qc_ddnj(i)=1 data(ier,i) = zero ratio_errors(i) = zero muse(i)=.false. @@ -778,6 +854,11 @@ subroutine setupbend(obsLL,odiagLL, & end do intloop if (obs_check) then ! reject observation +!> xuanli -- set dbend, rdiagbuf(5), rdiagbuf(17) as JEDI missing + rdiagbuf( 5,i) = -3.368795e+38 + rdiagbuf( 17,i) = -3.368795e+38 + dbend = -3.368795e+38 +!< xuanli qcfail(i)=.true. data(ier,i) = zero ratio_errors(i) = zero @@ -800,9 +881,15 @@ subroutine setupbend(obsLL,odiagLL, & ! Remove very large simulated values if(dbend > 0.05_r_kind) then +!> xuanli -- set dbend, rdiagbuf(5), rdiagbuf(17) as JEDI missing + rdiagbuf( 5,i) = -3.368795e+38 + rdiagbuf( 17,i) = -3.368795e+38 + dbend = -3.368795e+38 +!< xuanli data(ier,i) = zero ratio_errors(i) = zero qcfail(i)=.true. + qc_largeBA(i)=1 muse(i)=.false. endif @@ -871,6 +958,7 @@ subroutine setupbend(obsLL,odiagLL, & if(abs(rdiagbuf(5,i)) > cutoff) then qcfail(i)=.true. + qc_stat(i)=1 data(ier,i) = zero ratio_errors(i) = zero muse(i) = .false. @@ -890,6 +978,7 @@ subroutine setupbend(obsLL,odiagLL, & if( (alt <= eight) .and. & ((data(isatid,i)==4).or.(data(isatid,i)==3).or.(data(isatid,i)==5))) then qcfail(i)=.true. + qc_metop(i)=1 data(ier,i) = zero ratio_errors(i) = zero muse(i)=.false. @@ -951,6 +1040,13 @@ subroutine setupbend(obsLL,odiagLL, & if(qcfail(i)) rdiagbuf(10,i) = four !modified in genstats due to toss_gps_sub if(qcfail_loc(i) == one) rdiagbuf(10,i) = one if(qcfail_high(i) == one) rdiagbuf(10,i) = two + if(qc_superr(i) == 1) rdiagbuf(10,i) = 7 !xuanli to print out SR + !if(qc_layer(i) == 1) rdiagbuf(10,i) = 8 !xuanli to print out SR + if(qc_ddnj(i) == 1) rdiagbuf(10,i) = 9 !xuanli to print out SR + if(qc_stat(i) == 1) rdiagbuf(10,i) = 10 !xuanli to print out SR + if(qc_largeBA(i) == 1) rdiagbuf(10,i) = 11 !xuanli to print out SR + if(qc_metop(i) == 1) rdiagbuf(10,i) = 12 !xuanli to print out SR + if(muse(i)) then ! modified in genstats_gps due to toss_gps_sub rdiagbuf(12,i) = one ! minimization usage flag (1=use, -1=not used) @@ -1027,6 +1123,28 @@ subroutine setupbend(obsLL,odiagLL, & gps_alltail(ibin)%head%elat= data(ilate,i) gps_alltail(ibin)%head%elon= data(ilone,i) +! 2 dimensional geovals for JEDI + allocate(gps_alltail(ibin)%head%tvirges(nsig),stat=istatus) + allocate(gps_alltail(ibin)%head%tsenges(nsig),stat=istatus) + allocate(gps_alltail(ibin)%head%sphmges(nsig),stat=istatus) + allocate(gps_alltail(ibin)%head%hgtlges(nsig),stat=istatus) + allocate(gps_alltail(ibin)%head%hgtiges(nsig+1),stat=istatus) + allocate(gps_alltail(ibin)%head%prsiges(nsig+1),stat=istatus) + allocate(gps_alltail(ibin)%head%prslges(nsig),stat=istatus) + + do j= 1, nsig + gps_alltail(ibin)%head%tvirges(j) = Tvir(j,i) + gps_alltail(ibin)%head%tsenges(j) = Tsen(j,i) + gps_alltail(ibin)%head%sphmges(j) = sphm(j,i) + gps_alltail(ibin)%head%hgtlges(j) = hgtl(j,i) + gps_alltail(ibin)%head%prslges(j) = 1000.0*exp(prslnl(j,i)) + end do + + do j= 1, nsig + 1 + gps_alltail(ibin)%head%hgtiges(j) = hgti(j,i) + gps_alltail(ibin)%head%prsiges(j) = 1000.0*exp(prslni(j,i)) + end do + allocate(gps_alltail(ibin)%head%rdiag(nreal),stat=istatus) if (istatus/=0) write(6,*)'SETUPBEND: allocate error for gps_alldiag, istatus=',istatus @@ -1268,6 +1386,7 @@ subroutine setupbend(obsLL,odiagLL, & gps_alltail(ibin)%head%dataerr = data(ier,i)*data(igps,i) gps_alltail(ibin)%head%muse = muse(i) ! logical endif ! (last_pass) + end do ! i=1,nobs deallocate(ddnj,grid_s,ref_rad_s) ! Release memory of local guess arrays diff --git a/src/gsi/setupcldtot.F90 b/src/gsi/setupcldtot.F90 index 3d899d1a82..a30ef92a90 100755 --- a/src/gsi/setupcldtot.F90 +++ b/src/gsi/setupcldtot.F90 @@ -90,7 +90,7 @@ subroutine setupcldtot(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_di integer(i_kind) ,intent(in ) :: lunin,mype,nele,nobs real(r_kind),dimension(100+7*nsig) ,intent(inout) :: awork real(r_kind),dimension(npres_print,nconvtype,5,3),intent(inout) :: bwork - integer(i_kind) ,intent(in ) :: is ! ndat index + integer(i_kind) ,intent(in ) :: is ! ndat index logical ,intent(in ) :: conv_diagsave #ifdef RR_CLOUDANALYSIS diff --git a/src/gsi/setupdbz.f90 b/src/gsi/setupdbz.f90 index 9bbf5ed34b..96f0378c52 100644 --- a/src/gsi/setupdbz.f90 +++ b/src/gsi/setupdbz.f90 @@ -426,6 +426,7 @@ subroutine setupdbz(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,radardbz_d if (lobsdiagsave) nreal=nreal+4*miter+1 if (.not.allocated(cdiagbuf)) allocate(cdiagbuf(nobs)) if (.not.allocated(rdiagbuf)) allocate(rdiagbuf(nreal,nobs)) + if(netcdf_diag) call init_netcdf_diag_ end if mm1=mype+1 scale=one @@ -1447,35 +1448,42 @@ subroutine setupdbz(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,radardbz_d ! Release memory of local guess arrays call final_vars_ - ! Write information to diagnostic file - if(radardbz_diagsave .and. ii>0 )then + if(radardbz_diagsave .and. netcdf_diag) call nc_diag_write + if(radardbz_diagsave .and. binary_diag .and. ii>0 )then - write(string,600) jiter -600 format('radardbz_',i2.2) - diag_file=trim(dirname) // trim(string) - if(init_pass) then - open(newunit=lu_diag,file=trim(diag_file),form='unformatted',status='unknown',position='rewind') + if( .not. l_use_dbz_directDA .and. .not. if_model_dbz )then + write(7)'dbz',nchar,nreal,ii,mype,ioff0 + write(7)cdiagbuf(1:ii),rdiagbuf(:,1:ii) + deallocate(cdiagbuf,rdiagbuf) else - inquire(file=trim(diag_file),exist=diagexist) - if (diagexist) then - open(lu_diag,file=trim(diag_file),form='unformatted',status='old',position='append') + + write(string,600) jiter +600 format('radardbz_',i2.2) + diag_file=trim(dirname) // trim(string) + if(init_pass) then + open(newunit=lu_diag,file=trim(diag_file),form='unformatted',status='unknown',position='rewind') else - open(lu_diag,file=trim(diag_file),form='unformatted',status='unknown',position='rewind') + inquire(file=trim(diag_file),exist=diagexist) + if (diagexist) then + open(lu_diag,file=trim(diag_file),form='unformatted',status='old',position='append') + else + open(lu_diag,file=trim(diag_file),form='unformatted',status='unknown',position='rewind') + endif + endif + if(init_pass .and. mype == 0) then + if ( .not. l_use_dbz_directDA ) then ! EnKF uses these diagnostics and EnKF uses single OBS file for now. + write(lu_diag) ianldate ! So do not write analysis date for binary in case of using direct reflectivity DA. + end if + write(6,*)'SETUPDBZ: write time record to file ',& + trim(diag_file), ' ',ianldate endif - endif - if(init_pass .and. mype == 0) then - if ( .not. l_use_dbz_directDA ) then ! EnKF uses these diagnostics and EnKF uses single OBS file for now. - write(lu_diag) ianldate ! So do not write analysis date for binary in case of using direct reflectivity DA. - end if - write(6,*)'SETUPDBZ: write time record to file ',& - trim(diag_file), ' ',ianldate - endif - write(lu_diag)'dbz',nchar,nreal,ii,mype,ioff0 - write(lu_diag)cdiagbuf(1:ii),rdiagbuf(:,1:ii) - deallocate(cdiagbuf,rdiagbuf) - close(lu_diag) + write(lu_diag)'dbz',nchar,nreal,ii,mype,ioff0 + write(lu_diag)cdiagbuf(1:ii),rdiagbuf(:,1:ii) + deallocate(cdiagbuf,rdiagbuf) + close(lu_diag) + end if end if write(6,*)'mype, irefsmlobs,irejrefsmlobs are ',mype,' ',irefsmlobs, ' ',irejrefsmlobs ! close(52) !simulated obs @@ -1773,7 +1781,7 @@ subroutine init_netcdf_diag_ end if call nc_diag_init(diag_conv_file, append=append_diag) - + if (.not. append_diag) then ! don't write headers on append - the module will break? call nc_diag_header("date_time",ianldate ) call nc_diag_header("Number_of_state_vars", nsdim ) diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index cce8970ee0..066492d4a6 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -218,7 +218,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& integer(i_kind) k1,k2,k,j,nz,jc,idia,irdim1,istatus,ioff0 integer(i_kind) ioff,itoss,ikeep,ierror_toq,ierror_poq integer(i_kind) isolz,ifovn,itoqf - integer(i_kind) mm1,itime,ilat,ilon,ilate,ilone,itoq,ipoq,iafbo !emily + integer(i_kind) mm1,itime,ilat,ilon,ilate,ilone,itoq,ipoq,iafbo,iuseflag !emily integer(i_kind),dimension(iint,nobs):: idiagbuf integer(i_kind),dimension(nlevs):: ipos,iouse,ikeepk @@ -301,6 +301,7 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& end do nlev=jc + write(6,*)'emily nlev nlevs = ', obstype, nlev, nlevs ! Handle error conditions if (nlevs>nlev) write(6,*)'SETUPOZLAY: level number reduced for ',obstype,' ', & nlevs,' --> ',nlev @@ -350,6 +351,9 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& itoqf=9 ! index of row anomaly (omi only) ifovn=14 ! index of scan position (gome and omi only) iafbo=15 ! index of algorithm flag for best ozone (for omi, ompsnm, and ompstc8) !emily + iuseflag=16 ! index of useflag !emily + if (obstype == 'ompsnp') iuseflag=10 !emily + ! If requested, save data for diagnostic ouput if(ozone_diagsave)ii=0 @@ -366,7 +370,12 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& dlat=data(ilat,i) dlon=data(ilon,i) dtime=data(itime,i) - + +!>>emily_test + ierror_toq = nint(data(itoq,i)) + ierror_poq = nint(data(ipoq,i)) +!<0) then ! write(6,*)'setupozlay: nobskeep',nobskeep @@ -425,16 +434,18 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& nlevs,mype,doz_dz) endif +!>>orig ! Check scan position errors in ompstc8 - if(obstype == "ompstc8") then - if(data(ifovn,i) == 1 .or. data(ifovn,i) == 2 .or. & - data(ifovn,i) == 3 .or. data(ifovn,i) == 4 .or. & - data(ifovn,i) == 35) then - if(abs(data(ilate,i)) > 50._r_kind)then - luse(i) = .false. - endif - endif - endif +! if(obstype == "ompstc8") then +! if(data(ifovn,i) == 1 .or. data(ifovn,i) == 2 .or. & +! data(ifovn,i) == 3 .or. data(ifovn,i) == 4 .or. & +! data(ifovn,i) == 35) then +! if(abs(data(ilate,i)) > 50._r_kind)then +! luse(i) = .false. +! endif +! endif +! endif +!<>emily + if(data(iuseflag,i) < 0) then + varinv3(k)=zero + ratio_errors(k)=zero + rat_err2=zero + if(luse(i))stats_oz(2,j) = stats_oz(2,j) + one ! number of obs tossed + endif + write(6,*)'emily checking iuseflag = ', data(iuseflag,i), varinv3(k) +! Check scan position errors in ompstc8 + if(obstype == "ompstc8") then + if(data(ifovn,i) == 1 .or. data(ifovn,i) == 2 .or. & + data(ifovn,i) == 3 .or. data(ifovn,i) == 4 .or. & + data(ifovn,i) == 35) then + if(abs(data(ilate,i)) > 50._r_kind)then + varinv3(k)=zero + ratio_errors(k)=zero + rat_err2=zero + if(luse(i))stats_oz(2,j) = stats_oz(2,j) + one ! number of obs tossed + endif + endif + endif +!<tiny_r_kind .or. & @@ -544,6 +577,11 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& if (rat_err2*varinv3(k)>tiny_r_kind .and. luse(i)) & stats_oz(7,j) = stats_oz(7,j) + one +!>>emily_added + varinv4diag(k)=varinv3(k) + rat_err4diag=rat_err2 +!< 0 .or. ipm2_5 <= 0) then + write(6,*) 'setuppm2_5: ',trim(aeroname),' missing in anavinfo' + call stop2(452) + endif + enddo + + if (size(gsi_chemguess_bundle)==nfldsig) then + aeroname='smoke' + call gsi_bundlegetpointer(gsi_chemguess_bundle(1),trim(aeroname),& + rank3,ier) + if (ier==0) then + allocate(ges_pm2_5(size(rank3,1),size(rank3,2),size(rank3,3),& + nfldsig)) + ges_pm2_5(:,:,:,1)=rank3 + allocate(pm25wc(size(rank3,1),size(rank3,2),size(rank3,3),naero_smoke_fv3,nfldsig)) + pm25wc(:,:,:,1,1)=rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_chemguess_bundle(ifld),trim(aeroname),rank3,ier) + ges_pm2_5(:,:,:,ifld)=rank3 + pm25wc(:,:,:,1,ifld)=rank3 + enddo + else + write(6,*) 'setuppm2_5: ',trim(aeroname),' not found in chembundle,ier= ',ier + call stop2(453) + endif + + do i=2,naero_smoke_fv3 + aeroname=trim(aeronames_smoke_fv3(i)) + call gsi_bundlegetpointer(gsi_chemguess_bundle(1),trim(aeroname),& + rank3,ier) + pm25wc(:,:,:,i,1)=rank3 + if (ier==0) then + ges_pm2_5(:,:,:,1)=ges_pm2_5(:,:,:,1)+rank3 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_chemguess_bundle(ifld),trim(aeroname),rank3,ier) + ges_pm2_5(:,:,:,ifld)=ges_pm2_5(:,:,:,ifld)+rank3 + pm25wc(:,:,:,i,ifld)=rank3 + enddo + else + write(6,*) 'setuppm2_5: ',trim(aeroname),' not found in chembundle,ier= ',ier + call stop2(453) + end if + end do + else + write(6,*) 'setuppm2_5: size(gsi_chemguess_bundle)/=nfldsig ges_pm2_5 not setup !!!' + call stop2(454) + end if ! eq. nfldsig + + endif + if (fv3_cmaq_regional .and. laeroana_fv3cmaq) then !check if pm25at, pm25ac and pm25co are in ges call gsi_chemguess_get ('var::pm25at', ipm2_5, ier ) @@ -632,7 +702,7 @@ subroutine setuppm2_5(obsLL,odiagLL,lunin,mype,nreal,nobs,isis,is,conv_diagsave) !convert for cmaq as well - if (wrf_mass_regional .or. fv3_cmaq_regional) then + if (wrf_mass_regional .or. fv3_cmaq_regional .or. laeroana_fv3smoke) then call tintrp2a11(ges_ps,ps_ges,dlat,dlon,dtime,hrdifsig,& mype,nfldsig) @@ -669,17 +739,48 @@ subroutine setuppm2_5(obsLL,odiagLL,lunin,mype,nreal,nobs,isis,is,conv_diagsave) call tintrp2a11(ges_pm2_5,pm2_5ges,dlat,dlon,dtime,hrdifsig,& mype,nfldsig) innov = conc - pm2_5ges + if (laeroana_fv3smoke) then + if ( -1.0*innov >= pm2_5_innov_threshold .or. & + (innov > pm2_5_innov_threshold .and. pm2_5ges >=1.0_r_kind).or. & + (conc >= 40.0_r_kind .and. pm2_5ges >=1.0_r_kind).or. & + conc >= 100.0_r_kind ) then + innov = innov + else + innov = 0.0_r_kind + muse(i)=.false. + end if + if (tv_ges-273.15_r_kind < 5.0_r_kind) then + innov = 0.0_r_kind + muse(i)=.false. + end if + + end if end if if ( fv3_cmaq_regional .and. laeroana_fv3cmaq) then -! interpoloate pm25ac + ! interpoloate pm25ac call tintrp2a11(pm25wc(:,:,:,1,nfldsig),pm25wc_ges(1),dlat,dlon,dtime,hrdifsig,& mype,nfldsig) call tintrp2a11(pm25wc(:,:,:,2,nfldsig),pm25wc_ges(2),dlat,dlon,dtime,hrdifsig,& mype,nfldsig) call tintrp2a11(pm25wc(:,:,:,3,nfldsig),pm25wc_ges(3),dlat,dlon,dtime,hrdifsig,& mype,nfldsig) + elseif (laeroana_fv3smoke) then + call tintrp2a11(pm25wc(:,:,:,1,nfldsig),pm25wc_ges(1),dlat,dlon,dtime,hrdifsig,& + mype,nfldsig) + call tintrp2a11(pm25wc(:,:,:,2,nfldsig),pm25wc_ges(2),dlat,dlon,dtime,hrdifsig,& + mype,nfldsig) + if (pm25wc_ges(1) >= 1.0_r_kind) then + pm25wc_ges(1)=1.0_r_kind + else + pm25wc_ges(2)=0.0_r_kind + end if + if (pm25wc_ges(2) >= 1.0_r_kind) then + pm25wc_ges(2)=1.0_r_kind + else + pm25wc_ges(2)=0.0_r_kind + end if else pm25wc_ges = 0.0_r_kind end if diff --git a/src/gsi/setupps.f90 b/src/gsi/setupps.f90 index 6a6b4f72f3..1cee2e5478 100644 --- a/src/gsi/setupps.f90 +++ b/src/gsi/setupps.f90 @@ -997,8 +997,6 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Observation", sngl(pob) ) call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(pob-pges) ) call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(pob-pgesorig)) - call nc_diag_metadata("Forecast_adjusted", sngl(pges) ) - call nc_diag_metadata("Forecast_unadjusted", sngl(pgesorig) ) if (lobsdiagsave) then diff --git a/src/gsi/setupq.f90 b/src/gsi/setupq.f90 index b9750dde21..702c68e692 100644 --- a/src/gsi/setupq.f90 +++ b/src/gsi/setupq.f90 @@ -111,6 +111,8 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! information in diagonostic file, which is used ! in offline observation quality control program (AutoObsQC) ! for 3D-RTMA (if l_obsprvdiag is true). +! 2023-03-09 Draper added option to interpolate screen-level q from model 2m output. +! (hofx_2m_sfcfile) ! ! ! input argument list: @@ -162,7 +164,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav 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,superfact,limitqobs + use jfunc, only: jiter,last,jiterstart,miter,superfact,limitqobs,hofx_2m_sfcfile use convinfo, only: nconvtype,cermin,cermax,cgross,cvar_b,cvar_pg,ictype use convinfo, only: ibeta,ikapa use convinfo, only: icsubtype @@ -219,7 +221,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! Declare local variables real(r_double) rstation_id - real(r_kind) qob,qges,qsges,q2mges,q2mges_water + real(r_kind) qob,qges,qsges,q2mges,q2mges_water,qsges_o real(r_kind) ratio_errors,dlat,dlon,dtime,dpres,rmaxerr,error real(r_kind) rsig,dprpx,rlow,rhgh,presq,tfact,ramp real(r_kind) psges,sfcchk,ddiff,errorx @@ -233,6 +235,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),dimension(nobs):: dup real(r_kind),dimension(lat2,lon2,nsig,nfldsig):: qg real(r_kind),dimension(lat2,lon2,nfldsig):: qg2m + real(r_kind),dimension(lat2,lon2,nfldsig):: qg2m_o real(r_kind),dimension(nsig):: prsltmp real(r_kind),dimension(34):: ptablq real(r_single),allocatable,dimension(:,:)::rdiagbuf @@ -240,7 +243,8 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),dimension(nsig):: prsltmp2, ttmp, qtmp, utmp,vtmp,hsges real(r_kind) :: psges2 real(r_kind),dimension(nsig+1):: prsitmp - + real(r_kind),dimension(nsig):: ttmp_reverse,qtmp_reverse,utmp_reverse,vtmp_reverse,hsges_reverse, prsltmp2_reverse !emily + real(r_kind),dimension(nsig+1):: prsitmp_reverse !emily integer(i_kind) i,j,nchar,nreal,ii,l,jj,mm1,itemp,iip integer(i_kind) jsig,itype,k,nn,ikxx,iptrb,ibin,ioff,ioff0,icat,ijb @@ -248,6 +252,8 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav integer(i_kind) ier2,iuse,ilate,ilone,istnelv,iobshgt,izz,iprvd,isprvd integer(i_kind) idomsfc,iderivative integer(i_kind) ibb,ikk,idddd + integer(i_kind) kk, isli !emily + integer(i_kind) water_frac,land_frac,ice_frac !emily real(r_kind) :: delz type(sparr2) :: dhx_dx integer(i_kind) :: iz, q_ind, nind, nnz,iprev_station @@ -282,12 +288,22 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),allocatable,dimension(:,:,: ) :: ges_ps real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q real(r_kind),allocatable,dimension(:,:,: ) :: ges_q2m - real(r_kind),allocatable,dimension(:,:,:,:) :: ges_u - real(r_kind),allocatable,dimension(:,:,:,:) :: ges_v + real(r_kind),allocatable,dimension(:,:,: ) :: ges_t2m logical:: l_pbl_pseudo_itype integer(i_kind):: ich0 type(obsLList),pointer,dimension(:):: qhead + + logical :: landsfctype + + real(r_kind) :: delta_z, lapse_error, q_delta_terrain + real(r_kind), parameter :: T_lapse = -0.0045 ! standard lapse rate, K/m +! use 4.5 K/km, in place of more standard 6.5 K/km, following +! https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019EA000984 +! lapse_error_frac around 0.5 ~ 2K/km, from Figure 2 of above. + real(r_kind), parameter :: lapse_error_frac = 0.5 ! inflation factor for obs error when vertically interpolating + real(r_kind), parameter :: max_delta_z = 300. ! max. vertical mismatch allowed (later: relax this) + qhead => obsLL(:) save_jacobian = conv_diagsave .and. jiter==jiterstart .and. lobsdiag_forenkf @@ -366,8 +382,11 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav hr_offset=min_offset/60.0_r_kind dup=one do k=1,nobs + ikx=nint(data(ikxx,k)) + itype=ictype(ikx) + landsfctype =( itype==181 .or. itype==183 .or. itype==187 .or. itype==188 ) do l=k+1,nobs - if (twodvar_regional) then + if (twodvar_regional .or. (hofx_2m_sfcfile .and. landsfctype) ) then duplogic=data(ilat,k) == data(ilat,l) .and. & data(ilon,k) == data(ilon,l) .and. & data(ier,k) < r1000 .and. data(ier,l) < r1000 .and. & @@ -432,9 +451,15 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ice=.false. ! get larger (in rh) q obs error for mixed and ice phases iderivative=0 + + ! calculate qsat and 2m qsat 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) - qg2m(:,:,jj)=qg(:,:,1,jj) + call genqsat(qg(:,:,:,jj),ges_tsen(:,:,:,jj),ges_prsl(:,:,:,jj),lat2,lon2,nsig,ice,iderivative) + if (i_use_2mq4b > 0) then ! use lowest model level + qg2m(:,:,jj)=qg(:,:,1,jj) + elseif ( hofx_2m_sfcfile ) then ! calculate from 2m model output + call genqsat(qg2m(:,:,jj),ges_t2m(:,:,jj),ges_ps(:,:,jj),lat2,lon2,1,ice,iderivative) + endif end do @@ -447,10 +472,10 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call dtime_check(dtime, in_curbin, in_anybin) if(.not.in_anybin) cycle + landsfctype =( itype==181 .or. itype==183 .or. itype==187 ) ! Flag static conditions to create PBL_pseudo_surfobsq obs. - l_pbl_pseudo_itype = l_pbl_pseudo_surfobsq .and. & - ( itype==181 .or. itype==183 .or.itype==187 ) + l_pbl_pseudo_itype = l_pbl_pseudo_surfobsq .and. landsfctype if(in_curbin) then ! Convert obs lats and lons to grid coordinates @@ -522,10 +547,10 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav nsig,mype,nfldsig) call tintrp2a1(ges_q,qtmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) - call tintrp2a1(ges_u,utmp,dlat,dlon,dtime,hrdifsig,& - nsig,mype,nfldsig) - call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,& - nsig,mype,nfldsig) +! call tintrp2a1(ges_u,utmp,dlat,dlon,dtime,hrdifsig,& +! nsig,mype,nfldsig) +! call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,& +! nsig,mype,nfldsig) call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) @@ -533,24 +558,28 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav presq=r10*exp(dpres) itype=ictype(ikx) dprpx=zero - if(((itype > 179 .and. itype < 190) .or. itype == 199) & + + if ( hofx_2m_sfcfile .and. landsfctype) then + dpres = one ! put obs on surface + else + if(((itype > 179 .and. itype < 190) .or. itype == 199) & .and. .not.twodvar_regional)then - dprpx=abs(one-exp(dpres-log(psges)))*r10 - end if + dprpx=abs(one-exp(dpres-log(psges)))*r10 + endif ! Put obs pressure in correct units to get grid coord. number - call grdcrd1(dpres,prsltmp(1),nsig,-1) + call grdcrd1(dpres,prsltmp(1),nsig,-1) ! Get approximate k value of surface by using surface pressure - sfcchk=log(psges) - call grdcrd1(sfcchk,prsltmp(1),nsig,-1) + sfcchk=log(psges) + call grdcrd1(sfcchk,prsltmp(1),nsig,-1) ! Check to see if observations is above the top of the model (regional mode) - if( dpres>=nsig+1)dprpx=1.e6_r_kind - if((itype > 179 .and. itype < 186) .or. itype == 199) dpres=one + if( dpres>=nsig+1)dprpx=1.e6_r_kind + if((itype > 179 .and. itype < 186) .or. itype == 199) dpres=one + + endif -! Scale errors by guess saturation q - qob = data(iqob,i) if(limitqobs) then call tintrp31(ges_qsat,qsges,dlat,dlon,dpres,dtime,hrdifsig,& @@ -558,11 +587,13 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav qob=min(qob,superfact*qsges) end if +! get qsges, to be used to scale the obs error 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 + +! overwrite qsges with 2-m qs if sfc obs scheme + if( ( (i_use_2mq4b > 0) .and. ((itype > 179 .and. itype < 190) .or. itype == 199) & + .and. .not.twodvar_regional) .or. (hofx_2m_sfcfile .and. landsfctype) )then call tintrp2a11(qg2m,qsges,dlat,dlon,dtime,hrdifsig,mype,nfldsig) endif @@ -573,10 +604,36 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav rmaxerr=max(small2,rmaxerr) errorx =(data(ier,i)+dprpx)*qsges -! Interpolate guess moisture to observation location and time - call tintrp31(ges_q,qges,dlat,dlon,dpres,dtime, & - hrdifsig,mype,nfldsig) - +! qges: Interpolate guess moisture to observation location and time + + if (.not. ( hofx_2m_sfcfile .and. landsfctype) ) then + call tintrp31(ges_q,qges,dlat,dlon,dpres,dtime, & + hrdifsig,mype,nfldsig) + else + ! only use land locations + if (int(data(idomsfc,i)) .NE. 1 ) muse(i) = .false. + + call tintrp2a11(ges_q2m,qges,dlat,dlon,dtime,hrdifsig,mype,nfldsig) + + ! terrain correction: assume RH_zo = RH_zm, and correct T with + ! same lapse rate as used for T2m terrain correction + + delta_z = data(istnelv,i) - data(izz,i) ! obs -model + + do jj=1,nfldsig + ! qsat in model at height of obs + call genqsat(qg2m_o(:,:,jj),ges_t2m(:,:,jj)+delta_z*T_lapse,ges_ps(:,:,jj),lat2,lon2,1,ice,iderivative) + enddo + + call tintrp2a11(qg2m_o,qsges_o,dlat,dlon,dtime,hrdifsig,mype,nfldsig) + q_delta_terrain = (qsges/qsges_o - 1)*qob + qob = qob * ( qsges/qsges_o) + + !update the station elevation + data(istnelv,i) = data(izz,i) + + endif + ddiff=qob-qges ! Setup dynamic ob error specification for aircraft recon in hurricanes @@ -596,18 +653,22 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav endif errorx =max(small1,errorx) - ! Adjust observation error to reflect the size of the residual. ! If extrapolation occurred, then further adjust error according to ! amount of extrapolation. - rlow=max(sfcchk-dpres,zero) + if (.not. (hofx_2m_sfcfile .and. landsfctype) ) then + rlow=max(sfcchk-dpres,zero) ! linear variation of observation ramp [between grid points 1(~3mb) and 15(~45mb) below the surface] - if(l_sfcobserror_ramp_q) then - ramp=min(max(((rlow-1.0_r_kind)/(15.0_r_kind-1.0_r_kind)),0.0_r_kind),1.0_r_kind)*0.001_r_kind + if(l_sfcobserror_ramp_q) then + ramp=min(max(((rlow-1.0_r_kind)/(15.0_r_kind-1.0_r_kind)),0.0_r_kind),1.0_r_kind)*0.001_r_kind + else + ramp=rlow + endif else - ramp=rlow + rlow = zero + ramp = zero endif rhgh=max(dpres-r0_001-rsig,zero) @@ -618,7 +679,20 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav if(rhgh/=zero) awork(3) = awork(3) + one end if - ratio_errors=error*qsges/(errorx+1.0e6_r_kind*rhgh+r8*ramp) +! inflate error for uncertainty in the terrain adjustment + lapse_error = 0. + if ( hofx_2m_sfcfile .and. landsfctype) then + if (abs(delta_z)max_delta_z do not assim. + ! inflate obs error to account for error in lapse_rate + ! also include some representativity error here (assuming + ! delta_z ~ heterogeneity) + lapse_error = abs(lapse_error_frac*q_delta_terrain) + else + muse(i)=.false. + endif + endif + + ratio_errors=error*qsges/(errorx+1.0e6_r_kind*rhgh+r8*ramp + lapse_error) ! Check to see if observations is above the top of the model (regional mode) if (dpres > rsig) ratio_errors=zero @@ -642,7 +716,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav dhx_dx%val(2) = delz ! weight for iz+1's level endif -! Interpolate 2-m q to obs locations/times +! i_use_2mq4b: Interpolate 2-m q to obs locations/times if(i_use_2mq4b>0 .and. itype > 179 .and. itype < 190 .and. .not.twodvar_regional)then if(i_coastline==2 .or. i_coastline==3) then @@ -667,7 +741,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call stop2(100) endif ddiff=qob-qges - endif + endif ! i_use_2mq4b ! If requested, setup for single obs test. @@ -967,7 +1041,7 @@ subroutine setupq(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav my_head => null() ENDDO - endif ! 181,183,187 + endif ! l_pbl_pseudo_itype !!!!!!!!!!!!!!!!!! PBL pseudo surface obs !!!!!!!!!!!!!!!!!!!!!!! ! End of loop over observations @@ -1049,7 +1123,7 @@ subroutine init_vars_ call stop2(999) endif ! get q2m ... - if (i_use_2mq4b>0) then + if (i_use_2mq4b>0 .or. hofx_2m_sfcfile) then varname='q2m' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank2,istatus) if (istatus==0) then @@ -1068,42 +1142,25 @@ subroutine init_vars_ call stop2(999) endif endif ! i_use_2mq4b -! get u ... - varname='u' - call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) - if (istatus==0) then - if(allocated(ges_u))then - write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' - call stop2(999) - endif - allocate(ges_u(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) - ges_u(:,:,:,1)=rank3 - do ifld=2,nfldsig - call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) - ges_u(:,:,:,ifld)=rank3 - enddo - else - write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus - call stop2(999) - endif -! get v ... - varname='v' - call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) - if (istatus==0) then - if(allocated(ges_v))then - write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + if (hofx_2m_sfcfile) then + varname='t2m' + call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank2,istatus) + if (istatus==0) then + if(allocated(ges_t2m))then + write(6,*) trim(myname), ': ', trim(varname), ' already incorrectly alloc ' + call stop2(999) + endif + allocate(ges_t2m(size(rank2,1),size(rank2,2),nfldsig)) + ges_t2m(:,:,1)=rank2 + do ifld=2,nfldsig + call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank2,istatus) + ges_t2m(:,:,ifld)=rank2 + enddo + else + write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) - endif - allocate(ges_v(size(rank3,1),size(rank3,2),size(rank3,3),nfldsig)) - ges_v(:,:,:,1)=rank3 - do ifld=2,nfldsig - call gsi_bundlegetpointer(gsi_metguess_bundle(ifld),trim(varname),rank3,istatus) - ges_v(:,:,:,ifld)=rank3 - enddo - else - write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus - call stop2(999) - endif + endif + endif ! hofx_2m_sfcfile ! get q ... varname='q' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank3,istatus) @@ -1332,8 +1389,10 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Observation_Subtype", icsubtype(ikx) ) call nc_diag_metadata("Latitude", sngl(data(ilate,i)) ) call nc_diag_metadata("Longitude", sngl(data(ilone,i)) ) +! this is the obs height after being interpolated to the model (=model height) call nc_diag_metadata("Station_Elevation", sngl(data(istnelv,i)) ) call nc_diag_metadata("Pressure", sngl(presq) ) +! this is the original obs height (= stn elevation, before being interpolated) call nc_diag_metadata("Height", sngl(data(iobshgt,i)) ) call nc_diag_metadata("Time", sngl(dtime-time_offset)) call nc_diag_metadata("Prep_QC_Mark", sngl(data(iqc,i)) ) @@ -1352,8 +1411,6 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Observation", sngl(data(iqob,i))) call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(ddiff) ) call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(qob-qges) ) - call nc_diag_metadata("Forecast_adjusted", sngl(data(iqob,i)-ddiff)) - call nc_diag_metadata("Forecast_unadjusted", sngl(qges)) call nc_diag_metadata("Forecast_Saturation_Spec_Hum", sngl(qsges) ) if (lobsdiagsave) then do jj=1,miter @@ -1385,6 +1442,20 @@ subroutine contents_netcdf_diag_(odiag) endif ! GEOVALS + !>>emily + do k = 1, nsig + kk = nsig-k+1 + utmp_reverse(kk) = utmp(k) + vtmp_reverse(kk) = vtmp(k) + ttmp_reverse(kk) = ttmp(k) + qtmp_reverse(kk) = qtmp(k) + hsges_reverse(kk) = hsges(k) + prsltmp2_reverse(kk) = prsltmp2(k) + enddo + do k = 1, nsig+1 + kk = (nsig+1)-k+1 + prsitmp_reverse(kk) = prsitmp(k) + enddo call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp)) @@ -1392,7 +1463,31 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_data2d("eastward_wind", sngl(utmp)) call nc_diag_data2d("northward_wind", sngl(vtmp)) call nc_diag_data2d("geopotential_height", sngl(hsges) ) + !<>orig +! call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) +! call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) +! call nc_diag_data2d("air_temperature", sngl(ttmp)) +! call nc_diag_data2d("specific_humidity", sngl(qtmp)) +! call nc_diag_data2d("eastward_wind", sngl(utmp)) +! call nc_diag_data2d("northward_wind", sngl(vtmp)) +! call nc_diag_data2d("geopotential_height", sngl(hsges) ) +!<>emily + isli = data(idomsfc,i) + water_frac = 0.0 + land_frac = 0.0 + ice_frac = 0.0 + if (isli == 0) water_frac = 1.0 + if (isli == 1) land_frac = 1.0 + if (isli == 2) ice_frac = 1.0 + call nc_diag_metadata("Water_Fraction", sngl(water_frac)) + call nc_diag_metadata("Land_Fraction", sngl(land_frac)) + call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) +!<>emily + real(r_kind),dimension(nchanl):: varinv_grosschk, varinv_sdoei + real(r_kind),dimension(nchanl):: varinv_after_jsfcchk,varinv_after_sdoei + real(r_kind),dimension(nchanl):: varinv_after_grosschk + real(r_kind),dimension(nchanl):: varinv_after_wavenum,varinv_after_rangechk,varinv_after_topo,varinv_after_transmittop + real(r_kind),dimension(nchanl):: varinv_after_clddet,varinv_after_jsfcchk_land,varinv_after_nsstret + real(r_kind),dimension(nchanl):: varinv_after_grossroutinechk_over_ocean + real(r_kind),dimension(nchanl):: varinv_after_grossroutinechk + real(r_kind),dimension(nchanl):: varinv_after_sfcchk + real(r_kind),dimension(nchanl):: varinv_after_ch2chk + real(r_kind),dimension(nchanl):: varinv_after_scatteringchk + real(r_kind),dimension(nchanl):: varinv_after_sfcterrianchk + real(r_kind),dimension(nchanl):: varinv_after_clrfracchk + real(r_kind),dimension(nchanl):: varinv_after_stdchk + real(r_kind),dimension(nchanl):: varinv_after_stdadj + real(r_kind) :: pred9,pred10,pred11 !emily +!< nchanl)then @@ -558,10 +584,9 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! ! Set error instrument channels tnoise(jc)=varch(j) - channel_passive=iuse_rad(j)==-1 .or. iuse_rad(j)==0 - if (iuse_rad(j)< -1 .or. (channel_passive .and. & + if (iuse_rad(j)< -1 .or. (channel_passive(j) .and. & .not.rad_diagsave)) tnoise(jc)=r1e10 - if (passive_bc .and. channel_passive) tnoise(jc)=varch(j) + if (passive_bc .and. channel_passive(j)) tnoise(jc)=varch(j) if (iuse_rad(j)>0) l_may_be_passive=.true. if (tnoise(jc) < 1.e4_r_kind) toss = .false. @@ -776,6 +801,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! Loop over data in this block call dtime_setup() +! write(6,*)'emily checking nobs = ', isis, nobs do n = 1,nobs ! Extract analysis relative observation time. dtime = data_s(itime,n) @@ -813,7 +839,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& if(seviri .and. abs(data_s(iszen_ang,n)) > 180.0_r_kind) data_s(iszen_ang,n)=r100 -! Set land/sea, snow, ice percentages and flags (no time interpolation) +! Set land/sea, snow, i e percentages and flags (no time interpolation) sea = data_s(ifrac_sea,n) >= 0.99_r_kind land = data_s(ifrac_lnd,n) >= 0.99_r_kind @@ -845,25 +871,6 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& iinstr=getindex(idnames,trim(covtype)) endif endif - do jc=1,nchanl - j=ich(jc) - - tnoise(jc)=varch(j) - - if(sea .and. (varch_sea(j)>zero)) tnoise(jc)=varch_sea(j) - if(land .and. (varch_land(j)>zero)) tnoise(jc)=varch_land(j) - if(ice .and. (varch_ice(j)>zero)) tnoise(jc)=varch_ice(j) - if(snow .and. (varch_snow(j)>zero)) tnoise(jc)=varch_snow(j) - if(mixed .and. (varch_mixed(j)>zero)) tnoise(jc)=varch_mixed(j) - tnoise_save = tnoise(jc) - - channel_passive=iuse_rad(j)==-1 .or. iuse_rad(j)==0 - if (iuse_rad(j)< -1 .or. (channel_passive .and. & - .not.rad_diagsave)) tnoise(jc)=r1e10 - if (passive_bc .and. channel_passive) tnoise(jc)=tnoise_save - if (tnoise(jc) < 1.e4_r_kind) toss = .false. - end do - ! Count data of different surface types if(luse(n))then if (mixed) then @@ -884,9 +891,30 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& endif endif + do jc=1,nchanl + j=ich(jc) + + tnoise(jc)=varch(j) + + if(mixed .and. (varch_mixed(j)>zero)) then + tnoise(jc)=varch_mixed(j) + else if(snow .and. (varch_snow(j)>zero)) then + tnoise(jc)=varch_snow(j) + else if(ice .and. (varch_ice(j)>zero)) then + tnoise(jc)=varch_ice(j) + else if(land .and. (varch_land(j)>zero)) then + tnoise(jc)=varch_land(j) + else if(sea .and. (varch_sea(j)>zero)) then + tnoise(jc)=varch_sea(j) + end if + + if (.not. (passive_bc .and. channel_passive(j))) then + if (iuse_rad(j)< -1 .or. (channel_passive(j) .and. & + .not.rad_diagsave)) tnoise(jc)=r1e10 + end if + ! Load channel data into work array. - do i = 1,nchanl - tb_obs(i) = data_s(i+nreal,n) + tb_obs(jc) = data_s(jc+nreal,n) end do @@ -994,10 +1022,11 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& tsavg5=tsavg5+dtsavg endif +! Compute microwave cloud liquid water or graupel water path for bias correction and QC. + if (adp_anglebc) then ! If using adaptive angle dependent bias correction, update the predicctors ! for this part of bias correction. The AMSUA cloud liquid water algorithm ! uses total angle dependent bias correction for channels 1 and 2 - if (adp_anglebc) then do i=1,nchanl mm=ich(i) if (goessndr .or. goes_img .or. ahi .or. seviri .or. ssmi .or. ssmis .or. gmi .or. abi) then @@ -1016,8 +1045,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& end if end do end if - -! Compute microwave cloud liquid water or graupel water path for bias correction and QC. +!***** clw_obs=zero clw_guess_retrieval=zero gwp=zero @@ -1054,10 +1082,8 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& id_qc(1:nchanl) = ifail_cloud_qc endif endif - endif ! Screening for cold-air outbreak area (only applied to MW for now) - if (cao_check .and. radmod%lprecip) then - if(microwave .and. sea) then + if (cao_check .and. radmod%lprecip) then if(radmod%lcloud_fwd) then cao_flag = (stability < 12.0_r_kind) .and. (hwp_ratio < half) .and. (tcwv < 8.0_r_kind) if (cao_flag) then ! remove all tropospheric channels @@ -1080,12 +1106,17 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& endif endif +! totbc = total bias correction !emily + totbc=zero !emily predbias=zero - cld_rbc_idx2=zero + abi2km_bc = zero + abi2km_bc(2) = 233.5_r_kind + abi2km_bc(3) = 241.7_r_kind + abi2km_bc(4) = 250.5_r_kind +!$omp parallel do schedule(dynamic,1) private(i,mm,j,k,tlap,node,bias) do i=1,nchanl mm=ich(i) - !***** ! COMPUTE AND APPLY BIAS CORRECTION TO SIMULATED VALUES !***** @@ -1111,30 +1142,10 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& else pred(3,i) = clw_obs*cosza*cosza end if + if(radmod%lcloud_fwd .and. sea) pred(3,i ) = zero - - - ! Apply bias correction - - kmax(i) = 0 - if (lwrite_peakwt .or. passive_bc) then - ptau5derivmax = -9.9e31_r_kind -! maximum of weighting function is level at which transmittance -! (ptau5) is changing the fastest. This is used for the level -! assignment (needed for vertical localization). - weightmax(i) = zero - do k=2,nsig - ptau5deriv = abs( (ptau5(k-1,i)-ptau5(k,i))/ & - (log(prsltmp(k-1))-log(prsltmp(k))) ) - if (ptau5deriv > ptau5derivmax) then - ptau5derivmax = ptau5deriv - kmax(i) = k - weightmax(i) = r10*prsitmp(k) ! cb to mb. - end if - enddo - end if tlapchn(i)= (ptau5(2,i)-ptau5(1,i))*(tsavg5-tvp(2)) do k=2,nsig-1 @@ -1180,6 +1191,18 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& end do end if + if (abi2km .and. regional) then + pred(:,i) = zero + if (i>=2 .and. i<=4) then + if (tb_obs(i) > 190.0_r_kind .and. tb_obs(i) < 300.0_r_kind) then + pred(1,i)=1.0_r_kind + pred(2,i)=tb_obs(i)-abi2km_bc(i) + pred(3,i)=(tb_obs(i)-abi2km_bc(i))**2 + pred(4,i)=(tb_obs(i)-abi2km_bc(i))**3 + end if + end if + end if + do j = 1,npred predbias(j,i) = predchan(j,i)*pred(j,i) end do @@ -1196,12 +1219,14 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! tbcnob = obs - guess before bias correction tbcnob(i) = tb_obs(i) - tsim(i) tbc(i) = tbcnob(i) - + do j=1, npred-angord tbc(i)=tbc(i) - predbias(j,i) !obs-ges with bias correction + totbc(i) = totbc(i) + predbias(j,i) end do tbc(i)=tbc(i) - predbias(npred+1,i) tbc(i)=tbc(i) - predbias(npred+2,i) + totbc(i) = totbc(i) + predbias(npred+1,i)+predbias(npred+2,i) ! Calculate cloud effect for QC if (radmod%cld_effect .and. eff_area) then @@ -1216,15 +1241,37 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& bias = bias+predbias(npred+2,i) cldeff_obs(i)=cldeff_obs(i) - bias ! observed cloud delta (bias corrected) endif + end do + kmax = 0 + if (lwrite_peakwt .or. passive_bc) then +!$omp parallel do schedule(dynamic,1) private(i,k,ptau5derivmax,ptau5deriv) + do i=1,nchanl + ptau5derivmax = -9.9e31_r_kind +! maximum of weighting function is level at which transmittance +! (ptau5) is changing the fastest. This is used for the level +! assignment (needed for vertical localization). + weightmax(i) = zero + do k=2,nsig + ptau5deriv = abs( (ptau5(k-1,i)-ptau5(k,i))/ & + (log(prsltmp(k-1))-log(prsltmp(k))) ) + if (ptau5deriv > ptau5derivmax) then + ptau5derivmax = ptau5deriv + kmax(i) = k + weightmax(i) = r10*prsitmp(k) ! cb to mb. + end if + enddo ! End of loop over channels - end do + end do + end if ! Compute retrieved microwave cloud liquid water and ! assign cld_rbc_idx for bias correction in allsky conditions cld_rbc_idx=one + cld_rbc_idx2=zero if (radmod%lcloud_fwd .and. radmod%ex_biascor .and. eff_area) then ierrret=0 +!$omp parallel do schedule(dynamic,1) private(i,mm,j) do i=1,nchanl mm=ich(i) tsim_bc(i)=tsim(i) @@ -1240,19 +1287,19 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& tsim_clr_bc(i)=tsim_clr_bc(i)+predbias(npred+2,i) end do - if(amsua.or.atms) call ret_amsua(tsim_bc,nchanl,tsavg5,zasat,clw_guess_retrieval,ierrret) - if(gmi) then - call gmi_37pol_diff(tsim_bc(6),tsim_bc(7),tsim_clr_bc(6),tsim_clr_bc(7),clw_guess_retrieval,ierrret) - call gmi_37pol_diff(tb_obs(6),tb_obs(7),tsim_clr_bc(6),tsim_clr_bc(7),clw_obs,ierrret) + if(amsua.or.atms) then + call ret_amsua(tsim_bc,nchanl,tsavg5,zasat,clw_guess_retrieval,ierrret) + else if(gmi) then + call gmi_37pol_diff(tsim_bc(6),tsim_bc(7),tsim_clr_bc(6),tsim_clr_bc(7),clw_guess_retrieval,ierrret) + call gmi_37pol_diff(tb_obs(6),tb_obs(7),tsim_clr_bc(6),tsim_clr_bc(7),clw_obs,ierrret) end if if (radmod%ex_obserr=='ex_obserr1') then call radiance_ex_biascor(radmod,nchanl,tsim_bc,tsavg5,zasat, & clw_guess_retrieval,clw_obs,cld_rbc_idx,ierrret) - end if -! if (radmod%ex_obserr=='ex_obserr2') then ! comment out for now, need to be tested +! else if (radmod%ex_obserr=='ex_obserr2') then ! comment out for now, need to be tested ! call radiance_ex_biascor(radmod,nchanl,cldeff_obs,cldeff_fg,cld_rbc_idx) ! end if - if (radmod%ex_obserr=='ex_obserr3') then + else if (radmod%ex_obserr=='ex_obserr3') then call radiance_ex_biascor_gmi(radmod,clw_obs,clw_guess_retrieval,nchanl,cld_rbc_idx) end if @@ -1305,17 +1352,17 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! Assign observation error for all-sky radiances if (radmod%lcloud_fwd .and. eff_area) then - if (radmod%ex_obserr=='ex_obserr1') & + if (radmod%ex_obserr=='ex_obserr1') then call radiance_ex_obserr(radmod,nchanl,clw_obs,clw_guess_retrieval,tnoise,tnoise_cld,error0) - if (radmod%ex_obserr=='ex_obserr3') & + else if (radmod%ex_obserr=='ex_obserr3') then call radiance_ex_obserr_gmi(radmod,nchanl,clw_obs,clw_guess_retrieval,tnoise,tnoise_cld,error0) + end if end if do i=1,nchanl mm=ich(i) - channel_passive=iuse_rad(ich(i))==-1 .or. iuse_rad(ich(i))==0 - if(tnoise(i) < 1.e4_r_kind .or. (channel_passive .and. rad_diagsave) & - .or. (passive_bc .and. channel_passive))then + if(tnoise(i) < 1.e4_r_kind .or. (channel_passive(mm) .and. rad_diagsave) & + .or. (passive_bc .and. channel_passive(mm)))then varinv(i) = varinv(i)/error0(i)**2 errf(i) = error0(i) else @@ -1347,14 +1394,10 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& do i=1,nchanl m=ich(i) - if (varinv(i) < tiny_r_kind) then - varinv_use(i) = zero + if (icld_det(m)>0 .and. varinv(i) >= tiny_r_kind) then + varinv_use(i) = varinv(i) else - if ((icld_det(m)>0)) then - varinv_use(i) = varinv(i) - else - varinv_use(i) = zero - end if + varinv_use(i) = zero end if end do call qc_irsnd(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse(n),goessndr, & @@ -1381,7 +1424,8 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& call qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse(n), & zsges,cenlat,tb_obsbc1,cosza,clw_obs,tbc,ptau5,emissivity_k,ts, & - pred,predchan,id_qc,aivals,errf,errf0,clw_obs,varinv,cldeff_obs,cldeff_fg,factch6, & + pred,predchan,id_qc,aivals,errf,errf0,clw_obs,varinv,varinv_sdoei,varinv_grosschk,varinv_after_jsfcchk,varinv_after_sdoei,cldeff_obs,cldeff_fg,factch6,factch4,qc4emiss_out, & !emily + ! pred,predchan,id_qc,aivals,errf,errf0,clw_obs,varinv,cldeff_obs,cldeff_fg,factch6, & !orig cld_rbc_idx,sfc_speed,error0,clw_guess_retrieval,scatp,radmod) ! If cloud impacted channels not used turn off predictor @@ -1422,7 +1466,8 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& call qc_atms(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse(n), & zsges,cenlat,tb_obsbc1,cosza,clw_obs,tbc,ptau5,emissivity_k,ts, & - pred,predchan,id_qc,aivals,errf,errf0,clw_obs,varinv,cldeff_obs,cldeff_fg,factch6, & + pred,predchan,id_qc,aivals,errf,errf0,clw_obs,varinv,varinv_sdoei,varinv_grosschk,varinv_after_jsfcchk,varinv_after_sdoei,cldeff_obs,cldeff_fg,factch6,factch4,qc4emiss_out, & ! emily + ! pred,predchan,id_qc,aivals,errf,errf0,clw_obs,varinv,cldeff_obs,cldeff_fg,factch6, & !orig cld_rbc_idx,sfc_speed,error0,clw_guess_retrieval,scatp,radmod) ! ---------- GOES imager -------------- @@ -1446,14 +1491,10 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& else if (seviri .or. abi .or. ahi) then do i=1,nchanl m=ich(i) - if (varinv(i) < tiny_r_kind) then - varinv_use(i) = zero + if (icld_det(m)>0 .and. varinv(i) >= tiny_r_kind) then + varinv_use(i) = varinv(i) else - if ((icld_det(m)>0)) then - varinv_use(i) = varinv(i) - else - varinv_use(i) = zero - end if + varinv_use(i) = zero end if end do @@ -1463,7 +1504,21 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& call qc_geocsr(nchanl,is,ndat,nsig,ich,sea,land,ice,snow,luse(n), & zsges,trop5,tzbgr,tsavg5,tb_obs_sdv,tbc,tb_obs,tnoise,ptau5,prsltmp,tvp,temp,wmix,emissivity_k,ts, & - id_qc,aivals,errf,varinv,varinv_use,cld,cldp,kmax,abi,ahi,seviri) +! id_qc,aivals,errf,varinv,varinv_use,cld,cldp,kmax,abi,ahi,seviri) +!>>emily + id_qc,aivals,errf,varinv,varinv_use, & + varinv_after_sfcterrianchk, & + varinv_after_rangechk, & + varinv_after_topo, & + varinv_after_transmittop, & + varinv_after_clddet, & + varinv_after_stdchk, & + varinv_after_grossroutinechk, & + varinv_after_stdadj, & + varinv_after_nsstret, & + varinv_after_jsfcchk, & +!<>emily + do i=1,nchanl + varinv_after_clrfracchk(i) = varinv(i) + end do +!< tiny_r_kind .and. & - (tb_obs(7)-tb_obs(8))-(tsim(7)-tsim(8)) <= -0.75_r_kind) then - varinv(i)=zero - varinv_use(i)=zero - end if - end if - end do + if(abi .or. ahi) then + do i = 1,nchanl + if( i/=2 .and. i/=3 .and.varinv(i) > tiny_r_kind) then + if((tb_obs(7)-tb_obs(8))-(tsim(7)-tsim(8)) <= -0.75_r_kind) then + varinv(i)=zero + end if + end if + end do + end if ! ! ---------- AVRHRR -------------- @@ -1508,20 +1572,18 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! channels with iuse_rad=-1 or 0 are used in cloud detection. do i=1,nchanl m=ich(i) - if (varinv(i) < tiny_r_kind) then - varinv_use(i) = zero + if (icld_det(m)>0 .and. varinv(i) >= tiny_r_kind) then + varinv_use(i) = varinv(i) else - if ((icld_det(m)>0)) then - varinv_use(i) = varinv(i) - else - varinv_use(i) = zero - end if + varinv_use(i) = zero 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, & + varinv_after_wavenum,varinv_after_rangechk,varinv_after_topo,varinv_after_transmittop, & !emily + varinv_after_clddet, varinv_after_nsstret, varinv_after_jsfcchk, & !emily id_qc,aivals,errf,varinv,varinv_use,cld,cldp) else if (viirs) then @@ -1531,20 +1593,18 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! 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 + if (icld_det(m)>0 .and. varinv(i) >= tiny_r_kind) then + varinv_use(i) = varinv(i) else - if ((icld_det(m)>0)) then - varinv_use(i) = varinv(i) - else - varinv_use(i) = zero - end if + varinv_use(i) = zero 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, & + varinv_after_wavenum,varinv_after_rangechk,varinv_after_topo,varinv_after_transmittop, & !emily + varinv_after_clddet, varinv_after_nsstret, varinv_after_jsfcchk, & !emily id_qc,aivals,errf,varinv,varinv_use,cld,cldp) ! ---------- SSM/I , SSMIS, AMSRE ------------------- @@ -1552,7 +1612,6 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& else if( ssmi .or. amsre .or. ssmis )then - frac_sea=data_s(ifrac_sea,n) if(amsre)then bearaz= (270._r_kind-data_s(ilazi_ang,n))*deg2rad sun_zenith=data_s(iszen_ang,n)*deg2rad @@ -1565,6 +1624,15 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& zsges,luse(n),sea,mixed, & temp,wmix,ts,emissivity_k,ierrret,kraintype,tpwc_obs,clw_obs,sgagl,tzbgr, & tbc,tbcnob,tsim,tnoise,ssmi,amsre_low,amsre_mid,amsre_hig,ssmis, & + varinv_after_grossroutinechk_over_ocean, & !emily + varinv_after_topo, & !emily + varinv_after_sfcchk, & !emily + varinv_after_ch2chk, & !emily + varinv_after_grossroutinechk,& !emily + varinv_after_scatteringchk, & !emily + varinv_after_nsstret, & !emily + varinv_after_jsfcchk, & !emily + pred9,pred10,pred11, & !emily varinv,errf,aivals(1,is),id_qc) ! ---------- AMSR2 ------------------- @@ -1654,23 +1722,33 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& if(luse(n))aivals(7,is) = aivals(7,is) + one end if end if + varinv_after_grosschk(i) = varinv(i) !emily end do if(amsua .or. atms .or. amsub .or. mhs .or. msu .or. hsb)then - if(amsua)nlev=6 - if(atms)nlev=7 - if(amsub .or. mhs)nlev=5 - if(hsb)nlev=4 - if(msu)nlev=4 + if(amsua)then + nlev=6 + else if(atms)then + nlev=7 + else if(amsub .or. mhs)then + nlev=5 + else if(hsb)then + nlev=4 + else if(msu)then + nlev=4 + end if kval=0 do i=2,nlev ! do i=1,nlev - channel_passive=iuse_rad(ich(i))==-1 .or. iuse_rad(ich(i))==0 - if (varinv(i)=1) .or. & - (passive_bc .and. channel_passive))) then + mm=ich(i) + if (varinv(i)=1) .or. & + (passive_bc .and. channel_passive(mm)))) then kval=max(i-1,kval) - if(amsub .or. hsb .or. mhs)kval=nlev - if((amsua .or. atms) .and. i <= 3)kval = zero + if(amsub .or. hsb .or. mhs)then + kval=nlev + else if((amsua .or. atms) .and. i <= 3) then + kval = zero + end if end if end do if(kval > 0)then @@ -1681,60 +1759,55 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& if(amsua)then varinv(15)=zero if(id_qc(15) == igood_qc)id_qc(15)=ifail_interchan_qc - end if - if (atms) then + else if (atms) then varinv(16:18)=zero if(id_qc(16) == igood_qc)id_qc(16)=ifail_interchan_qc if(id_qc(17) == igood_qc)id_qc(17)=ifail_interchan_qc if(id_qc(18) == igood_qc)id_qc(18)=ifail_interchan_qc end if end if - end if - - if(mhs.or.amsub)then - do i = 1, nchanl - m = ich(i) - if(sea .and. isst_det(m) >0 .and. tsavg5 < 278.0_r_kind) then - varinv(i) = zero - if(id_qc(i) == igood_qc)id_qc(i)=ifail_isst_det - endif - - if(sea .and. iwndspeed_det(m)>0 .and. tsavg5 < 285.0_r_kind .and. sfc_speed > 10.0_r_kind) then - varinv(i) = zero - if(id_qc(i) == igood_qc)id_qc(i)=ifail_iwndspeed_det - endif - if(iomg_det(m) > 0 .and. abs(tbcnob(2)) > 5.0_r_kind) then - varinv(i) = zero - if(id_qc(i) == igood_qc)id_qc(i)=ifail_iomg_det - endif - if(itopo_det(m) > 0 .and. zsges > 1000.0_r_kind ) then - varinv(i) = zero - if(id_qc(i) == igood_qc)id_qc(i)=ifail_itopo_det - endif - enddo + if(mhs.or.amsub)then + do i = 1, nchanl + m = ich(i) + if(sea)then + if(isst_det(m) >0 .and. tsavg5 < 278.0_r_kind) then + varinv(i) = zero + if(id_qc(i) == igood_qc)id_qc(i)=ifail_isst_det + + else if(iwndspeed_det(m)>0 .and. tsavg5 < 285.0_r_kind .and. sfc_speed > 10.0_r_kind) then + varinv(i) = zero + if(id_qc(i) == igood_qc)id_qc(i)=ifail_iwndspeed_det + endif + end if + if(iomg_det(m) > 0 .and. abs(tbcnob(2)) > 5.0_r_kind) then + varinv(i) = zero + if(id_qc(i) == igood_qc)id_qc(i)=ifail_iomg_det + + else if(itopo_det(m) > 0 .and. zsges > 1000.0_r_kind ) then + varinv(i) = zero + if(id_qc(i) == igood_qc)id_qc(i)=ifail_itopo_det + endif + enddo + endif endif ! Screen out land surface types by channel. Flags are set in satinfo file. do i = 1, nchanl m = ich(i) - if(iwater_det(m) > 0 .and. sea) then + if(sea .and. iwater_det(m) > 0) then varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_iwater_det - endif - if(isnow_det(m) > 0 .and. snow) then + else if(snow .and. isnow_det(m) > 0 ) then varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_isnow_det - endif - if(mixed .and. imix_det(m) > 0) then + else if(mixed .and. imix_det(m) > 0) then varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_imix_det - endif - if(land .and. iland_det(m) > 0) then + else if(land .and. iland_det(m) > 0) then varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_iland_det - endif - if(ice .and. iice_det(m) > 0) then + else if(ice .and. iice_det(m) > 0) then varinv(i) = zero if(id_qc(i) == igood_qc)id_qc(i)=ifail_iice_det endif @@ -1749,39 +1822,36 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& endif endif - do i = 1,nchanl - ! Reject radiances for single radiance test - if (lsingleradob) then + if (lsingleradob) then + do i = 1,nchanl + ! if the channels are beyond 0.01 of oblat/oblon, specified ! in gsi namelist, or aren't of type 'oneob_type', reject if ( (abs(cenlat - oblat) > one/r100 .or. & abs(cenlon - oblon) > one/r100) .or. & obstype /= oneob_type ) then varinv(i) = zero - varinv_use(i) = zero if (id_qc(i) == igood_qc) id_qc(i) = ifail_outside_range else ! if obchan <= zero, keep all footprints, if obchan > zero, ! keep only that which has channel obchan if (i /= obchan .and. obchan > zero) then varinv(i) = zero - varinv_use(i) = zero if (id_qc(i) == igood_qc) id_qc(i) = ifail_outside_range endif endif !cenlat/lon - endif !lsingleradob - enddo + enddo + endif !lsingleradob diagadd=zero account_for_corr_obs = .false. - iii=0 varinv0=zero +!$omp parallel do schedule(dynamic,1) private(ii,m,k,asum) do ii=1,nchanl m=ich(ii) if (varinv(ii)>tiny_r_kind .and. iuse_rad(m)>=1) then - iii=iii+1 varinv0(ii)=varinv(ii) raterr2(ii)=error0(ii)**2*varinv0(ii) if (l_may_be_passive .and. .not. retrieval) then @@ -1795,10 +1865,17 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& end if end if enddo + iii=0 + do ii=1,nchanl + m=ich(ii) + if (varinv(ii)>tiny_r_kind .and. iuse_rad(m)>=1) then + iii=iii+1 + end if + end do err2 = one/error0**2 tbc0=tbc tb_obs0=tb_obs - wgtjo=varinv0 + wgtjo=varinv if (l_may_be_passive .and. .not. retrieval) then if(iii>0 .and. iinstr.ne.-1)then chan_count=(iii*(iii+1))/2 @@ -1825,18 +1902,14 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& m = ich(i) if(luse(n))then - drad = tbc0(i) - dradnob = tbcnob(i) + drad = tbc0(i)*cld_rbc_idx(i) + dradnob = tbcnob(i)*cld_rbc_idx(i) varrad = tbc(i)*varinv(i) stats(1,m) = stats(1,m) + one !number of obs -! stats(3,m) = stats(3,m) + drad !obs-mod(w_biascor) -! stats(4,m) = stats(4,m) + tbc0(i)*drad !(obs-mod(w_biascor))**2 -! stats(5,m) = stats(5,m) + tbc(i)*varrad !penalty contribution -! stats(6,m) = stats(6,m) + dradnob !obs-mod(w/o_biascor) - stats(3,m) = stats(3,m) + drad*cld_rbc_idx(i) !obs-mod(w_biascor) - stats(4,m) = stats(4,m) + tbc0(i)*drad*cld_rbc_idx(i)!(obs-mod(w_biascor))**2 + stats(3,m) = stats(3,m) + drad !obs-mod(w_biascor) + stats(4,m) = stats(4,m) + tbc0(i)*drad !(obs-mod(w_biascor))**2 stats(5,m) = stats(5,m) + tbc(i)*varrad !penalty contribution - stats(6,m) = stats(6,m) + dradnob*cld_rbc_idx(i) !obs-mod(w/o_biascor) + stats(6,m) = stats(6,m) + dradnob !obs-mod(w/o_biascor) if (account_for_corr_obs .and. (cor_opt ==1 .or. cor_opt ==2) ) then exp_arg = -half*tbc(i)**2 @@ -1870,7 +1943,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! summation of observation number if (newpc4pred) then - ostats(m) = ostats(m) + one*cld_rbc_idx(i) + ostats(m) = ostats(m) + cld_rbc_idx(i) end if end if @@ -1881,12 +1954,11 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& ! At the end of analysis, prepare for bias correction for monitored channels ! Only "good monitoring" obs are included in J_passive calculation. - channel_passive=iuse_rad(m)==-1 .or. iuse_rad(m)==0 - if (passive_bc .and. (jiter>miter) .and. channel_passive) then + if (passive_bc .and. (jiter>miter) .and. channel_passive(m)) then ! summation of observation number, ! skip ostats accumulation for channels without coef. initialization if (newpc4pred .and. luse(n) .and. any(predx(:,m)/=zero)) then - ostats(m) = ostats(m) + one*cld_rbc_idx(i) + ostats(m) = ostats(m) + cld_rbc_idx(i) end if iccm=iccm+1 end if @@ -1932,7 +2004,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& my_head%raterr2(icc),my_head%pred(npred,icc), & my_head%dtb_dvar(nsigradjac,icc), & my_head%ich(icc),& - my_head%icx(icc)) + my_head%icx(icc),my_head%iccerr(icc)) if(luse_obsdiag)allocate(my_head%diags(icc)) call get_ij(mm1,slats,slons,my_head%ij,my_head%wij) @@ -2000,6 +2072,13 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& end if ! end of newpc4pred loop end if end do + ncr=0 + do ii=1,iii + my_head%iccerr(ii) = ncr + do mm=1,ii + ncr=ncr+1 + end do + end do my_head%nchan = iii ! profile observation count my_head%use_corr_obs=.false. @@ -2094,23 +2173,28 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& allocate(my_headm%res(iccm),my_headm%err2(iccm), & my_headm%raterr2(iccm),my_headm%pred(npred,iccm), & my_headm%ich(iccm), & - my_headm%icx(iccm)) + my_headm%icx(iccm),my_headm%iccerr(iccm)) my_headm%nchan = iccm ! profile observation count my_headm%time=dtime my_headm%luse=luse(n) my_headm%ich(:)=-1 iii=0 + ncr=0 do ii=1,nchanl m=ich(ii) - channel_passive=iuse_rad(m)==-1 .or. iuse_rad(m)==0 - if (varinv(ii)>tiny_r_kind .and. channel_passive) then + if (varinv(ii)>tiny_r_kind .and. channel_passive(m)) then iii=iii+1 my_headm%res(iii)=tbc(ii) ! obs-ges innovation my_headm%err2(iii)=one/error0(ii)**2 ! 1/(obs error)**2 (original uninflated error) my_headm%raterr2(iii)=error0(ii)**2*varinv(ii) ! (original error)/(inflated error) my_headm%icx(iii)=m ! channel index + do mm=1,ii + ncr=ncr+1 + end do + + my_headm%iccerr(iii)=ncr ! channel index do k=1,npred my_headm%pred(k,iii)=pred(k,ii)*upd_pred(k)*max(cld_rbc_idx(ii),cld_rbc_idx2(ii)) end do @@ -2583,7 +2667,7 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("Soil_Temperature", sngl(surface(1)%soil_temperature) ) ! soil temperature (K) call nc_diag_metadata("Soil_Moisture", sngl(surface(1)%soil_moisture_content) ) ! soil moisture call nc_diag_metadata("Land_Type_Index", surface(1)%land_type ) ! surface land type - call nc_diag_metadata("tsavg5", missing ) ! SST first guess used for SST retrieval + call nc_diag_metadata("tsavg5", sngl(tsavg5) ) ! SST first guess used for SST retrieval call nc_diag_metadata("sstcu", missing ) ! NCEP SST analysis at t call nc_diag_metadata("sstph", missing ) ! Physical SST retrieval call nc_diag_metadata("sstnv", missing ) ! Navy SST retrieval @@ -2614,11 +2698,16 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("Sfc_Wind_Speed", sngl(surface(1)%wind_speed) ) call nc_diag_metadata("Cloud_Frac", sngl(cld) ) + call nc_diag_metadata("cloudAmountInSegment", sngl(cld) ) !emily + call nc_diag_metadata("amountSegmentCloudFree",sngl(100.0-cld) ) !emily call nc_diag_metadata("CTP", sngl(cldp) ) call nc_diag_metadata("CLW", sngl(clw_obs) ) call nc_diag_metadata("TPWC", sngl(tpwc_obs) ) call nc_diag_metadata("clw_obs", sngl(clw_obs) ) call nc_diag_metadata("clw_guess", sngl(clw_guess) ) + call nc_diag_metadata("factch6", sngl(factch6) ) + call nc_diag_metadata("factch4", sngl(factch4) ) !emily + call nc_diag_metadata("qc4emiss", sngl(qc4emiss_out) ) !emily if (nstinfo==0) then data_s(itref,n) = missing @@ -2632,17 +2721,112 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) call nc_diag_metadata("SST_Cool_layer_tdrop", sngl(data_s(idtc,n)) ) ! dt_cool at zob call nc_diag_metadata("SST_dTz_dTfound", sngl(data_s(itz_tr,n)) ) ! d(Tz)/d(Tr) - call nc_diag_metadata("standard_deviation_clear_bt", sngl(tb_obs_sdv(ich_diag(i)))) ! needed for seviri qc - call nc_diag_metadata("Observation", sngl(tb_obs0(ich_diag(i))) ) ! observed brightness temperature (K) - call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(tbcnob(ich_diag(i))) ) ! observed - simulated Tb with no bias correction (K) - call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(tbc0(ich_diag(i) )) ) ! observed - simulated Tb with bias corrrection (K) - errinv = sqrt(varinv0(ich_diag(i))) - call nc_diag_metadata("Inverse_Observation_Error", sngl(errinv) ) + call nc_diag_metadata("standard_deviation_clear_bt", sngl(tb_obs_sdv(ich_diag(i)))) ! needed for seviri qc + call nc_diag_metadata("Observation", sngl(tb_obs0(ich_diag(i))) ) ! observed brightness temperature (K) + call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(tbcnob(ich_diag(i))) ) ! observed - simulated Tb with no bias correction (K) + call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(tbc0(ich_diag(i) )) ) ! observed - simulated Tb with bias corrrection (K) + call nc_diag_metadata("TotalBias", sngl(totbc(ich_diag(i) )) ) ! total bias corrrection (K) !emily + call nc_diag_metadata("Forecast_unadjusted", sngl(tsim(ich_diag(i) )) ) ! simulated Tb without bias corrrection (K) + call nc_diag_metadata("Forecast_adjusted", sngl(tsim(ich_diag(i) ) & + + totbc(ich_diag(i) )) ) ! simulated Tb with bias corrrection (K) + ! errinv = sqrt(varinv0(ich_diag(i))) !orig + errinv = sqrt(varinv(ich_diag(i))) !emily + call nc_diag_metadata("Inverse_Observation_Error", sngl(errinv) ) ! 1.0/observation error + call nc_diag_metadata("Input_Observation_Error", sngl(error0(ich_diag(i))) ) ! Origial error assignment +!>>emily + if (iasi .or. cris .or. airs .or. avhrr) then + errinv_tmp = sqrt(varinv_after_wavenum(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_wavenum", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_rangechk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_range", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_topo(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_topo", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_transmittop(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_transmittop", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_clddet(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_clddet", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_jsfcchk_land(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_jsfcchk_land", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_nsstret(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_nsstret", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_jsfcchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_jsfcchk", sngl(errinv_tmp)) + endif + + if (amsua .or. atms) then + errinv_tmp = sqrt(varinv_after_jsfcchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_jsfcchk", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_sdoei(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_sdoei", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_sdoei(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_sdoei", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_grosschk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_grosschk", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_grosschk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_grosschk", sngl(errinv_tmp)) + output_tmp = cldeff_obs(ich_diag(i)) + call nc_diag_metadata("cldeff_obs", sngl(output_tmp)) + output_tmp = cldeff_fg(ich_diag(i)) + call nc_diag_metadata("cldeff_bkg", sngl(output_tmp)) + endif + + if (ssmis) then + errinv_tmp = sqrt(varinv_after_grossroutinechk_over_ocean(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_grossroutinechk_ocean", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_grossroutinechk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_grossroutinechk", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_topo(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_topo", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_sfcchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_sfcchk", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_ch2chk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_ch2chk", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_scatteringchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_scatteringchk", sngl(errinv_tmp) ) + errinv_tmp = sqrt(varinv_after_jsfcchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_jsfcchk", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_nsstret(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_nsstret", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_grosschk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_grosschk", sngl(errinv_tmp)) + call nc_diag_metadata("SSMIS_ScatteringIndexPred9", sngl(pred9) ) + call nc_diag_metadata("SSMIS_ScatteringIndexPred10", sngl(pred10) ) + call nc_diag_metadata("SSMIS_ScatteringIndexPred11", sngl(pred11) ) + endif + + if (seviri) then + errinv_tmp = sqrt(varinv_after_sfcterrianchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_sfcterrianchk", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_rangechk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_range", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_topo(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_topo", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_transmittop(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_transmittop", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_clddet(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_clddet", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_stdchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_stdchk", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_grossroutinechk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_grossroutinechk", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_stdadj(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_stdadj", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_nsstret(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_nsstret", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_jsfcchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_jsfcchk", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_clrfracchk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_clrfracchk", sngl(errinv_tmp)) + errinv_tmp = sqrt(varinv_after_grosschk(ich_diag(i))) + call nc_diag_metadata("Inverse_Observation_Error_after_grosschk", sngl(errinv_tmp)) + endif +!<0 call gsi_metguess_get ('var::w' , ivar, istatus ) - if (ivar>0) then + if (if_use_w_vr.and.ivar>0) then include_w=.true. if(if_vterminal)then if( .not. if_model_dbz ) then diff --git a/src/gsi/setupt.f90 b/src/gsi/setupt.f90 index ff09b4b0ea..84c5f552a8 100644 --- a/src/gsi/setupt.f90 +++ b/src/gsi/setupt.f90 @@ -54,12 +54,12 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav use gridmod, only: nsig,twodvar_regional,regional use gridmod, only: get_ijk,pt_ll - use jfunc, only: jiter,last,jiterstart,miter + use jfunc, only: jiter,last,jiterstart,miter,hofx_2m_sfcfile use guess_grids, only: nfldsig, hrdifsig,ges_lnprsl,& geop_hgtl,ges_tsen,pbl_height use guess_grids, only: ges_prsi - use state_vectors, only: svars3d, levels + use state_vectors, only: svars3d, levels, ns3d, svars2d use constants, only: zero, one, four,t0c,rd_over_cp,three,rd_over_cp_mass,ten use constants, only: tiny_r_kind,half,two @@ -229,6 +229,8 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! for 3D-RTMA (if l_obsprvdiag is true). ! 2022-03-15 Hu change all th2 to t2m to indicate that 2m temperature ! is sensible instead of potentionl temperature +! 2023-03-21 Draper added option to interpolate screen-level T from model 2m output. +! (hofx_2m_sfcfile) ! ! !REMARKS: ! language: f90 @@ -279,6 +281,9 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav real(r_kind),dimension(npredt):: predcoef real(r_kind) tgges,roges real(r_kind),dimension(nsig):: ttmp,tvtmp,qtmp,utmp,vtmp,hsges + real(r_kind),dimension(nsig):: ttmp_reverse,qtmp_reverse,utmp_reverse,vtmp_reverse,hsges_reverse, prsltmp2_reverse !emily + real(r_kind),dimension(nsig+1):: prsitmp_reverse !emily + real(r_kind) u10ges,v10ges,t2ges,q2ges,psges2,f10ges real(r_kind),dimension(34) :: ptablt real(r_single),allocatable,dimension(:,:)::rdiagbuf @@ -296,6 +301,8 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav integer(i_kind) regime integer(i_kind) idomsfc,iskint,iff10,isfcr integer(i_kind) ibb,ikk,idddd + integer(i_kind) kk, isli !emily + integer(i_kind) water_frac,land_frac,ice_frac !emily integer(i_kind),dimension(nobs):: buddyuse @@ -311,7 +318,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav logical,dimension(nobs):: luse,muse integer(i_kind),dimension(nobs):: ioid ! initial (pre-distribution) obs ID - logical sfctype + logical sfctype, landsfctype logical iqtflg logical aircraftobst logical duplogic @@ -344,6 +351,18 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav integer(i_kind):: ich0 type(obsLList),pointer,dimension(:):: thead + + real(r_kind) :: delta_z, lapse_error + real(r_kind), parameter :: T_lapse = -0.0045 ! standard lapse rate, K/m +! use 4.5 K/km, in place of more standard 6.5 K/km, following +! https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019EA000984 +! lapse_error_frac around 0.5 ~ 2K/km, from Figure 2 of above. + real(r_kind), parameter :: lapse_error_frac = 0.5 ! inflation factor for obs error when vertically interpolating + real(r_kind), parameter :: max_delta_z = 300. ! max. vertical mismatch allowed + +! CSD - move this to where the namelists are read in. + if (i_use_2mt4b>0) hofx_2m_sfcfile=.false. + thead => obsLL(:) save_jacobian = conv_diagsave .and. jiter==jiterstart .and. lobsdiag_forenkf @@ -434,8 +453,11 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav hr_offset=min_offset/60.0_r_kind dup=one do k=1,nobs + ikx=nint(data(ikxx,k)) + itype=ictype(ikx) + landsfctype =( itype==181 .or. itype==183 .or. itype==187 .or. itype==188 ) do l=k+1,nobs - if (twodvar_regional) then + if (twodvar_regional .or. (hofx_2m_sfcfile .and. landsfctype) ) then duplogic=data(ilat,k) == data(ilat,l) .and. & data(ilon,k) == data(ilon,l) .and. & data(ier,k) < r1000 .and. data(ier,l) < r1000 .and. & @@ -467,6 +489,10 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav end do ! Run a buddy-check +! Note: buddy check crashes for hofx_2m_sfcfile option. +! Ccurrent params have buddy radius of 108 km, max diff of 8 K. +! The gross error check removes O-F > 7., so this is probably removing +! most obs that fail the buddy check already if (twodvar_regional .and. buddycheck_t) call buddy_check_t(is,data,luse,mype,nele,nobs,muse,buddyuse) ! If requested, save select data for output to diagnostic file @@ -523,6 +549,10 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav rstation_id = data(id,i) prest=r10*exp(dpres) ! in mb sfctype=(itype>179.and.itype<190).or.(itype>=192.and.itype<=199) +! hofx_2m_sfcfile option to calculate hofx from 2m model output (rather than LML) +! is restricted to landsfctype only. GDAS assimilates 180 and 182 over ocean, +! should we also use 2m model output for the over-ocean obs? + landsfctype =( itype==181 .or. itype==183 .or. itype==187 ) iqtflg=nint(data(iqt,i)) == 0 var_jb=data(ijb,i) @@ -674,17 +704,22 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! END GEOVALS - drpx=zero - if(sfctype .and. .not.twodvar_regional) then - drpx=abs(one-((one/exp(dpres-log(psges))))**rd_over_cp)*t0c - end if + drpx = zero + if ( hofx_2m_sfcfile .and. landsfctype) then + dpres = one ! put obs at surface + else + if(sfctype .and. .not.twodvar_regional) then + drpx=abs(one-((one/exp(dpres-log(psges))))**rd_over_cp)*t0c + end if -! Put obs pressure in correct units to get grid coord. number - call grdcrd1(dpres,prsltmp(1),nsig,-1) +! Put obs pressure in correct units to get grid coord. number + call grdcrd1(dpres,prsltmp(1),nsig,-1) + endif ! Implementation of forward model ---------- - if(sfctype.and.sfcmodel) then +! SCENARIO 1: If obs is sfctype, and sfcmodel is requested. Outdated. + if(sfctype .and. sfcmodel) then tgges=data(iskint,i) roges=data(isfcr,i) @@ -714,8 +749,47 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav f10ges,u10ges,v10ges, t2ges, q2ges, regime, iqtflg) tges = t2ges +! SCENARIO 2: obs is sfctype, and hofx_2m_sfcfile scheme is on. +! 2m forecast has been read from the sfc guess files + elseif (landsfctype .and. hofx_2m_sfcfile ) then + +! mask: 0 - sea, 1 - land, 2-ice, >= 3 mixed +! for now, use only pure land + if (int(data(idomsfc,i)) .NE. 1 ) muse(i) = .false. + + call tintrp2a11(ges_t2m,tges2m,dlat,dlon,dtime,hrdifsig,& + mype,nfldsig) + +! correct obs to model terrain height using a standard lapse rate. +! Later: look into updating with lapse-rate from the model (similar to gsd_terrain_match) + + delta_z = data(izz,i) - data(istnelv,i) + tob = tob + delta_z*T_lapse + !update the station elevation + data(istnelv,i) = data(izz,i) + + if(save_jacobian) then + t_ind = getindex(svars2d, 't2m') + if (t_ind < 0) then + print *, 'Error: no variable t2m in state vector.Exiting.' + call stop2(1300) + endif + dhx_dx%st_ind(1) = sum(levels(1:ns3d)) + t_ind + dhx_dx%end_ind(1) = sum(levels(1:ns3d)) + t_ind + dhx_dx%val(1) = one + dhx_dx%val(2) = zero ! in this case, there is no vertical interp + ! and nnz (=dim(dhx_dx%val)) should be one, + ! but nnz is a file attribute, so need to use + ! same value as for vertical profile obs. Get + ! around this by setting val(2) to zero. + endif + +! SCENARIO 3: obs is sfctype, and neither sfcmodel nor hofx_2m_sfcfile is chosen +! .or. obs is not sfctype. Interpoate hofx from model levels. else + if(iqtflg)then +! SCENARIO 3a: obs is a virtual temp. ! Interpolate guess tv to observation location and time call tintrp31(ges_tv,tges,dlat,dlon,dpres,dtime, & hrdifsig,mype,nfldsig) @@ -737,6 +811,7 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav dhx_dx%val(2) = delz ! weight for iz+1's level endif else +! SCENARIO 3b: obs is a sensible temp. ! Interpolate guess tsen to observation location and time call tintrp31(ges_tsen,tges,dlat,dlon,dpres,dtime, & hrdifsig,mype,nfldsig) @@ -759,6 +834,8 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav endif end if + +! SCENARIO 4: obs is sfctype, and i_use_2mt4b flag is on (turns on regional sfc DA) if(i_use_2mt4b>0 .and. sfctype) then if(i_coastline==1 .or. i_coastline==3) then @@ -793,17 +870,23 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call grdcrd1(sfcchk,prsltmp(1),nsig,-1) ! Check to see if observations is above the top of the model (regional mode) - if(sfctype)then + if(sfctype .and. .not. (hofx_2m_sfcfile .and. landsfctype) )then if(abs(dpres)>four) drpx=1.0e10_r_kind pres_diff=prest-r10*psges if (twodvar_regional .and. abs(pres_diff)>=r1000) drpx=1.0e10_r_kind end if - rlow=max(sfcchk-dpres,zero) -! linear variation of observation ramp [between grid points 1(~3mb) and 15(~45mb) below the surface] - if(l_sfcobserror_ramp_t) then - ramp=min(max(((rlow-1.0_r_kind)/(15.0_r_kind-1.0_r_kind)),0.0_r_kind),1.0_r_kind) + + if (.not. (hofx_2m_sfcfile .and. landsfctype) ) then + rlow=max(sfcchk-dpres,zero) +! linear variation of observation ramp [between grid points 1(~3mb) and 15(~45mb) below the surface] + if(l_sfcobserror_ramp_t) then + ramp=min(max(((rlow-1.0_r_kind)/(15.0_r_kind-1.0_r_kind)),0.0_r_kind),1.0_r_kind) + else + ramp=rlow + endif else - ramp=rlow + rlow = zero + ramp = zero endif rhgh=max(zero,dpres-rsigp-r0_001) @@ -815,12 +898,26 @@ subroutine setupt(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav if(rlow/=zero) awork(2) = awork(2) + one if(rhgh/=zero) awork(3) = awork(3) + one end if - - ratio_errors=error/(data(ier,i)+drpx+1.0e6_r_kind*rhgh+r8*ramp) + +! inflate error for uncertainty in the terrain adjustment + lapse_error = 0. + if ( hofx_2m_sfcfile .and. landsfctype) then + if (abs(delta_z)max_delta_z do not assim. + ! inflate obs error to account for error in lapse_rate + ! also include some representativity error here (assuming + ! delta_z ~ heterogeneity) + lapse_error = abs(lapse_error_frac*T_lapse*delta_z) + else + muse(i)=.false. + endif + endif + + ratio_errors=error/(data(ier,i)+drpx+1.0e6_r_kind*rhgh+r8*ramp + lapse_error) ! Compute innovation - if(i_use_2mt4b>0 .and. sfctype) then + if( (sfctype .and. i_use_2mt4b>0) .or. (hofx_2m_sfcfile .and. landsfctype) ) then ddiff = tob-tges2m + if (hofx_2m_sfcfile) tges=tges2m else ddiff = tob-tges endif @@ -1431,7 +1528,7 @@ subroutine init_vars_ write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) endif - if(i_use_2mt4b>0) then + if(i_use_2mt4b>0 .or. hofx_2m_sfcfile) then ! get t2m ... varname='t2m' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank2,istatus) @@ -1450,6 +1547,7 @@ subroutine init_vars_ write(6,*) trim(myname),': ', trim(varname), ' not found in met bundle, ier= ',istatus call stop2(999) endif + ! get q2m ... varname='q2m' call gsi_bundlegetpointer(gsi_metguess_bundle(1),trim(varname),rank2,istatus) @@ -1696,8 +1794,10 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Observation_Subtype", icsubtype(ikx) ) call nc_diag_metadata("Latitude", sngl(data(ilate,i)) ) call nc_diag_metadata("Longitude", sngl(data(ilone,i)) ) +! this is the obs height after being interpolated to the model (=model height) call nc_diag_metadata("Station_Elevation", sngl(data(istnelv,i)) ) call nc_diag_metadata("Pressure", sngl(prest) ) +! this is the original obs height (= stn elevation, before being interpolated) call nc_diag_metadata("Height", sngl(data(iobshgt,i)) ) call nc_diag_metadata("Time", sngl(dtime-time_offset)) call nc_diag_metadata("Prep_QC_Mark", sngl(data(iqc,i)) ) @@ -1713,11 +1813,13 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Errinv_Input", sngl(errinv_input) ) call nc_diag_metadata("Errinv_Adjust", sngl(errinv_adjst) ) call nc_diag_metadata("Errinv_Final", sngl(errinv_final) ) - call nc_diag_metadata("Observation", sngl(data(itob,i)) ) + if (hofx_2m_sfcfile ) then + call nc_diag_metadata("Observation", sngl(tob) ) + else + call nc_diag_metadata("Observation", sngl(data(itob,i)) ) + endif call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(ddiff) ) call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(tob-tges) ) - call nc_diag_metadata("Forecast_unadjusted", sngl(tges)) - call nc_diag_metadata("Forecast_adjusted", sngl(data(itob,i)-ddiff)) if (aircraft_t_bc_pof .or. aircraft_t_bc .or. aircraft_t_bc_ext) then call nc_diag_metadata("Data_Pof", sngl(data(ipof,i)) ) @@ -1771,14 +1873,51 @@ subroutine contents_netcdf_diag_(odiag) endif ! GEOVALS - call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) - call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) - call nc_diag_data2d("air_temperature", sngl(ttmp)) - call nc_diag_data2d("specific_humidity", sngl(qtmp)) - call nc_diag_data2d("eastward_wind", sngl(utmp)) - call nc_diag_data2d("northward_wind", sngl(vtmp)) - call nc_diag_data2d("geopotential_height", sngl(hsges) ) + !>>emily + do k = 1, nsig + kk = nsig-k+1 + utmp_reverse(kk) = utmp(k) + vtmp_reverse(kk) = vtmp(k) + ttmp_reverse(kk) = ttmp(k) + qtmp_reverse(kk) = qtmp(k) + hsges_reverse(kk) = hsges(k) + prsltmp2_reverse(kk) = prsltmp2(k) + enddo + do k = 1, nsig+1 + kk = (nsig+1)-k+1 + prsitmp_reverse(kk) = prsitmp(k) + enddo + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2_reverse*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp_reverse*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp_reverse)) + call nc_diag_data2d("specific_humidity", sngl(qtmp_reverse)) + call nc_diag_data2d("eastward_wind", sngl(utmp_reverse)) + call nc_diag_data2d("northward_wind", sngl(vtmp_reverse)) + call nc_diag_data2d("geopotential_height", sngl(hsges_reverse) ) + !<>orig +! call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) +! call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) +! call nc_diag_data2d("air_temperature", sngl(ttmp)) +! call nc_diag_data2d("specific_humidity", sngl(qtmp)) +! call nc_diag_data2d("eastward_wind", sngl(utmp)) +! call nc_diag_data2d("northward_wind", sngl(vtmp)) +! call nc_diag_data2d("geopotential_height", sngl(hsges) ) +!<>emily + isli = data(idomsfc,i) + water_frac = 0.0 + land_frac = 0.0 + ice_frac = 0.0 + if (isli == 0) water_frac = 1.0 + if (isli == 1) land_frac = 1.0 + if (isli == 2) ice_frac = 1.0 + call nc_diag_metadata("Water_Fraction", sngl(water_frac)) + call nc_diag_metadata("Land_Fraction", sngl(land_frac)) + call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) +!<=280 .and. itype < 300) if (z_height .or. sfc_data) then + write(6,*)'emily setupw: you are here 1 ...' + write(6,*)'emily setupw: itype = ', itype + write(6,*)'emily setupw: sfc_data = ', sfc_data + write(6,*)'emily setupw: sfcmod_gfs, sfcmod_mm5 = ', sfcmod_gfs, sfcmod_mm5 drpx = zero dpres = data(ihgt,i) @@ -650,6 +656,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav end if dpres=dpres-(dstn+fact*(zsges-dstn)) if(itype==261) dpres = data(ihgt,i) + write(6,*)'emily setupw: dpres = ', dpres ! Get guess surface elevation and geopotential height profile ! at observation location. @@ -738,8 +745,10 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav if (zob <= zero .and. twodvar_regional) zob=ten !trap for stations with negative zob + if (itype == 290) write(6,*)'emily setupw zob zges(1) = ', zob, zges(1) if (zob > zges(1)) then factw=one + if (itype == 290) write(6,*)'emily setupw factw (final-1a) = ', factw else factw = data(iff10,i) if(sfcmod_gfs .or. sfcmod_mm5) then @@ -747,6 +756,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav skint = data(iskint,i) call comp_fact10(dlat,dlon,dtime,skint,sfcr,isli,mype,factw) end if + if (itype == 290) write(6,*)'emily setupw factw (final-1b) = ', factw if (zob <= ten) then if(zob < ten)then @@ -767,11 +777,14 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav else term = (zges(1)-zob)/(zges(1)-ten) factw = one-term+factw*term + if (itype == 290) write(6,*)'emily setupw factw (final-1c) = ', factw end if ugesin=factw*ugesin vgesin=factw*vgesin + if (itype == 290) write(6,*)'emily setupw factw (final ) = ', factw + if (save_jacobian) then dhx_dx_u%val = factw * dhx_dx_u%val dhx_dx_v%val = factw * dhx_dx_v%val @@ -816,6 +829,9 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! Process observations with reported pressure else + + write(6,*)'emily setupw you are here 2 ...' + dpres = data(ipres,i) presw = ten*exp(dpres) dpres = dpres-log(psges) @@ -1278,7 +1294,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav 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 + valqc=half*(valqcu+valqcv) ! Accumulate statistics for obs belonging to this task if (muse(i)) then @@ -1767,7 +1783,6 @@ subroutine contents_binary_diag_(udiag,vdiag) rdiagbuf(23,ii) = factw ! 10m wind reduction factor rdiagbuf(24,ii) = 1.e+10_r_single ! u spread (filled in by EnKF) rdiagbuf(25,ii) = 1.e+10_r_single ! v spread (filled in by EnKF) - rdiagbuf(26,ii) = data(iamvq,i) ! AMVQ mitigation flag for AMVs;only for GOES17,LHP issue ioff=ioff0 if (lobsdiagsave) then @@ -1854,8 +1869,6 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_metadata("Errinv_Input", sngl(errinv_input) ) call nc_diag_metadata("Errinv_Adjust", sngl(errinv_adjst) ) call nc_diag_metadata("Errinv_Final", sngl(errinv_final) ) - ! AMVQ Mitigated winds - call nc_diag_metadata("Mitigation_flag_AMVQ", sngl(data(iamvq,i)) ) call nc_diag_metadata("Wind_Reduction_Factor_at_10m", sngl(factw) ) if (.not. regional .or. fv3_regional) then @@ -1879,14 +1892,10 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_metadata("u_Observation", sngl(uob_e) ) call nc_diag_metadata("u_Obs_Minus_Forecast_adjusted", sngl(dudiff_e) ) call nc_diag_metadata("u_Obs_Minus_Forecast_unadjusted", sngl(uob_e-uges_e) ) - call nc_diag_metadata("u_Forecast_adjusted", sngl(uob_e-dudiff_e)) - call nc_diag_metadata("u_Forecast_unadjusted", sngl(uges_e)) call nc_diag_metadata("v_Observation", sngl(vob_e) ) call nc_diag_metadata("v_Obs_Minus_Forecast_adjusted", sngl(dvdiff_e) ) call nc_diag_metadata("v_Obs_Minus_Forecast_unadjusted", sngl(vob_e-vges_e) ) - call nc_diag_metadata("v_Forecast_adjusted", sngl(vob_e-dvdiff_e)) - call nc_diag_metadata("v_Forecast_unadjusted", sngl(vges_e)) endif if (lobsdiagsave) then @@ -1927,16 +1936,58 @@ subroutine contents_netcdf_diag_(udiag,vdiag) endif ! GEOVALS - call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) - call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) - call nc_diag_data2d("air_temperature", sngl(ttmp)) - call nc_diag_data2d("specific_humidity", sngl(qtmp)) - call nc_diag_data2d("eastward_wind", sngl(utmp)) - call nc_diag_data2d("northward_wind", sngl(vtmp)) - call nc_diag_data2d("geopotential_height", sngl(hsges) ) + + !>>emily + do k = 1, nsig + kk = nsig-k+1 + utmp_reverse(kk) = utmp(k) + vtmp_reverse(kk) = vtmp(k) + ttmp_reverse(kk) = ttmp(k) + qtmp_reverse(kk) = qtmp(k) + hsges_reverse(kk) = hsges(k) + prsltmp2_reverse(kk) = prsltmp2(k) + enddo + do k = 1, nsig+1 + kk = (nsig+1)-k+1 + prsitmp_reverse(kk) = prsitmp(k) + enddo + call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2_reverse*r1000)) + call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp_reverse*r1000)) + call nc_diag_data2d("air_temperature", sngl(ttmp_reverse)) + call nc_diag_data2d("specific_humidity", sngl(qtmp_reverse)) + call nc_diag_data2d("eastward_wind", sngl(utmp_reverse)) + call nc_diag_data2d("northward_wind", sngl(vtmp_reverse)) + call nc_diag_data2d("geopotential_height", sngl(hsges_reverse) ) + !<>orig +! call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) +! call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) +! call nc_diag_data2d("air_temperature", sngl(ttmp)) +! call nc_diag_data2d("specific_humidity", sngl(qtmp)) +! call nc_diag_data2d("eastward_wind", sngl(utmp)) +! call nc_diag_data2d("northward_wind", sngl(vtmp)) +! call nc_diag_data2d("geopotential_height", sngl(hsges) ) +!<>emily + water_frac = 0.0 + land_frac = 0.0 + ice_frac = 0.0 + if (isli == 0) water_frac = 1.0 + if (isli == 1) land_frac = 1.0 + if (isli == 2) ice_frac = 1.0 + call nc_diag_metadata("Water_Fraction", sngl(water_frac)) + call nc_diag_metadata("Land_Fraction", sngl(land_frac)) + call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) +!<0 +qspresent=getindex(svars3d,'qs')>0 +qrpresent=getindex(svars3d,'qr')>0 +qipresent=getindex(svars3d,'qi')>0 +qlpresent=getindex(svars3d,'ql')>0 +cldchpresent=getindex(svars2d,'cldch')>0 +lcbaspresent=getindex(svars2d,'lcbas')>0 +howvpresent=getindex(svars2d,'howv')>0 +wspd10mpresent=getindex(svars2d,'wspd10m')>0 +pblhpresent=getindex(svars2d,'pblh')>0 +vispresent=getindex(svars2d,'vis')>0 +gustpresent=getindex(svars2d,'gust')>0 end subroutine init_anasv subroutine final_anasv @@ -370,7 +386,7 @@ subroutine norms_vars(xst,pmin,pmax,psum,pnum) ! local variables real(r_kind),allocatable,dimension(:) :: zloc,nloc real(r_kind),allocatable,dimension(:,:) :: zall,nall - integer(i_kind) :: i,ii + integer(i_kind) :: i pmin=zero pmax=zero @@ -383,59 +399,32 @@ subroutine norms_vars(xst,pmin,pmax,psum,pnum) zloc=zero ! Independent part of vector -! Sum - ii=0 +! Sum,Max,Min and number of points +!$omp parallel do schedule(dynamic,1) !private(i) do i = 1,ns3d - ii=ii+1 if(xst%r3(i)%mykind==r_single)then - zloc(ii)= sum_mask(xst%r3(i)%qr4,ihalo=1) + zloc(i)= sum_mask(xst%r3(i)%qr4,ihalo=1) + zloc(nvars+i)= minval(xst%r3(i)%qr4) + zloc(2*nvars+i)= maxval(xst%r3(i)%qr4) else - zloc(ii)= sum_mask(xst%r3(i)%q,ihalo=1) + zloc(i)= sum_mask(xst%r3(i)%q,ihalo=1) + zloc(nvars+i)= minval(xst%r3(i)%q) + zloc(2*nvars+i)= maxval(xst%r3(i)%q) endif - nloc(ii) = real((lat2-2)*(lon2-2)*levels(i), r_kind) ! dim of 3d fields + nloc(i) = real((lat2-2)*(lon2-2)*levels(i), r_kind) ! dim of 3d fields enddo +!$omp parallel do schedule(dynamic,1) !private(i) do i = 1,ns2d - ii=ii+1 if(xst%r2(i)%mykind==r_single)then - zloc(ii)= sum_mask(xst%r2(i)%qr4,ihalo=1) + zloc(ns3d+i)= sum_mask(xst%r2(i)%qr4,ihalo=1) + zloc(nvars+ns3d+i)= minval(xst%r2(i)%qr4) + zloc(2*nvars+ns3d+i)= maxval(xst%r2(i)%qr4) else - zloc(ii)= sum_mask(xst%r2(i)%q,ihalo=1) - endif - nloc(ii) = real((lat2-2)*(lon2-2), r_kind) ! dim of 2d fields - enddo -! Min - do i = 1,ns3d - ii=ii+1 - if(xst%r3(i)%mykind==r_single)then - zloc(ii)= minval(xst%r3(i)%qr4) - else - zloc(ii)= minval(xst%r3(i)%q) - endif - enddo - do i = 1,ns2d - ii=ii+1 - if(xst%r2(i)%mykind==r_single)then - zloc(ii)= minval(xst%r2(i)%qr4) - else - zloc(ii)= minval(xst%r2(i)%q) - endif - enddo -! Max - do i = 1,ns3d - ii=ii+1 - if(xst%r3(i)%mykind==r_single)then - zloc(ii)= maxval(xst%r3(i)%qr4) - else - zloc(ii)= maxval(xst%r3(i)%q) - endif - enddo - do i = 1,ns2d - ii=ii+1 - if(xst%r2(i)%mykind==r_single)then - zloc(ii)= maxval(xst%r2(i)%qr4) - else - zloc(ii)= maxval(xst%r2(i)%q) + zloc(ns3d+i)= sum_mask(xst%r2(i)%q,ihalo=1) + zloc(nvars+ns3d+i)= minval(xst%r2(i)%q) + zloc(2*nvars+ns3d+i)= maxval(xst%r2(i)%q) endif + nloc(ns3d+i) = real((lat2-2)*(lon2-2), r_kind) ! dim of 2d fields enddo ! Gather contributions @@ -444,20 +433,12 @@ subroutine norms_vars(xst,pmin,pmax,psum,pnum) call mpi_allgather(nloc,size(nloc),mpi_rtype, & & nall,size(nloc),mpi_rtype, mpi_comm_world,ierror) - ii=0 - do i=1,ns3d - ii=ii+1 - psum(ii)=SUM(zall(ii,:)) - pnum(ii)=SUM(nall(ii,:)) - enddo - do i=1,ns2d - ii=ii+1 - psum(ii)=SUM(zall(ii,:)) - pnum(ii)=SUM(nall(ii,:)) - enddo - do ii=1,nvars - pmin(ii)=MINVAL(zall( nvars+ii,:)) - pmax(ii)=MAXVAL(zall(2*nvars+ii,:)) +!$omp parallel do schedule(dynamic,1) !private(i) + do i=1,nvars + psum(i)=SUM(zall(i,:)) + pnum(i)=SUM(nall(i,:)) + pmin(i)=MINVAL(zall( nvars+i,:)) + pmax(i)=MAXVAL(zall(2*nvars+i,:)) enddo ! Release work space diff --git a/src/gsi/statsconv.f90 b/src/gsi/statsconv.f90 index 7ddb7dea04..a01675d8d0 100644 --- a/src/gsi/statsconv.f90 +++ b/src/gsi/statsconv.f90 @@ -154,20 +154,6 @@ subroutine statsconv(mype,& ! Summary report for winds if(mype==mype_uv) then -! Open output file so as to point to correct position in output file - if(first)then - open(iout_uv) - else - open(iout_uv,position='append') - end if - - -! Compute and write counts, penalties, and ratio of penalty -! to data counts for each model level - numssm=nint(awork(6,i_uv)); numgross=nint(awork(4,i_uv)) - umplty=zero; vmplty=zero; uvqcplty=zero ; ntot=0; - tu=zero; tv=zero ; tuv=zero - tssm=zero ; qctssm=zero nread=0 nkeep=0 nreadspd=0 @@ -181,85 +167,92 @@ subroutine statsconv(mype,& nkeepspd=nkeepspd+ndata(i,3) end if end do - if(nkeep > 0 .or. nkeepspd > 0)then -! Write header information - mesage='current vfit of wind data, ranges in m/s$' + if(nread > 0 .or. nreadspd > 0)then +! Open output file so as to point to correct position in output file + if(first)then + open(iout_uv) + else + open(iout_uv,position='append') + end if -! Call routine to compute and write count, rms, and penalty information - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'spd' .or. trim(ioctype(j)) == 'uv' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_uv,pflag) - numlow = nint(awork(2,i_uv)) - numhgh = nint(awork(3,i_uv)) - write(iout_uv,900) 'wind',numhgh,numlow - numfailqc=nint(awork(21,i_uv)) -! keep a seperate record of numfailqc for ssmi wind speeds - numfailqc_ssmi=nint(awork(61,i_uv)) - do k=1,nsig - num(k)=nint(awork(6*nsig+k+100,i_uv)) - rat1=zero - rat2=zero - if(num(k) > 0)then - rat1=awork(4*nsig+k+100,i_uv)/float(num(k)) - rat2=awork(5*nsig+k+100,i_uv)/float(num(k)) + +! Compute and write counts, penalties, and ratio of penalty +! to data counts for each model level + numssm=nint(awork(6,i_uv)); numgross=nint(awork(4,i_uv)) + umplty=zero; vmplty=zero; uvqcplty=zero ; ntot=0; + tu=zero; tv=zero ; tuv=zero + tssm=zero ; qctssm=zero + if(nkeep > 0 .or. nkeepspd > 0)then +! Write header information + mesage='current vfit of wind data, ranges in m/s$' + +! Call routine to compute and write count, rms, and penalty information + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'spd' .or. trim(ioctype(j)) == 'uv' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_uv,pflag) + numlow = nint(awork(2,i_uv)) + numhgh = nint(awork(3,i_uv)) + write(iout_uv,900) 'wind',numhgh,numlow + numfailqc=nint(awork(21,i_uv)) +! keep a seperate record of numfailqc for ssmi wind speeds + numfailqc_ssmi=nint(awork(61,i_uv)) + do k=1,nsig + num(k)=nint(awork(6*nsig+k+100,i_uv)) + rat1=zero + rat2=zero + if(num(k) > 0)then + rat1=awork(4*nsig+k+100,i_uv)/float(num(k)) + rat2=awork(5*nsig+k+100,i_uv)/float(num(k)) + end if + umplty=umplty+awork(4*nsig+k+100,i_uv) + vmplty=vmplty+awork(5*nsig+k+100,i_uv) + ntot=ntot+num(k) + write(iout_uv,241) 'w',num(k),k,awork(4*nsig+k+100,i_uv),& + awork(5*nsig+k+100,i_uv),rat1,rat2 + end do + do k=1,nsig + num(k)=nint(awork(6*nsig+k+100,i_uv)) + rat1=zero + rat3=zero + if(num(k) > 0)then + rat1=(awork(4*nsig+k+100,i_uv)+awork(5*nsig+k+100,i_uv))/float(num(k)) + rat3=awork(3*nsig+k+100,i_uv)/float(num(k)) + end if + uvqcplty=uvqcplty+awork(3*nsig+k+100,i_uv) + write(iout_uv,240) 'w',num(k),k,awork(4*nsig+k+100,i_uv)+awork(5*nsig+k+100,i_uv), & + awork(3*nsig+k+100,i_uv),rat1,rat3 + end do + +! Write statistics gross checks + write(iout_uv,920)' number ssm/i winds that fail nonlinear qc =',numfailqc_ssmi + write(iout_uv,925) 'wind',numgross,numfailqc +! Write statistics regarding penalties + if(ntot > 0)then + tu=umplty/float(ntot) + tv=vmplty/float(ntot) + tuv=uvqcplty/float(ntot) end if - umplty=umplty+awork(4*nsig+k+100,i_uv) - vmplty=vmplty+awork(5*nsig+k+100,i_uv) - ntot=ntot+num(k) - write(iout_uv,241) 'w',num(k),k,awork(4*nsig+k+100,i_uv),& - awork(5*nsig+k+100,i_uv),rat1,rat2 - end do - do k=1,nsig - num(k)=nint(awork(6*nsig+k+100,i_uv)) - rat1=zero - rat3=zero - if(num(k) > 0)then - rat1=(awork(4*nsig+k+100,i_uv)+awork(5*nsig+k+100,i_uv))/float(num(k)) - rat3=awork(3*nsig+k+100,i_uv)/float(num(k)) + if(numssm > 0)then + tssm=awork(5,i_uv)/awork(6,i_uv) + qctssm=awork(22,i_uv)/awork(6,i_uv) end if - uvqcplty=uvqcplty+awork(3*nsig+k+100,i_uv) - write(iout_uv,240) 'w',num(k),k,awork(4*nsig+k+100,i_uv)+awork(5*nsig+k+100,i_uv), & - awork(3*nsig+k+100,i_uv),rat1,rat3 - end do - -! Write statistics gross checks - write(iout_uv,920)' number ssm/i winds that fail nonlinear qc =',numfailqc_ssmi - write(iout_uv,925) 'wind',numgross,numfailqc -! Write statistics regarding penalties - if(ntot > 0)then - tu=umplty/float(ntot) - tv=vmplty/float(ntot) - tuv=uvqcplty/float(ntot) end if - if(numssm > 0)then - tssm=awork(5,i_uv)/awork(6,i_uv) - qctssm=awork(22,i_uv)/awork(6,i_uv) - end if - end if - write(iout_uv,949) 'u',ntot,umplty,tu - write(iout_uv,949) 'v',ntot,vmplty,tv - write(iout_uv,950) 'uv',jiter,nread,nkeep,ntot*2 - write(iout_uv,951) 'uv',umplty+vmplty,uvqcplty,tu+tv,tuv - write(iout_uv,950) 'spd',jiter,nreadspd,nkeepspd,numssm - write(iout_uv,951) 'spd',awork(5,i_uv),awork(22,i_uv),tssm,qctssm + write(iout_uv,949) 'u',ntot,umplty,tu + write(iout_uv,949) 'v',ntot,vmplty,tv + write(iout_uv,950) 'uv',jiter,nread,nkeep,ntot*2 + write(iout_uv,951) 'uv',umplty+vmplty,uvqcplty,tu+tv,tuv + write(iout_uv,950) 'spd',jiter,nreadspd,nkeepspd,numssm + write(iout_uv,951) 'spd',awork(5,i_uv),awork(22,i_uv),tssm,qctssm ! Close unit receiving summary output - close(iout_uv) + close(iout_uv) + end if end if ! Summary report for gps if (mype==mype_gps)then - if(first)then - open(iout_gps) - else - open(iout_gps,position='append') - end if - - - gpsmplty=zero; gpsqcplty=zero ; ntot=0 - tgps=zero ; qctgps=zero nread=0 nkeep=0 ctype=' ' @@ -270,67 +263,64 @@ subroutine statsconv(mype,& ctype=dtype(i) end if end do - if(nkeep > 0)then - mesage='current fit of gps data in fractional difference$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'gps' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_gps,pflag) - do k=1,nsig - num(k)=nint(awork(5*nsig+k+100,i_gps)) - rat=zero - rat3=zero - if(num(k)>0) then - rat=awork(6*nsig+k+100,i_gps)/float(num(k)) - rat3=awork(3*nsig+k+100,i_gps)/float(num(k)) - end if - ntot=ntot+num(k); gpsmplty=gpsmplty+awork(6*nsig+k+100,i_gps) - gpsqcplty=gpsqcplty+awork(3*nsig+k+100,i_gps) - write(iout_gps,240)'gps',num(k),k,awork(6*nsig+k+100,i_gps), & - awork(3*nsig+k+100,i_gps),rat,rat3 - end do - numgross=nint(awork(4,i_gps)) - numfailqc=nint(awork(21,i_gps)) - numfail1_gps=nint(awork(22,i_gps)) - numfail2_gps=nint(awork(23,i_gps)) - numfail3_gps=nint(awork(24,i_gps)) - write(iout_gps,925)'gps',numgross,numfailqc - write(iout_gps,920)' number of gps obs failed stats qc in NH =',numfail1_gps - write(iout_gps,920)' number of gps obs failed stats qc in SH =',numfail2_gps - write(iout_gps,920)' number of gps obs failed stats qc in TR =',numfail3_gps - - numlow = nint(awork(2,i_gps)) - numhgh = nint(awork(3,i_gps)) - write(iout_gps,900) 'gps',numhgh,numlow - if(ntot > 0) then - tgps=gpsmplty/ntot - qctgps=gpsqcplty/ntot - endif - end if + if(nread > 0)then + if(first)then + open(iout_gps) + else + open(iout_gps,position='append') + end if - write(iout_gps,950) ctype,jiter,nread,nkeep,ntot - write(iout_gps,951) ctype,gpsmplty,gpsqcplty,tgps,qctgps - close(iout_gps) - endif + gpsmplty=zero; gpsqcplty=zero ; ntot=0 + tgps=zero ; qctgps=zero + if(nkeep > 0)then + mesage='current fit of gps data in fractional difference$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'gps' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_gps,pflag) + do k=1,nsig + num(k)=nint(awork(5*nsig+k+100,i_gps)) + rat=zero + rat3=zero + if(num(k)>0) then + rat=awork(6*nsig+k+100,i_gps)/float(num(k)) + rat3=awork(3*nsig+k+100,i_gps)/float(num(k)) + end if + ntot=ntot+num(k); gpsmplty=gpsmplty+awork(6*nsig+k+100,i_gps) + gpsqcplty=gpsqcplty+awork(3*nsig+k+100,i_gps) + write(iout_gps,240)'gps',num(k),k,awork(6*nsig+k+100,i_gps), & + awork(3*nsig+k+100,i_gps),rat,rat3 + end do + numgross=nint(awork(4,i_gps)) + numfailqc=nint(awork(21,i_gps)) + numfail1_gps=nint(awork(22,i_gps)) + numfail2_gps=nint(awork(23,i_gps)) + numfail3_gps=nint(awork(24,i_gps)) + write(iout_gps,925)'gps',numgross,numfailqc + write(iout_gps,920)' number of gps obs failed stats qc in NH =',numfail1_gps + write(iout_gps,920)' number of gps obs failed stats qc in SH =',numfail2_gps + write(iout_gps,920)' number of gps obs failed stats qc in TR =',numfail3_gps + + numlow = nint(awork(2,i_gps)) + numhgh = nint(awork(3,i_gps)) + write(iout_gps,900) 'gps',numhgh,numlow + if(ntot > 0) then + tgps=gpsmplty/ntot + qctgps=gpsqcplty/ntot + endif + end if + write(iout_gps,950) ctype,jiter,nread,nkeep,ntot + write(iout_gps,951) ctype,gpsmplty,gpsqcplty,tgps,qctgps -! Summary report for specific humidity - if(mype==mype_q) then - if(first)then - open(iout_q) - else - open(iout_q,position='append') + close(iout_gps) end if + endif - mesage='current fit of q data, units in per-cent of guess q-sat$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'q' - end do - call dtast(bwork,npres_print,pbotq,ptopq,mesage,jiter,iout_q,pflag) - qmplty=zero; qqcplty=zero ; ntot=0 - tq=zero ; qctq=zero +! Summary report for specific humidity + if(mype==mype_q) then nread=0 nkeep=0 do i=1,ndat @@ -339,53 +329,61 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - do k=1,nsig - num(k)=nint(awork(k+6*nsig+100,i_q)) - rat=zero - rat3=zero - if(num(k) > 0)then - rat=awork(5*nsig+k+100,i_q)/float(num(k)) - rat3=awork(3*nsig+k+100,i_q)/float(num(k)) - end if - qmplty=qmplty+awork(5*nsig+k+100,i_q) - qqcplty=qqcplty+awork(3*nsig+k+100,i_q) - ntot=ntot+num(k) - write(iout_q,240) 'q',num(k),k,awork(5*nsig+k+100,i_q), & - awork(3*nsig+k+100,i_q),rat,rat3 + if(nread > 0)then + if(first)then + open(iout_q) + else + open(iout_q,position='append') + end if + + mesage='current fit of q data, units in per-cent of guess q-sat$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'q' end do - grsmlt=five - numgrsq=nint(awork(4,i_q)) - numfailqc=nint(awork(21,i_q)) - write(iout_q,924)' (scaled as precent of guess specific humidity)' - write(iout_q,925) 'q',numgrsq,numfailqc - write(iout_q,975) grsmlt,'q',awork(5,i_q) - numlow = nint(awork(2,i_q)) - numhgh = nint(awork(3,i_q)) - write(iout_q,900) 'q',numhgh,numlow - if(ntot > 0) then - tq=qmplty/float(ntot) - qctq=qqcplty/float(ntot) + call dtast(bwork,npres_print,pbotq,ptopq,mesage,jiter,iout_q,pflag) + + qmplty=zero; qqcplty=zero ; ntot=0 + tq=zero ; qctq=zero + if(nkeep > 0)then + do k=1,nsig + num(k)=nint(awork(k+6*nsig+100,i_q)) + rat=zero + rat3=zero + if(num(k) > 0)then + rat=awork(5*nsig+k+100,i_q)/float(num(k)) + rat3=awork(3*nsig+k+100,i_q)/float(num(k)) + end if + qmplty=qmplty+awork(5*nsig+k+100,i_q) + qqcplty=qqcplty+awork(3*nsig+k+100,i_q) + ntot=ntot+num(k) + write(iout_q,240) 'q',num(k),k,awork(5*nsig+k+100,i_q), & + awork(3*nsig+k+100,i_q),rat,rat3 + end do + grsmlt=five + numgrsq=nint(awork(4,i_q)) + numfailqc=nint(awork(21,i_q)) + write(iout_q,924)' (scaled as precent of guess specific humidity)' + write(iout_q,925) 'q',numgrsq,numfailqc + write(iout_q,975) grsmlt,'q',awork(5,i_q) + numlow = nint(awork(2,i_q)) + numhgh = nint(awork(3,i_q)) + write(iout_q,900) 'q',numhgh,numlow + if(ntot > 0) then + tq=qmplty/float(ntot) + qctq=qqcplty/float(ntot) + end if end if - end if - write(iout_q,950) 'q',jiter,nread,nkeep,ntot - write(iout_q,951) 'q',qmplty,qqcplty,tq,qctq + write(iout_q,950) 'q',jiter,nread,nkeep,ntot + write(iout_q,951) 'q',qmplty,qqcplty,tq,qctq - close(iout_q) + close(iout_q) + end if end if ! Summary report for surface pressure if(mype==mype_ps) then - if(first)then - open(iout_ps) - else - open(iout_ps,position='append') - end if - - nump=nint(awork(5,i_ps)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -394,40 +392,42 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of surface pressure data, ranges in mb$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'ps' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_ps,pflag) + if(nread > 0)then + if(first)then + open(iout_ps) + else + open(iout_ps,position='append') + end if + + nump=nint(awork(5,i_ps)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of surface pressure data, ranges in mb$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'ps' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_ps,pflag) - numgross=nint(awork(6,i_ps)) - numfailqc=nint(awork(21,i_ps)) - write(iout_ps,925) 'psfc',numgross,numfailqc - if(nump > 0)then - pw=awork(4,i_ps)/float(nump) - pw3=awork(22,i_ps)/float(nump) + numgross=nint(awork(6,i_ps)) + numfailqc=nint(awork(21,i_ps)) + write(iout_ps,925) 'psfc',numgross,numfailqc + if(nump > 0)then + pw=awork(4,i_ps)/float(nump) + pw3=awork(22,i_ps)/float(nump) + end if end if - end if - write(iout_ps,950) 'psfc',jiter,nread,nkeep,nump - write(iout_ps,951) 'psfc',awork(4,i_ps),awork(22,i_ps),pw,pw3 + write(iout_ps,950) 'psfc',jiter,nread,nkeep,nump + write(iout_ps,951) 'psfc',awork(4,i_ps),awork(22,i_ps),pw,pw3 - close(iout_ps) + close(iout_ps) + end if end if ! Summary report for total precipitable water if(mype==mype_pw) then - if(first)then - open(iout_pw) - else - open(iout_pw,position='append') - end if - - nsuperp=nint(awork(4,i_pw)) - tpw=zero ; tpw3=zero nread=0 nkeep=0 do i=1,ndat @@ -436,41 +436,42 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of precip. water data, ranges in mm$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'pw' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_pw,pflag) - - numgrspw=nint(awork(6,i_pw)) - numfailqc=nint(awork(21,i_pw)) - grsmlt=three - tpw=zero - tpw3=zero - if(nsuperp > 0)then - tpw=awork(5,i_pw)/nsuperp - tpw3=awork(22,i_pw)/nsuperp - end if - write(iout_pw,925) 'p.w.',numgrspw,numfailqc - write(iout_pw,975) grsmlt,'p.w.',awork(7,i_pw) - end if - write(iout_pw,950) 'pw',jiter,nread,nkeep,nsuperp - write(iout_pw,951) 'pw',awork(5,i_pw),awork(22,i_pw),tpw,tpw3 + if(nread > 0)then + if(first)then + open(iout_pw) + else + open(iout_pw,position='append') + end if + tpw=zero ; tpw3=zero + if(nkeep > 0)then + mesage='current fit of precip. water data, ranges in mm$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'pw' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_pw,pflag) + + numgrspw=nint(awork(6,i_pw)) + numfailqc=nint(awork(21,i_pw)) + grsmlt=three + tpw=zero + tpw3=zero + nsuperp=nint(awork(4,i_pw)) + if(nsuperp > 0)then + tpw=awork(5,i_pw)/nsuperp + tpw3=awork(22,i_pw)/nsuperp + end if + write(iout_pw,925) 'p.w.',numgrspw,numfailqc + write(iout_pw,975) grsmlt,'p.w.',awork(7,i_pw) + end if + write(iout_pw,950) 'pw',jiter,nread,nkeep,nsuperp + write(iout_pw,951) 'pw',awork(5,i_pw),awork(22,i_pw),tpw,tpw3 - close(iout_pw) + close(iout_pw) + end if end if ! Summary report for conventional sst if(mype==mype_sst) then - if(first)then - open(iout_sst) - else - open(iout_sst,position='append') - end if - - numsst=nint(awork(5,i_sst)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -479,37 +480,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional sst data, ranges in C$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'sst' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_sst,pflag) + if(nread > 0)then + if(first)then + open(iout_sst) + else + open(iout_sst,position='append') + end if - numgross=nint(awork(6,i_sst)) - numfailqc=nint(awork(21,i_sst)) - if(numsst > 0)then - pw=awork(4,i_sst)/numsst - pw3=awork(22,i_sst)/numsst + numsst=nint(awork(5,i_sst)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional sst data, ranges in C$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'sst' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_sst,pflag) + + numgross=nint(awork(6,i_sst)) + numfailqc=nint(awork(21,i_sst)) + if(numsst > 0)then + pw=awork(4,i_sst)/numsst + pw3=awork(22,i_sst)/numsst + end if + write(iout_sst,925) 'sst',numgross,numfailqc end if - write(iout_sst,925) 'sst',numgross,numfailqc - end if - write(iout_sst,950) 'sst',jiter,nread,nkeep,numsst - write(iout_sst,951) 'sst',awork(4,i_sst),awork(22,i_sst),pw,pw3 + write(iout_sst,950) 'sst',jiter,nread,nkeep,numsst + write(iout_sst,951) 'sst',awork(4,i_sst),awork(22,i_sst),pw,pw3 - close(iout_sst) + close(iout_sst) + end if end if ! Summary report for conventional gust if(mype==mype_gust) then - if(first)then - open(iout_gust) - else - open(iout_gust,position='append') - end if - - numgust=nint(awork(5,i_gust)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -518,37 +521,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional gust data, ranges in m/s$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'gust' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_gust,pflag) + if(nread > 0)then + if(first)then + open(iout_gust) + else + open(iout_gust,position='append') + end if - numgross=nint(awork(6,i_gust)) - numfailqc=nint(awork(21,i_gust)) - if(numgust > 0)then - pw=awork(4,i_gust)/numgust - pw3=awork(22,i_gust)/numgust + numgust=nint(awork(5,i_gust)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional gust data, ranges in m/s$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'gust' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_gust,pflag) + + numgross=nint(awork(6,i_gust)) + numfailqc=nint(awork(21,i_gust)) + if(numgust > 0)then + pw=awork(4,i_gust)/numgust + pw3=awork(22,i_gust)/numgust + end if + write(iout_gust,925) 'gust',numgross,numfailqc end if - write(iout_gust,925) 'gust',numgross,numfailqc - end if - write(iout_gust,950) 'gust',jiter,nread,nkeep,numgust - write(iout_gust,951) 'gust',awork(4,i_gust),awork(22,i_gust),pw,pw3 + write(iout_gust,950) 'gust',jiter,nread,nkeep,numgust + write(iout_gust,951) 'gust',awork(4,i_gust),awork(22,i_gust),pw,pw3 - close(iout_gust) + close(iout_gust) + end if end if ! Summary report for conventional vis if(mype==mype_vis) then - if(first)then - open(iout_vis) - else - open(iout_vis,position='append') - end if - - numvis=nint(awork(5,i_vis)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -557,37 +562,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional vis data, ranges in m$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'vis' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_vis,pflag) + if(nread > 0)then + if(first)then + open(iout_vis) + else + open(iout_vis,position='append') + end if - numgross=nint(awork(6,i_vis)) - numfailqc=nint(awork(21,i_vis)) - if(numvis > 0)then - pw=awork(4,i_vis)/numvis - pw3=awork(22,i_vis)/numvis + numvis=nint(awork(5,i_vis)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional vis data, ranges in m$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'vis' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_vis,pflag) + + numgross=nint(awork(6,i_vis)) + numfailqc=nint(awork(21,i_vis)) + if(numvis > 0)then + pw=awork(4,i_vis)/numvis + pw3=awork(22,i_vis)/numvis + end if + write(iout_vis,925) 'vis',numgross,numfailqc end if - write(iout_vis,925) 'vis',numgross,numfailqc - end if - write(iout_vis,950) 'vis',jiter,nread,nkeep,numvis - write(iout_vis,951) 'vis',awork(4,i_vis),awork(22,i_vis),pw,pw3 + write(iout_vis,950) 'vis',jiter,nread,nkeep,numvis + write(iout_vis,951) 'vis',awork(4,i_vis),awork(22,i_vis),pw,pw3 - close(iout_vis) + close(iout_vis) + end if end if ! Summary report for conventional pblh if(mype==mype_pblh) then - if(first)then - open(iout_pblh) - else - open(iout_pblh,position='append') - end if - - numpblh=nint(awork(5,i_pblh)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -596,37 +603,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional pblh data, ranges in m$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'pblh' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_pblh,pflag) + if(nread > 0)then + if(first)then + open(iout_pblh) + else + open(iout_pblh,position='append') + end if - numgross=nint(awork(6,i_pblh)) - numfailqc=nint(awork(21,i_pblh)) - if(numpblh > 0)then - pw=awork(4,i_pblh)/numpblh - pw3=awork(22,i_pblh)/numpblh + numpblh=nint(awork(5,i_pblh)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional pblh data, ranges in m$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'pblh' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_pblh,pflag) + + numgross=nint(awork(6,i_pblh)) + numfailqc=nint(awork(21,i_pblh)) + if(numpblh > 0)then + pw=awork(4,i_pblh)/numpblh + pw3=awork(22,i_pblh)/numpblh + end if + write(iout_pblh,925) 'pblh',numgross,numfailqc end if - write(iout_pblh,925) 'pblh',numgross,numfailqc - end if - write(iout_pblh,950) 'pblh',jiter,nread,nkeep,numpblh - write(iout_pblh,951) 'pblh',awork(4,i_pblh),awork(22,i_pblh),pw,pw3 + write(iout_pblh,950) 'pblh',jiter,nread,nkeep,numpblh + write(iout_pblh,951) 'pblh',awork(4,i_pblh),awork(22,i_pblh),pw,pw3 - close(iout_pblh) + close(iout_pblh) + end if end if ! Summary report for conventional wspd10m if(mype==mype_wspd10m) then - if(first)then - open(iout_wspd10m) - else - open(iout_wspd10m,position='append') - end if - - numwspd10m=nint(awork(5,i_wspd10m)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -635,37 +644,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional wspd10m data, ranges in m/s$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'wspd10m' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_wspd10m,pflag) + if(nread > 0)then + if(first)then + open(iout_wspd10m) + else + open(iout_wspd10m,position='append') + end if - numgross=nint(awork(6,i_wspd10m)) - numfailqc=nint(awork(21,i_wspd10m)) - if(numwspd10m > 0)then - pw=awork(4,i_wspd10m)/numwspd10m - pw3=awork(22,i_wspd10m)/numwspd10m + numwspd10m=nint(awork(5,i_wspd10m)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional wspd10m data, ranges in m/s$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'wspd10m' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_wspd10m,pflag) + + numgross=nint(awork(6,i_wspd10m)) + numfailqc=nint(awork(21,i_wspd10m)) + if(numwspd10m > 0)then + pw=awork(4,i_wspd10m)/numwspd10m + pw3=awork(22,i_wspd10m)/numwspd10m + end if + write(iout_wspd10m,925) 'wspd10m',numgross,numfailqc end if - write(iout_wspd10m,925) 'wspd10m',numgross,numfailqc - end if - write(iout_wspd10m,950) 'wspd10m',jiter,nread,nkeep,numwspd10m - write(iout_wspd10m,951) 'wspd10m',awork(4,i_wspd10m),awork(22,i_wspd10m),pw,pw3 + write(iout_wspd10m,950) 'wspd10m',jiter,nread,nkeep,numwspd10m + write(iout_wspd10m,951) 'wspd10m',awork(4,i_wspd10m),awork(22,i_wspd10m),pw,pw3 - close(iout_wspd10m) + close(iout_wspd10m) + end if end if ! Summary report for conventional td2m if(mype==mype_td2m) then - if(first)then - open(iout_td2m) - else - open(iout_td2m,position='append') - end if - - numtd2m=nint(awork(5,i_td2m)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -674,37 +685,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional td2m data, ranges in K $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'td2m' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_td2m,pflag) + if(nread > 0)then + if(first)then + open(iout_td2m) + else + open(iout_td2m,position='append') + end if - numgross=nint(awork(6,i_td2m)) - numfailqc=nint(awork(21,i_td2m)) - if(numtd2m > 0)then - pw=awork(4,i_td2m)/numtd2m - pw3=awork(22,i_td2m)/numtd2m + numtd2m=nint(awork(5,i_td2m)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional td2m data, ranges in K $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'td2m' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_td2m,pflag) + + numgross=nint(awork(6,i_td2m)) + numfailqc=nint(awork(21,i_td2m)) + if(numtd2m > 0)then + pw=awork(4,i_td2m)/numtd2m + pw3=awork(22,i_td2m)/numtd2m + end if + write(iout_td2m,925) 'td2m',numgross,numfailqc end if - write(iout_td2m,925) 'td2m',numgross,numfailqc - end if - write(iout_td2m,950) 'td2m',jiter,nread,nkeep,numtd2m - write(iout_td2m,951) 'td2m',awork(4,i_td2m),awork(22,i_td2m),pw,pw3 + write(iout_td2m,950) 'td2m',jiter,nread,nkeep,numtd2m + write(iout_td2m,951) 'td2m',awork(4,i_td2m),awork(22,i_td2m),pw,pw3 - close(iout_td2m) + close(iout_td2m) + end if end if ! Summary report for conventional mxtm if(mype==mype_mxtm) then - if(first)then - open(iout_mxtm) - else - open(iout_mxtm,position='append') - end if - - nummxtm=nint(awork(5,i_mxtm)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -713,37 +726,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional mxtm data, ranges in K $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'mxtm' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_mxtm,pflag) + if(nread > 0)then + if(first)then + open(iout_mxtm) + else + open(iout_mxtm,position='append') + end if - numgross=nint(awork(6,i_mxtm)) - numfailqc=nint(awork(21,i_mxtm)) - if(nummxtm > 0)then - pw=awork(4,i_mxtm)/nummxtm - pw3=awork(22,i_mxtm)/nummxtm + nummxtm=nint(awork(5,i_mxtm)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional mxtm data, ranges in K $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'mxtm' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_mxtm,pflag) + + numgross=nint(awork(6,i_mxtm)) + numfailqc=nint(awork(21,i_mxtm)) + if(nummxtm > 0)then + pw=awork(4,i_mxtm)/nummxtm + pw3=awork(22,i_mxtm)/nummxtm + end if + write(iout_mxtm,925) 'mxtm',numgross,numfailqc end if - write(iout_mxtm,925) 'mxtm',numgross,numfailqc - end if - write(iout_mxtm,950) 'mxtm',jiter,nread,nkeep,nummxtm - write(iout_mxtm,951) 'mxtm',awork(4,i_mxtm),awork(22,i_mxtm),pw,pw3 + write(iout_mxtm,950) 'mxtm',jiter,nread,nkeep,nummxtm + write(iout_mxtm,951) 'mxtm',awork(4,i_mxtm),awork(22,i_mxtm),pw,pw3 - close(iout_mxtm) + close(iout_mxtm) + end if end if ! Summary report for conventional mitm if(mype==mype_mitm) then - if(first)then - open(iout_mitm) - else - open(iout_mitm,position='append') - end if - - nummitm=nint(awork(5,i_mitm)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -752,37 +767,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional mitm data, ranges in K $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'mitm' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_mitm,pflag) + if(nread > 0)then + if(first)then + open(iout_mitm) + else + open(iout_mitm,position='append') + end if - numgross=nint(awork(6,i_mitm)) - numfailqc=nint(awork(21,i_mitm)) - if(nummitm > 0)then - pw=awork(4,i_mitm)/nummitm - pw3=awork(22,i_mitm)/nummitm + nummitm=nint(awork(5,i_mitm)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional mitm data, ranges in K $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'mitm' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_mitm,pflag) + + numgross=nint(awork(6,i_mitm)) + numfailqc=nint(awork(21,i_mitm)) + if(nummitm > 0)then + pw=awork(4,i_mitm)/nummitm + pw3=awork(22,i_mitm)/nummitm + end if + write(iout_mitm,925) 'mitm',numgross,numfailqc end if - write(iout_mitm,925) 'mitm',numgross,numfailqc - end if - write(iout_mitm,950) 'mitm',jiter,nread,nkeep,nummitm - write(iout_mitm,951) 'mitm',awork(4,i_mitm),awork(22,i_mitm),pw,pw3 + write(iout_mitm,950) 'mitm',jiter,nread,nkeep,nummitm + write(iout_mitm,951) 'mitm',awork(4,i_mitm),awork(22,i_mitm),pw,pw3 - close(iout_mitm) + close(iout_mitm) + end if end if ! Summary report for conventional pmsl if(mype==mype_pmsl) then - if(first)then - open(iout_pmsl) - else - open(iout_pmsl,position='append') - end if - - numpmsl=nint(awork(5,i_pmsl)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -791,37 +808,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional pmsl data, ranges in hPa $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'pmsl' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_pmsl,pflag) + if(nread > 0)then + if(first)then + open(iout_pmsl) + else + open(iout_pmsl,position='append') + end if - numgross=nint(awork(6,i_pmsl)) - numfailqc=nint(awork(21,i_pmsl)) - if(numpmsl > 0)then - pw=awork(4,i_pmsl)/numpmsl - pw3=awork(22,i_pmsl)/numpmsl + numpmsl=nint(awork(5,i_pmsl)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional pmsl data, ranges in hPa $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'pmsl' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_pmsl,pflag) + + numgross=nint(awork(6,i_pmsl)) + numfailqc=nint(awork(21,i_pmsl)) + if(numpmsl > 0)then + pw=awork(4,i_pmsl)/numpmsl + pw3=awork(22,i_pmsl)/numpmsl + end if + write(iout_pmsl,925) 'pmsl',numgross,numfailqc end if - write(iout_pmsl,925) 'pmsl',numgross,numfailqc - end if - write(iout_pmsl,950) 'pmsl',jiter,nread,nkeep,numpmsl - write(iout_pmsl,951) 'pmsl',awork(4,i_pmsl),awork(22,i_pmsl),pw,pw3 + write(iout_pmsl,950) 'pmsl',jiter,nread,nkeep,numpmsl + write(iout_pmsl,951) 'pmsl',awork(4,i_pmsl),awork(22,i_pmsl),pw,pw3 - close(iout_pmsl) + close(iout_pmsl) + end if end if ! Summary report for conventional howv if(mype==mype_howv) then - if(first)then - open(iout_howv) - else - open(iout_howv,position='append') - end if - - numhowv=nint(awork(5,i_howv)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -830,37 +849,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional howv data, ranges in m $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'howv' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_howv,pflag) + if(nread > 0)then + if(first)then + open(iout_howv) + else + open(iout_howv,position='append') + end if - numgross=nint(awork(6,i_howv)) - numfailqc=nint(awork(21,i_howv)) - if(numhowv > 0)then - pw=awork(4,i_howv)/numhowv - pw3=awork(22,i_howv)/numhowv + numhowv=nint(awork(5,i_howv)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional howv data, ranges in m $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'howv' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_howv,pflag) + + numgross=nint(awork(6,i_howv)) + numfailqc=nint(awork(21,i_howv)) + if(numhowv > 0)then + pw=awork(4,i_howv)/numhowv + pw3=awork(22,i_howv)/numhowv + end if + write(iout_howv,925) 'howv',numgross,numfailqc end if - write(iout_howv,925) 'howv',numgross,numfailqc - end if - write(iout_howv,950) 'howv',jiter,nread,nkeep,numhowv - write(iout_howv,951) 'howv',awork(4,i_howv),awork(22,i_howv),pw,pw3 + write(iout_howv,950) 'howv',jiter,nread,nkeep,numhowv + write(iout_howv,951) 'howv',awork(4,i_howv),awork(22,i_howv),pw,pw3 - close(iout_howv) + close(iout_howv) + end if end if ! Summary report for tcamt if(mype==mype_tcamt) then - if(first)then - open(iout_tcamt) - else - open(iout_tcamt,position='append') - end if - - numtcamt=nint(awork(5,i_tcamt)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -869,37 +890,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional tcamt data, ranges in %$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'tcamt' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_tcamt,pflag) + if(nread > 0)then + if(first)then + open(iout_tcamt) + else + open(iout_tcamt,position='append') + end if - numgross=nint(awork(6,i_tcamt)) - numfailqc=nint(awork(21,i_tcamt)) - if(numtcamt > 0)then - pw=awork(4,i_tcamt)/numtcamt - pw3=awork(22,i_tcamt)/numtcamt + numtcamt=nint(awork(5,i_tcamt)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional tcamt data, ranges in %$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'tcamt' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_tcamt,pflag) + + numgross=nint(awork(6,i_tcamt)) + numfailqc=nint(awork(21,i_tcamt)) + if(numtcamt > 0)then + pw=awork(4,i_tcamt)/numtcamt + pw3=awork(22,i_tcamt)/numtcamt + end if + write(iout_tcamt,925) 'tcamt',numgross,numfailqc end if - write(iout_tcamt,925) 'tcamt',numgross,numfailqc - end if - write(iout_tcamt,950) 'tcamt',jiter,nread,nkeep,numtcamt - write(iout_tcamt,951) 'tcamt',awork(4,i_tcamt),awork(22,i_tcamt),pw,pw3 + write(iout_tcamt,950) 'tcamt',jiter,nread,nkeep,numtcamt + write(iout_tcamt,951) 'tcamt',awork(4,i_tcamt),awork(22,i_tcamt),pw,pw3 - close(iout_tcamt) + close(iout_tcamt) + end if end if ! Summary report for lcbas if(mype==mype_lcbas) then - if(first)then - open(iout_lcbas) - else - open(iout_lcbas,position='append') - end if - - numlcbas=nint(awork(5,i_lcbas)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -908,37 +931,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional lcbas data, ranges in m$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'lcbas' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_lcbas,pflag) + if(nread > 0)then + if(first)then + open(iout_lcbas) + else + open(iout_lcbas,position='append') + end if - numgross=nint(awork(6,i_lcbas)) - numfailqc=nint(awork(21,i_lcbas)) - if(numlcbas > 0)then - pw=awork(4,i_lcbas)/numlcbas - pw3=awork(22,i_lcbas)/numlcbas + numlcbas=nint(awork(5,i_lcbas)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional lcbas data, ranges in m$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'lcbas' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_lcbas,pflag) + + numgross=nint(awork(6,i_lcbas)) + numfailqc=nint(awork(21,i_lcbas)) + if(numlcbas > 0)then + pw=awork(4,i_lcbas)/numlcbas + pw3=awork(22,i_lcbas)/numlcbas + end if + write(iout_lcbas,925) 'lcbas',numgross,numfailqc end if - write(iout_lcbas,925) 'lcbas',numgross,numfailqc - end if - write(iout_lcbas,950) 'lcbas',jiter,nread,nkeep,numlcbas - write(iout_lcbas,951) 'lcbas',awork(4,i_lcbas),awork(22,i_lcbas),pw,pw3 + write(iout_lcbas,950) 'lcbas',jiter,nread,nkeep,numlcbas + write(iout_lcbas,951) 'lcbas',awork(4,i_lcbas),awork(22,i_lcbas),pw,pw3 - close(iout_lcbas) + close(iout_lcbas) + end if end if ! Summary report for conventional cldch if(mype==mype_cldch) then - if(first)then - open(iout_cldch) - else - open(iout_cldch,position='append') - end if - - numcldch=nint(awork(5,i_cldch)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -947,37 +972,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional cldch data, ranges in m$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'cldch' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_cldch,pflag) + if(nread > 0)then + if(first)then + open(iout_cldch) + else + open(iout_cldch,position='append') + end if - numgross=nint(awork(6,i_cldch)) - numfailqc=nint(awork(21,i_cldch)) - if(numcldch > 0)then - pw=awork(4,i_cldch)/numcldch - pw3=awork(22,i_cldch)/numcldch + numcldch=nint(awork(5,i_cldch)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional cldch data, ranges in m$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'cldch' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_cldch,pflag) + + numgross=nint(awork(6,i_cldch)) + numfailqc=nint(awork(21,i_cldch)) + if(numcldch > 0)then + pw=awork(4,i_cldch)/numcldch + pw3=awork(22,i_cldch)/numcldch + end if + write(iout_cldch,925) 'cldch',numgross,numfailqc end if - write(iout_cldch,925) 'cldch',numgross,numfailqc - end if - write(iout_cldch,950) 'cldch',jiter,nread,nkeep,numcldch - write(iout_cldch,951) 'cldch',awork(4,i_cldch),awork(22,i_cldch),pw,pw3 + write(iout_cldch,950) 'cldch',jiter,nread,nkeep,numcldch + write(iout_cldch,951) 'cldch',awork(4,i_cldch),awork(22,i_cldch),pw,pw3 - close(iout_cldch) + close(iout_cldch) + end if end if ! Summary report for conventional uwnd10m if(mype==mype_uwnd10m) then - if(first)then - open(iout_uwnd10m) - else - open(iout_uwnd10m,position='append') - end if - - numuwnd10m=nint(awork(5,i_uwnd10m)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -986,37 +1013,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional uwnd10m data, ranges in m/s$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'uwnd10m' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_uwnd10m,pflag) + if(nread > 0)then + if(first)then + open(iout_uwnd10m) + else + open(iout_uwnd10m,position='append') + end if - numgross=nint(awork(6,i_uwnd10m)) - numfailqc=nint(awork(21,i_uwnd10m)) - if(numuwnd10m > 0)then - pw=awork(4,i_uwnd10m)/numuwnd10m - pw3=awork(22,i_uwnd10m)/numuwnd10m + numuwnd10m=nint(awork(5,i_uwnd10m)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional uwnd10m data, ranges in m/s$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'uwnd10m' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_uwnd10m,pflag) + + numgross=nint(awork(6,i_uwnd10m)) + numfailqc=nint(awork(21,i_uwnd10m)) + if(numuwnd10m > 0)then + pw=awork(4,i_uwnd10m)/numuwnd10m + pw3=awork(22,i_uwnd10m)/numuwnd10m + end if + write(iout_uwnd10m,925) 'uwnd10m',numgross,numfailqc end if - write(iout_uwnd10m,925) 'uwnd10m',numgross,numfailqc - end if - write(iout_uwnd10m,950) 'uwnd10m',jiter,nread,nkeep,numuwnd10m - write(iout_uwnd10m,951) 'uwnd10m',awork(4,i_uwnd10m),awork(22,i_uwnd10m),pw,pw3 + write(iout_uwnd10m,950) 'uwnd10m',jiter,nread,nkeep,numuwnd10m + write(iout_uwnd10m,951) 'uwnd10m',awork(4,i_uwnd10m),awork(22,i_uwnd10m),pw,pw3 - close(iout_uwnd10m) + close(iout_uwnd10m) + end if end if ! Summary report for conventional vwnd10m if(mype==mype_vwnd10m) then - if(first)then - open(iout_vwnd10m) - else - open(iout_vwnd10m,position='append') - end if - - numvwnd10m=nint(awork(5,i_vwnd10m)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -1025,37 +1054,39 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of conventional vwnd10m data, ranges in m/s$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'vwnd10m' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_vwnd10m,pflag) + if(nread > 0)then + if(first)then + open(iout_vwnd10m) + else + open(iout_vwnd10m,position='append') + end if - numgross=nint(awork(6,i_vwnd10m)) - numfailqc=nint(awork(21,i_vwnd10m)) - if(numvwnd10m > 0)then - pw=awork(4,i_vwnd10m)/numvwnd10m - pw3=awork(22,i_vwnd10m)/numvwnd10m + numvwnd10m=nint(awork(5,i_vwnd10m)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of conventional vwnd10m data, ranges in m/s$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'vwnd10m' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_vwnd10m,pflag) + + numgross=nint(awork(6,i_vwnd10m)) + numfailqc=nint(awork(21,i_vwnd10m)) + if(numvwnd10m > 0)then + pw=awork(4,i_vwnd10m)/numvwnd10m + pw3=awork(22,i_vwnd10m)/numvwnd10m + end if + write(iout_vwnd10m,925) 'vwnd10m',numgross,numfailqc end if - write(iout_vwnd10m,925) 'vwnd10m',numgross,numfailqc - end if - write(iout_vwnd10m,950) 'vwnd10m',jiter,nread,nkeep,numvwnd10m - write(iout_vwnd10m,951) 'vwnd10m',awork(4,i_vwnd10m),awork(22,i_vwnd10m),pw,pw3 + write(iout_vwnd10m,950) 'vwnd10m',jiter,nread,nkeep,numvwnd10m + write(iout_vwnd10m,951) 'vwnd10m',awork(4,i_vwnd10m),awork(22,i_vwnd10m),pw,pw3 - close(iout_vwnd10m) + close(iout_vwnd10m) + end if end if ! Summary report for temperature if (mype==mype_t)then - if(first)then - open(iout_t) - else - open(iout_t,position='append') - end if - - tmplty=zero; tqcplty=zero ; ntot=0 - tt=zero ; qctt=zero nread=0 nkeep=0 do i=1,ndat @@ -1064,54 +1095,56 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of temperature data, ranges in K $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 't' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_t,pflag) - do k=1,nsig - num(k)=nint(awork(5*nsig+k+100,i_t)) - rat=zero ; rat3=zero - if(num(k) > 0) then - rat=awork(6*nsig+k+100,i_t)/float(num(k)) - rat3=awork(3*nsig+k+100,i_t)/float(num(k)) + if(nread > 0)then + if(first)then + open(iout_t) + else + open(iout_t,position='append') + end if + + tmplty=zero; tqcplty=zero ; ntot=0 + tt=zero ; qctt=zero + if(nkeep > 0)then + mesage='current fit of temperature data, ranges in K $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 't' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_t,pflag) + do k=1,nsig + num(k)=nint(awork(5*nsig+k+100,i_t)) + rat=zero ; rat3=zero + if(num(k) > 0) then + rat=awork(6*nsig+k+100,i_t)/float(num(k)) + rat3=awork(3*nsig+k+100,i_t)/float(num(k)) + end if + ntot=ntot+num(k); tmplty=tmplty+awork(6*nsig+k+100,i_t) + tqcplty=tqcplty+awork(3*nsig+k+100,i_t) + write(iout_t,240) 't',num(k),k,awork(6*nsig+k+100,i_t), & + awork(3*nsig+k+100,i_t),rat,rat3 + end do + numgross=nint(awork(4,i_t)) + numfailqc=nint(awork(21,i_t)) + write(iout_t,925) 'temp',numgross,numfailqc + numlow = nint(awork(2,i_t)) + numhgh = nint(awork(3,i_t)) + write(iout_t,900) 't',numhgh,numlow + if(ntot > 0) then + tt=tmplty/ntot + qctt=tqcplty/ntot end if - ntot=ntot+num(k); tmplty=tmplty+awork(6*nsig+k+100,i_t) - tqcplty=tqcplty+awork(3*nsig+k+100,i_t) - write(iout_t,240) 't',num(k),k,awork(6*nsig+k+100,i_t), & - awork(3*nsig+k+100,i_t),rat,rat3 - end do - numgross=nint(awork(4,i_t)) - numfailqc=nint(awork(21,i_t)) - write(iout_t,925) 'temp',numgross,numfailqc - numlow = nint(awork(2,i_t)) - numhgh = nint(awork(3,i_t)) - write(iout_t,900) 't',numhgh,numlow - if(ntot > 0) then - tt=tmplty/ntot - qctt=tqcplty/ntot end if - end if - write(iout_t,950) 't',jiter,nread,nkeep,ntot - write(iout_t,951) 't',tmplty,tqcplty,tt,qctt + write(iout_t,950) 't',jiter,nread,nkeep,ntot + write(iout_t,951) 't',tmplty,tqcplty,tt,qctt - close(iout_t) + close(iout_t) + end if endif ! Summary report for doppler lidar winds if(mype==mype_dw) then - if(first)then - open(iout_dw) - else - open(iout_dw,position='append') - end if - - dwmplty=zero; dwqcplty=zero ; ntot=0 - tdw=zero ; qctdw=zero nread=0 nkeep=0 do i=1,ndat @@ -1120,56 +1153,58 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current vfit of lidar wind data, ranges in m/s$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'dw' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_dw,pflag) + if(nread > 0)then + if(first)then + open(iout_dw) + else + open(iout_dw,position='append') + end if + + dwmplty=zero; dwqcplty=zero ; ntot=0 + tdw=zero ; qctdw=zero + if(nkeep > 0)then + mesage='current vfit of lidar wind data, ranges in m/s$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'dw' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_dw,pflag) - do k=1,nsig - num(k)=nint(awork(k+5*nsig+100,i_dw)) - rat=zero - rat3=zero - if(num(k) > 0) then - rat=awork(6*nsig+k+100,i_dw)/float(num(k)) - rat3=awork(3*nsig+k+100,i_dw)/float(num(k)) + do k=1,nsig + num(k)=nint(awork(k+5*nsig+100,i_dw)) + rat=zero + rat3=zero + if(num(k) > 0) then + rat=awork(6*nsig+k+100,i_dw)/float(num(k)) + rat3=awork(3*nsig+k+100,i_dw)/float(num(k)) + end if + ntot=ntot+num(k) + dwmplty=dwmplty+awork(6*nsig+k+100,i_dw) + dwqcplty=dwqcplty+awork(3*nsig+k+100,i_dw) + write(iout_dw,240) 'r',num(k),k,awork(6*nsig+k+100,i_dw), & + awork(3*nsig+k+100,i_dw),rat,rat3 + end do + numgross=nint(awork(4,i_dw)) + numfailqc=nint(awork(21,i_dw)) + if(ntot > 0) then + tdw=dwmplty/float(ntot) + qctdw=dwqcplty/float(ntot) end if - ntot=ntot+num(k) - dwmplty=dwmplty+awork(6*nsig+k+100,i_dw) - dwqcplty=dwqcplty+awork(3*nsig+k+100,i_dw) - write(iout_dw,240) 'r',num(k),k,awork(6*nsig+k+100,i_dw), & - awork(3*nsig+k+100,i_dw),rat,rat3 - end do - numgross=nint(awork(4,i_dw)) - numfailqc=nint(awork(21,i_dw)) - if(ntot > 0) then - tdw=dwmplty/float(ntot) - qctdw=dwqcplty/float(ntot) - end if - write(iout_dw,925) 'dw',numgross,numfailqc - numlow = nint(awork(2,i_dw)) - numhgh = nint(awork(3,i_dw)) - write(iout_dw,900) 'dw',numhgh,numlow - end if + write(iout_dw,925) 'dw',numgross,numfailqc + numlow = nint(awork(2,i_dw)) + numhgh = nint(awork(3,i_dw)) + write(iout_dw,900) 'dw',numhgh,numlow + end if - write(iout_dw,950) 'dw',jiter,nread,nkeep,ntot - write(iout_dw,951) 'dw',dwmplty,dwqcplty,tdw,qctdw + write(iout_dw,950) 'dw',jiter,nread,nkeep,ntot + write(iout_dw,951) 'dw',dwmplty,dwqcplty,tdw,qctdw - close(iout_dw) + close(iout_dw) + end if end if ! Summary report for radar radial winds if(mype==mype_rw) then - if(first)then - open(iout_rw) - else - open(iout_rw,position='append') - end if - - rwmplty=zero; rwqcplty=zero ; ntot=0 - trw=zero ; qctrw=zero nread=0 nkeep=0 do i=1,ndat @@ -1178,57 +1213,59 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current vfit of radar wind data, ranges in m/s$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'rw' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_rw,pflag) + if(nread > 0)then + if(first)then + open(iout_rw) + else + open(iout_rw,position='append') + end if + + rwmplty=zero; rwqcplty=zero ; ntot=0 + trw=zero ; qctrw=zero + if(nkeep > 0)then + mesage='current vfit of radar wind data, ranges in m/s$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'rw' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_rw,pflag) - numgross=nint(awork(4,i_rw)) - numfailqc=nint(awork(21,i_rw)) - do k=1,nsig - num(k)=nint(awork(k+5*nsig+100,i_rw)) - rat=zero - rat3=zero - if(num(k) > 0) then - rat=awork(6*nsig+k+100,i_rw)/float(num(k)) - rat3=awork(3*nsig+k+100,i_rw)/float(num(k)) + numgross=nint(awork(4,i_rw)) + numfailqc=nint(awork(21,i_rw)) + do k=1,nsig + num(k)=nint(awork(k+5*nsig+100,i_rw)) + rat=zero + rat3=zero + if(num(k) > 0) then + rat=awork(6*nsig+k+100,i_rw)/float(num(k)) + rat3=awork(3*nsig+k+100,i_rw)/float(num(k)) + end if + ntot=ntot+num(k) + rwmplty=rwmplty+awork(6*nsig+k+100,i_rw) + rwqcplty=rwqcplty+awork(3*nsig+k+100,i_rw) + write(iout_rw,240) 'r',num(k),k,awork(6*nsig+k+100,i_rw), & + awork(3*nsig+k+100,i_rw),rat,rat3 + end do + if(ntot > 0) then + trw=rwmplty/float(ntot) + qctrw=rwqcplty/float(ntot) end if - ntot=ntot+num(k) - rwmplty=rwmplty+awork(6*nsig+k+100,i_rw) - rwqcplty=rwqcplty+awork(3*nsig+k+100,i_rw) - write(iout_rw,240) 'r',num(k),k,awork(6*nsig+k+100,i_rw), & - awork(3*nsig+k+100,i_rw),rat,rat3 - end do - if(ntot > 0) then - trw=rwmplty/float(ntot) - qctrw=rwqcplty/float(ntot) - end if - write(iout_rw,925) 'rw',numgross,numfailqc - numlow = nint(awork(2,i_rw)) - numhgh = nint(awork(3,i_rw)) - nhitopo = nint(awork(5,i_rw)) - ntoodif = nint(awork(6,i_rw)) - write(iout_rw,900) 'rw',numhgh,numlow - write(iout_rw,905) 'rw',nhitopo,ntoodif - end if - write(iout_rw,950) 'rw',jiter,nread,nkeep,ntot - write(iout_rw,951) 'rw',rwmplty,rwqcplty,trw,qctrw + write(iout_rw,925) 'rw',numgross,numfailqc + numlow = nint(awork(2,i_rw)) + numhgh = nint(awork(3,i_rw)) + nhitopo = nint(awork(5,i_rw)) + ntoodif = nint(awork(6,i_rw)) + write(iout_rw,900) 'rw',numhgh,numlow + write(iout_rw,905) 'rw',nhitopo,ntoodif + end if + write(iout_rw,950) 'rw',jiter,nread,nkeep,ntot + write(iout_rw,951) 'rw',rwmplty,rwqcplty,trw,qctrw - close(iout_rw) + close(iout_rw) + end if end if ! Summary report for radar reflectivity if(mype==mype_dbz) then - if(first)then - open(iout_dbz) - else - open(iout_dbz,position='append') - end if - - dbzmplty=zero; dbzqcplty=zero ; ntot=0 - tdbz=zero ; qctdbz=zero nread=0 nkeep=0 do i=1,ndat @@ -1237,56 +1274,58 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current vfit of radar reflectivity data, ranges in dBZ$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'dbz' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_dbz,pflag) - - numgross=nint(awork(4,i_dbz)) - numfailqc=nint(awork(21,i_dbz)) - do k=1,nsig - num(k)=nint(awork(k+5*nsig+100,i_dbz)) - rat=zero - rat3=zero - if(num(k) > 0) then - rat=awork(6*nsig+k+100,i_dbz)/float(num(k)) - rat3=awork(3*nsig+k+100,i_dbz)/float(num(k)) + if(nread > 0)then + if(first)then + open(iout_dbz) + else + open(iout_dbz,position='append') + end if + + dbzmplty=zero; dbzqcplty=zero ; ntot=0 + tdbz=zero ; qctdbz=zero + if(nkeep > 0)then + mesage='current vfit of radar reflectivity data, ranges in dBZ$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'dbz' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_dbz,pflag) + + numgross=nint(awork(4,i_dbz)) + numfailqc=nint(awork(21,i_dbz)) + do k=1,nsig + num(k)=nint(awork(k+5*nsig+100,i_dbz)) + rat=zero + rat3=zero + if(num(k) > 0) then + rat=awork(6*nsig+k+100,i_dbz)/float(num(k)) + rat3=awork(3*nsig+k+100,i_dbz)/float(num(k)) + end if + ntot=ntot+num(k) + dbzmplty=dbzmplty+awork(6*nsig+k+100,i_dbz) + dbzqcplty=dbzqcplty+awork(3*nsig+k+100,i_dbz) + write(iout_dbz,240) 'r',num(k),k,awork(6*nsig+k+100,i_dbz), & + awork(3*nsig+k+100,i_dbz),rat,rat3 + end do + if(ntot > 0) then + tdbz=dbzmplty/float(ntot) + qctdbz=dbzqcplty/float(ntot) end if - ntot=ntot+num(k) - dbzmplty=dbzmplty+awork(6*nsig+k+100,i_dbz) - dbzqcplty=dbzqcplty+awork(3*nsig+k+100,i_dbz) - write(iout_dbz,240) 'r',num(k),k,awork(6*nsig+k+100,i_dbz), & - awork(3*nsig+k+100,i_dbz),rat,rat3 - end do - if(ntot > 0) then - tdbz=dbzmplty/float(ntot) - qctdbz=dbzqcplty/float(ntot) - end if - write(iout_dbz,925) 'dbz',numgross,numfailqc - numlow = nint(awork(2,i_dbz)) - numhgh = nint(awork(3,i_dbz)) - nhitopo = nint(awork(5,i_dbz)) - ntoodif = nint(awork(6,i_dbz)) - write(iout_dbz,900) 'dbz',numhgh,numlow - write(iout_dbz,905) 'dbz',nhitopo,ntoodif - end if - write(iout_dbz,950) 'dbz',jiter,nread,nkeep,ntot - write(iout_dbz,951) 'dbz',dbzmplty,dbzqcplty,tdbz,qctdbz + write(iout_dbz,925) 'dbz',numgross,numfailqc + numlow = nint(awork(2,i_dbz)) + numhgh = nint(awork(3,i_dbz)) + nhitopo = nint(awork(5,i_dbz)) + ntoodif = nint(awork(6,i_dbz)) + write(iout_dbz,900) 'dbz',numhgh,numlow + write(iout_dbz,905) 'dbz',nhitopo,ntoodif + end if + write(iout_dbz,950) 'dbz',jiter,nread,nkeep,ntot + write(iout_dbz,951) 'dbz',dbzmplty,dbzqcplty,tdbz,qctdbz - close(iout_dbz) + close(iout_dbz) + end if end if if(mype==mype_tcp) then - if(first)then - open(iout_tcp) - else - open(iout_tcp,position='append') - end if - - nump=nint(awork(5,i_tcp)) - pw=zero ; pw3=zero nread=0 nkeep=0 do i=1,ndat @@ -1295,39 +1334,41 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of surface pressure data, ranges in mb$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'tcp' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_tcp,pflag) - - numgross=nint(awork(6,i_tcp)) - numfailqc=nint(awork(21,i_tcp)) - write(iout_tcp,925) 'psfc',numgross,numfailqc + if(nread > 0)then + if(first)then + open(iout_tcp) + else + open(iout_tcp,position='append') + end if - if(nump > 0)then - pw=awork(4,i_tcp)/float(nump) - pw3=awork(22,i_tcp)/float(nump) + nump=nint(awork(5,i_tcp)) + pw=zero ; pw3=zero + if(nkeep > 0)then + mesage='current fit of surface pressure data, ranges in mb$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'tcp' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_tcp,pflag) + + numgross=nint(awork(6,i_tcp)) + numfailqc=nint(awork(21,i_tcp)) + write(iout_tcp,925) 'psfc',numgross,numfailqc + + if(nump > 0)then + pw=awork(4,i_tcp)/float(nump) + pw3=awork(22,i_tcp)/float(nump) + end if end if - end if - write(iout_tcp,950) 'psfc',jiter,nread,nkeep,nump - write(iout_tcp,951) 'psfc',awork(4,i_tcp),awork(22,i_tcp),pw,pw3 + write(iout_tcp,950) 'psfc',jiter,nread,nkeep,nump + write(iout_tcp,951) 'psfc',awork(4,i_tcp),awork(22,i_tcp),pw,pw3 - close(iout_tcp) + close(iout_tcp) + end if end if ! Summary report for lagrangian if (mype==mype_lag)then - if(first)then - open(iout_lag) - else - open(iout_lag,position='append') - end if - - tmplty=zero; tqcplty=zero ; ntot=0 - tt=zero ; qctt=zero nread=0 nkeep=0 do i=1,ndat @@ -1336,53 +1377,54 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of lagangian data, ranges in m $' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'lag' - end do - call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_lag,pflag) - do k=1,nsig - num(k)=nint(awork(6*nsig+k+100,i_lag)) - rat=zero ; rat3=zero - if(num(k) > 0) then - rat=awork(4*nsig+k+100,i_lag)/float(num(k)) - rat3=awork(3*nsig+k+100,i_lag)/float(num(k)) + if(nread > 0)then + if(first)then + open(iout_lag) + else + open(iout_lag,position='append') + end if + + tmplty=zero; tqcplty=zero ; ntot=0 + tt=zero ; qctt=zero + if(nkeep > 0)then + mesage='current fit of lagangian data, ranges in m $' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'lag' + end do + call dtast(bwork,npres_print,pbot,ptop,mesage,jiter,iout_lag,pflag) + do k=1,nsig + num(k)=nint(awork(6*nsig+k+100,i_lag)) + rat=zero ; rat3=zero + if(num(k) > 0) then + rat=awork(4*nsig+k+100,i_lag)/float(num(k)) + rat3=awork(3*nsig+k+100,i_lag)/float(num(k)) + end if + ntot=ntot+num(k); tmplty=tmplty+awork(4*nsig+k+100,i_lag) + tqcplty=tqcplty+awork(3*nsig+k+100,i_lag) + write(iout_lag,240) 'lag',num(k),k,awork(4*nsig+k+100,i_lag), & + awork(3*nsig+k+100,i_lag),rat,rat3 + end do + numgross=nint(awork(4,i_lag)) + numfailqc=nint(awork(21,i_lag)) + write(iout_lag,925) 'lag',numgross,numfailqc + ! numlow = nint(awork(2,i_t)) + ! numhgh = nint(awork(3,i_t)) + ! write(iout_lag,900) 't',numhgh,numlow + if(ntot > 0) then + tt=tmplty/ntot + qctt=tqcplty/ntot end if - ntot=ntot+num(k); tmplty=tmplty+awork(4*nsig+k+100,i_lag) - tqcplty=tqcplty+awork(3*nsig+k+100,i_lag) - write(iout_lag,240) 'lag',num(k),k,awork(4*nsig+k+100,i_lag), & - awork(3*nsig+k+100,i_lag),rat,rat3 - end do - numgross=nint(awork(4,i_lag)) - numfailqc=nint(awork(21,i_lag)) - write(iout_lag,925) 'lag',numgross,numfailqc - ! numlow = nint(awork(2,i_t)) - ! numhgh = nint(awork(3,i_t)) - ! write(iout_lag,900) 't',numhgh,numlow - if(ntot > 0) then - tt=tmplty/ntot - qctt=tqcplty/ntot end if - end if - write(iout_lag,950) 'lag',jiter,nread,nkeep,ntot - write(iout_lag,951) 'lag',tmplty,tqcplty,tt,qctt + write(iout_lag,950) 'lag',jiter,nread,nkeep,ntot + write(iout_lag,951) 'lag',tmplty,tqcplty,tt,qctt - close(iout_lag) + close(iout_lag) + end if endif ! Summary report for solid-water content path if(mype==mype_swcp) then - if(first)then - open(iout_swcp) - else - open(iout_swcp,position='append') - end if - - nsuperp=nint(awork(4,i_swcp)) - - tswcp=zero ; tswcp3=zero nread=0 nkeep=0 do i=1,ndat @@ -1391,42 +1433,44 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of solid-water content path, ranges in kg/m^2$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'swcp' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_swcp,pflag) - - numgrsswcp=nint(awork(6,i_swcp)) - numfailqc=nint(awork(21,i_swcp)) - grsmlt=three - tswcp=zero - tswcp3=zero - if(nsuperp > 0)then - tswcp=awork(5,i_swcp)/nsuperp - tswcp3=awork(22,i_swcp)/nsuperp - end if - write(iout_swcp,925) 'swcp',numgrsswcp,numfailqc - write(iout_swcp,975) grsmlt,'swcp',awork(7,i_swcp) - end if - write(iout_swcp,950) 'swcp',jiter,nread,nkeep,nsuperp - write(iout_swcp,951) 'swcp',awork(5,i_swcp),awork(22,i_swcp),tswcp,tswcp3 + if(nread > 0)then + if(first)then + open(iout_swcp) + else + open(iout_swcp,position='append') + end if + + nsuperp=nint(awork(4,i_swcp)) + + tswcp=zero ; tswcp3=zero + if(nkeep > 0)then + mesage='current fit of solid-water content path, ranges in kg/m^2$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'swcp' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_swcp,pflag) + + numgrsswcp=nint(awork(6,i_swcp)) + numfailqc=nint(awork(21,i_swcp)) + grsmlt=three + tswcp=zero + tswcp3=zero + if(nsuperp > 0)then + tswcp=awork(5,i_swcp)/nsuperp + tswcp3=awork(22,i_swcp)/nsuperp + end if + write(iout_swcp,925) 'swcp',numgrsswcp,numfailqc + write(iout_swcp,975) grsmlt,'swcp',awork(7,i_swcp) + end if + write(iout_swcp,950) 'swcp',jiter,nread,nkeep,nsuperp + write(iout_swcp,951) 'swcp',awork(5,i_swcp),awork(22,i_swcp),tswcp,tswcp3 - close(iout_swcp) + close(iout_swcp) + end if end if ! Summary report for liquid-water content path if(mype==mype_lwcp) then - if(first)then - open(iout_lwcp) - else - open(iout_lwcp,position='append') - end if - - nsuperp=nint(awork(4,i_lwcp)) - - tlwcp=zero ; tlwcp3=zero nread=0 nkeep=0 do i=1,ndat @@ -1435,29 +1479,40 @@ subroutine statsconv(mype,& nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of liquid-water content path, ranges in kg/m^2$' - do j=1,nconvtype - pflag(j)=trim(ioctype(j)) == 'lwcp' - end do - call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_lwcp,pflag) - - numgrslwcp=nint(awork(6,i_lwcp)) - numfailqc=nint(awork(21,i_lwcp)) - grsmlt=three - tlwcp=zero - tlwcp3=zero - if(nsuperp > 0)then - tlwcp=awork(5,i_lwcp)/nsuperp - tlwcp3=awork(22,i_lwcp)/nsuperp - end if - write(iout_lwcp,925) 'lwcp',numgrslwcp,numfailqc - write(iout_lwcp,975) grsmlt,'lwcp',awork(7,i_lwcp) - end if - write(iout_lwcp,950) 'lwcp',jiter,nread,nkeep,nsuperp - write(iout_lwcp,951) 'lwcp',awork(5,i_lwcp),awork(22,i_lwcp),tlwcp,tlwcp3 + if(nread > 0)then + if(first)then + open(iout_lwcp) + else + open(iout_lwcp,position='append') + end if - close(iout_lwcp) + nsuperp=nint(awork(4,i_lwcp)) + + tlwcp=zero ; tlwcp3=zero + if(nkeep > 0)then + mesage='current fit of liquid-water content path, ranges in kg/m^2$' + do j=1,nconvtype + pflag(j)=trim(ioctype(j)) == 'lwcp' + end do + call dtast(bwork,1,pbotall,ptopall,mesage,jiter,iout_lwcp,pflag) + + numgrslwcp=nint(awork(6,i_lwcp)) + numfailqc=nint(awork(21,i_lwcp)) + grsmlt=three + tlwcp=zero + tlwcp3=zero + if(nsuperp > 0)then + tlwcp=awork(5,i_lwcp)/nsuperp + tlwcp3=awork(22,i_lwcp)/nsuperp + end if + write(iout_lwcp,925) 'lwcp',numgrslwcp,numfailqc + write(iout_lwcp,975) grsmlt,'lwcp',awork(7,i_lwcp) + end if + write(iout_lwcp,950) 'lwcp',jiter,nread,nkeep,nsuperp + write(iout_lwcp,951) 'lwcp',awork(5,i_lwcp),awork(22,i_lwcp),tlwcp,tlwcp3 + + close(iout_lwcp) + end if end if diff --git a/src/gsi/statslight.f90 b/src/gsi/statslight.f90 index ffcdef6a0a..7f8e7c8349 100644 --- a/src/gsi/statslight.f90 +++ b/src/gsi/statslight.f90 @@ -56,31 +56,14 @@ subroutine statslight(mype,i_light,bwork,awork,i_ref,ndata) real(r_kind) grsmlt,tlight real(r_kind) tlight3 - real(r_kind),dimension(1):: pbotall,ptopall logical,dimension(nlighttype):: pflag !********************************************************************************* -! Initialize constants and variables. - ptopall(1)=zero; pbotall(1)=2000.0_r_kind - - -! Generate summary statistics - - pflag=.FALSE. - -! Summary report for lightning flash rate +! Generate statistics Summary report for lightning flash rate if(mype==mype_light) then - if(first)then - open(iout_light) - else - open(iout_light,position='append') - end if - - nsuperl=nint(awork(4,i_light)) - tlight=zero ; tlight3=zero nread=0 nkeep=0 do i=1,ndat @@ -89,29 +72,40 @@ subroutine statslight(mype,i_light,bwork,awork,i_ref,ndata) nkeep=nkeep+ndata(i,3) end if end do - if(nkeep > 0)then - mesage='current fit of lightning data, range in #hits km-2 hr-1$' - do j=1,nlighttype - pflag(j)=trim(nulight(j)) == 'light' - enddo - - call dtast(bwork,1,pbot,ptop,mesage,jiter,iout_light,pflag) + if(nread > 0)then + pflag=.FALSE. + if(first)then + open(iout_light) + else + open(iout_light,position='append') + end if - numgrslight=nint(awork(6,i_light)) - numfailqc=nint(awork(21,i_light)) - grsmlt=three - tlight=zero - if(nsuperl > 0)then - tlight=awork(5,i_light)/nsuperl - tlight3=awork(22,i_light)/nsuperl + nsuperl=nint(awork(4,i_light)) + tlight=zero ; tlight3=zero + if(nkeep > 0)then + mesage='current fit of lightning data, range in #hits km-2 hr-1$' + do j=1,nlighttype + pflag(j)=trim(nulight(j)) == 'light' + enddo + + call dtast(bwork,1,pbot,ptop,mesage,jiter,iout_light,pflag) + + numgrslight=nint(awork(6,i_light)) + numfailqc=nint(awork(21,i_light)) + grsmlt=three + tlight=zero + if(nsuperl > 0)then + tlight=awork(5,i_light)/nsuperl + tlight3=awork(22,i_light)/nsuperl + end if + write(iout_light,925) 'light',numgrslight,numfailqc + write(iout_light,975) grsmlt,'light',awork(7,i_light) end if - write(iout_light,925) 'light',numgrslight,numfailqc - write(iout_light,975) grsmlt,'light',awork(7,i_light) - end if - write(iout_light,950) 'light',jiter,nread,nkeep,nsuperl - write(iout_light,951) 'light',awork(5,i_light),awork(22,i_light),tlight,tlight3 + write(iout_light,950) 'light',jiter,nread,nkeep,nsuperl + write(iout_light,951) 'light',awork(5,i_light),awork(22,i_light),tlight,tlight3 - close(iout_light) + close(iout_light) + end if end if diff --git a/src/gsi/statsrad.f90 b/src/gsi/statsrad.f90 index c6a993092c..121761fa76 100644 --- a/src/gsi/statsrad.f90 +++ b/src/gsi/statsrad.f90 @@ -142,7 +142,7 @@ subroutine statsrad(aivals,stats,ndata) ! Write obs count to runtime output file write(iout_rad,1109) do i=1,ndat - if(idisplay(i))then + if(idisplay(i) .and. ndata(i,2) > 0)then iobs2 = nint(aivals(38,i)) qcpenal = aivals(39,i) rpenal = aivals(40,i) @@ -162,9 +162,9 @@ subroutine statsrad(aivals,stats,ndata) 2012 format(12x,A7,5x,8(a7,1x)) 2999 format(' Illegal satellite type ') 1102 format(1x,i4,i5,1x,a16,2i7,1x,f10.3,1x,6(f11.7,1x)) -1109 format(t5,'it',t13,'satellite',t23,'instrument',t38, & - '# read',t49,'# keep',t59,'# assim',& - t68,'penalty',t81,'qcpnlty',t95,'cpen',t105,'qccpen') +1109 format(t5,'it',t13,'satellite',t23,'instrument',t40, & + '# read',t53,'# keep',t65,'# assim',& + t75,'penalty',t88,'qcpnlty',t104,'cpen',t115,'qccpen') 1115 format('o-g',1x,i2.2,1x,'rad',2x,2A10,2x,3(i11,2x),4(g12.5,1x)) ! Close output unit diff --git a/src/gsi/stpcalc.f90 b/src/gsi/stpcalc.f90 index 80fac64d61..30387341e3 100644 --- a/src/gsi/stpcalc.f90 +++ b/src/gsi/stpcalc.f90 @@ -226,17 +226,19 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & use stpjcmod, only: stplimq,stplimg,stplimv,stplimp,stplimw10m,& stplimhowv,stplimcldch,stpjcdfi,stpjcpdry,stpliml,stplimqc use bias_predictors, only: predictors - use control_vectors, only: control_vector,qdot_prod_sub,cvars2d,cvars3d + use control_vectors, only: control_vector,qdot_prod_sub + use state_vectors, only: qgpresent,qspresent,qrpresent,qipresent,qlpresent + use state_vectors, only: cldchpresent,lcbaspresent,howvpresent,wspd10mpresent,pblhpresent,vispresent,gustpresent use state_vectors, only: allocate_state,deallocate_state use gsi_bundlemod, only: gsi_bundle use gsi_bundlemod, only: gsi_bundlegetpointer use gsi_bundlemod, only: assignment(=) use guess_grids, only: ntguessig,nfldsig use mpl_allreducemod, only: mpl_allreduce - use mpeu_util, only: getindex use timermod, only: timer_ini,timer_fnl use stpjomod, only: stpjo use gsi_io, only: verbose + use gridmod, only: minmype implicit none ! Declare passed variables @@ -266,20 +268,19 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & real(r_quad),dimension(4,ipen):: pbc real(r_quad),dimension(4,nobs_type):: pbcjo real(r_quad),dimension(4,nobs_type,nobs_bins):: pbcjoi - real(r_quad),dimension(4,nobs_bins):: pbcqmin,pbcqmax + real(r_quad),dimension(4):: pbcqmin,pbcqmax real(r_quad),dimension(4,nobs_bins):: pbcql,pbcqi,pbcqr,pbcqs,pbcqg real(r_quad),dimension(ipen):: pen_est real(r_quad),dimension(3,ipenlin):: pstart real(r_quad) bx,cx,ccoef,bcoef,dels,sges1,sgesj real(r_quad),dimension(0:istp_iter):: stp real(r_kind),dimension(istp_iter):: stprat - real(r_quad),dimension(ipen):: bsum,csum,bsum_save,csum_save,pen_save + real(r_quad),dimension(ipen):: bsum,csum real(r_quad),dimension(ipen,nobs_bins):: pj real(r_kind) delpen real(r_kind) outpensave real(r_kind),dimension(4)::sges real(r_kind),dimension(ioutpen):: outpen,outstp - logical :: cxterm,change_dels,ifound logical :: print_verbose,pjcalc @@ -290,7 +291,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & ! Initialize variable print_verbose=.false. if(verbose)print_verbose=.true. - cxterm=.false. mm1=mype+1 stp(0)=stpinout outpen = zero @@ -387,10 +387,10 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & ! there, if one has to know or to reference them explicitly. 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) @@ -426,11 +426,11 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & dels = one_tenth_quad stepsize: do ii=1,istp_iter + pbc=zero_quad pjcalc=.false. if(iter == 0 .and. kprt >= 2 .and. ii == 1)pjcalc=.true. iis=ii ! Delta stepsize - change_dels=.true. sges(1)= stp(ii-1) sges(2)=(one_quad-dels)*stp(ii-1) @@ -448,7 +448,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if ! Calculate penalty values for linear terms - do i=1,ipenlin sges1=real(sges(1),r_quad) pbc(1,i)=pstart(1,i)-(2.0_r_quad*pstart(2,i)-pstart(3,i)*sges1)*sges1 @@ -475,60 +474,72 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & 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 + call stplimq(dval(ibin),sval(ibin),sges,pbcqmin,pbcqmax,nstep,it) do j=1,nstep - pbc(j,4) = pbc(j,4)+pbcqmin(j,ibin) - pbc(j,5) = pbc(j,5)+pbcqmax(j,ibin) + pbc(j,4) = pbc(j,4)+pbcqmin(j) + pbc(j,5) = pbc(j,5)+pbcqmax(j) end do + if(pjcalc)then + pj(4,ibin)=pj(4,ibin)+pbcqmin(1)+pbcqmin(ipenloc) + pj(5,ibin)=pj(5,ibin)+pbcqmax(1)+pbcqmax(ipenloc) + end if 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 +!$omp parallel sections +!$omp section ! 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) + if(gustpresent) then + call stplimg(dval(1),sval(1),sges,pbc(1,6),nstep) + if(pjcalc)pj(6,1)=pbc(1,6)+pbc(ipenloc,6) + end if +!$omp section ! 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) + if(vispresent) then + call stplimv(dval(1),sval(1),sges,pbc(1,7),nstep) + if(pjcalc)pj(7,1)=pbc(1,7)+pbc(ipenloc,7) + end if ! 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) +!$omp section + if(pblhpresent) then + call stplimp(dval(1),sval(1),sges,pbc(1,8),nstep) + if(pjcalc)pj(8,1)=pbc(1,8)+pbc(ipenloc,8) + end if ! 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) +!$omp section + if(wspd10mpresent) then + call stplimw10m(dval(1),sval(1),sges,pbc(1,9),nstep) + if(pjcalc)pj(9,1)=pbc(1,9)+pbc(ipenloc,9) + end if ! 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) +!$omp section + if(howvpresent) then + call stplimhowv(dval(1),sval(1),sges,pbc(1,10),nstep) + if(pjcalc)pj(10,1)=pbc(1,10)+pbc(ipenloc,10) + end if ! 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) +!$omp section + if(lcbaspresent) then + call stpliml(dval(1),sval(1),sges,pbc(1,11),nstep) + if(pjcalc)pj(11,1)=pbc(1,11)+pbc(ipenloc,11) + end if ! 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) +!$omp section + if(cldchpresent) then + call stplimcldch(dval(1),sval(1),sges,pbc(1,12),nstep) + if(pjcalc)pj(12,1)=pbc(1,12)+pbc(ipenloc,12) + end if +!$omp end parallel sections if (ljclimqc) then - if (getindex(cvars3d,'ql')>0) then +!$omp parallel sections private (ibin,it,j) +!$omp section + if (qlpresent) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,13),nstep,ntguessig,'ql') if(pjcalc) pj(13,1)=pbc(1,13)+pbc(ipenloc,13) @@ -541,7 +552,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if call stplimqc(dval(ibin),sval(ibin),sges,pbcql(1,ibin),nstep,it,'ql') end do - pbc(:,13)=zero_quad do ibin=1,nobs_bins do j=1,nstep pbc(j,13) = pbc(j,13)+pbcql(j,ibin) @@ -554,7 +564,8 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if end if end if - if (getindex(cvars3d,'qi')>0) then +!$omp section + if (qipresent) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,14),nstep,ntguessig,'qi') if(pjcalc) pj(14,1)=pbc(1,14)+pbc(ipenloc,14) @@ -567,7 +578,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if call stplimqc(dval(ibin),sval(ibin),sges,pbcqi(1,ibin),nstep,it,'qi') end do - pbc(:,14)=zero_quad do ibin=1,nobs_bins do j=1,nstep pbc(j,14) = pbc(j,14)+pbcqi(j,ibin) @@ -580,7 +590,8 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if end if end if - if (getindex(cvars3d,'qr')>0) then +!$omp section + if (qrpresent) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,15),nstep,ntguessig,'qr') if(pjcalc) pj(15,1)=pbc(1,15)+pbc(ipenloc,15) @@ -593,7 +604,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if call stplimqc(dval(ibin),sval(ibin),sges,pbcqr(1,ibin),nstep,it,'qr') end do - pbc(:,15)=zero_quad do ibin=1,nobs_bins do j=1,nstep pbc(j,15) = pbc(j,15)+pbcqr(j,ibin) @@ -606,7 +616,8 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if end if end if - if (getindex(cvars3d,'qs')>0) then +!$omp section + if (qspresent) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,16),nstep,ntguessig,'qs') if(pjcalc) pj(16,1)=pbc(1,16)+pbc(ipenloc,16) @@ -619,7 +630,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if call stplimqc(dval(ibin),sval(ibin),sges,pbcqs(1,ibin),nstep,it,'qs') end do - pbc(:,16)=zero_quad do ibin=1,nobs_bins do j=1,nstep pbc(j,16) = pbc(j,16)+pbcqs(j,ibin) @@ -632,7 +642,8 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if end if end if - if (getindex(cvars3d,'qg')>0) then +!$omp section + if (qgpresent) then if(.not.ljc4tlevs) then call stplimqc(dval(ibin_anl),sval(ibin_anl),sges,pbc(1,17),nstep,ntguessig,'qg') if(pjcalc) pj(17,1)=pbc(1,17)+pbc(ipenloc,17) @@ -645,7 +656,6 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if call stplimqc(dval(ibin),sval(ibin),sges,pbcqg(1,ibin),nstep,it,'qg') end do - pbc(:,17)=zero_quad do ibin=1,nobs_bins do j=1,nstep pbc(j,17) = pbc(j,17)+pbcqg(j,ibin) @@ -658,33 +668,35 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end if end if end if +!$omp end parallel sections end if ! ljclimqc end if + ! penalties for Jo pbcjoi=zero_quad call stpjo(dval,dbias,sval,sbias,sges,pbcjoi,nstep) pbcjo=zero_quad - do ibin=1,size(pbcjoi,3) ! == obs_bins - do j=1,size(pbcjoi,2) - do i=1,size(pbcjoi,1) + do ibin=1,nobs_bins ! == obs_bins + do j=1,nobs_type + do i=1,4 pbcjo(i,j)=pbcjo(i,j)+pbcjoi(i,j,ibin) end do end do enddo + do j=1,nobs_type + do i=1,4 + pbc(i,n0+j)=pbcjo(i,j) + end do + end do if(pjcalc)then - do ibin=1,size(pbcjoi,3) - do j=1,size(pbcjoi,2) + do ibin=1,nobs_bins + do j=1,nobs_type pj(n0+j,ibin)=pj(n0+j,ibin)+pbcjoi(ipenloc,j,ibin)+pbcjoi(1,j,ibin) end do enddo endif - do j=1,size(pbcjo,2) - do i=1,size(pbcjo,1) - pbc(i,n0+j)=pbcjo(i,j) - end do - end do ! Gather J contributions call mpl_allreduce(4,ipen,pbc) @@ -718,114 +730,93 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & ! estimate of stepsize + istp_use=ii stp(ii)=stp(ii-1) - if(cx > 1.e-20_r_kind) then - stp(ii)=stp(ii)+bx/cx ! step size estimate - else -! Check for cx <= 0. (probable error or large nonlinearity) - if(mype == 0) then - write(iout_iter,*) ' entering cx <=0 stepsize option',cx,stp(ii) - write(iout_iter,105) (bsum(i),i=1,ipen) - write(iout_iter,110) (csum(i),i=1,ipen) - end if - stp(ii)=outstp(ipenloc) - outpensave=outpen(ipenloc) - do i=1,nsteptot - if(outpen(i) < outpensave)then - stp(ii)=outstp(i) - outpensave=outpen(i) - end if - end do - if(outpensave < outpen(ipenloc))then - if(mype == 0)write(iout_iter,*) ' early termination due to cx <=0 ',cx,stp(ii) - cxterm=.true. - else -! Try different (better?) stepsize - stp(ii)=max(outstp(1),1.0e-20_r_kind) - do i=2,nsteptot - if(outstp(i) < stp(ii) .and. outstp(i) > 1.0e-20_r_kind)stp(ii)=outstp(i) - end do - stp(ii)=one_tenth_quad*stp(ii) - change_dels=.false. - end if - end if - + if(cx > 1.e-20_r_quad) stp(ii)=stp(ii)+bx/cx ! step size estimate ! estimate various terms in penalty on first iteration if(ii == 1)then - do i=1,ipen - pen_save(i)=pbc(1,i) - bsum_save(i)=bsum(i) - csum_save(i)=csum(i) - end do - pjcost(1) = pen_save(1)+pbc(ipenloc,1) ! Jb + pjcost(1) = pbc(1,1)+pbc(ipenloc,1) ! Jb pjcost(2) = zero_quad do i=1,nobs_type - pjcost(2) = pjcost(2)+pen_save(n0+i)+pbc(ipenloc,n0+i) ! Jo + pjcost(2) = pjcost(2)+pbc(1,n0+i)+pbc(ipenloc,n0+i) ! Jo end do - pjcost(3) = pen_save(2) + pen_save(3)+pbc(ipenloc,3) ! Jc + pjcost(3) = pbc(1,2) + pbc(1,3)+pbc(ipenloc,3) ! Jc pjcost(4) = zero_quad do i=4,n0 - pjcost(4) = pjcost(4) + pen_save(i)+pbc(ipenloc,i) ! Jl + pjcost(4) = pjcost(4) + pbc(1,i)+pbc(ipenloc,i) ! Jl end do penalty=pjcost(1)+pjcost(2)+pjcost(3)+pjcost(4) ! J = Jb + Jo + Jc +Jl ! Write out detailed results to iout_iter - if(mype == 0) then - write(iout_iter,100) (pen_save(i)+pbc(ipenloc,i),i=1,ipen) - if(print_verbose)then - write(iout_iter,105) (bsum(i),i=1,ipen) - write(iout_iter,110) (csum(i),i=1,ipen) - end if - end if - endif - -! estimate of change in penalty - delpen = stp(ii)*(bx - 0.5_r_quad*stp(ii)*cx ) - -! If change in penalty is very small end stepsize calculation - if(abs(delpen/penalty) < 1.e-17_r_kind) then - if(mype == 0)then - write(iout_iter,*) ' minimization has converged ' - write(iout_iter,140) ii,delpen,bx,cx,stp(ii) + if(mype == minmype) then write(iout_iter,100) (pbc(1,i)+pbc(ipenloc,i),i=1,ipen) if(print_verbose)then write(iout_iter,105) (bsum(i),i=1,ipen) write(iout_iter,110) (csum(i),i=1,ipen) end if end if - end_iter = .true. -! Finalize timer - call timer_fnl('stpcalc') - istp_use=ii - exit stepsize - end if + endif -! Check for negative stepsize (probable error or large nonlinearity) - if(stp(ii) <= zero_quad) then - if(mype == 0) then - write(iout_iter,*) ' entering negative stepsize option',stp(ii) + if(cx <= 1.e-20_r_quad .or. stp(ii) <= zero_quad)then +! Check for cx <= 0 or. stp(ii) < zero. (probable error or large nonlinearity) + if(mype == minmype) then + write(iout_iter,*) ' entering cx <=0 or stp <= 0 stepsize option',cx,stp(ii) write(iout_iter,105) (bsum(i),i=1,ipen) write(iout_iter,110) (csum(i),i=1,ipen) end if stp(ii)=outstp(ipenloc) outpensave=outpen(ipenloc) - do i=1,nsteptot + do i=1,ii if(outpen(i) < outpensave)then - stp(ii)=outstp(i) outpensave=outpen(i) + istp_use=i end if end do + if(istp_use /= ii .and. stp(istp_use) > zero_quad)then + if(mype == minmype)then + write(iout_iter,*) ' early termination due to cx or stp <=0 ',cx,stp(ii) + write(iout_iter,*) ' better stepsize found',cx,stp(ii) + end if + exit stepsize + else if(ii == istp_iter)then + if(mype == minmype)then + write(iout_iter,*) ' early termination due to no decrease in penalty ',cx,stp(ii) + end if + stp(istp_use)=zero + end_iter = .true. + exit stepsize + else ! Try different (better?) stepsize - if(stp(ii) <= zero_quad .and. ii /= istp_iter)then - stp(ii)=max(outstp(1),1.0e-20_r_kind) - do i=2,nsteptot - if(outstp(i) < stp(ii) .and. outstp(i) > 1.0e-20_r_kind)stp(ii)=outstp(i) - end do - stp(ii)=one_tenth_quad*stp(ii) - change_dels=.false. + stp(ii)=one_tenth_quad*max(outstp(1),1.0e-20_r_kind) end if + else + +! estimate of change in penalty + delpen = stp(ii)*(bx - 0.5_r_quad*stp(ii)*cx ) + +! If change in penalty is very small end stepsize calculation + if(abs(delpen/penalty) < 1.e-17_r_kind) then + if(mype == minmype)then + write(iout_iter,*) ' minimization has converged ' + write(iout_iter,140) ii,delpen,bx,cx,stp(ii) + write(iout_iter,100) (pbc(1,i)+pbc(ipenloc,i),i=1,ipen) + if(print_verbose)then + write(iout_iter,105) (bsum(i),i=1,ipen) + write(iout_iter,110) (csum(i),i=1,ipen) + end if + end if + end_iter = .true. +! Finalize timer + call timer_fnl('stpcalc') + exit stepsize + end if +! Check for convergence in stepsize estimation + stprat(ii)=zero + if(stp(ii) > zero_quad)stprat(ii)=abs((stp(ii)-stp(ii-1))/stp(ii)) + if(stprat(ii) < 1.e-4_r_kind) exit stepsize + dels = one_tenth_quad*dels end if 100 format(' J=',3e25.18/,(3x,3e25.18)) @@ -839,31 +830,21 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & 141 format('***WARNING*** reduced penalty not found in search direction',/, & ' - probable error',(5e25.18)) -! Check for convergence in stepsize estimation - istp_use=ii - if(cxterm) exit stepsize - stprat(ii)=zero - if(stp(ii) > zero)then - stprat(ii)=abs((stp(ii)-stp(ii-1))/stp(ii)) - end if - if(stprat(ii) < 1.e-4_r_kind) exit stepsize - if(change_dels)dels = one_tenth_quad*dels ! If stepsize estimate has not converged use best stepsize estimate or zero if( ii == istp_iter)then stp(ii)=outstp(ipenloc) outpensave=outpen(ipenloc) - ifound=.false. ! Find best stepsize to this point do i=1,nsteptot if(outpen(i) < outpensave)then stp(ii)=outstp(i) outpensave=outpen(i) - ifound=.true. + istp_use=i end if end do - if(ifound)exit stepsize + if(istp_use /= istp_iter)exit stepsize ! If no best stepsize set to zero and end minimization - if(mype == 0)then + if(mype == minmype)then write(iout_iter,141)(outpen(i),i=1,nsteptot) end if end_iter = .true. @@ -874,39 +855,41 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & end do stepsize if(kprt >= 2 .and. iter == 0)then call mpl_allreduce(ipen,nobs_bins,pj) - if(mype == 0)call prnt_j(pj,n0,ipen,kprt) + if(mype == minmype)call prnt_j(pj,n0,ipen,kprt) end if stpinout=stp(istp_use) ! Estimate terms in penalty - if(mype == 0 .and. print_verbose)then - do i=1,ipen - pen_est(i)=pen_save(i)-(stpinout-stp(0))*(2.0_r_quad*bsum_save(i)- & - (stpinout-stp(0))*csum_save(i)) + if(mype == minmype)then + if(print_verbose)then + do i=1,ipen + pen_est(i)=pbc(1,i)-(stpinout-stp(0))*(2.0_r_quad*bsum(i)- & + (stpinout-stp(0))*csum(i)) + end do + write(iout_iter,101) (pbc(1,i)-pen_est(i),i=1,ipen) + end if + pjcostnew(1) = pbc(1,1) ! Jb + pjcostnew(3) = pbc(1,2)+pbc(1,3) ! Jc + pjcostnew(4)=zero + do i=4,n0 + pjcostnew(4) = pjcostnew(4) + pbc(1,i) ! Jl end do - write(iout_iter,101) (pbc(1,i)-pen_est(i),i=1,ipen) - end if - pjcostnew(1) = pbc(1,1) ! Jb - pjcostnew(3) = pbc(1,2)+pbc(1,3) ! Jc - pjcostnew(4)=zero - do i=4,n0 - pjcostnew(4) = pjcostnew(4) + pbc(1,i) ! Jl - end do - pjcostnew(2) = zero - do i=1,nobs_type - pjcostnew(2) = pjcostnew(2)+pbc(1,n0+i) ! Jo - end do - penaltynew=pjcostnew(1)+pjcostnew(2)+pjcostnew(3)+pjcostnew(4) + pjcostnew(2) = zero + do i=1,nobs_type + pjcostnew(2) = pjcostnew(2)+pbc(1,n0+i) ! Jo + end do + penaltynew=pjcostnew(1)+pjcostnew(2)+pjcostnew(3)+pjcostnew(4) - if(mype == 0 .and. print_verbose)then - write(iout_iter,200) (stp(i),i=0,istp_use) - write(iout_iter,199) (stprat(ii),ii=1,istp_use) - write(iout_iter,201) (outstp(i),i=1,nsteptot) - write(iout_iter,202) (outpen(i)-outpen(4),i=1,nsteptot) + if(print_verbose)then + write(iout_iter,200) (stp(i),i=0,istp_use) + write(iout_iter,199) (stprat(ii),ii=1,istp_use) + write(iout_iter,201) (outstp(i),i=1,nsteptot) + write(iout_iter,202) (outpen(i)-outpen(4),i=1,nsteptot) + end if end if ! Check for final stepsize negative (probable error) if(stpinout <= zero)then - if(mype == 0)then + if(mype == minmype)then write(iout_iter,130) ii,bx,cx,stp(ii) write(iout_iter,105) (bsum(i),i=1,ipen) write(iout_iter,110) (csum(i),i=1,ipen) @@ -926,19 +909,22 @@ subroutine stpcalc(stpinout,sval,sbias,dirx,dval,dbias, & endif ! Update solution - do i=1,nrclen - sbias%values(i)=sbias%values(i)+stpinout*dbias%values(i) - end do !$omp parallel do schedule(dynamic,1) private(i,ii) - do ii=1,nobs_bins - do i=1,sval(ii)%ndim - sval(ii)%values(i)=sval(ii)%values(i)+stpinout*dval(ii)%values(i) - end do - end do -!DIR$ IVDEP - do i=1,nclen - xhatsave%values(i)=xhatsave%values(i)+stpinout*dirx%values(i) - yhatsave%values(i)=yhatsave%values(i)+stpinout*diry%values(i) + do ii=1,nobs_bins+2 + if(ii <= nobs_bins)then + do i=1,sval(ii)%ndim + sval(ii)%values(i)=sval(ii)%values(i)+stpinout*dval(ii)%values(i) + end do + else if(ii == nobs_bins+1)then + do i=1,nrclen + sbias%values(i)=sbias%values(i)+stpinout*dbias%values(i) + end do + else + do i=1,nclen + xhatsave%values(i)=xhatsave%values(i)+stpinout*dirx%values(i) + yhatsave%values(i)=yhatsave%values(i)+stpinout*diry%values(i) + end do + end if end do @@ -975,6 +961,7 @@ subroutine prnt_j(pj,n0,ipen,kprt) use mpimod, only: mype use gsi_obOperTypeManager, only: nobs_type => obOper_count use gsi_obOperTypeManager, only: obOper_typeInfo + use gridmod, only: minmype real(r_quad),dimension(ipen,nobs_bins),intent(in ) :: pj integer(i_kind) ,intent(in ) :: n0,ipen,kprt @@ -986,7 +973,7 @@ subroutine prnt_j(pj,n0,ipen,kprt) integer(i_kind) :: ii,jj character(len=20) :: ctype(ipen) - if(kprt <=0 .or. mype /=0)return + if(kprt <=0 .or. mype /=minmype)return ctype(:)=".unknown." ctype(1)='background ' ctype(2)=' ' diff --git a/src/gsi/stpgps.f90 b/src/gsi/stpgps.f90 index f55e9f4292..d357df1c05 100644 --- a/src/gsi/stpgps.f90 +++ b/src/gsi/stpgps.f90 @@ -107,12 +107,13 @@ subroutine stpgps(gpshead,rval,sval,out,sges,nstep) real(r_kind),dimension(max(1,nstep)),intent(in ) :: sges ! Declare local variables - integer(i_kind) j,kk,ier,istatus - integer(i_kind),dimension(nsig):: i1,i2,i3,i4 + integer(i_kind):: j,kk,ier,istatus + integer(i_kind):: i1,i2,i3,i4 real(r_kind) :: val,val2 real(r_kind) :: w1,w2,w3,w4 real(r_kind) :: q_TL,p_TL,t_TL real(r_kind) :: rq_TL,rp_TL,rt_TL + real(r_kind),dimension(nsig) :: valk2,valk real(r_kind),pointer,dimension(:) :: st,sq real(r_kind),pointer,dimension(:) :: rt,rq real(r_kind),pointer,dimension(:) :: sp @@ -149,34 +150,33 @@ subroutine stpgps(gpshead,rval,sval,out,sges,nstep) val2=-gpsptr%res if(nstep > 0)then - do j=1,nsig - i1(j)= gpsptr%ij(1,j) - i2(j)= gpsptr%ij(2,j) - i3(j)= gpsptr%ij(3,j) - i4(j)= gpsptr%ij(4,j) - enddo w1=gpsptr%wij(1) w2=gpsptr%wij(2) w3=gpsptr%wij(3) w4=gpsptr%wij(4) - val=zero - - +!$omp parallel do schedule(dynamic,1) private(j,t_TL,rt_TL,q_TL,rq_TL,p_TL,rp_TL,i1,i2,i3,i4) do j=1,nsig - t_TL =w1* st(i1(j))+w2* st(i2(j))+w3* st(i3(j))+w4* st(i4(j)) - rt_TL=w1* rt(i1(j))+w2* rt(i2(j))+w3* rt(i3(j))+w4* rt(i4(j)) - q_TL =w1* sq(i1(j))+w2* sq(i2(j))+w3* sq(i3(j))+w4* sq(i4(j)) - rq_TL=w1* rq(i1(j))+w2* rq(i2(j))+w3* rq(i3(j))+w4* rq(i4(j)) - p_TL =w1* sp(i1(j))+w2* sp(i2(j))+w3* sp(i3(j))+w4* sp(i4(j)) - rp_TL=w1* rp(i1(j))+w2* rp(i2(j))+w3* rp(i3(j))+w4* rp(i4(j)) - val2 = val2 + t_tl*gpsptr%jac_t(j)+ q_tl*gpsptr%jac_q(j)+p_tl*gpsptr%jac_p(j) - val = val + rt_tl*gpsptr%jac_t(j)+rq_tl*gpsptr%jac_q(j)+rp_tl*gpsptr%jac_p(j) - + i1= gpsptr%ij(1,j) + i2= gpsptr%ij(2,j) + i3= gpsptr%ij(3,j) + i4= gpsptr%ij(4,j) + t_TL =w1* st(i1)+w2* st(i2)+w3* st(i3)+w4* st(i4) + rt_TL=w1* rt(i1)+w2* rt(i2)+w3* rt(i3)+w4* rt(i4) + q_TL =w1* sq(i1)+w2* sq(i2)+w3* sq(i3)+w4* sq(i4) + rq_TL=w1* rq(i1)+w2* rq(i2)+w3* rq(i3)+w4* rq(i4) + p_TL =w1* sp(i1)+w2* sp(i2)+w3* sp(i3)+w4* sp(i4) + rp_TL=w1* rp(i1)+w2* rp(i2)+w3* rp(i3)+w4* rp(i4) + valk2(j) = t_tl*gpsptr%jac_t(j)+ q_tl*gpsptr%jac_q(j)+ p_tl*gpsptr%jac_p(j) + valk(j) = rt_tl*gpsptr%jac_t(j)+rq_tl*gpsptr%jac_q(j)+rp_tl*gpsptr%jac_p(j) enddo - + val=zero + do j=1,nsig + val2 = val2 + valk2(j) + val = val + valk(j) + enddo ! penalty and gradient do kk=1,nstep diff --git a/src/gsi/stpjo.f90 b/src/gsi/stpjo.f90 index b0ff730823..0f80d9b4a2 100644 --- a/src/gsi/stpjo.f90 +++ b/src/gsi/stpjo.f90 @@ -267,8 +267,6 @@ subroutine stpjo(dval,dbias,xval,xbias,sges,pbcjo,nstep) use m_obsdiags, only: obOper_destroy use gsi_obOperTypeManager, only: obOper_typeInfo - use intradmod, only: setrad - use mpeu_util, only: perr,die use mpeu_util, only: tell use mpeu_mpif, only: MPI_comm_world @@ -290,7 +288,6 @@ subroutine stpjo(dval,dbias,xval,xbias,sges,pbcjo,nstep) class(obOper),pointer:: it_obOper !************************************************************************************ - call setrad(xval(1)) !$omp parallel do schedule(dynamic,1) private(ll,mm,ib,it_obOper) do mm=1,stpcnt diff --git a/src/gsi/stppm2_5.f90 b/src/gsi/stppm2_5.f90 index 87f0f9a4f5..3483563b9e 100644 --- a/src/gsi/stppm2_5.f90 +++ b/src/gsi/stppm2_5.f90 @@ -66,6 +66,7 @@ subroutine stppm2_5(pm2_5head,rval,sval,out,sges,nstep) use gridmod, only: cmaq_regional,wrf_mass_regional,fv3_cmaq_regional USE chemmod, ONLY: d_2_5,s_2_5,nh4_mfac,oc_mfac,laeroana_gocart use chemmod, only: naero_cmaq_fv3,aeronames_cmaq_fv3,imodes_cmaq_fv3,laeroana_fv3cmaq + use chemmod, only: naero_smoke_fv3,aeronames_smoke_fv3,laeroana_fv3smoke implicit none @@ -82,7 +83,7 @@ subroutine stppm2_5(pm2_5head,rval,sval,out,sges,nstep) real(r_kind) cg_pm2_5,val,val2,wgross,wnotgross,pm2_5_pg real(r_kind),dimension(max(1,nstep))::pen real(r_kind) w1,w2,w3,w4,w5,w6,w7,w8,qq - real(r_kind),pointer,dimension(:):: rpm2_5,spm2_5 + real(r_kind),pointer,dimension(:):: rpm2_5,spm2_5,rdust,sdust type(pm2_5Node), pointer :: pm2_5ptr character(len=max_varname_length) :: aeroname @@ -255,6 +256,105 @@ subroutine stppm2_5(pm2_5head,rval,sval,out,sges,nstep) end if + if ( laeroana_fv3smoke) then + pm2_5ptr => pm2_5Node_typecast(pm2_5head) + + ier=0 + iaero=1 + aeroname=aeronames_smoke_fv3(iaero) !'smoke' + call gsi_bundlegetpointer(sval,trim(aeroname),spm2_5,istatus);ier=istatus+ier + call gsi_bundlegetpointer(rval,trim(aeroname),rpm2_5,istatus);ier=istatus+ier + iaero=2 + aeroname=aeronames_smoke_fv3(iaero) !'dust' + call gsi_bundlegetpointer(sval,trim(aeroname),sdust,istatus);ier=istatus+ier + call gsi_bundlegetpointer(rval,trim(aeroname),rdust,istatus);ier=istatus+ier + + if (istatus /= 0) then + write(6,*) 'error gsi_bundlegetpointer in intpm2_5 for ',aeronames_smoke_fv3(1:2) + call stop2(454) + endif + + do while (associated(pm2_5ptr)) + if(pm2_5ptr%luse)then + if(nstep > 0)then + j1=pm2_5ptr%ij(1) + j2=pm2_5ptr%ij(2) + j3=pm2_5ptr%ij(3) + j4=pm2_5ptr%ij(4) + j5=pm2_5ptr%ij(5) + j6=pm2_5ptr%ij(6) + j7=pm2_5ptr%ij(7) + j8=pm2_5ptr%ij(8) + w1=pm2_5ptr%wij(1) + w2=pm2_5ptr%wij(2) + w3=pm2_5ptr%wij(3) + w4=pm2_5ptr%wij(4) + w5=pm2_5ptr%wij(5) + w6=pm2_5ptr%wij(6) + w7=pm2_5ptr%wij(7) + w8=pm2_5ptr%wij(8) + + istatus=0 + + val2=-pm2_5ptr%res + val=zero + + iaero=1 + val= pm2_5ptr%pm25wc(iaero)* & + (w1*rpm2_5(j1)+w2*rpm2_5(j2)+w3*rpm2_5(j3)+w4*rpm2_5(j4)+& + w5*rpm2_5(j5)+w6*rpm2_5(j6)+w7*rpm2_5(j7)+w8*rpm2_5(j8))+val + iaero=2 + val= pm2_5ptr%pm25wc(iaero)* & + (w1*rdust(j1)+w2*rdust(j2)+w3*rdust(j3)+w4*rdust(j4)+& + w5*rdust(j5)+w6*rdust(j6)+w7*rdust(j7)+w8*rdust(j8))+val + + iaero=1 + val2= pm2_5ptr%pm25wc(iaero)* & + (w1*spm2_5(j1)+w2*spm2_5(j2)+w3*spm2_5(j3)+w4*spm2_5(j4)+& + w5*spm2_5(j5)+w6*spm2_5(j6)+w7*spm2_5(j7)+w8*spm2_5(j8))+val2 + iaero=2 + val2= pm2_5ptr%pm25wc(iaero)* & + (w1*sdust(j1)+w2*sdust(j2)+w3*sdust(j3)+w4*sdust(j4)+& + w5*sdust(j5)+w6*sdust(j6)+w7*sdust(j7)+w8*sdust(j8))+val2 + + do kk=1,nstep + qq=val2+sges(kk)*val + pen(kk)=qq*qq*pm2_5ptr%err2 + end do + else + pen(1)=pm2_5ptr%res*pm2_5ptr%res*pm2_5ptr%err2 + end if !nstep + +! modify penalty term if nonlinear qc + + if (nlnqc_iter .and. pm2_5ptr%pg > tiny_r_kind .and. & + pm2_5ptr%b > tiny_r_kind) then + pm2_5_pg=pm2_5ptr%pg*varqc_iter + cg_pm2_5=cg_term/pm2_5ptr%b + wnotgross= one-pm2_5_pg + wgross = pm2_5_pg*cg_pm2_5/wnotgross + do kk=1,max(1,nstep) + pen(kk)= -two*log((exp(-half*pen(kk))+wgross)/(one+wgross)) + end do + endif + + out(1) = out(1)+pen(1)*pm2_5ptr%raterr2 + do kk=2,nstep + out(kk) = out(kk)+(pen(kk)-pen(1))*pm2_5ptr%raterr2 + end do + end if ! pm2_5ptr%luse + + pm2_5ptr => pm2_5Node_nextcast(pm2_5ptr) + + end do + + nullify(spm2_5) + nullify(rpm2_5) + nullify(sdust) + nullify(rdust) + + end if ! laeroana_fv3smoke + if (wrf_mass_regional .and. laeroana_gocart) then diff --git a/src/gsi/stprad.f90 b/src/gsi/stprad.f90 index 0def855d61..e81688f7e3 100644 --- a/src/gsi/stprad.f90 +++ b/src/gsi/stprad.f90 @@ -110,7 +110,7 @@ subroutine stprad(radhead,dval,xval,rpred,spred,out,sges,nstep) use gsi_metguess_mod, only: gsi_metguess_get use mpeu_util, only: getindex use intradmod, only: luseu,lusev,luset,luseq,lusecw,luseoz,luseqg,luseqh,luseqi,luseql, & - luseqr,luseqs + luseqr,luseqs,lusesst use intradmod, only: itsen,iqv,ioz,icw,ius,ivs,isst,iqg,iqh,iqi,iql,iqr,iqs,lgoback use m_obsNode, only: obsNode use m_radNode, only: radNode @@ -128,14 +128,15 @@ subroutine stprad(radhead,dval,xval,rpred,spred,out,sges,nstep) type(gsi_bundle),intent(in) :: xval ! Declare local variables - integer(i_kind) istatus - integer(i_kind) nn,n,ic,k,nx,j1,j2,j3,j4,kk, mm, ic1,ncr + integer(i_kind) istatus,icx + integer(i_kind) nn,n,ic,k,nx,j1,j2,j3,j4,kk,mm,ncr real(r_kind) val2,val,w1,w2,w3,w4 real(r_kind),dimension(nsigradjac):: tdir,rdir real(r_kind) cg_rad,wgross,wnotgross integer(i_kind),dimension(nsig) :: j1n,j2n,j3n,j4n - real(r_kind),dimension(max(1,nstep)) :: term,rad + real(r_kind),dimension(max(1,nstep)) :: rad type(radNode), pointer :: radptr + real(r_kind),allocatable,dimension(:,:) :: term real(r_kind),allocatable,dimension(:) :: biasvects real(r_kind),allocatable,dimension(:) :: biasvectr real(r_kind),pointer,dimension(:) :: rt,rq,rcw,roz,ru,rv,rqg,rqh,rqi,rql,rqr,rqs @@ -150,34 +151,59 @@ subroutine stprad(radhead,dval,xval,rpred,spred,out,sges,nstep) if(lgoback)return -! Retrieve pointers - call gsi_bundlegetpointer(xval,'u', su, istatus) - call gsi_bundlegetpointer(xval,'v', sv, istatus) - call gsi_bundlegetpointer(xval,'tsen' ,st, istatus) - call gsi_bundlegetpointer(xval,'q', sq, istatus) - call gsi_bundlegetpointer(xval,'cw' ,scw,istatus) - call gsi_bundlegetpointer(xval,'oz' ,soz,istatus) - call gsi_bundlegetpointer(xval,'sst',sst,istatus) - call gsi_bundlegetpointer(xval,'qg' ,sqg,istatus) - call gsi_bundlegetpointer(xval,'qh' ,sqh,istatus) - call gsi_bundlegetpointer(xval,'qi' ,sqi,istatus) - call gsi_bundlegetpointer(xval,'ql' ,sql,istatus) - call gsi_bundlegetpointer(xval,'qr' ,sqr,istatus) - call gsi_bundlegetpointer(xval,'qs' ,sqs,istatus) - - call gsi_bundlegetpointer(dval,'u', ru, istatus) - call gsi_bundlegetpointer(dval,'v', rv, istatus) - call gsi_bundlegetpointer(dval,'tsen' ,rt, istatus) - call gsi_bundlegetpointer(dval,'q', rq, istatus) - call gsi_bundlegetpointer(dval,'cw' ,rcw,istatus) - call gsi_bundlegetpointer(dval,'oz' ,roz,istatus) - call gsi_bundlegetpointer(dval,'sst',rst,istatus) - call gsi_bundlegetpointer(dval,'qg' ,rqg,istatus) - call gsi_bundlegetpointer(dval,'qh' ,rqh,istatus) - call gsi_bundlegetpointer(dval,'qi' ,rqi,istatus) - call gsi_bundlegetpointer(dval,'ql' ,rql,istatus) - call gsi_bundlegetpointer(dval,'qr' ,rqr,istatus) - call gsi_bundlegetpointer(dval,'qs' ,rqs,istatus) +! Retrieve pointers for used variables + if(luseu)then + call gsi_bundlegetpointer(dval,'u', ru, istatus) + call gsi_bundlegetpointer(xval,'u', su, istatus) + end if + if(lusev)then + call gsi_bundlegetpointer(xval,'v', sv, istatus) + call gsi_bundlegetpointer(dval,'v', rv, istatus) + end if + if(luset)then + call gsi_bundlegetpointer(xval,'tsen' ,st, istatus) + call gsi_bundlegetpointer(dval,'tsen' ,rt, istatus) + end if + if(luseq)then + call gsi_bundlegetpointer(xval,'q', sq, istatus) + call gsi_bundlegetpointer(dval,'q', rq, istatus) + end if + if(lusecw)then + call gsi_bundlegetpointer(xval,'cw' ,scw,istatus) + call gsi_bundlegetpointer(dval,'cw' ,rcw,istatus) + end if + if(luseoz)then + call gsi_bundlegetpointer(xval,'oz' ,soz,istatus) + call gsi_bundlegetpointer(dval,'oz' ,roz,istatus) + end if + if(lusesst)then + call gsi_bundlegetpointer(xval,'sst',sst,istatus) + call gsi_bundlegetpointer(dval,'sst',rst,istatus) + end if + if(luseqg)then + call gsi_bundlegetpointer(xval,'qg' ,sqg,istatus) + call gsi_bundlegetpointer(dval,'qg' ,rqg,istatus) + end if + if(luseqh)then + call gsi_bundlegetpointer(xval,'qh' ,sqh,istatus) + call gsi_bundlegetpointer(dval,'qh' ,rqh,istatus) + end if + if(luseqi)then + call gsi_bundlegetpointer(xval,'qi' ,sqi,istatus) + call gsi_bundlegetpointer(dval,'qi' ,rqi,istatus) + end if + if(luseql)then + call gsi_bundlegetpointer(xval,'ql' ,sql,istatus) + call gsi_bundlegetpointer(dval,'ql' ,rql,istatus) + end if + if(luseqr)then + call gsi_bundlegetpointer(xval,'qr' ,sqr,istatus) + call gsi_bundlegetpointer(dval,'qr' ,rqr,istatus) + end if + if(luseqs)then + call gsi_bundlegetpointer(xval,'qs' ,sqs,istatus) + call gsi_bundlegetpointer(dval,'qs' ,rqs,istatus) + end if tdir=zero @@ -187,118 +213,117 @@ subroutine stprad(radhead,dval,xval,rpred,spred,out,sges,nstep) do while(associated(radptr)) if(radptr%luse)then if(nstep > 0)then - j1=radptr%ij(1) - j2=radptr%ij(2) - j3=radptr%ij(3) - j4=radptr%ij(4) w1=radptr%wij(1) w2=radptr%wij(2) w3=radptr%wij(3) w4=radptr%wij(4) - if(luseu)then - tdir(ius+1)=w1* su(j1) + w2* su(j2) + w3* su(j3) + w4* su(j4) - rdir(ius+1)=w1* ru(j1) + w2* ru(j2) + w3* ru(j3) + w4* ru(j4) - endif - if(lusev)then - tdir(ivs+1)=w1* sv(j1) + w2* sv(j2) + w3* sv(j3) + w4* sv(j4) - rdir(ivs+1)=w1* rv(j1) + w2* rv(j2) + w3* rv(j3) + w4* rv(j4) - endif - if (isst>=0) then - tdir(isst+1)=w1*sst(j1) + w2*sst(j2) + w3*sst(j3) + w4*sst(j4) - rdir(isst+1)=w1*rst(j1) + w2*rst(j2) + w3*rst(j3) + w4*rst(j4) - end if - j1n(1) = j1 - j2n(1) = j2 - j3n(1) = j3 - j4n(1) = j4 + j1n(1) = radptr%ij(1) + j2n(1) = radptr%ij(2) + j3n(1) = radptr%ij(3) + j4n(1) = radptr%ij(4) do n=2,nsig j1n(n) = j1n(n-1)+latlon11 j2n(n) = j2n(n-1)+latlon11 j3n(n) = j3n(n-1)+latlon11 j4n(n) = j4n(n-1)+latlon11 enddo - do n=1,nsig - j1 = j1n(n) - j2 = j2n(n) - j3 = j3n(n) - j4 = j4n(n) - -! Input state vector -! Input search direction vector - if(luset)then - tdir(itsen+n)=w1* st(j1) +w2* st(j2) + w3* st(j3) +w4* st(j4) - rdir(itsen+n)=w1* rt(j1) +w2* rt(j2) + w3* rt(j3) +w4* rt(j4) - endif - if(luseq)then - tdir(iqv+n)=w1* sq(j1) +w2* sq(j2) + w3* sq(j3) +w4* sq(j4) - rdir(iqv+n)=w1* rq(j1) +w2* rq(j2) + w3* rq(j3) +w4* rq(j4) - endif - if (luseoz) then - tdir(ioz+n)=w1*soz(j1)+w2*soz(j2)+ w3*soz(j3)+w4*soz(j4) - rdir(ioz+n)=w1*roz(j1)+w2*roz(j2)+ w3*roz(j3)+w4*roz(j4) - end if - if (lusecw) then - tdir(icw+n)=w1*scw(j1)+w2*scw(j2)+ w3*scw(j3)+w4*scw(j4) - rdir(icw+n)=w1*rcw(j1)+w2*rcw(j2)+ w3*rcw(j3)+w4*rcw(j4) - end if - if (luseqg) then - tdir(iqg+n)=w1*sqg(j1)+w2*sqg(j2)+ w3*sqg(j3)+w4*sqg(j4) - rdir(iqg+n)=w1*rqg(j1)+w2*rqg(j2)+ w3*rqg(j3)+w4*rqg(j4) - end if - if (luseqh) then - tdir(iqh+n)=w1*sqh(j1)+w2*sqh(j2)+ w3*sqh(j3)+w4*sqh(j4) - rdir(iqh+n)=w1*rqh(j1)+w2*rqh(j2)+ w3*rqh(j3)+w4*rqh(j4) - end if - if (luseqi) then - tdir(iqi+n)=w1*sqi(j1)+w2*sqi(j2)+ w3*sqi(j3)+w4*sqi(j4) - rdir(iqi+n)=w1*rqi(j1)+w2*rqi(j2)+ w3*rqi(j3)+w4*rqi(j4) - end if - if (luseql) then - tdir(iql+n)=w1*sql(j1)+w2*sql(j2)+ w3*sql(j3)+w4*sql(j4) - rdir(iql+n)=w1*rql(j1)+w2*rql(j2)+ w3*rql(j3)+w4*rql(j4) - end if - if (luseqr) then - tdir(iqr+n)=w1*sqr(j1)+w2*sqr(j2)+ w3*sqr(j3)+w4*sqr(j4) - rdir(iqr+n)=w1*rqr(j1)+w2*rqr(j2)+ w3*rqr(j3)+w4*rqr(j4) + allocate(biasvects(radptr%nchan)) + allocate(biasvectr(radptr%nchan)) + allocate(term(max(1,nstep),radptr%nchan)) + +!$omp parallel do schedule(dynamic,1) private(n,j1,j2,j3,j4,icx,vals_quad,valr_quad,nx) + do n=1,max(nsig,radptr%nchan) + if(n <= nsig)then + j1 = j1n(n) + j2 = j2n(n) + j3 = j3n(n) + j4 = j4n(n) + if(n == 1)then + if(luseu)then + tdir(ius+1)=w1* su(j1) + w2* su(j2) + w3* su(j3) + w4* su(j4) + rdir(ius+1)=w1* ru(j1) + w2* ru(j2) + w3* ru(j3) + w4* ru(j4) + endif + if(lusev)then + tdir(ivs+1)=w1* sv(j1) + w2* sv(j2) + w3* sv(j3) + w4* sv(j4) + rdir(ivs+1)=w1* rv(j1) + w2* rv(j2) + w3* rv(j3) + w4* rv(j4) + endif + if (lusesst) then + tdir(isst+1)=w1*sst(j1) + w2*sst(j2) + w3*sst(j3) + w4*sst(j4) + rdir(isst+1)=w1*rst(j1) + w2*rst(j2) + w3*rst(j3) + w4*rst(j4) + end if + end if + +! Input state vector +! Input search direction vector + if(luset)then + tdir(itsen+n)=w1* st(j1) +w2* st(j2) + w3* st(j3) +w4* st(j4) + rdir(itsen+n)=w1* rt(j1) +w2* rt(j2) + w3* rt(j3) +w4* rt(j4) + endif + if(luseq)then + tdir(iqv+n)=w1* sq(j1) +w2* sq(j2) + w3* sq(j3) +w4* sq(j4) + rdir(iqv+n)=w1* rq(j1) +w2* rq(j2) + w3* rq(j3) +w4* rq(j4) + endif + if (luseoz) then + tdir(ioz+n)=w1*soz(j1)+w2*soz(j2)+ w3*soz(j3)+w4*soz(j4) + rdir(ioz+n)=w1*roz(j1)+w2*roz(j2)+ w3*roz(j3)+w4*roz(j4) + end if + if (lusecw) then + tdir(icw+n)=w1*scw(j1)+w2*scw(j2)+ w3*scw(j3)+w4*scw(j4) + rdir(icw+n)=w1*rcw(j1)+w2*rcw(j2)+ w3*rcw(j3)+w4*rcw(j4) + end if + if (luseqg) then + tdir(iqg+n)=w1*sqg(j1)+w2*sqg(j2)+ w3*sqg(j3)+w4*sqg(j4) + rdir(iqg+n)=w1*rqg(j1)+w2*rqg(j2)+ w3*rqg(j3)+w4*rqg(j4) + end if + if (luseqh) then + tdir(iqh+n)=w1*sqh(j1)+w2*sqh(j2)+ w3*sqh(j3)+w4*sqh(j4) + rdir(iqh+n)=w1*rqh(j1)+w2*rqh(j2)+ w3*rqh(j3)+w4*rqh(j4) + end if + if (luseqi) then + tdir(iqi+n)=w1*sqi(j1)+w2*sqi(j2)+ w3*sqi(j3)+w4*sqi(j4) + rdir(iqi+n)=w1*rqi(j1)+w2*rqi(j2)+ w3*rqi(j3)+w4*rqi(j4) + end if + if (luseql) then + tdir(iql+n)=w1*sql(j1)+w2*sql(j2)+ w3*sql(j3)+w4*sql(j4) + rdir(iql+n)=w1*rql(j1)+w2*rql(j2)+ w3*rql(j3)+w4*rql(j4) + end if + if (luseqr) then + tdir(iqr+n)=w1*sqr(j1)+w2*sqr(j2)+ w3*sqr(j3)+w4*sqr(j4) + rdir(iqr+n)=w1*rqr(j1)+w2*rqr(j2)+ w3*rqr(j3)+w4*rqr(j4) + end if + if (luseqs) then + tdir(iqs+n)=w1*sqs(j1)+w2*sqs(j2)+ w3*sqs(j3)+w4*sqs(j4) + rdir(iqs+n)=w1*rqs(j1)+w2*rqs(j2)+ w3*rqs(j3)+w4*rqs(j4) + end if end if - if (luseqs) then - tdir(iqs+n)=w1*sqs(j1)+w2*sqs(j2)+ w3*sqs(j3)+w4*sqs(j4) - rdir(iqs+n)=w1*rqs(j1)+w2*rqs(j2)+ w3*rqs(j3)+w4*rqs(j4) + if(n <= radptr%nchan)then + icx=radptr%icx(n) + vals_quad = zero_quad + valr_quad = zero_quad + do nx=1,npred + vals_quad = vals_quad + spred(nx,icx)*radptr%pred(nx,n) + valr_quad = valr_quad + rpred(nx,icx)*radptr%pred(nx,n) + end do + biasvects(n) = vals_quad + biasvectr(n) = valr_quad end if - end do - end if - if(nstep > 0)then - allocate(biasvects(radptr%nchan)) - allocate(biasvectr(radptr%nchan)) - do nn=1,radptr%nchan - ic1=radptr%icx(nn) - vals_quad = zero_quad - valr_quad = zero_quad - do nx=1,npred - vals_quad = vals_quad + spred(nx,ic1)*radptr%pred(nx,nn) - valr_quad = valr_quad + rpred(nx,ic1)*radptr%pred(nx,nn) - end do - biasvects(nn) = vals_quad - biasvectr(nn) = valr_quad - end do endif - ncr=0 +! !$omp parallel do schedule(dynamic,1) private(nn,ic,mm,ncr,k,kk,rad,val,val2,cg_rad,wnotgross,wgross) do nn=1,radptr%nchan - val2=-radptr%res(nn) - if(nstep > 0)then val = zero + val2=-radptr%res(nn) ! contribution from bias corection ic=radptr%icx(nn) if(radptr%use_corr_obs) then do mm=1,nn - ncr=ncr+1 + ncr=radptr%iccerr(nn)+mm val2=val2+radptr%rsqrtinv(ncr)*biasvects(mm) val =val +radptr%rsqrtinv(ncr)*biasvectr(mm) end do @@ -318,12 +343,12 @@ subroutine stprad(radhead,dval,xval,rpred,spred,out,sges,nstep) rad(kk)=val2+sges(kk)*val end do else - rad(kk)= val2 + rad(1)= -radptr%res(nn) end if ! calculate contribution to J do kk=1,max(1,nstep) - term(kk) = radptr%err2(nn)*rad(kk)*rad(kk) + term(kk,nn) = radptr%err2(nn)*rad(kk)*rad(kk) end do ! Modify penalty term if nonlinear QC @@ -333,18 +358,23 @@ subroutine stprad(radhead,dval,xval,rpred,spred,out,sges,nstep) wnotgross= one-pg_rad(ic)*varqc_iter wgross = varqc_iter*pg_rad(ic)*cg_rad/wnotgross do kk=1,max(1,nstep) - term(kk) = -two*log((exp(-half*term(kk) ) + wgross)/(one+wgross)) + term(kk,nn) = -two*log((exp(-half*term(kk,nn) ) + wgross)/(one+wgross)) end do endif - out(1) = out(1) + term(1)*radptr%raterr2(nn) + end do + + deallocate(biasvects, biasvectr) + + do nn=1,radptr%nchan + out(1) = out(1) + term(1,nn)*radptr%raterr2(nn) do kk=2,nstep - out(kk) = out(kk) + (term(kk)-term(1))*radptr%raterr2(nn) + out(kk) = out(kk) + (term(kk,nn)-term(1,nn))*radptr%raterr2(nn) end do end do - if(nstep > 0) deallocate(biasvects, biasvectr) + deallocate(term) end if diff --git a/src/gsi/stprw.f90 b/src/gsi/stprw.f90 index 710d9baa23..c5f996463c 100644 --- a/src/gsi/stprw.f90 +++ b/src/gsi/stprw.f90 @@ -83,6 +83,7 @@ subroutine stprw(rwhead,rval,sval,out,sges,nstep) ! !$$$ use kinds, only: r_kind,i_kind,r_quad + use obsmod, only: if_use_w_vr use qcmod, only: nlnqc_iter,varqc_iter use constants, only: half,one,two,tiny_r_kind,cg_term,zero_quad,r3600 use gsi_bundlemod, only: gsi_bundle @@ -124,7 +125,7 @@ subroutine stprw(rwhead,rval,sval,out,sges,nstep) call gsi_bundlegetpointer(sval,'u',su,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'v',sv,istatus);ier=istatus+ier call gsi_bundlegetpointer(sval,'w',sw,istatus) - if (istatus==0) then + if (if_use_w_vr.and.istatus==0) then include_w=.true. else include_w=.false. @@ -132,7 +133,7 @@ subroutine stprw(rwhead,rval,sval,out,sges,nstep) call gsi_bundlegetpointer(rval,'u',ru,istatus);ier=istatus+ier call gsi_bundlegetpointer(rval,'v',rv,istatus);ier=istatus+ier call gsi_bundlegetpointer(rval,'w',rw,istatus) - if (istatus==0) then + if (if_use_w_vr.and.istatus==0) then include_w=.true. else include_w=.false. diff --git a/src/gsi/stpsst.f90 b/src/gsi/stpsst.f90 index 222b67862c..765676010b 100644 --- a/src/gsi/stpsst.f90 +++ b/src/gsi/stpsst.f90 @@ -101,13 +101,13 @@ subroutine stpsst(ssthead,rval,sval,out,sges,nstep) real(r_kind) pg_sst real(r_kind),pointer,dimension(:) :: ssst real(r_kind),pointer,dimension(:) :: rsst - real(r_kind) tdir,rdir type(sstNode), pointer :: sstptr out=zero_quad ! If no sst data return if(.not. associated(ssthead))return + if(.not. nst_gsi > 2 ) return ! Retrieve pointers ! Simply return if any pointer not found @@ -129,15 +129,12 @@ subroutine stpsst(ssthead,rval,sval,out,sges,nstep) w3=sstptr%wij(3) w4=sstptr%wij(4) - if ( nst_gsi > 2 .and. (sstptr%tz_tr > zero .and. sstptr%tz_tr <= one) ) then - tdir = w1*ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4) - rdir = w1*rsst(j1)+w2*rsst(j2)+w3*rsst(j3)+w4*rsst(j4) - val = sstptr%tz_tr*rdir - val2 = sstptr%tz_tr*tdir - sstptr%res - else - val =w1*rsst(j1)+w2*rsst(j2)+w3*rsst(j3)+w4*rsst(j4) - val2=w1*ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4)-sstptr%res - endif + val =w1*rsst(j1)+w2*rsst(j2)+w3*rsst(j3)+w4*rsst(j4) + val2=w1*ssst(j1)+w2*ssst(j2)+w3*ssst(j3)+w4*ssst(j4) + + val = sstptr%tz_tr*val + val2 = sstptr%tz_tr*val2 + val2=val2-sstptr%res do kk=1,nstep sst=val2+sges(kk)*val diff --git a/src/gsi/stpt.f90 b/src/gsi/stpt.f90 index 27f5385ac1..5911d87b9d 100644 --- a/src/gsi/stpt.f90 +++ b/src/gsi/stpt.f90 @@ -184,7 +184,6 @@ subroutine stpt(thead,dval,xval,out,sges,nstep,rpred,spred) w6=tptr%wij(6) w7=tptr%wij(7) w8=tptr%wij(8) -! Note time derivative stuff not consistent for virtual temperature if(tptr%tv_ob)then val= w1*rtv(j1)+w2*rtv(j2)+w3*rtv(j3)+w4*rtv(j4)+ & @@ -208,9 +207,6 @@ subroutine stpt(thead,dval,xval,out,sges,nstep,rpred,spred) end do end if - do kk=1,nstep - tt(kk)=val2+sges(kk)*val - end do if(tptr%use_sfc_model) then @@ -229,8 +225,9 @@ subroutine stpt(thead,dval,xval,out,sges,nstep,rpred,spred) valv2=w1* sv(j1)+w2* sv(j2)+w3* sv(j3)+w4* sv(j4) valp =w1* rp(j1)+w2* rp(j2)+w3* rp(j3)+w4* rp(j4) valp2=w1* sp(j1)+w2* sp(j2)+w3* sp(j3)+w4* sp(j4) + do kk=1,nstep - ts_prime=tt(kk) + ts_prime=val2+sges(kk)*val tg_prime=valsst2+sges(kk)*valsst qs_prime=valq2+sges(kk)*valq us_prime=valu2+sges(kk)*valu @@ -239,14 +236,18 @@ subroutine stpt(thead,dval,xval,out,sges,nstep,rpred,spred) tt(kk)=psfc_prime*tptr%tlm_tsfc(1) + tg_prime*tptr%tlm_tsfc(2) + & ts_prime *tptr%tlm_tsfc(3) + qs_prime*tptr%tlm_tsfc(4) + & - us_prime *tptr%tlm_tsfc(5) + vs_prime*tptr%tlm_tsfc(6) + us_prime *tptr%tlm_tsfc(5) + vs_prime*tptr%tlm_tsfc(6) - & + tptr%res + end do + + else + + do kk=1,nstep + tt(kk)=val2+sges(kk)*val-tptr%res end do end if - do kk=1,nstep - tt(kk)=tt(kk)-tptr%res - end do else tt(1)=tptr%res end if diff --git a/src/gsi/stub_get_pseudo_ensperts.f90 b/src/gsi/stub_get_pseudo_ensperts.f90 index 7bababc0c3..ca39b4b6e2 100644 --- a/src/gsi/stub_get_pseudo_ensperts.f90 +++ b/src/gsi/stub_get_pseudo_ensperts.f90 @@ -32,7 +32,7 @@ subroutine get_pseudo_ensperts_dummy(this,en_perts,nelen) use kinds, only: i_kind implicit none class(get_pseudo_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ) :: nelen write(6,*)'get_pseudo_ensperts: ***WARNING*** dummy call ... does nothing!' diff --git a/src/gsi/stub_get_wrf_mass_ensperts.f90 b/src/gsi/stub_get_wrf_mass_ensperts.f90 index 3089cb9336..bf98f3106e 100644 --- a/src/gsi/stub_get_wrf_mass_ensperts.f90 +++ b/src/gsi/stub_get_wrf_mass_ensperts.f90 @@ -38,7 +38,7 @@ subroutine ens_spread_dualres_regional_dummy(this,mype,en_perts,nelen,en_bar) implicit none class(get_wrf_mass_ensperts_class), intent(inout) :: this integer(i_kind),intent(in):: mype - type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(in ) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen type(gsi_bundle),OPTIONAL,intent(in):: en_bar write(6,*)'get_wrf_mass_ensperts: ***WARNING*** dummy call ... does nothing!' @@ -50,7 +50,7 @@ subroutine get_wrf_mass_ensperts_dummy(this,en_perts,nelen,ps_bar) use gsi_bundlemod, only: gsi_bundle implicit none class(get_wrf_mass_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_single),dimension(:,:,:),allocatable:: ps_bar write(6,*)'get_wrf_mass_ensperts: ***WARNING*** dummy call ... does nothing!' diff --git a/src/gsi/stub_get_wrf_nmm_ensperts.f90 b/src/gsi/stub_get_wrf_nmm_ensperts.f90 index 14ab869ffd..db27125d70 100644 --- a/src/gsi/stub_get_wrf_nmm_ensperts.f90 +++ b/src/gsi/stub_get_wrf_nmm_ensperts.f90 @@ -13,7 +13,7 @@ subroutine get_wrf_nmm_ensperts_dummy(this,en_perts,nelen,region_lat_ens,region_ implicit none class(get_wrf_nmm_ensperts_class), intent(inout) :: this - type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:) + type(gsi_bundle),allocatable, intent(inout) :: en_perts(:,:,:) integer(i_kind), intent(in ):: nelen real(r_kind),allocatable, intent(inout):: region_lat_ens(:,:),region_lon_ens(:,:) real(r_single),dimension(:,:,:),allocatable, intent(inout):: ps_bar diff --git a/src/gsi/stub_wrf_binary_interface.f90 b/src/gsi/stub_wrf_binary_interface.f90 index 201482df13..58ef9e004e 100644 --- a/src/gsi/stub_wrf_binary_interface.f90 +++ b/src/gsi/stub_wrf_binary_interface.f90 @@ -29,18 +29,26 @@ end subroutine convert_binary_mass_dummy subroutine convert_binary_nmm_dummy(this,update_pint,ctph0,stph0,tlm0) use kinds, only: r_kind + use constants, only: zero implicit none class(get_wrf_binary_interface_class), intent(inout) :: this logical ,intent(inout) :: update_pint real(r_kind),intent( out) :: ctph0,stph0,tlm0 + ctph0 = zero + stph0 = zero + tlm0 = zero end subroutine convert_binary_nmm_dummy subroutine convert_nems_nmmb_dummy(this,update_pint,ctph0,stph0,tlm0) use kinds, only: r_kind + use constants, only: zero implicit none class(get_wrf_binary_interface_class), intent(inout) :: this logical ,intent(inout) :: update_pint real(r_kind),intent( out) :: ctph0,stph0,tlm0 + ctph0 = zero + stph0 = zero + tlm0 = zero end subroutine convert_nems_nmmb_dummy end module get_wrf_binary_interface_mod diff --git a/src/gsi/stub_wrf_netcdf_interface.f90 b/src/gsi/stub_wrf_netcdf_interface.f90 index d80b765300..4235318686 100644 --- a/src/gsi/stub_wrf_netcdf_interface.f90 +++ b/src/gsi/stub_wrf_netcdf_interface.f90 @@ -30,12 +30,15 @@ end subroutine convert_netcdf_mass_dummy subroutine convert_netcdf_nmm_dummy(this,update_pint,ctph0,stph0,tlm0,guess) use kinds, only: r_single,i_kind,r_kind + use constants, only: zero implicit none class(convert_netcdf_class) ,intent(inout) :: this logical ,intent(in ) :: guess logical ,intent(inout) :: update_pint real(r_kind),intent( out) :: ctph0,stph0,tlm0 - + ctph0 = zero + stph0 = zero + tlm0 = zero end subroutine convert_netcdf_nmm_dummy subroutine update_netcdf_mass_dummy(this) diff --git a/src/gsi/update_guess.f90 b/src/gsi/update_guess.f90 index a90e7a19d6..1885542a1b 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,superfact + use jfunc, only: iout_iter,bcoption,tsensible,clip_supersaturation,superfact,hofx_2m_sfcfile use gridmod, only: lat2,lon2,nsig,& regional,twodvar_regional,regional_ozone,& l_reg_update_hydro_delz @@ -287,7 +287,11 @@ subroutine update_guess(sval,sbias) ! since we don't know which comes first in met-guess, we ! must postpone updating tv after all other met-guess fields endif - icloud=getindex(cloud,guess(ic)) + if( allocated(cloud) )then + icloud=getindex(cloud,guess(ic)) + else + icloud=-999 + end if if ( .not. l_use_dbz_directDA ) then ! original code if(icloud>0) then ptr3dges = max(ptr3dges+ptr3dinc,zero) @@ -454,7 +458,7 @@ subroutine update_guess(sval,sbias) endif call gsd_update_soil_tq(tinc_1st,is_t,qinc_1st,is_q,it) endif ! l_gsd_soilTQ_nudge - if (i_use_2mt4b > 0 .and. is_t>0) then + if ( (i_use_2mt4b > 0.or. hofx_2m_sfcfile) .and. is_t>0) then do j=1,lon2 do i=1,lat2 tinc_1st(i,j)=p_tv(i,j,1) @@ -462,7 +466,7 @@ subroutine update_guess(sval,sbias) end do call gsd_update_t2m(tinc_1st,it) endif ! l_gsd_t2m_adjust - if (i_use_2mq4b > 0 .and. is_q>0) then + if ( (i_use_2mq4b > 0.or. hofx_2m_sfcfile) .and. is_q>0) then do j=1,lon2 do i=1,lat2 qinc_1st(i,j)=p_q(i,j,1) diff --git a/src/gsi/vqc_int.f90 b/src/gsi/vqc_int.f90 index 714ee23ea3..12abc53b35 100644 --- a/src/gsi/vqc_int.f90 +++ b/src/gsi/vqc_int.f90 @@ -27,12 +27,12 @@ subroutine vqc_int(error2,rat_error2,t_pgv,cg_tv,var_jbv,ibv,ikv,valv,gradv) real(r_kind), intent(out) :: gradv ! Declare local variables - real(r_kind) wnotgross,wgross,g_nvqc,w_nvqc,p0,qq + real(r_kind) wnotgross,wgross,g_nvqc,w_nvqc,p0,qq - if (vqc .and. nlnqc_iter .and. t_pgv > tiny_r_kind .and. & + if (vqc .and. nlnqc_iter .and. t_pgv > tiny_r_kind .and. & cg_tv > tiny_r_kind) then wnotgross= one-t_pgv wgross =t_pgv*cg_tv/wnotgross diff --git a/src/gsi/vqc_stp.f90 b/src/gsi/vqc_stp.f90 index 1c8f296853..04d9a91245 100644 --- a/src/gsi/vqc_stp.f90 +++ b/src/gsi/vqc_stp.f90 @@ -41,7 +41,7 @@ subroutine vqc_stp(pen_v,nstep_v,tpg_v,cgt_v,& ! Note: if wgross=0 (no gross error, then wnotgross=1 and this ! all reduces to the linear case (no qc) - if (vqc .and. nlnqc_iter .and. tpg_v > tiny_r_kind .and. cgt_v >tiny_r_kind) then + if (vqc .and. nlnqc_iter .and. tpg_v > tiny_r_kind .and. cgt_v >tiny_r_kind) then wnotgross= one-tpg_v wgross =tpg_v*cgt_v/wnotgross do kk=1,max(1,nstep_v) diff --git a/src/gsi/write_incr.f90 b/src/gsi/write_incr.f90 index 69ad96e281..9adb150863 100644 --- a/src/gsi/write_incr.f90 +++ b/src/gsi/write_incr.f90 @@ -26,7 +26,7 @@ module write_incr contains - subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) + subroutine write_fv3_inc_ (grd,filename,mype_out,gfs_bundle,ibin) !$$$ subprogram documentation block ! . . . @@ -76,6 +76,7 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) use general_sub2grid_mod, only: sub2grid_info use gsi_bundlemod, only: gsi_bundle, gsi_bundlegetpointer + use gsi_bundlemod, only: assignment(=) use control_vectors, only: control_vector use constants, only: one, rad2deg, r1000 @@ -93,13 +94,13 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) use state_vectors, only: svars3d use mpeu_util, only: getindex + use control2state_mod, only: control2state implicit none ! !INPUT PARAMETERS: type(sub2grid_info), intent(in) :: grd - type(spec_vars), intent(in) :: sp_a character(len=24), intent(in) :: filename ! file to open and write to integer(i_kind), intent(in) :: mype_out ! mpi task to write output file type(gsi_bundle), intent(in) :: gfs_bundle @@ -158,7 +159,6 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) ! set up state space based off of xhatsave ! Convert from control space directly to physical ! space for comparison with obs. - call allocate_preds(sbiasinc) do iii=1,nobs_bins call allocate_state(svalinc(iii)) end do @@ -168,7 +168,10 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) do iii=1,ntlevs_ens call allocate_state(evalinc(iii)) end do + + call allocate_preds(sbiasinc) call control2state(xhatsave,mvalinc,sbiasinc) + call deallocate_preds(sbiasinc) if (l4dvar) then if (l_hyb_ens) then @@ -193,6 +196,12 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) end do end if end if + do iii=1,ntlevs_ens + call deallocate_state(evalinc(iii)) + end do + do iii=1,nsubwin + call deallocate_state(mvalinc(iii)) + end do ! Check hydrometeors in control variables iql = getindex(svars3d,'ql') @@ -366,10 +375,9 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) ncstart = (/ jstart(mype+1), 1, 1 /) nccount = (/ grd%lon1, grd%lat1-1, grd%nsig /) j1 = 2 - j2 = grd%lat1-1 else if (istart(mype+1)+grd%lat1 == grd%nlat+1) then nccount = (/ grd%lon1, grd%lat1-1, grd%nsig /) - j2 = grd%lat1-2 + j2 = grd%lat1-1 end if call mpi_barrier(mpi_comm_world,ierror) allocate(out3d(nccount(1),nccount(2),grd%nsig)) @@ -528,6 +536,10 @@ subroutine write_fv3_inc_ (grd,sp_a,filename,mype_out,gfs_bundle,ibin) endif ! ! cleanup and exit call nccheck_incr(nf90_close(ncid_out)) + deallocate(out3d) + do iii=1,nobs_bins + call deallocate_state(svalinc(iii)) + end do if ( mype == mype_out ) then write(6,*) "FV3 netCDF increment written, file= "//trim(filename)//".nc" end if diff --git a/src/gsi/xhat_vordivmod.f90 b/src/gsi/xhat_vordivmod.f90 index bff52aa9d4..e271fb9fb3 100644 --- a/src/gsi/xhat_vordivmod.f90 +++ b/src/gsi/xhat_vordivmod.f90 @@ -77,6 +77,8 @@ subroutine init_ allocate(xhat_vor(lat2,lon2,nsig,nobs_bins)) allocate(xhat_div(lat2,lon2,nsig,nobs_bins)) + xhat_vor=zero + xhat_div=zero end subroutine init_ subroutine clean_ @@ -146,18 +148,6 @@ subroutine calc_(sval) !******************************************************************************* -! Initialize local arrays - do ii=1,nobs_bins - do k=1,nsig - do j=1,lon2 - do i=1,lat2 - xhat_vor(i,j,k,ii) = zero - xhat_div(i,j,k,ii) = zero - end do - end do - end do - end do - ! The GSI analyzes stream function (sf) and velocity potential (vp). ! Wind field observations are in terms of zonal (u) and meridional ! (v) wind components or wind speed. Thus, the GSI carries wind diff --git a/ush/build.sh b/ush/build.sh index 935a48307d..71674c4f4c 100755 --- a/ush/build.sh +++ b/ush/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -eu +set -eux # Get the root of the cloned GSI directory readonly DIR_ROOT=$(cd "$(dirname "$(readlink -f -n "${BASH_SOURCE[0]}" )" )/.." && pwd -P) @@ -21,19 +21,15 @@ REGRESSION_TESTS=${REGRESSION_TESTS:-"YES"} # Build regression test suite source $DIR_ROOT/ush/detect_machine.sh # Load modules +set +x source $DIR_ROOT/ush/module-setup.sh module use $DIR_ROOT/modulefiles module load gsi_$MACHINE_ID module list +set -x -# Set CONTROLPATH variables for Regression testing on supported MACHINE_ID -if [[ $MACHINE_ID = wcoss ]] ; then - CONTROLPATH="/da/save/Michael.Lueken/svn1/build" -elif [[ $MACHINE_ID = wcoss_dell_p3 ]] ; then - CONTROLPATH="/gpfs/dell2/emc/modeling/noscrub/Michael.Lueken/svn1/install/bin" -elif [[ $MACHINE_ID = hera.intel ]] ; then - CONTROLPATH="/scratch1/NCEPDEV/da/Michael.Lueken/svn1/install/bin" -fi +# Set CONTROLPATH variable to user develop installation +CONTROLPATH="$DIR_ROOT/../develop/install/bin" # Collect BUILD Options CMAKE_OPTS+=" -DCMAKE_BUILD_TYPE=$BUILD_TYPE" @@ -52,10 +48,8 @@ CMAKE_OPTS+=" -DGSI_MODE=$GSI_MODE -DENKF_MODE=${ENKF_MODE}" mkdir -p $BUILD_DIR && cd $BUILD_DIR # Configure, build, install -set -x cmake $CMAKE_OPTS $DIR_ROOT make -j ${BUILD_JOBS:-8} VERBOSE=${BUILD_VERBOSE:-} make install -set +x exit diff --git a/ush/build_4nco_global.sh b/ush/build_4nco_global.sh index 60382ce9b5..45d5eaf7a1 100755 --- a/ush/build_4nco_global.sh +++ b/ush/build_4nco_global.sh @@ -18,6 +18,9 @@ export GSI_MODE="GFS" export ENKF_MODE="GFS" export REGRESSION_TESTS="NO" +# Optionally set compiler flags +##export FFLAGS="-check all,noarg_temp_created" + # Prune the directory structure per NCO liking if [[ "${PRUNE_4NCO:-}" =~ [yYtT] ]]; then $DIR_ROOT/ush/prune_4nco_global.sh prune diff --git a/ush/detect_machine.sh b/ush/detect_machine.sh index 0eae636cbc..ecd1ad536e 100755 --- a/ush/detect_machine.sh +++ b/ush/detect_machine.sh @@ -2,16 +2,6 @@ case $(hostname -f) in - llogin[1-3]) MACHINE_ID=wcoss_cray ;; ### luna - slogin[1-3]) MACHINE_ID=wcoss_cray ;; ### surge - - m7[12]a[1-3].ncep.noaa.gov) MACHINE_ID=wcoss_dell_p3 ;; ### mars - v7[12]a[1-3].ncep.noaa.gov) MACHINE_ID=wcoss_dell_p3 ;; ### venus - m109a[1-4].ncep.noaa.gov) MACHINE_ID=wcoss_dell_p3 ;; ### mars3.5 - m110a[1-4].ncep.noaa.gov) MACHINE_ID=wcoss_dell_p3 ;; ### mars3.5 - v109a[1-4].ncep.noaa.gov) MACHINE_ID=wcoss_dell_p3 ;; ### venus3.5 - v110a[1-4].ncep.noaa.gov) MACHINE_ID=wcoss_dell_p3 ;; ### venus3.5 - adecflow0[12].acorn.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### acorn alogin0[12].acorn.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### acorn clogin0[1-9].cactus.wcoss2.ncep.noaa.gov) MACHINE_ID=wcoss2 ;; ### cactus01-9 diff --git a/ush/module-setup.sh b/ush/module-setup.sh index 67821de821..469fd4a3c5 100755 --- a/ush/module-setup.sh +++ b/ush/module-setup.sh @@ -29,30 +29,6 @@ elif [[ $MACHINE_ID = s4* ]] ; then fi module purge -elif [[ $MACHINE_ID = wcoss_cray ]] ; then - # We are on NOAA Luna or Surge - if ( ! eval module help > /dev/null 2>&1 ) ; then - source /opt/modules/default/init/bash - fi - module purge - # Workaround until module issues are fixed: - unset _LMFILES_ - unset LOADEDMODULES - module use /opt/modulefiles - module use /opt/cray/ari/modulefiles - module use /opt/cray/craype/default/alt-modulefiles - module use /opt/cray/alt-modulefiles - module use /gpfs/hps/nco/ops/nwprod/modulefiles - module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles - module use /usrx/local/prod/modulefiles - -elif [[ $MACHINE_ID = wcoss_dell_p3 ]] ; then - # We are on NOAA Mars or Venus - if ( ! eval module help > /dev/null 2>&1 ) ; then - source /usrx/local/prod/lmod/lmod/init/bash - fi - module purge - elif [[ $MACHINE_ID = wcoss2 ]]; then # We are on WCOSS2 module reset diff --git a/ush/prune_4nco_global.sh b/ush/prune_4nco_global.sh index 0e1eba2ead..149d2bab50 100755 --- a/ush/prune_4nco_global.sh +++ b/ush/prune_4nco_global.sh @@ -15,6 +15,8 @@ # removed directories and files # +function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } + set -ex mode=$1 @@ -23,7 +25,14 @@ mode=$1 if [[ "$mode" = "prune" ]]; then string="rm -r" elif [[ "$mode" = "restore" ]]; then - string="reset HEAD" + git_ver=$(git version | cut -d" " -f3) + if [ $(version $git_ver) -lt $(version "2.23.0") ]; then + use_checkout="YES" + string="checkout" + else + use_checkout="NO" + string="restore" + fi else echo " " echo "***ERROR*** invalid mode= $mode" @@ -46,38 +55,58 @@ echo " " cd $topdir rlist="regression src/GSD unit-tests" for type in $rlist; do - git $string ${type}* - rc=$? - if [[ $rc -ne 0 ]]; then - echo "***ERROR* git $string ${type}" - exit - fi - if [[ "$mode" = "restore" ]]; then - git checkout ${type}* - rc=$? - if [[ $rc -ne 0 ]]; then - echo "***ERROR* git checkout ${type}" + if [[ "$mode" = "prune" ]]; then + if [ -e $type ]; then + git $string ${type}* + rc=$? + if [[ $rc -ne 0 ]]; then + echo "***ERROR*** git $string ${type}" + exit + fi + fi + elif [[ "$mode" = "restore" ]]; then + if [[ "$use_checkout" = "YES" ]]; then + git reset HEAD ${type}* + git checkout ${type}* + rc=$? + else + git restore --staged ${type}* + git restore ${type}* + rc=$? + fi + if [[ $rc -ne 0 ]]; then + echo "***ERROR*** restore failed for ${type}" exit - fi + fi fi done # Process doc directories and files cd $topdir/doc -rlist="EnKF_user_guide GSI_user_guide README.discover" +rlist="EnKF_user_guide GSI_user_guide README.discover Release_Notes.fv3gfs_da.v15.0.0.txt Release_Notes.gfsda.v16.0.0.txt" for type in $rlist; do - git $string ${type}* - rc=$? - if [[ $rc -ne 0 ]]; then - echo "***ERROR* git $string ${type}" - exit - fi - if [[ "$mode" = "restore" ]]; then - git checkout ${type}* - rc=$? + if [[ "$mode" = "prune" ]]; then + if [ -e $type ]; then + git $string ${type}* + rc=$? + if [[ $rc -ne 0 ]]; then + echo "***ERROR*** git $string ${type}" + exit + fi + fi + elif [[ "$mode" = "restore" ]]; then + if [[ "$use_checkout" = "YES" ]]; then + git reset HEAD ${type}* + git checkout ${type}* + rc=$? + else + git restore --staged ${type}* + git restore ${type}* + rc=$? + fi if [[ $rc -ne 0 ]]; then - echo "***ERROR* git checkout ${type}" + echo "***ERROR*** restore failed for ${type}" exit fi fi @@ -88,17 +117,27 @@ done cd $topdir/ush rlist="sub" for type in $rlist; do - git $string ${type}* - rc=$? - if [[ $rc -ne 0 ]]; then - echo "***ERROR* git $string ${type}" - exit - fi - if [[ "$mode" = "restore" ]]; then - git checkout ${type}* - rc=$? + if [[ "$mode" = "prune" ]]; then + if [ -e $type ]; then + git $string ${type}* + rc=$? + if [[ $rc -ne 0 ]]; then + echo "***ERROR*** git $string ${type}" + exit + fi + fi + elif [[ "$mode" = "restore" ]]; then + if [[ "$use_checkout" = "YES" ]]; then + git reset HEAD ${type}* + git checkout ${type}* + rc=$? + else + git restore --staged ${type}* + git restore ${type}* + rc=$? + fi if [[ $rc -ne 0 ]]; then - echo "***ERROR* git checkout ${type}" + echo "***ERROR*** restore failed for ${type}" exit fi fi diff --git a/ush/sub_jet b/ush/sub_jet index 5bd9a6d68c..e11be1280c 100755 --- a/ush/sub_jet +++ b/ush/sub_jet @@ -88,7 +88,7 @@ output=${output:-$jobname.out} myuser=$LOGNAME myhost=$(hostname) -DATA=$regdir/regtests/data +DATA=${DATA:-$ptmp/tmp} mkdir -p $DATA @@ -117,6 +117,7 @@ echo "#SBATCH --time=$timew" echo "#SBATCH --nodes=$nodes --ntasks-per-node=$procs --cpus-per-task=$threads" >> $cfile #echo "#SBATCH -j oe" >> $cfile echo "#SBATCH --account=$accnt" >> $cfile +echo "#SBATCH --mem=0" >> $cfile echo "#SBATCH --partition=kjet" >> $cfile #echo "#SBATCH -V" >> $cfile #echo "#PBS -d" >> $cfile diff --git a/ush/sub_orion b/ush/sub_orion new file mode 100755 index 0000000000..065e7c8ab0 --- /dev/null +++ b/ush/sub_orion @@ -0,0 +1,168 @@ +#!/bin/sh --login +set -x +usage="\ +Usage: $0 [options] executable [args] + where the options are: + -a account account (default: none) + -b binding run smt binding or not (default:NO) + -d dirin initial directory (default: cwd) + -e envars copy comma-separated environment variables + -g group group name + -i append standard input to command file + -j jobname specify jobname (default: executable basename) + -m machine machine on which to run (default: current) + -n write command file to stdout rather than submitting it + -o output specify output file (default: jobname.out) + -p procs[/nodes[/ppreq] + number of MPI tasks and optional nodes or Bblocking and + ppreq option (N or S) (defaults: serial, Bunlimited, S) + -q queue[/qpreq] queue name and optional requirement, e.g. dev/P + (defaults: 1 if serial or dev if parallel and none) + (queue 3 or 4 is dev or prod with twice tasks over ip) + (options: P=parallel, B=bigmem, b=batch) + -r rmem[/rcpu] resources memory and cpus/task (default: '1024 mb', 1) + -t timew wall time limit in [[hh:]mm:]ss format (default: 900) + -u userid userid to run under (default: self) + -v verbose mode + -w when when to run, in yyyymmddhh[mm], +hh[mm], thh[mm], or + Thh[mm] (full, incremental, today or tomorrow) format + (default: now) +Function: This command submits a job to the batch queue." +subcmd="$*" +stdin=NO +nosub=NO +account="" +binding="NO" +dirin="" +envars="" +group="" +jobname="" +machine="" +output="" +procs=0 +nodes="" +ppreq="" +queue="" +qpreq="" +rmem="1024" +rcpu="1" +timew="900" +userid="" +verbose=NO +when="" +while getopts a:b:d:e:g:ij:m:no:p:q:r:t:u:vw: opt;do + case $opt in + a) account="$OPTARG";; + b) binding="$OPTARG";; + d) dirin="$OPTARG";; + e) envars="$OPTARG";; + g) group="$OPTARG";; + i) stdin=YES;; + j) jobname=$OPTARG;; + m) machine="$OPTARG";; + n) nosub=YES;; + o) output=$OPTARG;; + p) procs=$(echo $OPTARG/|cut -d/ -f1);nodes=$(echo $OPTARG/|cut -d/ -f2);ppreq=$(echo $OPTARG/|cut -d/ -f3);; + q) queue=$(echo $OPTARG/|cut -d/ -f1);qpreq=$(echo $OPTARG/|cut -d/ -f2);; + r) rmem=$(echo $OPTARG/|cut -d/ -f1);rcpu=$(echo $OPTARG/|cut -d/ -f2);; + t) timew=$OPTARG;; + u) userid=$OPTARG;; + v) verbose=YES;; + w) when=$OPTARG;; + \?) echo $0: invalid option >&2;echo "$usage" >&2;exit 1;; + esac +done +shift $(($OPTIND-1)) +if [[ $# -eq 0 ]];then + echo $0: missing executable name >&2;echo "$usage" >&2;exit 1 +fi +exec=$1 +if [[ ! -s $exec ]]&&which $exec >/dev/null 2>&1;then + exec=$(which $exec) +fi +shift +args="$*" +bn=$(basename $exec) +export jobname=${jobname:-$bn} +output=${output:-$jobname.out} +myuser=$LOGNAME +myhost=$(hostname) + +DATA=${ptmp:-/work/noaa/da/stmp/$LOGNAME/tmp} +mkdir -p $DATA + +#partition=${partition:-c1ms} +queue=${queue:-batch} +timew=${timew:-01:20:00} +task_node=${task_node:-$procs} +size=$((nodes*task_node)) +envars=$envars +threads=${rcpu:-1} + +export TZ=GMT +cfile=$DATA/sub$$ +> $cfile +#echo "#PBS -S /bin/sh" >> $cfile +echo "#!/bin/sh --login" >> $cfile +echo "" >> $cfile +echo "#SBATCH --output=$output" >> $cfile +echo "#SBATCH --job-name=$jobname" >> $cfile +echo "#SBATCH --qos=$queue" >> $cfile +echo "#SBATCH --time=$timew" >> $cfile +echo "#SBATCH --nodes=$nodes --ntasks-per-node=$procs --cpus-per-task=$threads" >> $cfile +echo "#SBATCH --account=$accnt" >> $cfile + +echo "" >>$cfile +echo "export ntasks=$(( $nodes * $procs ))" >> $cfile +echo "export ppn=$procs" >> $cfile +echo "export threads=$threads" >> $cfile +echo "export OMP_NUM_THREADS=$threads" >> $cfile +##echo "export OMP_STACKSIZE=2048M" >> $cfile +echo "ulimit -s unlimited" >> $cfile + +echo "" >>$cfile +echo ". "$(awk '{ print $1, $2, $3, $4, $5, $6, $7, $8, $9 }' $regdir/regression_var.out) >>$cfile +echo "" >>$cfile + +echo ". /apps/lmod/lmod/init/sh" >> $cfile +echo "module purge" >> $cfile +echo "module use $gsisrc/modulefiles" >> $cfile +echo "module load gsi_orion" >> $cfile +echo "module list" >> $cfile +echo "" >> $cfile +cat $exec >> $cfile + +if [[ $nosub = YES ]];then + cat $cfile + exit +elif [[ $verbose = YES ]];then + set -x + cat $cfile +fi + + +if [[ $stdin = YES ]];then + cat +fi >>$cfile +if [[ $nosub = YES ]];then + cat $cfile + exit +elif [[ $verbose = YES ]];then + set -x + cat $cfile +fi +sbatch=${sbatch:-sbatch} + +ofile=$DATA/subout$$ +>$ofile +chmod 777 $ofile +$sbatch --export=ALL $cfile >$ofile +rc=$? +cat $ofile +if [[ -w $SUBLOG ]];then + jobn=$(grep -i submitted $ofile|head -n1|cut -d\" -f2) + date -u +"%Y%m%d%H%M%S : $subcmd : $jobn" >>$SUBLOG +fi +rm $cfile $ofile +[[ $MKDATA = YES ]] && rmdir $DATA +exit $rc diff --git a/ush/sub_wcoss b/ush/sub_wcoss deleted file mode 100755 index 3fa4876c64..0000000000 --- a/ush/sub_wcoss +++ /dev/null @@ -1,343 +0,0 @@ -#!/bin/ksh -set -x -# -# May 28, 2013 - Shrinivas Moorthi :now updated for lsf9.1.1 - should handle coupled case also -# -usage="\ -Usage: $0 [options] executable [args] - where the options are: - -a account account (default: none) - -b binding run smt binding or not (default:NO) - -d dirin initial directory (default: cwd) - -e envars copy comma-separated environment variables - -g group group name - -i append standard input to command file - -j jobname specify jobname (default: executable basename) -# -m machine machine on which to run (default: current) - -m mpiver mpi version (poe or intelmpi) (default: poe) - -n write command file to stdout rather than submitting it - -o output specify output file (default: jobname.out) - -p procs[/nodes[/ppreq] - number of MPI tasks and optional nodes or Bblocking and - ppreq option (N or S) (defaults: serial, Bunlimited, S) - -q queue[/qpreq] queue name and optional requirement, e.g. dev/P - (defaults: 1 if serial or dev if parallel and none) - (queue 3 or 4 is dev or prod with twice tasks over ip) - (options: P=parallel, B=bigmem, b=batch) - -r rmem[/rcpu[/pe_node] resources memory and cpus/task and cores per node (default: '1024 mb', 1, and 16) - -t timew wall time limit in [[hh:]mm:]ss format (default: 900) - -u userid userid to run under (default: self) - -v verbose mode - -w when when to run, in yyyymmddhh[mm], +hh[mm], thh[mm], or - Thh[mm] (full, incremental, today or tomorrow) format - (default: now) - - You can also export variables \"TASK_GEOMETRY\" (default:-\"NONE\") and - \"INHERIT_ENV\" (default:-\"YES\") - Set this variable to \"NO\" and - export it if you do not want the next job to inherit current job - environment. - - Other environmental variables which can be exported from outside are: - - \"KMP_STACKSIZE\" (default:-\"1024m\") - \"MP_EUIDEVELOP\" (default:-\"NULL\") - \"F_UFMTENDIAN\" (default:-\"NULL\") - \"MPICH_ALLTOALL_THROTTLE\" (default:-\"NULL\") - \"MP_SINGLE_THREAD\" (default:-\"NULL\") - \"MP_EAGER_LIMIT\" (default:-\"NULL\") - \"MP_USE_BULK_XFER\" (default:-\"NULL\") - \"MP_COLLECTIVE_OFFLOAD\" (default:-\"NULL\") - \"MP_SHARED_MEMORY\" (default:-\"NULL\") - \"MP_MPILIB\" (default:-\"NULL\") - \"MP_LABELIO\" (default:-\"NULL\") - \"MP_STDOUTMODE\" (default:-\"NULL\") - \"DATA\" (default:-\"/stmpp1/$LOGNAME/sub\" - - deleted at the end if created) - -Function: This command submits a job to the batch queue." -subcmd="$*" -stdin=NO -nosub=NO -account="" -binding="NO" -dirin="" -envars="" -group="" -jobname="" -machine="" -mpiver="" -output="" -procs=0 -nodes="" -ppreq="" -queue="" -qpreq="" -rmem="1024" -rcpu="1" -pe_node="16" -timew="900" -userid="" -verbose=NO -when="" -while getopts a:b:d:e:g:ij:m:no:p:q:r:t:u:vw: opt;do - case $opt in - a) account="$OPTARG";; - b) binding="$OPTARG";; - d) dirin="$OPTARG";; - e) envars="$OPTARG";; - g) group="$OPTARG";; - i) stdin=YES;; - j) jobname=$OPTARG;; -# m) machine="$OPTARG";; - m) mpiver="$OPTARG";; - n) nosub=YES;; - o) output=$OPTARG;; - p) procs=$(echo $OPTARG/|cut -d/ -f1);nodes=$(echo $OPTARG/|cut -d/ -f2);ppreq=$(echo $OPTARG/|cut -d/ -f3);; - q) queue=$(echo $OPTARG/|cut -d/ -f1);qpreq=$(echo $OPTARG/|cut -d/ -f2);; - r) rmem=$(echo $OPTARG/|cut -d/ -f1);rcpu=$(echo $OPTARG/|cut -d/ -f2);pe_node=$(echo $OPTARG/|cut -d/ -f3);; - t) timew=$OPTARG;; - u) userid=$OPTARG;; - v) verbose=YES;; - w) when=$OPTARG;; - \?) echo $0: invalid option >&2;echo "$usage" >&2;exit 1;; - esac -done -shift $(($OPTIND-1)) -if [[ $# -eq 0 ]];then - echo $0: missing executable name >&2;echo "$usage" >&2;exit 1 -fi -exec=$1 -if [[ ! -s $exec ]]&&which $exec >/dev/null 2>&1;then - exec=$(which $exec) -fi -shift -args="$*" -bn=$(basename $exec) -export jobname=${jobname:-$bn} -output=${output:-$jobname.out} -myuser=$LOGNAME -myhost=$(hostname) -mpiver=${mpiver:-poe} -envars=$envars - -#DATA=/lustre/fs/scratch/$LOGNAME/stmpp1 -DATA=${DATA:-/stmpp1/$LOGNAME/sub} -if [ -s $DATA ] ; then - MKDATA=NO -else - mkdir -p $DATA - MKDATA=YES -fi - -queue=${queue:-dev} -timew=${timew:-01:20} -timew=$(echo $timew |cut -d: -f1):$(echo $timew |cut -d: -f2) -threads=${rcpu:-1} - - -max_core=${max_core:-16} -task_node=${pe_node:-${task_node:-$max_core}} - -export INHERIT_ENV=${INHERIT_ENV:-YES} -export TASK_GEOMETRY=${TASK_GEOMETRY:-NONE} -if [ "$TASK_GEOMETRY" = NONE ] ; then - if [ $nodes -eq 1 ] ; then - task_node=$procs - fi - tot_size=$((procs*nodes)) -else - tot_size=$((task_node*nodes)) -fi -if [ $((task_node*threads)) -gt $max_core ]; then - core=cpu - echo "Hyper-threading is used - setting core=$core" -fi -export core=${core:-core} - -export KMP_STACKSIZE=${KMP_STACKSIZE:-1024m} - -export TZ=GMT -cfile=$DATA/sub$$ -> $cfile - -if [ $INHERIT_ENV = YES ] ; then - echo "#!/bin/ksh" >> $cfile -else - echo "#!/bin/ksh --login" >> $cfile - echo "#BSUB -L /bin/ksh" >> $cfile -fi -echo "#BSUB -a $mpiver" >> $cfile -echo "#BSUB -P $account" >> $cfile -echo "#BSUB -e $output" >> $cfile -echo "#BSUB -o $output" >> $cfile -echo "#BSUB -cwd $dirin" >> $cfile -##echo "#BSUB -o $output.%J" >> $cfile -echo "#BSUB -J $jobname" >> $cfile -echo "#BSUB -network type=sn_all:mode=US" >> $cfile -echo "#BSUB -q $queue" >> $cfile -echo "#BSUB -n $tot_size" >> $cfile -if [ $mpiver = openmp ] ; then - echo "#BSUB -R span[ptile=$procs]" >> $cfile - echo "#BSUB -R affinity[$core]" >> $cfile - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile -else - echo "#BSUB -R span[ptile=$procs]" >> $cfile -fi -if [ $threads -gt 1 ] ; then - if [ $core = core ] ; then - echo "#BSUB -R affinity[core($threads)]" >> $cfile - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -x" >> $cfile - fi - else - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R affinity[cpu($threads):distribute=balance]" >> $cfile - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -R affinity[cpu($threads):distribute=balance]" >> $cfile - echo "#BSUB -x" >> $cfile - fi - fi -else - if [ $core = core ] ; then - echo "#BSUB -R affinity[$core]" >> $cfile - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -x" >> $cfile - fi - else - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R affinity[cpu:distribute=balance]" >> $cfile - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -R affinity[cpu:distribute=balance]" >> $cfile - echo "#BSUB -x" >> $cfile - fi - fi -fi -echo "#BSUB -W $timew" >> $cfile - -if [[ -n $when ]];then - whena=$when - if [[ $when = +* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d%H%M") - ((mn+=$(echo $now|cut -c11-12))) - [[ $mn -ge 60 ]] && ((hr+=1)) && ((mn-=60)) - [[ $mn -lt 10 ]] && mn=0$mn - whena=$(/nwprod/util/exec/ndate +$hr $(echo $now|cut -c1-10))$mn - elif [[ $when = t* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d") - whena=$now$hr$mn - elif [[ $when = T* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d%H") - whena=$(/nwprod/util/exec/ndate +24 $now|cut -c1-8)$hr$mn - fi - yr=$(echo $whena|cut -c1-4) - mo=$(echo $whena|cut -c5-6) - dy=$(echo $whena|cut -c7-8) - hr=$(echo $whena|cut -c9-10) - mn=$(echo $whena|cut -c11-12) - [[ -n $mn ]] || mn=00 - echo "#BSUB -b $yr:$mo:$dy:$hr:$mn" >> $cfile -fi - -#echo "source ~${LOGNAME}/.profile" >> $cfile -#echo "ulimit -s unlimited" >> $cfile -#if [ ${MP_EUIDEVICE:-NULL} = sn_all ] ; then -#echo "#BSUB -network \"type=sn_all:mode=US\" " >> $cfile -#fi -#if [ ${MP_EULIB:-NULL} != NULL ] ; then -#echo "export MP_EUILIB=$MP_EUILIB" >> $cfile -#fi - -if [ ${MP_EUIDEVELOP:-NULL} != NULL ] ; then - echo "export MP_EUIDEVELOP=$MP_EUIDEVELOP" >> $cfile -fi -echo "export KMP_STACKSIZE=$KMP_STACKSIZE" >> $cfile -if [ ${F_UFMTENDIAN:-NULL} != NULL ] ; then - echo "export F_UFMTENDIAN=$F_UFMTENDIAN" >> $cfile -fi -if [ ${MPICH_ALLTOALL_THROTTLE:-NULL} != NULL ] ; then - echo "export MPICH_ALLTOALL_THROTTLE=$MPICH_ALLTOALL_THROTTLE" >> $cfile -fi -if [ ${MP_SINGLE_THREAD:-NULL} != NULL ] ; then - echo "export MP_SINGLE_THREAD=$MP_SINGLE_THREAD" >> $cfile -fi -if [ ${MP_EAGER_LIMIT:-NULL} != NULL ] ; then - echo "export MP_EAGER_LIMIT=$MP_EAGER_LIMIT" >> $cfile -fi - -if [ ${MP_USE_BULK_XFER:-NULL} != NULL ] ; then - echo "export MP_USE_BULK_XFER=$MP_USE_BULK_XFER" >> $cfile -fi -if [ ${MP_COLLECTIVE_OFFLOAD:-NULL} != NULL ] ; then - echo "export MP_COLLECTIVE_OFFLOAD=$MP_COLLECTIVE_OFFLOAD" >> $cfile -fi -if [ ${MP_SHARED_MEMORY:-NULL} != NULL ] ; then - echo "export MP_SHARED_MEMORY=$MP_SHARED_MEMORY" >> $cfile -fi -if [ ${MP_MPILIB:-NULL} != NULL ] ; then - echo "export MP_MPILIB=$MP_MPILIB" >> $cfile -fi -if [ ${MP_LABELIO:-NULL} != NULL ] ; then - echo "export MP_LABELIO=$MP_LABELIO" >> $cfile -fi -if [ ${MP_STDOUTMODE:-NULL} != NULL ] ; then - echo "export MP_STDOUTMODE=$MP_STDOUTMODE " >> $cfile -fi -if [ "$TASK_GEOMETRY" != NONE ] ; then - echo "export LSB_PJL_TASK_GEOMETRY=\"$TASK_GEOMETRY\"" >> $cfile -fi -for var in $(eval echo $envars | tr , ' ') ; do - echo "export $var" >> $cfile -done -echo "export OMP_NUM_THREADS=$threads" >> $cfile -echo "" >>$cfile -echo ". "$(awk '{ print $1, $2, $3, $4, $5, $6, $7, $8, $9 }' $regdir/regression_var.out) >> $cfile -echo "" >>$cfile - -echo ". $MODULESHOME/init/ksh" >> $cfile -echo "module purge" >> $cfile -echo "module use -a $gsisrc/modulefiles" >> $cfile -echo "module load modulefile.ProdGSI.wcoss" >> $cfile -echo "module list" >> $cfile - -echo "$exec" >> $cfile - -if [[ $stdin = YES ]];then - cat -fi >>$cfile -if [[ $nosub = YES ]];then - cat $cfile - exit -elif [[ $verbose = YES ]];then - set -x - cat $cfile -fi -bsub=${bsub:-$LSF_BINDIR/bsub} - -ofile=$DATA/subout$$ ->$ofile -chmod 777 $ofile -$bsub < $cfile -rc=$? -cat $ofile -if [[ -w $SUBLOG ]];then - jobn=$(grep -i submitted $ofile|head -n1|cut -d\" -f2) - date +"%Y%m%d%H%M%S : $subcmd : $jobn" >>$SUBLOG -fi -rm $cfile $ofile -[[ $MKDATA = YES ]] && rmdir $DATA -exit $rc diff --git a/ush/sub_wcoss2 b/ush/sub_wcoss2 new file mode 100755 index 0000000000..57115ef7c6 --- /dev/null +++ b/ush/sub_wcoss2 @@ -0,0 +1,176 @@ +#!/bin/sh --login +set -x +echo "starting sub_wcoss2" +usage="\ +Usage: $0 [options] executable [args] + where the options are: + -a account account (default: none) + -b binding run smt binding or not (default:NO) + -d dirin initial directory (default: cwd) + -e envars copy comma-separated environment variables + -g group group name + -i append standard input to command file + -j jobname specify jobname (default: executable basename) + -m machine machine on which to run (default: current) + -n write command file to stdout rather than submitting it + -o output specify output file (default: jobname.out) + -p procs[/nodes[/ppreq] + number of MPI tasks and optional nodes or Bblocking and + ppreq option (N or S) (defaults: serial, Bunlimited, S) + -q queue[/qpreq] queue name and optional requirement, e.g. dev/P + (defaults: 1 if serial or dev if parallel and none) + (queue 3 or 4 is dev or prod with twice tasks over ip) + (options: P=parallel, B=bigmem, b=batch) + -r rmem[/rcpu] resources memory and cpus/task (default: '1024 mb', 1) + -t timew wall time limit in [[hh:]mm:]ss format (default: 900) + -u userid userid to run under (default: self) + -v verbose mode + -w when when to run, in yyyymmddhh[mm], +hh[mm], thh[mm], or + Thh[mm] (full, incremental, today or tomorrow) format + (default: now) +Function: This command submits a job to the batch queue." +subcmd="$*" +stdin=NO +nosub=NO +account="" +binding="NO" +dirin="" +envars="" +group="" +jobname="" +machine="" +output="" +procs=0 +nodes="" +ppreq="" +queue="" +qpreq="" +rmem="1024" +rcpu="1" +timew="900" +userid="" +verbose=NO +when="" +while getopts a:b:d:e:g:ij:m:no:p:q:r:t:u:vw: opt;do + case $opt in + a) account="$OPTARG";; + b) binding="$OPTARG";; + d) dirin="$OPTARG";; + e) envars="$OPTARG";; + g) group="$OPTARG";; + i) stdin=YES;; + j) jobname=$OPTARG;; + m) machine="$OPTARG";; + n) nosub=YES;; + o) output=$OPTARG;; + p) procs=$(echo $OPTARG/|cut -d/ -f1);nodes=$(echo $OPTARG/|cut -d/ -f2);ppreq=$(echo $OPTARG/|cut -d/ -f3);; + q) queue=$(echo $OPTARG/|cut -d/ -f1);qpreq=$(echo $OPTARG/|cut -d/ -f2);; + r) rmem=$(echo $OPTARG/|cut -d/ -f1);rcpu=$(echo $OPTARG/|cut -d/ -f2);; + t) timew=$OPTARG;; + u) userid=$OPTARG;; + v) verbose=YES;; + w) when=$OPTARG;; + \?) echo $0: invalid option >&2;echo "$usage" >&2;exit 1;; + esac +done +shift $(($OPTIND-1)) +if [[ $# -eq 0 ]];then + echo $0: missing executable name >&2;echo "$usage" >&2;exit 1 +fi +exec=$1 +if [[ ! -s $exec ]]&&which $exec >/dev/null 2>&1;then + exec=$(which $exec) +fi +shift +args="$*" +bn=$(basename $exec) +export jobname=${jobname:-$bn} +output=${output:-$jobname.out} +myuser=$LOGNAME +myhost=$(hostname) + +DATA=/lfs/h2/emc/stmp/$LOGNAME/tmp +mkdir -p $DATA + +queue=${queue:-dev} +timew=${timew:-01:20:00} +task_node=${task_node:-$procs} +size=$((nodes*task_node)) +envars=$envars +threads=${rcpu:-1} +ncpus=$((procs*threads)) + +export TZ=GMT +cfile=$DATA/sub$$ +> $cfile +echo "#!/bin/bash" >> $cfile +echo "" >> $cfile +echo "#PBS -o $output" >> $cfile +echo "#PBS -N $jobname" >> $cfile +echo "#PBS -q $queue" >> $cfile +echo "#PBS -l walltime=$timew" >> $cfile +echo "#PBS -l select=$nodes:mpiprocs=$procs:ompthreads=$threads:ncpus=$ncpus" >> $cfile +echo "#PBS -l place=vscatter:exclhost" >> $cfile +echo "#PBS -j oe" >> $cfile +echo "#PBS -A "$accnt >> $cfile + +echo "" >> $cfile +echo "export OMP_NUM_THREADS=$threads" >> $cfile +echo "export ntasks=$(( $nodes * $procs ))" >> $cfile +echo "export ppn=$procs" >> $cfile +echo "export threads=$threads" >> $cfile +echo "" >> $cfile +echo ". "$(awk '{ print $1, $2, $3, $4, $5, $6, $7, $8, $9 }' $regdir/regression_var.out) >>$cfile +echo "" >> $cfile + +echo "module purge" >> $cfile +echo "module load envvar/1.0" >> $cfile +echo "module load PrgEnv-intel/8.2.0" >> $cfile +echo "module load intel/19.1.3.304" >> $cfile +echo "module load craype/2.7.13" >> $cfile +echo "module load cray-mpich/8.1.12" >> $cfile +echo "module load cray-pals/1.1.3" >> $cfile +echo "module load prod_util/2.0.14" >> $cfile +echo "module load prod_envir/2.0.6" >> $cfile +echo "module load crtm/2.4.0" >> $cfile +echo "module load cfp/2.0.4" >> $cfile +echo "module load netcdf/4.7.4" >> $cfile +echo "module list" >> $cfile +echo "" >> $cfile + +cat $exec >> $cfile + +if [[ $nosub = YES ]];then + cat $cfile + exit +elif [[ $verbose = YES ]];then + set -x + cat $cfile +fi + +if [[ $stdin = YES ]];then + cat +fi >>$cfile +if [[ $nosub = YES ]];then + cat $cfile + exit +elif [[ $verbose = YES ]];then + set -x + cat $cfile +fi +qsub=${qsub:-qsub} + +ofile=$DATA/subout$$ +>$ofile +chmod 777 $ofile +$qsub -V $cfile >$ofile +rc=$? +cat $ofile +if [[ -w $SUBLOG ]];then + jobn=$(grep -i submitted $ofile|head -n1|cut -d\" -f2) + date -u +"%Y%m%d%H%M%S : $subcmd : $jobn" >>$SUBLOG +fi +##rm $cfile $ofile +##[[ $MKDATA = YES ]] && rmdir $DATA +echo "ending sub_wcoss2" +exit $rc diff --git a/ush/sub_wcoss_c b/ush/sub_wcoss_c deleted file mode 100755 index 831e0a10f4..0000000000 --- a/ush/sub_wcoss_c +++ /dev/null @@ -1,299 +0,0 @@ -#!/bin/ksh -set -x -# -# May 28, 2013 - Shrinivas Moorthi :now updated for lsf9.1.1 - should handle coupled case also -# -usage="\ -Usage: $0 [options] executable [args] - where the options are: - -a account account (default: none) - -b binding run smt binding or not (default:NO) - -d dirin initial directory (default: cwd) - -e envars copy comma-separated environment variables - -g group group name - -i append standard input to command file - -j jobname specify jobname (default: executable basename) -# -m machine machine on which to run (default: current) - -m mpiver mpi version (poe or intelmpi) (default: poe) - -n write command file to stdout rather than submitting it - -o output specify output file (default: jobname.out) - -p procs[/nodes[/ppreq] - number of MPI tasks and optional nodes or Bblocking and - ppreq option (N or S) (defaults: serial, Bunlimited, S) - -q queue[/qpreq] queue name and optional requirement, e.g. dev/P - (defaults: 1 if serial or dev if parallel and none) - (queue 3 or 4 is dev or prod with twice tasks over ip) - (options: P=parallel, B=bigmem, b=batch) - -r rmem[/rcpu[/pe_node] resources memory and cpus/task and cores per node (default: '1024 mb', 1, and 16) - -t timew wall time limit in [[hh:]mm:]ss format (default: 900) - -u userid userid to run under (default: self) - -v verbose mode - -w when when to run, in yyyymmddhh[mm], +hh[mm], thh[mm], or - Thh[mm] (full, incremental, today or tomorrow) format - (default: now) - - You can also export variables and - \"INHERIT_ENV\" (default:-\"YES\") - Set this variable to \"NO\" and - export it if you do not want the next job to inherit current job - environment. - - Other environmental variables which can be exported from outside are: - - \"KMP_STACKSIZE\" (default:-\"1024m\") - \"MP_EUIDEVELOP\" (default:-\"NULL\") - \"F_UFMTENDIAN\" (default:-\"NULL\") - \"MPICH_ALLTOALL_THROTTLE\" (default:-\"NULL\") - \"MP_SINGLE_THREAD\" (default:-\"NULL\") - \"MP_EAGER_LIMIT\" (default:-\"NULL\") - \"MP_USE_BULK_XFER\" (default:-\"NULL\") - \"MP_COLLECTIVE_OFFLOAD\" (default:-\"NULL\") - \"MP_SHARED_MEMORY\" (default:-\"NULL\") - \"MP_MPILIB\" (default:-\"NULL\") - \"MP_LABELIO\" (default:-\"NULL\") - \"MP_STDOUTMODE\" (default:-\"NULL\") - \"DATA\" (default:-\"/stmp/$LOGNAME/sub\" - - deleted at the end if created) - -Function: This command submits a job to the batch queue." -subcmd="$*" -stdin=NO -nosub=NO -account="" -binding="NO" -dirin="" -envars="" -group="" -jobname="" -machine="" -mpiver="" -output="" -procs=0 -nodes="" -ppreq="NONE" -queue="" -qpreq="" -rmem="1024" -rcpu="1" -pe_node=${pe_node:-24} -timew="900" -userid="" -verbose=NO -when="" -while getopts a:b:d:e:g:ij:m:no:p:q:r:t:u:vw: opt;do - case $opt in - a) account="$OPTARG";; - b) binding="$OPTARG";; - d) dirin="$OPTARG";; - e) envars="$OPTARG";; - g) group="$OPTARG";; - i) stdin=YES;; - j) jobname=$OPTARG;; - m) machine="$OPTARG";; - m) mpiver="$OPTARG";; - n) nosub=YES;; - o) output=$OPTARG;; - p) procs=$(echo $OPTARG/|cut -d/ -f1);nodes=$(echo $OPTARG/|cut -d/ -f2);ppreq=$(echo $OPTARG/|cut -d/ -f3);; - q) queue=$(echo $OPTARG/|cut -d/ -f1);qpreq=$(echo $OPTARG/|cut -d/ -f2);; - r) rmem=$(echo $OPTARG/|cut -d/ -f1);rcpu=$(echo $OPTARG/|cut -d/ -f2);pe_node=$(echo $OPTARG/|cut -d/ -f3);; - t) timew=$OPTARG;; - u) userid=$OPTARG;; - v) verbose=YES;; - w) when=$OPTARG;; - \?) echo $0: invalid option >&2;echo "$usage" >&2;exit 1;; - esac -done -shift $(($OPTIND-1)) -if [[ $# -eq 0 ]];then - echo $0: missing executable name >&2;echo "$usage" >&2;exit 1 -fi -exec=$1 -if [[ ! -s $exec ]]&&which $exec >/dev/null 2>&1;then - exec=$(which $exec) -fi -shift -args="$*" -bn=$(basename $exec) -export jobname=${jobname:-$bn} -machine=${machine:-""} -output=${output:-$jobname.out} -myuser=$LOGNAME -myhost=$(hostname) -#mpiver=${mpiver:-poe} -envars=$envars - -#DATA=/lustre/fs/scratch/$LOGNAME/stmp -pext=${pext:-""} -PTMP=${PTMP:-/gpfs/hps/stmp} -DATA=${DATA:-$PTMP/$LOGNAME/sub} -if [ -s $DATA ] ; then - MKDATA=NO -else - mkdir -p $DATA - MKDATA=YES -fi -dirin=${dirin:-$(pwd)} - -queue=${queue:-dev} -timew=${timew:-01:20} -timew=$(echo $timew |cut -d: -f1):$(echo $timew |cut -d: -f2) -threads=${rcpu:-1} -nthreads=$threads - - -max_core=${max_core:-24} -ptile=$((procs/nodes)) -pe_node=${pe_ndoe:-$ptile} -task_node=${pe_node:-${task_node:-$max_core}} - -export INHERIT_ENV=${INHERIT_ENV:-YES} -if [ $nodes -eq 1 ] ; then - task_node=$procs -fi -tot_size=$procs -max_tasks=$((max_core*nodes)) -#tot_size=$procs -if [ $((task_node*threads)) -gt $max_core ]; then - core_typ=cpu - nthreads=$threads - threads=$((2*max_core/task_node)) - echo "Hyper-threading is used - setting core_typ=$corei_typ" -fi -export core_typ=${core_typ:-core} - -if [ $pe_node -eq $max_tasks -a $nthreads -gt 1 ] ; then - pe_node=$((npe_node/nthreads)) -fi - - -export OMP_STACKSIZE=${OMP_STACKSIZE:-1024m} -export KMP_AFFINITY=${KMP_AFFINITY:-disabled} -export OMP_NUM_THREADS=$nthreads - -export TZ=GMT -cfile=$DATA/sub$$ -> $cfile - -if [ $INHERIT_ENV = YES ] ; then - echo "#!/bin/ksh" >> $cfile -else - echo "#!/bin/sh --login" >> $cfile - echo "#BSUB -L /bin/sh" >> $cfile -fi -echo "#BSUB -P $account" >> $cfile -echo "#BSUB -e $output" >> $cfile -echo "#BSUB -o $output" >> $cfile -echo "#BSUB -J $jobname" >> $cfile -#echo "#BSUB -network type=sn_all:mode=US" >> $cfile -echo "#BSUB -q $queue" >> $cfile -#echo "#BSUB -n $tot_size" >> $cfile -if [ $queue = dev_transfer ] ; then - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile -fi -if [ $queue != dev_transfer ] ; then - echo "#BSUB -M $rmem" >> $cfile - echo "#BSUB -extsched 'CRAYLINUX[]' -R '1*{select[craylinux && !vnode]} + $max_tasks*{select[craylinux && vnode]span[ptile=24] cu[type=cabinet]}'" >> $cfile -fi -echo "#BSUB -W $timew" >> $cfile -echo "#BSUB -cwd $dirin" >> $cfile - -if [[ -n $when ]];then - whena=$when - if [[ $when = +* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d%H%M") - ((mn+=$(echo $now|cut -c11-12))) - [[ $mn -ge 60 ]] && ((hr+=1)) && ((mn-=60)) - [[ $mn -lt 10 ]] && mn=0$mn - whena=$($NDATE +$hr $(echo $now|cut -c1-10))$mn - elif [[ $when = t* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d") - whena=$now$hr$mn - elif [[ $when = T* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d%H") - whena=$($NDATE +24 $now|cut -c1-8)$hr$mn - fi - yr=$(echo $whena|cut -c1-4) - mo=$(echo $whena|cut -c5-6) - dy=$(echo $whena|cut -c7-8) - hr=$(echo $whena|cut -c9-10) - mn=$(echo $whena|cut -c11-12) - [[ -n $mn ]] || mn=00 - echo "#BSUB -b $yr:$mo:$dy:$hr:$mn" >> $cfile -fi - -#echo "source ~${LOGNAME}/.profile" >> $cfile -#echo "ulimit -s unlimited" >> $cfile -#if [ ${MP_EUIDEVICE:-NULL} = sn_all ] ; then -#echo "#BSUB -network \"type=sn_all:mode=US\" " >> $cfile -#fi -#if [ ${MP_EULIB:-NULL} != NULL ] ; then -#echo "export MP_EUILIB=$MP_EUILIB" >> $cfile -#fi - -if [ ${KMP_AFFINITY:-NULL} != NULL ] ; then - echo "export KMP_AFFINITY=$KMP_AFFINITY" >> $cfile -fi - -echo "export OMP_STACKSIZE=$OMP_STACKSIZE" >> $cfile -echo "export OMP_NUM_THREADS=$OMP_NUM_THREADS" >> $cfile -echo "export FORT_BUFFERED=true" >> $cfile - -if [ ${MP_LABELIO:-NULL} != NULL ] ; then - echo "export MP_LABELIO=$MP_LABELIO" >> $cfile -fi -if [ ${MP_STDOUTMODE:-NULL} != NULL ] ; then - echo "export MP_STDOUTMODE=$MP_STDOUTMODE " >> $cfile -fi -for var in $(eval echo $envars | tr , ' ') ; do - echo "export $var" >> $cfile -done - -if [ $INHERIT_ENV = YES ] ; then - echo ". $MODULESHOME/init/ksh" >> $cfile -else - echo ". $MODULESHOME/init/sh" >> $cfile -fi -echo "module purge" >> $cfile -echo "module use -a $gsisrc/modulefiles" >> $cfile -echo "module load modulefile.ProdGSI.wcoss_cray" >> $cfile -echo "module list" >> $cfile -echo "" >>$cfile - -APRUN="aprun -j1 -n $procs -N $pe_node -d $nthreads -cc depth" -echo "export APRUN='$APRUN'" >> $cfile - -echo "$exec" >> $cfile - -if [[ $stdin = YES ]];then - cat -fi >>$cfile -if [[ $nosub = YES ]];then - cat $cfile - exit -elif [[ $verbose = YES ]];then - set -x - cat $cfile -fi -bsub=${bsub:-$LSF_BINDIR/bsub} - -ofile=$DATA/subout$$ ->$ofile -chmod 777 $ofile -$bsub < $cfile -rc=$? -cat $ofile -if [[ -w $SUBLOG ]];then - jobn=$(grep -i submitted $ofile|head -n1|cut -d\" -f2) - date +"%Y%m%d%H%M%S : $subcmd : $jobn" >>$SUBLOG -fi -#rm $cfile $ofile -#[[ $MKDATA = YES ]] && rmdir $DATA -exit $rc diff --git a/ush/sub_wcoss_d b/ush/sub_wcoss_d deleted file mode 100755 index 84a57226be..0000000000 --- a/ush/sub_wcoss_d +++ /dev/null @@ -1,345 +0,0 @@ -#!/bin/ksh -set -x -# -# May 28, 2013 - Shrinivas Moorthi :now updated for lsf9.1.1 - should handle coupled case also -# -usage="\ -Usage: $0 [options] executable [args] - where the options are: - -a account account (default: none) - -b binding run smt binding or not (default:NO) - -d dirin initial directory (default: cwd) - -e envars copy comma-separated environment variables - -g group group name - -i append standard input to command file - -j jobname specify jobname (default: executable basename) -# -m machine machine on which to run (default: current) - -m mpiver mpi version (poe or intelmpi) (default: poe) - -n write command file to stdout rather than submitting it - -o output specify output file (default: jobname.out) - -p procs[/nodes[/ppreq] - number of MPI tasks and optional nodes or Bblocking and - ppreq option (N or S) (defaults: serial, Bunlimited, S) - -q queue[/qpreq] queue name and optional requirement, e.g. dev/P - (defaults: 1 if serial or dev if parallel and none) - (queue 3 or 4 is dev or prod with twice tasks over ip) - (options: P=parallel, B=bigmem, b=batch) - -r rmem[/rcpu[/pe_node] resources memory and cpus/task and cores per node (default: '1024 mb', 1, and 16) - -t timew wall time limit in [[hh:]mm:]ss format (default: 900) - -u userid userid to run under (default: self) - -v verbose mode - -w when when to run, in yyyymmddhh[mm], +hh[mm], thh[mm], or - Thh[mm] (full, incremental, today or tomorrow) format - (default: now) - - You can also export variables \"TASK_GEOMETRY\" (default:-\"NONE\") and - \"INHERIT_ENV\" (default:-\"YES\") - Set this variable to \"NO\" and - export it if you do not want the next job to inherit current job - environment. - - Other environmental variables which can be exported from outside are: - - \"KMP_STACKSIZE\" (default:-\"1024m\") - \"MP_EUIDEVELOP\" (default:-\"NULL\") - \"F_UFMTENDIAN\" (default:-\"NULL\") - \"MPICH_ALLTOALL_THROTTLE\" (default:-\"NULL\") - \"MP_SINGLE_THREAD\" (default:-\"NULL\") - \"MP_EAGER_LIMIT\" (default:-\"NULL\") - \"MP_USE_BULK_XFER\" (default:-\"NULL\") - \"MP_COLLECTIVE_OFFLOAD\" (default:-\"NULL\") - \"MP_SHARED_MEMORY\" (default:-\"NULL\") - \"MP_MPILIB\" (default:-\"NULL\") - \"MP_LABELIO\" (default:-\"NULL\") - \"MP_STDOUTMODE\" (default:-\"NULL\") - \"DATA\" (default:-\"/stmpp1/$LOGNAME/sub\" - - deleted at the end if created) - -Function: This command submits a job to the batch queue." -subcmd="$*" -stdin=NO -nosub=NO -account="" -binding="NO" -dirin="" -envars="" -group="" -jobname="" -machine="" -mpiver="" -output="" -procs=0 -nodes="" -ppreq="" -queue="" -qpreq="" -rmem="1024" -rcpu="1" -pe_node="16" -timew="900" -userid="" -verbose=NO -when="" -while getopts a:b:d:e:g:ij:m:no:p:q:r:t:u:vw: opt;do - case $opt in - a) account="$OPTARG";; - b) binding="$OPTARG";; - d) dirin="$OPTARG";; - e) envars="$OPTARG";; - g) group="$OPTARG";; - i) stdin=YES;; - j) jobname=$OPTARG;; -# m) machine="$OPTARG";; - m) mpiver="$OPTARG";; - n) nosub=YES;; - o) output=$OPTARG;; - p) procs=$(echo $OPTARG/|cut -d/ -f1);nodes=$(echo $OPTARG/|cut -d/ -f2);ppreq=$(echo $OPTARG/|cut -d/ -f3);; - q) queue=$(echo $OPTARG/|cut -d/ -f1);qpreq=$(echo $OPTARG/|cut -d/ -f2);; - r) rmem=$(echo $OPTARG/|cut -d/ -f1);rcpu=$(echo $OPTARG/|cut -d/ -f2);pe_node=$(echo $OPTARG/|cut -d/ -f3);; - t) timew=$OPTARG;; - u) userid=$OPTARG;; - v) verbose=YES;; - w) when=$OPTARG;; - \?) echo $0: invalid option >&2;echo "$usage" >&2;exit 1;; - esac -done -shift $(($OPTIND-1)) -if [[ $# -eq 0 ]];then - echo $0: missing executable name >&2;echo "$usage" >&2;exit 1 -fi -exec=$1 -if [[ ! -s $exec ]]&&which $exec >/dev/null 2>&1;then - exec=$(which $exec) -fi -shift -args="$*" -bn=$(basename $exec) -export jobname=${jobname:-$bn} -output=${output:-$jobname.out} -myuser=$LOGNAME -myhost=$(hostname) -#mpiver=${mpiver:-intelmpi} -envars=$envars - -#DATA=/lustre/fs/scratch/$LOGNAME/stmpp1 -DATA=${DATA:-/gpfs/dell2/ptmp/$LOGNAME/sub} -if [ -s $DATA ] ; then - MKDATA=NO -else - mkdir -p $DATA - MKDATA=YES -fi - -queue=${queue:-dev} -timew=${timew:-01:20} -timew=$(echo $timew |cut -d: -f1):$(echo $timew |cut -d: -f2) -threads=${rcpu:-1} - - -max_core=${max_core:-16} -task_node=${pe_node:-${task_node:-$max_core}} - -export INHERIT_ENV=${INHERIT_ENV:-YES} -export TASK_GEOMETRY=${TASK_GEOMETRY:-NONE} -if [ "$TASK_GEOMETRY" = NONE ] ; then - if [ $nodes -eq 1 ] ; then - task_node=$procs - fi - tot_size=$((procs*nodes)) -else - tot_size=$((task_node*nodes)) -fi -if [ $((task_node*threads)) -gt $max_core ]; then - core=cpu - echo "Hyper-threading is used - setting core=$core" -fi -export core=${core:-core} - -export KMP_STACKSIZE=${KMP_STACKSIZE:-1024m} - -export TZ=GMT -cfile=$DATA/sub$$ -> $cfile - -if [ $INHERIT_ENV = YES ] ; then - echo "#!/bin/bash" >> $cfile -else - echo "#!/bin/bash " >> $cfile - echo "#BSUB -L /bin/bash" >> $cfile -fi -#echo "#BSUB -a $mpiver" >> $cfile -echo "#BSUB -P $account" >> $cfile -echo "#BSUB -e $output" >> $cfile -echo "#BSUB -o $output" >> $cfile -echo "#BSUB -cwd $dirin" >> $cfile -##echo "#BSUB -o $output.%J" >> $cfile -echo "#BSUB -J $jobname" >> $cfile -#echo "#BSUB -network type=sn_all:mode=US" >> $cfile -echo "#BSUB -q $queue" >> $cfile -echo "#BSUB -n $tot_size" >> $cfile -if [ $mpiver = openmp ] ; then - echo "#BSUB -R span[ptile=$procs]" >> $cfile - echo "#BSUB -R affinity[$core]" >> $cfile - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile -else - echo "#BSUB -R span[ptile=$procs]" >> $cfile -fi -if [ $threads -gt 1 ] ; then - if [ $core = core ] ; then - echo "#BSUB -R affinity[core($threads)]" >> $cfile - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -x" >> $cfile - fi - else - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R affinity[cpu($threads):distribute=balance]" >> $cfile - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -R affinity[cpu($threads):distribute=balance]" >> $cfile - echo "#BSUB -x" >> $cfile - fi - fi -else - if [ $core = core ] ; then - echo "#BSUB -R affinity[$core]" >> $cfile - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -x" >> $cfile - fi - else - if [ $queue = shared -o $ppreq = S ] ; then - echo "#BSUB -R affinity[cpu:distribute=balance]" >> $cfile - echo "#BSUB -R rusage[mem=$rmem]" >> $cfile - else - echo "#BSUB -R affinity[cpu:distribute=balance]" >> $cfile - echo "#BSUB -x" >> $cfile - fi - fi -fi -echo "#BSUB -W $timew" >> $cfile - -if [[ -n $when ]];then - whena=$when - if [[ $when = +* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d%H%M") - ((mn+=$(echo $now|cut -c11-12))) - [[ $mn -ge 60 ]] && ((hr+=1)) && ((mn-=60)) - [[ $mn -lt 10 ]] && mn=0$mn - whena=$(/nwprod/util/exec/ndate +$hr $(echo $now|cut -c1-10))$mn - elif [[ $when = t* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d") - whena=$now$hr$mn - elif [[ $when = T* ]];then - hr=$(echo $when|cut -c2-3) - mn=$(echo $when|cut -c4-5) - [[ -n $mn ]] || mn=00 - now=$(date -u +"%Y%m%d%H") - whena=$(/nwprod/util/exec/ndate +24 $now|cut -c1-8)$hr$mn - fi - yr=$(echo $whena|cut -c1-4) - mo=$(echo $whena|cut -c5-6) - dy=$(echo $whena|cut -c7-8) - hr=$(echo $whena|cut -c9-10) - mn=$(echo $whena|cut -c11-12) - [[ -n $mn ]] || mn=00 - echo "#BSUB -b $yr:$mo:$dy:$hr:$mn" >> $cfile -fi - -#echo "source ~${LOGNAME}/.profile" >> $cfile -#echo "ulimit -s unlimited" >> $cfile -#if [ ${MP_EUIDEVICE:-NULL} = sn_all ] ; then -#echo "#BSUB -network \"type=sn_all:mode=US\" " >> $cfile -#fi -#if [ ${MP_EULIB:-NULL} != NULL ] ; then -#echo "export MP_EUILIB=$MP_EUILIB" >> $cfile -#fi - -if [ ${MP_EUIDEVELOP:-NULL} != NULL ] ; then - echo "export MP_EUIDEVELOP=$MP_EUIDEVELOP" >> $cfile -fi -echo "export KMP_STACKSIZE=$KMP_STACKSIZE" >> $cfile -if [ ${F_UFMTENDIAN:-NULL} != NULL ] ; then - echo "export F_UFMTENDIAN=$F_UFMTENDIAN" >> $cfile -fi -if [ ${MPICH_ALLTOALL_THROTTLE:-NULL} != NULL ] ; then - echo "export MPICH_ALLTOALL_THROTTLE=$MPICH_ALLTOALL_THROTTLE" >> $cfile -fi -if [ ${MP_SINGLE_THREAD:-NULL} != NULL ] ; then - echo "export MP_SINGLE_THREAD=$MP_SINGLE_THREAD" >> $cfile -fi -if [ ${MP_EAGER_LIMIT:-NULL} != NULL ] ; then - echo "export MP_EAGER_LIMIT=$MP_EAGER_LIMIT" >> $cfile -fi - -if [ ${MP_USE_BULK_XFER:-NULL} != NULL ] ; then - echo "export MP_USE_BULK_XFER=$MP_USE_BULK_XFER" >> $cfile -fi -if [ ${MP_COLLECTIVE_OFFLOAD:-NULL} != NULL ] ; then - echo "export MP_COLLECTIVE_OFFLOAD=$MP_COLLECTIVE_OFFLOAD" >> $cfile -fi -if [ ${MP_SHARED_MEMORY:-NULL} != NULL ] ; then - echo "export MP_SHARED_MEMORY=$MP_SHARED_MEMORY" >> $cfile -fi -if [ ${MP_MPILIB:-NULL} != NULL ] ; then - echo "export MP_MPILIB=$MP_MPILIB" >> $cfile -fi -if [ ${MP_LABELIO:-NULL} != NULL ] ; then - echo "export MP_LABELIO=$MP_LABELIO" >> $cfile -fi -if [ ${MP_STDOUTMODE:-NULL} != NULL ] ; then - echo "export MP_STDOUTMODE=$MP_STDOUTMODE " >> $cfile -fi -if [ "$TASK_GEOMETRY" != NONE ] ; then - echo "export LSB_PJL_TASK_GEOMETRY=\"$TASK_GEOMETRY\"" >> $cfile -fi -for var in $(eval echo $envars | tr , ' ') ; do - echo "export $var" >> $cfile -done - -echo "export OMP_NUM_THREADS=$threads" >> $cfile -echo "" >>$cfile -echo ". "$(awk '{ print $1, $2, $3, $4, $5, $6, $7, $8, $9 }' $regdir/regression_var.out) >> $cfile -echo "" >>$cfile - -echo ". $MODULESHOME/init/bash" >> $cfile -echo "module purge" >> $cfile -echo "module use -a $gsisrc/modulefiles" >> $cfile -echo "module load gsi_wcoss_dell_p3" >> $cfile -echo "module list" >> $cfile -echo "" >>$cfile - -echo "$exec" >> $cfile - -if [[ $stdin = YES ]];then - cat -fi >>$cfile -if [[ $nosub = YES ]];then - cat $cfile - exit -elif [[ $verbose = YES ]];then - set -x - cat $cfile -fi -bsub=${bsub:-$LSF_BINDIR/bsub} - -ofile=subout$$ ->$ofile -chmod 777 $ofile -$bsub < $cfile -rc=$? -cat $ofile -if [[ -w $SUBLOG ]];then - jobn=$(grep -i submitted $ofile|head -n1|cut -d\" -f2) - date +"%Y%m%d%H%M%S : $subcmd : $jobn" >>$SUBLOG -fi -rm $cfile $ofile -[[ $MKDATA = YES ]] && rmdir $DATA -exit $rc From 7976dcfa6f59af4bad194612d4a4d41100d692f6 Mon Sep 17 00:00:00 2001 From: Emily Liu Date: Fri, 13 Oct 2023 20:37:32 -0500 Subject: [PATCH 23/26] add output to diagnosfic files for ufo evaluation --- modulefiles/gsi_orion.lua | 10 ++ src/gsi/CMakeLists.txt | 1 + src/gsi/genstats_gps.f90 | 25 ++--- src/gsi/gesinfo.F90 | 9 ++ src/gsi/read_gps.f90 | 19 ++-- src/gsi/read_prepbufr.f90 | 27 +++-- src/gsi/read_satwnd.f90 | 1 - src/gsi/setupbend.f90 | 56 +++++------ src/gsi/setupoz.f90 | 8 +- src/gsi/setupps.f90 | 205 ++++++++++++++++++++++++++++++++------ src/gsi/setupq.f90 | 64 ++++++------ src/gsi/setuprad.f90 | 10 +- src/gsi/setupt.f90 | 56 ++++++----- src/gsi/setupw.f90 | 192 ++++++++++++++++++++++------------- src/gsi/tpause.f90 | 4 +- 15 files changed, 462 insertions(+), 225 deletions(-) diff --git a/modulefiles/gsi_orion.lua b/modulefiles/gsi_orion.lua index e75a01ef5e..e3d4a68b11 100644 --- a/modulefiles/gsi_orion.lua +++ b/modulefiles/gsi_orion.lua @@ -19,6 +19,16 @@ load(pathJoin("hpc-impi", hpc_impi_ver)) load(pathJoin("cmake", cmake_ver)) load("gsi_common") +setenv("crtm_ROOT","/work/noaa/da/eliu/JEDI-GDAS/crtm_v2.4.1-jedi.1-intel2022/build") +setenv("crtm_VERSION","2.4.1-jedi.1") +setenv("CRTM_INC","/work/noaa/da/eliu/JEDI-GDAS/crtm_v2.4.1-jedi.1-intel2022/build/module") +setenv("CRTM_LIB","/work/noaa/da/eliu/JEDI-GDAS/crtm_v2.4.1-jedi.1-intel2022/build/lib/libcrtm_static.a") +setenv("CRTM_FIX","/work/noaa/da/eliu/JEDI-GDAS/crtm_v2.4.1-jedi.1-fix_gdasapp/fix") +whatis("Name: crtm") +whatis("Version: 2.4.1-jedi.1") +whatis("Category: library") +whatis("Description: crtm library") + load(pathJoin("prod_util", prod_util_ver)) diff --git a/src/gsi/CMakeLists.txt b/src/gsi/CMakeLists.txt index af94224c05..325bfdb6a5 100644 --- a/src/gsi/CMakeLists.txt +++ b/src/gsi/CMakeLists.txt @@ -146,6 +146,7 @@ target_link_libraries(gsi_fortran_obj PUBLIC nemsio::nemsio) target_link_libraries(gsi_fortran_obj PUBLIC ncio::ncio) target_link_libraries(gsi_fortran_obj PUBLIC w3emc::w3emc_d) target_link_libraries(gsi_fortran_obj PUBLIC sp::sp_d) +add_library(crtm::crtm ALIAS crtm) target_link_libraries(gsi_fortran_obj PUBLIC bufr::bufr_d) target_link_libraries(gsi_fortran_obj PUBLIC crtm::crtm) if(GSI_MODE MATCHES "Regional") diff --git a/src/gsi/genstats_gps.f90 b/src/gsi/genstats_gps.f90 index 6d762a46ad..9d41602228 100644 --- a/src/gsi/genstats_gps.f90 +++ b/src/gsi/genstats_gps.f90 @@ -64,7 +64,7 @@ module m_gpsStats integer(i_kind) :: idv,iob ! device id and obs index for sorting real (r_kind) :: elat, elon ! earth lat-lon for redistribution !real (r_kind) :: dlat, dlon ! earth lat-lon for redistribution - !> xuanli + ! real(r_kind),dimension(:),pointer :: tsenges => NULL() real(r_kind),dimension(:),pointer :: tvirges => NULL() real(r_kind),dimension(:),pointer :: sphmges => NULL() @@ -72,7 +72,7 @@ module m_gpsStats real(r_kind),dimension(:),pointer :: hgtiges => NULL() real(r_kind),dimension(:),pointer :: prslges => NULL() real(r_kind),dimension(:),pointer :: prsiges => NULL() - !< xuanli + ! end type gps_all_ob_type type gps_all_ob_head @@ -436,10 +436,10 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) end do END DO if(icnt > 0)then -!> xuanli +! ! nreal =22 nreal =34 -!< xuanli +! ioff =nreal if (lobsdiagsave) nreal=nreal+4*miter+1 if (save_jacobian) then @@ -451,8 +451,6 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) end if endif - - ! Loop over data to apply final qc, superobs factors, accumulate ! statistics and (optionally) load diagnostic output arrays icnt=0 @@ -546,6 +544,7 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) elev = gps_allptr%rdiag(7) dobs = gps_allptr%rdiag(17) if (toss_gps(kprof) > zero .and. (dobs == toss_gps(kprof) .or. elev < dobs_height(kprof))) then ! SR from obs + if(ratio_errors*data_ier > tiny_r_kind) then ! obs was good if (luse) then if(conv_diagsave) then @@ -717,7 +716,6 @@ subroutine genstats_gps(bwork,awork,toss_gps_sub,conv_diagsave,mype) endif endif - ! Destroy arrays holding gps data call destroy_genstats_gps contains @@ -778,15 +776,17 @@ subroutine contents_netcdf_diag_ obstype = gps_allptr%rdiag(1) obssubtype = gps_allptr%rdiag(2) call nc_diag_metadata("Observation_Type", obstype ) - call nc_diag_metadata("Observation_Subtype", obssubtype ) +! rename it to be consistent with GMAO gsi_ncdiag +! call nc_diag_metadata("Observation_Subtype", obssubtype ) call nc_diag_metadata("record_number", obssubtype ) call nc_diag_metadata_to_single("Latitude", gps_allptr%rdiag(3) ) call nc_diag_metadata_to_single("Longitude", gps_allptr%rdiag(4) ) call nc_diag_metadata_to_single("Incremental_Bending_Angle", gps_allptr%rdiag(5) ) ! call nc_diag_metadata_to_single("Pressure", gps_allptr%rdiag(6) ) !orig call nc_diag_metadata_to_single("Pressure", gps_allptr%rdiag(6)*100.0 ) +! rename the variable as impact_height ! call nc_diag_metadata_to_single("Height", gps_allptr%rdiag(7) ) - call nc_diag_metadata_to_single("Impact_Height", gps_allptr%rdiag(7)) ) + call nc_diag_metadata_to_single("Impact_Height", gps_allptr%rdiag(7) ) call nc_diag_metadata_to_single("Time", gps_allptr%rdiag(8) ) ! call nc_diag_metadata_to_single("Model_Elevation", gps_allptr%rdiag(9) ) !orig call nc_diag_metadata_to_single("surface_geopotential_height", gps_allptr%rdiag(9) ) @@ -804,7 +804,7 @@ subroutine contents_netcdf_diag_ call nc_diag_metadata_to_single("GPS_Type", gps_allptr%rdiag(20) ) call nc_diag_metadata_to_single("Temperature_at_Obs_Location", gps_allptr%rdiag(18) ) call nc_diag_metadata_to_single("Specific_Humidity_at_Obs_Location",gps_allptr%rdiag(21) ) -!> xuanli + call nc_diag_metadata("impact_parameter", sngl(gps_allptr%rdiag(23)) ) call nc_diag_metadata("pccf", sngl(gps_allptr%rdiag(24)) ) call nc_diag_metadata("reference_sat_id", int(gps_allptr%rdiag(25)) ) @@ -818,7 +818,6 @@ subroutine contents_netcdf_diag_ call nc_diag_metadata("process_center", int(gps_allptr%rdiag(33)) ) call nc_diag_metadata("atmospheric_refractivity", sngl(gps_allptr%rdiag(34)) ) call nc_diag_metadata("surface_altitude", sngl(gps_allptr%rdiag(9)) ) -!< xuanli if (save_jacobian) then call readarray(dhx_dx, gps_allptr%rdiag(ioff+1:nreal)) @@ -826,7 +825,6 @@ subroutine contents_netcdf_diag_ call nc_diag_data2d("Observation_Operator_Jacobian_endind", dhx_dx%end_ind(1:dhx_dx%nind)) call nc_diag_data2d("Observation_Operator_Jacobian_val", real(dhx_dx%val(1:dhx_dx%nnz),r_single)) endif -!> xuanli call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(gps_allptr%prslges)) call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(gps_allptr%prsiges)) call nc_diag_data2d("air_temperature", sngl(gps_allptr%tsenges)) @@ -834,9 +832,6 @@ subroutine contents_netcdf_diag_ call nc_diag_data2d("specific_humidity", sngl(gps_allptr%sphmges)) call nc_diag_data2d("geopotential_height", sngl(gps_allptr%hgtlges)) call nc_diag_data2d("geopotential_height_levels", sngl(gps_allptr%hgtiges)) -!< xuanli - - ! call nc_diag_data2d("T_Jacobian", gps_allptr%mmpoint%jac_t ) if (lobsdiagsave) then diff --git a/src/gsi/gesinfo.F90 b/src/gsi/gesinfo.F90 index 0aefd34c76..571400cee2 100644 --- a/src/gsi/gesinfo.F90 +++ b/src/gsi/gesinfo.F90 @@ -587,6 +587,15 @@ subroutine gesinfo time_offset=time_offset+fha(3)/r60 #endif + write(6,*)'emily time: nhr_assimilation = ', nhr_assimilation + write(6,*)'emily time: idate nmin_an = ', idate , nmin_an + write(6,*)'emily time: ibdate = ', ibdate + write(6,*)'emily time: iadatebgn = ', iadateend + write(6,*)'emily time: iedate = ', iedate + write(6,*)'emily time: iadateend = ', iedate + write(6,*)'emily time: ianldate = ', ianldate + write(6,*)'emily time: iwinbgn = ', iwinbgn + ! Get information about date/time and number of guess files if (regional) then if(wrf_nmm_regional) then diff --git a/src/gsi/read_gps.f90 b/src/gsi/read_gps.f90 index d90fb8b489..65e7343e15 100644 --- a/src/gsi/read_gps.f90 +++ b/src/gsi/read_gps.f90 @@ -138,18 +138,16 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & real(r_kind),allocatable,dimension(:,:):: cdata_all -!> xuanli + ! integer(i_kind),parameter:: n1ahdr=10 integer(i_kind),parameter:: n1ahdr=13 -!< xuanli + real(r_double),dimension(n1ahdr):: bfr1ahdr real(r_double),dimension(50,maxlevs):: data1b real(r_double),dimension(50,maxlevs):: data2a real(r_double),dimension(maxlevs):: nreps_this_ROSEQ2 -!> xuanli real(r_kind):: azm_ang, sat_ascd, sat_constid, siid, ogce -!< xuanli data lnbufr/10/ ! data hdr1a / 'YEAR MNTH DAYS HOUR MINU PCCF ELRC SAID PTID GEODU' / @@ -309,7 +307,7 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & endif endif -!> xuanli ascending flag: when qfro bit3 is set, occultation is ascending +! ascending flag: when qfro bit3 is set, occultation is ascending ! bit3 is clear, occultation is descending sat_ascd = 0.0 call upftbv(lnbufr,nemo,qfro,mxib,ibit,nib) @@ -318,7 +316,6 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & if(ibit(i) .eq. 3) sat_ascd=1.0 enddo endif -!< xuanli ! Read bending angle information ! Get the number of occurences of sequence ROSEQ2 in this subset @@ -392,7 +389,8 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & good=.true. if((abs(rlat)>90._r_kind).or.(abs(rlon)>r360).or.(height<=zero)) then good=.false. - else if (ref_obs) then + endif + if (ref_obs) then if ((ref>=1.e+9_r_kind).or.(ref<=zero).or.(height>=1.e+9_r_kind)) then good=.false. endif @@ -463,7 +461,7 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & cdata_all(14,ndata)= dlon_earth_deg ! earth relative longitude (degrees) cdata_all(15,ndata)= dlat_earth_deg ! earth relative latitude (degrees) cdata_all(16,ndata)= geoid ! geoid undulation (m) -!> xuanli + cdata_all(17,ndata)= qfro ! qfro cdata_all(18,ndata)= sat_ascd ! ascending flag cdata_all(19,ndata)= azm_ang ! azimuth angle @@ -471,7 +469,7 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & cdata_all(21,ndata)= siid ! occulting satellite cdata_all(22,ndata)= ogce ! Identification of originating/generating centre cdata_all(23,ndata)= ref ! refractivity obs (units of N) -!< xuanli + else notgood = notgood + 1 end if @@ -497,9 +495,8 @@ subroutine read_gps(nread,ndata,nodata,infile,lunout,obstype,twind, & write(6,*)'READ_GPS: # bad or missing data=', notgood do i=1,ngpsro_type if (nmrecs_id(i)>0) & - write(6,1021)'READ_GPS: LEO_id,nprof_gps = ',gpsro_itype(i),nmrecs_id(i) + write(6,1020)'READ_GPS: LEO_id,nprof_gps = ',gpsro_itype(i),nmrecs_id(i) end do -1021 format(a31,i6,i6) write(6,1020)'READ_GPS: ref_obs,nprof_gps= ',ref_obs,nprof_gps 1020 format(a31,L,i6) diff --git a/src/gsi/read_prepbufr.f90 b/src/gsi/read_prepbufr.f90 index 5a47949a94..2a084745bf 100644 --- a/src/gsi/read_prepbufr.f90 +++ b/src/gsi/read_prepbufr.f90 @@ -483,7 +483,8 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& else if(spdob) then nreal=24 else if(psob) then - nreal=20 +! nreal=20 !orig + nreal=21 !emily else if(qob) then nreal=26 else if(pwob) then @@ -636,6 +637,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& ! Time offset if(nmsg == 0) call time_4dvar(idate,toff) +! write(6,*)'emily checking toff = ', toff nmsg=nmsg+1 if (nmsg>nmsgmax) then write(6,*)'READ_PREPBUFR: messages exceed maximum ',nmsgmax @@ -1050,6 +1052,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& !------------------------------------------------------------------------ + write(6,*)'emily checking offtime_data = ', offtime_data if(offtime_data) then ! in time correction for observations to account for analysis @@ -1080,6 +1083,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& if (.not. (aircraft_t_bc .and. acft_profl_file)) then timeobs=real(real(hdr(4),r_single),r_double) t4dv=timeobs + toff + zeps=1.0e-8_r_kind if (t4dv -zeps) t4dv=zero if (t4dv>winlen.and.t4dv>emily +!>>orig +! if (isflg /= 0) cycle loop_readsb +! if (tsavg <= 273.0_r_kind) cycle loop_readsb +!<179.and.kx<190).or.(kx>=280.and.kx<=290).or. & @@ -1628,10 +1636,11 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& ! If temperature ob, extract information regarding virtual ! versus sensible temperature - if(tob) then +! if(tob) then !orig + if(tob .or. psob ) then !emily ! use tvirtual if tsensible flag not set, and not in either 2Dregional or global_2m DA mode if ( (.not. tsensible) .and. .not. (twodvar_regional .or. global_2m_land) ) then - write(6,*)'emily checking vtcd = ', vtcd + ! write(6,*)'emily checking vtcd = ', vtcd do k=1,levs tvflg(k)=one ! initialize as sensible do j=1,20 @@ -1804,6 +1813,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& if ( obsdat(1,k)< r500) qm=100 zqm=idnint(qcmark(4,k)) if (zqm>=lim_zqm .and. zqm/=15 .and. zqm/=9) qm=9 + ! if (zqm>=lim_zqm .and. zqm/=15 .and. zqm/=9) pqm(k)=9 !emily_test endif ! if(convobs .and. pqm(k) >=lim_qm .and. qm/=15 .and. qm/=9 )cycle loop_k_levs @@ -2321,6 +2331,9 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& ! Surface pressure else if(psob) then + qtflg=tvflg(k) !emily + write(6,*)'emily checkint psob t4dv = ', t4dv + poe=obserr(1,k)*one_tenth ! convert from mb to cb if (inflate_error) poe=poe*r1_2 cdata_all(1,iout)=poe ! surface pressure error (cb) @@ -2347,7 +2360,9 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& cdata_all(18,iout)=r_prvstg(1,1) ! provider name cdata_all(19,iout)=r_sprvstg(1,1) ! 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 + cdata_all(21,iout)=qtflg ! qtflg=0 (virtual) qtflg=1 (sensible) !emily +! if(perturb_obs)cdata_all(21,iout)=ran01dom()*perturb_fact ! ps perturbation !orig + if(perturb_obs)cdata_all(22,iout)=ran01dom()*perturb_fact ! ps perturbation if (twodvar_regional) & call adjust_error(cdata_all(14,iout),cdata_all(15,iout),cdata_all(11,iout),cdata_all(1,iout)) diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index 721dd3936c..3c07be891b 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -213,7 +213,6 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis real(r_double),dimension(13):: hdrdat real(r_double),dimension(4):: obsdat - real(r_double),dimension(2) :: hdrdat_test real(r_double),dimension(2) :: hdrdat_test,hdrdat_005099 real(r_double),dimension(3,5) :: heightdat real(r_double),dimension(6,4) :: derdwdat diff --git a/src/gsi/setupbend.f90 b/src/gsi/setupbend.f90 index 4b1fb225e4..d024b75d22 100644 --- a/src/gsi/setupbend.f90 +++ b/src/gsi/setupbend.f90 @@ -149,9 +149,9 @@ subroutine setupbend(obsLL,odiagLL, & use guess_grids, only: ges_lnprsi,hrdifsig,geop_hgti,nfldsig use guess_grids, only: ges_lnprsl,ges_prsi,geop_hgtl use guess_grids, only: nsig_ext,gpstop,commgpstop,commgpserrinf -!> xuanli +! use guess_grids, only: ges_tsen -!< xuanli +! use gridmod, only: nsig use gridmod, only: get_ij,latlon11 use constants, only: fv,n_a,n_b,n_c,deg2rad,tiny_r_kind,r0_01,r18,r61,r63,r10000 @@ -232,11 +232,10 @@ subroutine setupbend(obsLL,odiagLL, & real(r_kind) hobb real(r_kind),dimension(4) :: w4,dw4,dw4_TL -!> xuanli integer(i_kind) ier,ilon,ilat,ihgt,igps,itime,ikx,iuse, & iprof,ipctc,iroc,isatid,iptid,ilate,ilone,ioff,igeoid,iqfro integer(i_kind) iascd, iazm, iconstid, isiid, iogce, iref -!< xuanli + integer(i_kind) i,j,k,kk,mreal,nreal,jj,ikxx,ibin integer(i_kind) mm1,nsig_up,ihob,istatus,nsigstart integer(i_kind) kprof,istat,k1,k2,nobs_out,top_layer_SR,bot_layer_SR,count_SR @@ -247,7 +246,7 @@ subroutine setupbend(obsLL,odiagLL, & integer(i_kind) :: iz, t_ind, q_ind, p_ind, nnz, nind real(r_kind),dimension(3,nsig+nsig_ext) :: q_w,q_w_tl -! xuanli correct the dimension of hges +! correct the dimension of hges ! real(r_kind),dimension(nsig) :: hges,irefges,zges,dhdt,dhdp real(r_kind),dimension(nsig) :: irefges,zges,dhdt,dhdp real(r_kind),dimension(nsig+1) :: hges @@ -275,12 +274,10 @@ subroutine setupbend(obsLL,odiagLL, & real(r_kind),allocatable,dimension(:,:,:,:) :: ges_tv real(r_kind),allocatable,dimension(:,:,:,:) :: ges_q -!> xuanli real(r_kind),dimension(nsig, nobs) :: Tsen,Tvir,sphm,hgtl,prslnl real(r_kind),dimension(nsig+1,nobs) :: hgti,prslni integer(i_kind),dimension(nobs) :: qc_superr, qc_layer, qc_ddnj integer(i_kind),dimension(nobs) :: qc_stat,qc_largeBA,qc_metop -!< xuanli type(obsLList),pointer,dimension(:):: gpshead logical:: commdat @@ -346,7 +343,7 @@ subroutine setupbend(obsLL,odiagLL, & ilone=14 ! index of earth relative longitude (degrees) ilate=15 ! index of earth relative latitude (degrees) igeoid=16 ! index of geoid undulation (a value per profile, m) -!> xuanli +! iqfro=17 ! index of qfro (integer) iascd=18 ! index of ascending flag (integer) iazm=19 ! index of azimuth angle @@ -360,7 +357,7 @@ subroutine setupbend(obsLL,odiagLL, & qc_metop(:) = 0 qc_layer(:) = 0 qc_ddnj(:) = 0 -!< xuanli + kprof = 0 ! initialize kprof otherwise it is assigned as 787086608 ! Intialize variables nsig_up=nsig+nsig_ext ! extend nsig_ext levels above interface level nsig @@ -378,8 +375,8 @@ subroutine setupbend(obsLL,odiagLL, & allocate(ddnj(grids_dim),grid_s(grids_dim),ref_rad_s(grids_dim)) ! Allocate arrays for output to diagnostic file -! mreal=22 ! xuanli - mreal=34 ! xuanli +! mreal=22 ! + mreal=34 ! more arrays nreal=mreal if (lobsdiagsave) nreal=nreal+4*miter+1 if (save_jacobian) then @@ -569,6 +566,7 @@ subroutine setupbend(obsLL,odiagLL, & do k=nsigstart,1,-1 ! check for model SR layer at obs location grad_mod=1000.0_r_kind*(nrefges(k+1,i)-nrefges(k,i))/(rges(k+1,i)-rges(k,i)) + if (abs(grad_mod)>= half*crit_grad) then ! SR - likely, to be used in obs SR qc qc_layer_SR=.true. !SR-likely layer detected endif @@ -620,10 +618,9 @@ subroutine setupbend(obsLL,odiagLL, & rdiagbuf(2,i) = data(iprof,i) ! profile identifier rdiagbuf(3,i) = data(ilate,i) ! lat in degrees rdiagbuf(4,i) = data(ilone,i) ! lon in degrees -!> xuanli: modified imph in the diag file. In jedi: imph=impp-roc-geoid +!> modified imph in the diag file. In jedi: imph=impp-roc-geoid rdiagbuf(7,i) = tpdpres(i)-rocprof ! impact height in meters ! rdiagbuf(7,i) = tpdpres(i)-rocprof-unprof ! impact height in meters -- defination in JEDI -!< xuanli ! rdiagbuf(7,i) = tpdpres(i) ! impact parameter in meters rdiagbuf(8,i) = dtime-time_offset ! obs time (hours relative to analysis time) @@ -633,7 +630,6 @@ subroutine setupbend(obsLL,odiagLL, & rdiagbuf(17,i) = data(igps,i) ! bending angle observation (radians) rdiagbuf(19,i) = hob ! model vertical grid (interface) if monotone grid rdiagbuf(22,i) = 1.e+10_r_kind ! spread (filled in by EnKF) -!> xuanli rdiagbuf(23,i) = tpdpres(i) ! impact parameter in meters rdiagbuf(24,i) = data(ipctc,i) ! input bufr qc - index of per cent confidence rdiagbuf(25,i) = data(iptid,i) ! transmitter occ id @@ -646,7 +642,6 @@ subroutine setupbend(obsLL,odiagLL, & rdiagbuf(32,i) = data(isiid,i) ! occulting satellite rdiagbuf(33,i) = data(iogce,i) ! Identification of processing center rdiagbuf(34,i) = data(iref,i) ! refractivity -!< xuanli - if(ratio_errors(i) > tiny_r_kind) then ! obs inside model grid @@ -823,11 +818,11 @@ subroutine setupbend(obsLL,odiagLL, & ddnj(j)=dot_product(dw4,nrefges(ihob-1:ihob+2,i))!derivative (dN/dx)_j if(ddnj(j)>zero) then -!> xuanli -- set dbend, rdiagbuf(5), rdiagbuf(17) as JEDI missing +!-- set dbend, rdiagbuf(5) as JEDI missing dbend=-3.368795e+38 rdiagbuf( 5,i) = -3.368795e+38 - rdiagbuf( 17,i) = -3.368795e+38 -!< xuanli +! rdiagbuf( 17,i) = -3.368795e+38 +! qcfail(i)=.true. qc_ddnj(i)=1 data(ier,i) = zero @@ -854,11 +849,11 @@ subroutine setupbend(obsLL,odiagLL, & end do intloop if (obs_check) then ! reject observation -!> xuanli -- set dbend, rdiagbuf(5), rdiagbuf(17) as JEDI missing +! -- set dbend, rdiagbuf(5) as JEDI missing rdiagbuf( 5,i) = -3.368795e+38 - rdiagbuf( 17,i) = -3.368795e+38 +! rdiagbuf( 17,i) = -3.368795e+38 dbend = -3.368795e+38 -!< xuanli +! qcfail(i)=.true. data(ier,i) = zero ratio_errors(i) = zero @@ -881,11 +876,11 @@ subroutine setupbend(obsLL,odiagLL, & ! Remove very large simulated values if(dbend > 0.05_r_kind) then -!> xuanli -- set dbend, rdiagbuf(5), rdiagbuf(17) as JEDI missing +! -- set dbend, rdiagbuf(5) as JEDI missing rdiagbuf( 5,i) = -3.368795e+38 - rdiagbuf( 17,i) = -3.368795e+38 +! rdiagbuf( 17,i) = -3.368795e+38 dbend = -3.368795e+38 -!< xuanli +! data(ier,i) = zero ratio_errors(i) = zero qcfail(i)=.true. @@ -1040,13 +1035,12 @@ subroutine setupbend(obsLL,odiagLL, & if(qcfail(i)) rdiagbuf(10,i) = four !modified in genstats due to toss_gps_sub if(qcfail_loc(i) == one) rdiagbuf(10,i) = one if(qcfail_high(i) == one) rdiagbuf(10,i) = two - if(qc_superr(i) == 1) rdiagbuf(10,i) = 7 !xuanli to print out SR - !if(qc_layer(i) == 1) rdiagbuf(10,i) = 8 !xuanli to print out SR - if(qc_ddnj(i) == 1) rdiagbuf(10,i) = 9 !xuanli to print out SR - if(qc_stat(i) == 1) rdiagbuf(10,i) = 10 !xuanli to print out SR - if(qc_largeBA(i) == 1) rdiagbuf(10,i) = 11 !xuanli to print out SR - if(qc_metop(i) == 1) rdiagbuf(10,i) = 12 !xuanli to print out SR - + if(qc_superr(i) == 1) rdiagbuf(10,i) = 7 ! print out SR + !if(qc_layer(i) == 1) rdiagbuf(10,i) = 8 ! print out SR2, this is marked in genstats_gps + if(qc_stat(i) == 1) rdiagbuf(10,i) = 10 ! print out cutoff + if(qc_ddnj(i) == 1) rdiagbuf(10,i) = 9 ! print out ddnj>0 + if(qc_largeBA(i) == 1) rdiagbuf(10,i) = 11 ! print out large BA + if(qc_metop(i) == 1) rdiagbuf(10,i) = 12 ! print out metop 8 km if(muse(i)) then ! modified in genstats_gps due to toss_gps_sub rdiagbuf(12,i) = one ! minimization usage flag (1=use, -1=not used) diff --git a/src/gsi/setupoz.f90 b/src/gsi/setupoz.f90 index 59b17853a7..068957d6e7 100644 --- a/src/gsi/setupoz.f90 +++ b/src/gsi/setupoz.f90 @@ -529,7 +529,6 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& rat_err2=zero if(luse(i))stats_oz(2,j) = stats_oz(2,j) + one ! number of obs tossed endif - write(6,*)'emily checking iuseflag = ', data(iuseflag,i), varinv3(k) ! Check scan position errors in ompstc8 if(obstype == "ompstc8") then if(data(ifovn,i) == 1 .or. data(ifovn,i) == 2 .or. & @@ -659,6 +658,8 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& else call nc_diag_metadata("Time",sngl(dtime-time_offset)) endif +! if (obstype == 'ompstc8' .or. obstype == 'omi')) & !emily + call nc_diag_metadata("Total_Ozone_Quality_Code", sngl(ierror_toq )) !emily call nc_diag_metadata("Total_Ozone_Error_Flag", sngl(ierror_toq )) call nc_diag_metadata("Profile_Ozone_Error_Flag", sngl(ierror_poq )) call nc_diag_metadata_to_single("Reference_Pressure",(pobs(k)*r100)) @@ -684,7 +685,8 @@ subroutine setupozlay(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& !orig call nc_diag_metadata_to_single("Row_Anomaly_Index",(data(itoqf,i)) ) call nc_diag_metadata("Total_Ozone_Quality_Flag", sngl(data(itoqf,i)) ) else - call nc_diag_metadata_to_single("Row_Anomaly_Index",(rmiss) ) + call nc_diag_metadata("Total_Ozone_Quality_Flag", sngl(rmiss) ) !emily +!orig call nc_diag_metadata_to_single("Row_Anomaly_Index",(rmiss) ) endif !>>emily if (obstype == 'omi' .or. obstype == 'ompstc8' .or. obstype == 'ompsnm') then @@ -1225,8 +1227,6 @@ subroutine setupozlev(obsLL,odiagLL,lunin,mype,stats_oz,nlevs,nreal,nobs,& real(r_kind),dimension(nsig)::ozgestmp ! GeoVaLs for JEDI/UFO real(r_single),dimension(ireal,nobs):: diagbuf real(r_single),allocatable,dimension(:,:,:)::rdiagbuf - real(r_kind),dimension(nsig+1)::prsitmp - real(r_kind),dimension(nsig)::ozgestmp integer(i_kind) i,ii,jj,iextra,ibin integer(i_kind) k1,k2,k,j,idia,irdim1,ioff0,ioff1 diff --git a/src/gsi/setupps.f90 b/src/gsi/setupps.f90 index add84e991f..1889c30145 100644 --- a/src/gsi/setupps.f90 +++ b/src/gsi/setupps.f90 @@ -111,7 +111,6 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa use m_obsdiagNode, only: obsdiagNode_set use m_obsdiagNode, only: obsdiagNode_get use m_obsdiagNode, only: obsdiagNode_assert - use obsmod, only: rmiss_single,perturb_obs,oberror_tune,& lobsdiagsave,nobskeep,lobsdiag_allocated,& time_offset,lobsdiag_forenkf,ianldate @@ -145,6 +144,7 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa use gsi_metguess_mod, only : gsi_metguess_get,gsi_metguess_bundle use sparsearr, only: sparr2, new, size, writearray, fullarray use rapidrefresh_cldsurf_mod, only: l_closeobs + use obsmod, only: bmiss !emily implicit none @@ -171,8 +171,8 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa ! Declare local variables real(r_double) rstation_id - real(r_kind) tges,tges2,drbx,pob,pges,psges,psges2,dlat,dlon,dtime,var_jb - real(r_kind) rdelz,rdp,halfpi,obserror,obserrlm,drdp,residual,ratio + real(r_kind) tges,tges2,drbx,pob,pges,psges,psges2,dlat,dlon,dtime,var_jb,tges0,tvges !emily + real(r_kind) rdelz,rdp,halfpi,obserror,obserrlm,drdp,residual,ratio,obserr0,obserr_step1,grosschkbound !emily real(r_kind) errinv_input,errinv_adjst,errinv_final real(r_kind) err_input,err_adjst,err_final,tfact real(r_kind) zsges,pgesorig,rwgt @@ -181,6 +181,8 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa real(r_kind) val2,ress,ressw2,val,valqc real(r_kind) cg_t,cvar,wgt,rat_err2,qcgross real(r_kind),dimension(nobs):: dup + real(r_kind) obserr_factor_prschk !emily + real(r_single),dimension(nobs):: slat, slon !emily real(r_kind),dimension(nsig):: prsltmp real(r_kind),dimension(nsig):: zges, prsltmp2, tvgestmp, tsentmp, qtmp, utmp, vtmp real(r_kind) :: tgges,roges @@ -188,7 +190,8 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa real(r_kind),dimension(nele,nobs):: data real(r_single),allocatable,dimension(:,:)::rdiagbuf - integer(i_kind) ier,ilon,ilat,ipres,ihgt,itemp,id,itime,ikx,iqc,iptrb,ijb + integer(i_kind) gross_check_flag !emily + integer(i_kind) ier,ilon,ilat,ipres,ihgt,itemp,id,itime,ikx,iqc,iptrb,ijb,iqt !emily integer(i_kind) ier2,iuse,ilate,ilone,istnelv,idomsfc,izz,iprvd,isprvd integer(i_kind) ikxx,nn,ibin,ioff,ioff0 integer(i_kind) i,j,nchar,nreal,ii,jj,k,l,mm1 @@ -208,6 +211,7 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa real(r_kind) :: hr_offset logical:: in_curbin, in_anybin, save_jacobian + logical iqtflg !emily type(psNode),pointer:: my_head type(obs_diag ),pointer:: my_diag type(obs_diags),pointer:: my_diagLL @@ -256,7 +260,9 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa iprvd=18 ! index of observation provider isprvd=19 ! index of observation subprovider ijb=20 ! index of non linear qc parameter - iptrb=21 ! index of ps perturbation + iqt=21 ! index of virtual or sensible temperature !emily +! iptrb=21 ! index of ps perturbation !orig + iptrb=22 ! index of ps perturbation !emily ! Declare local constants halfpi = half*pi @@ -279,9 +285,13 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa ! Check to see if observation should be used or monitored ! muse = true then used + do i=1,nobs muse(i)=nint(data(iuse,i)) <= jiter + slat(i) = data(ilate,i) !emily + slon(i) = data(ilone,i) !emily end do +55 format(a20,2x,i6,2x,i6,2x,l6) ! If HD raobs available move prepbufr version to monitor if(nhdps > 0)then do i=1,nobs @@ -305,26 +315,59 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa hr_offset=min_offset/60.0_r_kind ! Check for duplicate observations at same location dup=one -! do k=1,nobs -! do l=k+1,nobs + do k=1,nobs + rstation_id = data(id,k) + ikx = nint(data(ikxx,k)) + itype = ictype(ikx) + write(10000+mype, *) ' ' + write(10000+mype, *) 'new obs ... ' + write(10000+mype, *) 'k lat/lon D ', k, data(ilate,k), data(ilone,k) + write(10000+mype, *) 'k lat/lon S ', k, slat(k), slon(k) + write(10000+mype, *) 'k station_id ', k, station_id + write(10000+mype, *) 'k itype ', k, itype + write(10000+mype, *) 'k time ', k, data(itime,k) + write(10000+mype, *) 'k obserr ', k, data(ier,k) + write(10000+mype, *) 'k muse ', k, muse(k), data(iuse,k) + write(10000+mype, *) 'k luse ', k, luse(k) + do l=k+1,nobs + rstation_id = data(id,l) + ikx = nint(data(ikxx,l)) + itype = ictype(ikx) +!>>orig ! if(data(ilat,k) == data(ilat,l) .and. & ! data(ilon,k) == data(ilon,l) .and. & ! data(ier,k) < r1000 .and. data(ier,l) < r1000 .and. & ! muse(k) .and. muse(l))then -! if(l_closeobs) then -! if(abs(data(itime,k)-hr_offset) hPa --> Pa ikx=nint(data(ikxx,i)) itype=ictype(ikx) isubtype=icsubtype(ikx) @@ -387,7 +435,8 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa ! Link obs to diagnostics structure if (luse_obsdiag) then my_diag => obsdiagLList_nextNode(my_diagLL ,& - create = .not.lobsdiag_allocated ,& + + create = .not.lobsdiag_allocated ,& idv = is ,& iob = ioid(i) ,& ich = 1 ,& @@ -406,6 +455,11 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa obserror = max(cermin(ikx)*one_tenth,& min(cermax(ikx)*one_tenth,data(ier,i))) +!>>emily + obserr_step1 = data(ier,i)*r1000 +!<>emily + if (pob > 1.0e8 .or. dhgt > 1.0e8) & + write(6,*) 'emily checking pob dhgt ', pob, dhgt + write(6,*) 'emily checking missing value ', bmiss, bmiss*one_tenth + if (pob >= bmiss*one_tenth .or. dhgt >= bmiss) then + obserr_factor_prschk = 1.0_r_kind !emily_test + endif +!<>emily + rstation_id = data(id,i) + ikx = nint(data(ikxx,i)) + itype = ictype(ikx) + write(30000+mype,*) 'emily ................................................... ' + write(30000+mype,*) 'emily lat/lon D ', data(ilate,i), data(ilone,i) + write(30000+mype,*) 'emily lat/lon S ', slat(i), slon(i) + write(30000+mype,*) 'emily luse ', luse(i) + write(30000+mype,*) 'emily station_id ', station_id + write(30000+mype,*) 'emily obs typ ', itype + write(30000+mype,*) 'emily obs dtime ', data(itime,i) + write(30000+mype,*) 'emily obs ps ', data(ipres,i)*1000. + write(30000+mype,*) 'emily model elevation ', zsges + write(30000+mype,*) 'emily obs hgt ', dhgt + write(30000+mype,*) 'emily obs selev ', data(istnelv,i) + write(30000+mype,*) 'emily obs tv ', data(itemp,i) + write(30000+mype,*) 'emily ges tv ', tvges + write(30000+mype,*) 'emily zsges ', zsges + write(30000+mype,*) 'emily avg_tv0 ', tges0 + write(30000+mype,*) 'emily avg_tv ', tges + write(30000+mype,*) 'emily model_temp_sfc ', tvges + write(30000+mype,*) 'emily ps ', pgesorig*1000. + write(30000+mype,*) 'emily ps_cor ', pges*1000. + write(30000+mype,*) 'emily ....... ' + write(30000+mype,*) 'emily obs ps ', data(ipres,i)*1000. + write(30000+mype,*) 'emily tvflg ', data(iqt,i), iqtflg + write(30000+mype,*) 'emily model elevation ', zsges + write(30000+mype,*) 'emily ob elevation (ob hgt)', dhgt + write(30000+mype,*) 'emily obs_temp_sfc(obs tv) ', data(itemp,i) + write(30000+mype,*) 'emily model_temp_sfc ', tvges + write(30000+mype,*) 'emily tges2 ', tges2 + write(30000+mype,*) 'emily tges ', tges + write(30000+mype,*) 'emily orig oberr ', data(ier2,i)*r100 + write(30000+mype,*) 'emily current oberr ', data(ier,i)*r100 + write(30000+mype,*) 'emily rdelz ', rdelz + write(30000+mype,*) 'emily drbx ', drbx + write(30000+mype,*) 'emily drdp ', drdp*r1000 + write(30000+mype,*) 'emily obserr_factor_prschk ', obserr_factor_prschk +!< qcgross .or. ratio_errors < tiny_r_kind) then if (luse(i)) awork(6) = awork(6)+one error = zero ratio_errors = zero + gross_check_flag = 1 !emily else ratio_errors = ratio_errors/sqrt(dup(i)) end if @@ -679,6 +791,7 @@ subroutine setupps(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsa else err_final = huge_single endif + if (.not. muse(i)) err_final = huge_single !emily errinv_input = huge_single errinv_adjst = huge_single @@ -966,6 +1079,7 @@ subroutine contents_binary_diag_(odiag) end subroutine contents_binary_diag_ subroutine contents_netcdf_diag_(odiag) + use obsmod, only: bmiss !emily type(obs_diag),pointer,intent(in):: odiag ! Observation class character(7),parameter :: obsclass = ' ps' @@ -975,12 +1089,20 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Observation_Type", ictype(ikx) ) call nc_diag_metadata("Observation_Subtype", icsubtype(ikx) ) !Replace direct calls to nc_diag_metadata with the screening subroutine - call nc_diag_metadata_to_single("Latitude", data(ilate,i) ) - call nc_diag_metadata_to_single("Longitude", data(ilone,i) ) +! call nc_diag_metadata_to_single("Latitude", data(ilate,i) ) !orig +! call nc_diag_metadata_to_single("Longitude", data(ilone,i) ) !orig + call nc_diag_metadata("Latitude", slat(i) ) !emily + call nc_diag_metadata("Longitude", slon(i) ) !emily call nc_diag_metadata_to_single("Station_Elevation",data(istnelv,i) ) call nc_diag_metadata_to_single("Pressure", data(ipres,i),r10,'*' ) call nc_diag_metadata_to_single("Height", dhgt ) + call nc_diag_metadata_to_single("ObserrFactorDup", sqrt(dup(i)) ) !emily + call nc_diag_metadata_to_single("ObserrFactorPrsChk", obserr_factor_prschk) !emily + call nc_diag_metadata_to_single("GrossChkBound", grosschkbound ) !emily call nc_diag_metadata_to_single("Time", dtime,time_offset,'-' ) + call nc_diag_metadata_to_single("deltObsTime", data(itime,i) ) !emily_test + call nc_diag_metadata("GrossCheckFlag", sngl(gross_check_flag))!emily_test + call nc_diag_metadata_to_single("Setup_QC_Mark", data(iqt,i) ) !emily_test call nc_diag_metadata_to_single("Prep_QC_Mark", data(iqc,i) ) call nc_diag_metadata_to_single("Prep_Use_Flag", data(iuse,i) ) call nc_diag_metadata_to_single("Nonlinear_QC_Var_Jb",var_jb ) @@ -991,6 +1113,8 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata("Analysis_Use_Flag", -1.0_r_single ) endif + call nc_diag_metadata_to_single("Error_Intermediate1", obserr_step1 ) !emily: Pa + call nc_diag_metadata_to_single("Error_Input", obserr0 ) !emily: Pa call nc_diag_metadata_to_single("Errinv_Input", errinv_input ) call nc_diag_metadata_to_single("Errinv_Adjust", errinv_adjst ) call nc_diag_metadata_to_single("Errinv_Final", errinv_final ) @@ -999,9 +1123,23 @@ subroutine contents_netcdf_diag_(odiag) call nc_diag_metadata_to_single("Obs_Minus_Forecast_adjusted",pob,pges,'-') call nc_diag_metadata_to_single("Obs_Minus_Forecast_unadjusted",pob,pgesorig,'-') - call nc_diag_metadata("Observation", sngl(pob) ) - call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(pob-pges) ) - call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(pob-pgesorig)) +!>>emily + if (iqtflg) then ! this is virtual temperature + call nc_diag_metadata("Observation_Virtual_Temperature", sngl(dtemp) ) + call nc_diag_metadata("Observation_Sensible_Temperature", sngl(bmiss)) + else ! this is sensible temperature + call nc_diag_metadata("Observation_Virtual_Temperature", sngl(bmiss) ) + call nc_diag_metadata("Observation_Sensible_Temperature", sngl(dtemp)) + endif +!<>orig +! call nc_diag_metadata("Obs_Minus_Forecast_adjusted", sngl(pob-pges) ) +! call nc_diag_metadata("Obs_Minus_Forecast_unadjusted", sngl(pob-pgesorig)) +!<>emily + call nc_diag_metadata("Forecast_adjusted", sngl(pges) ) + call nc_diag_metadata("Forecast_unadjusted", sngl(pgesorig)) +!<>orig @@ -1475,18 +1481,20 @@ subroutine contents_netcdf_diag_(odiag) ! call nc_diag_data2d("geopotential_height", sngl(hsges) ) !<>emily isli = data(idomsfc,i) water_frac = 0.0 land_frac = 0.0 ice_frac = 0.0 + snow_frac = 0.0 if (isli == 0) water_frac = 1.0 if (isli == 1) land_frac = 1.0 if (isli == 2) ice_frac = 1.0 + if (isli == 3) snow_frac = 1.0 call nc_diag_metadata("Water_Fraction", sngl(water_frac)) call nc_diag_metadata("Land_Fraction", sngl(land_frac)) call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) + call nc_diag_metadata("Snow_Fraction", sngl(snow_frac)) !<179.and.itype<190).or.(itype>=192.and.itype<=199) @@ -1788,37 +1789,43 @@ subroutine contents_netcdf_diag_(odiag) real(r_kind),dimension(miter) :: obsdiag_iuse - call nc_diag_metadata("Station_ID", station_id ) - call nc_diag_metadata("Observation_Class", obsclass ) - call nc_diag_metadata("Observation_Type", ictype(ikx) ) - call nc_diag_metadata("Observation_Subtype", icsubtype(ikx) ) - call nc_diag_metadata_to_single("Latitude",data(ilate,i)) - call nc_diag_metadata_to_single("Longitude",data(ilone,i)) + call nc_diag_metadata("Station_ID", station_id ) + call nc_diag_metadata("Observation_Class", obsclass ) + call nc_diag_metadata("Observation_Type", ictype(ikx) ) + call nc_diag_metadata("Observation_Subtype", icsubtype(ikx) ) + + call nc_diag_metadata_to_single("Latitude", data(ilate,i) ) + call nc_diag_metadata_to_single("Longitude", data(ilone,i) ) ! this is the obs height after being interpolated to the model (=model height) - call nc_diag_metadata_to_single("Station_Elevation",data(istnelv,i)) - call nc_diag_metadata_to_single("Pressure",prest) + call nc_diag_metadata_to_single("Station_Elevation",data(istnelv,i) ) + call nc_diag_metadata_to_single("Pressure", prest ) ! this is the original obs height (= stn elevation, before being interpolated) - call nc_diag_metadata_to_single("Height",data(iobshgt,i)) - call nc_diag_metadata_to_single("Time",dtime,time_offset,'-') - call nc_diag_metadata_to_single("Prep_QC_Mark",data(iqc,i)) - call nc_diag_metadata_to_single("Setup_QC_Mark",data(iqt,i)) - call nc_diag_metadata_to_single("Prep_Use_Flag",data(iuse,i)) + call nc_diag_metadata_to_single("Height", data(iobshgt,i) ) + call nc_diag_metadata_to_single("ObserrFactorDup", sqrt(dup(i)) ) !emily + call nc_diag_metadata_to_single("Time", dtime,time_offset,'-') + call nc_diag_metadata_to_single("deltObsTime", data(itime,i) ) !emily_test + call nc_diag_metadata_to_single("Prep_QC_Mark", data(iqc,i) ) + call nc_diag_metadata_to_single("Setup_QC_Mark", data(iqt,i) ) + call nc_diag_metadata_to_single("Prep_Use_Flag", data(iuse,i) ) + if(muse(i)) then - call nc_diag_metadata("Analysis_Use_Flag", sngl(one) ) + call nc_diag_metadata("Analysis_Use_Flag", sngl(one) ) else - call nc_diag_metadata("Analysis_Use_Flag", sngl(-one) ) + call nc_diag_metadata("Analysis_Use_Flag", sngl(-one) ) endif - call nc_diag_metadata_to_single("Nonlinear_QC_Rel_Wgt",rwgt) - call nc_diag_metadata_to_single("Errinv_Input",errinv_input ) - call nc_diag_metadata_to_single("Errinv_Adjust",errinv_adjst ) - call nc_diag_metadata_to_single("Errinv_Final",errinv_final ) + call nc_diag_metadata_to_single("Nonlinear_QC_Rel_Wgt",rwgt ) + call nc_diag_metadata_to_single("Error_Input", obserr0 ) !emily + call nc_diag_metadata_to_single("Errinv_Input", errinv_input ) + call nc_diag_metadata_to_single("Errinv_Adjust", errinv_adjst ) + call nc_diag_metadata_to_single("Errinv_Final", errinv_final ) + if (hofx_2m_sfcfile ) then - call nc_diag_metadata_to_single("Observation", tob ) + call nc_diag_metadata_to_single("Observation", tob ) else call nc_diag_metadata_to_single("Observation", data(itob,i) ) endif - call nc_diag_metadata_to_single("Obs_Minus_Forecast_adjusted",ddiff ) + call nc_diag_metadata_to_single("Obs_Minus_Forecast_adjusted",ddiff ) call nc_diag_metadata_to_single("Obs_Minus_Forecast_unadjusted",tob,tges,'-') if (aircraft_t_bc_pof .or. aircraft_t_bc .or. aircraft_t_bc_ext) then @@ -1911,12 +1918,15 @@ subroutine contents_netcdf_diag_(odiag) water_frac = 0.0 land_frac = 0.0 ice_frac = 0.0 + snow_frac = 0.0 if (isli == 0) water_frac = 1.0 if (isli == 1) land_frac = 1.0 if (isli == 2) ice_frac = 1.0 + if (isli == 3) snow_frac = 1.0 call nc_diag_metadata("Water_Fraction", sngl(water_frac)) call nc_diag_metadata("Land_Fraction", sngl(land_frac)) call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) + call nc_diag_metadata("Snow_Fraction", sngl(snow_frac)) !< nconvtype) then num_bad_ikx=num_bad_ikx+1 @@ -601,8 +606,35 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav nsig,mype,nfldsig) call tintrp2a1(ges_v,vtmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) - call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& + call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& !orig nsig,mype,nfldsig) +!>>emily_gmao + call tintrp2a1(geop_hgtl,zges_read,dlat,dlon,dtime,hrdifsig,& !emily_gmao + nsig,mype,nfldsig) + call tintrp31(ges_tv,sfctges,dlat,dlon,log(psges),dtime, & + hrdifsig,mype,nfldsig) +! Convert geopotential height at layer midpoints to geometric +! height using equations (17, 20, 23) in MJ Mahoney's note +! "A discussion of various measures of altitude" (2001). +! Available on the web at +! http://mtp.jpl.nasa.gov/notes/altitude/altitude.html +! +! termg = equation 17 +! termr = equation 21 +! termrg = first term in the denominator of equation 23 +! zges = equation 23 + + slat = data(ilate,i)*deg2rad + sin2 = sin(slat)*sin(slat) + termg = grav_equator * & + ((one+somigliana*sin2)/sqrt(one-eccentricity*eccentricity*sin2)) + termr = semi_major_axis /(one + flattening + grav_ratio - & + two*flattening*sin2) + termrg = (termg/grav)*termr + do k=1,nsig + zges_geometric(k) = (termr*zges_read(k)) / (termrg-zges_read(k)) ! eq (23) + end do +!<=280 .and. itype < 300) if (z_height .or. sfc_data) then - write(6,*)'emily setupw: you are here 1 ...' - write(6,*)'emily setupw: itype = ', itype - write(6,*)'emily setupw: sfc_data = ', sfc_data - write(6,*)'emily setupw: sfcmod_gfs, sfcmod_mm5 = ', sfcmod_gfs, sfcmod_mm5 +! write(6,*)'emily setupw: you are here 1 ...' +! write(6,*)'emily setupw: itype = ', itype +! write(6,*)'emily setupw: sfc_data = ', sfc_data +! write(6,*)'emily setupw: sfcmod_gfs, sfcmod_mm5 = ', sfcmod_gfs, sfcmod_mm5 drpx = zero dpres = data(ihgt,i) @@ -650,38 +682,45 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav end if dpres=dpres-(dstn+fact*(zsges-dstn)) if(itype==261) dpres = data(ihgt,i) - write(6,*)'emily setupw: dpres = ', dpres +! write(6,*)'emily setupw: dpres = ', dpres -! Get guess surface elevation and geopotential height profile -! at observation location. - call tintrp2a1(geop_hgtl,zges,dlat,dlon,dtime,hrdifsig,& - nsig,mype,nfldsig) +!>>orig +!! Get guess surface elevation and geopotential height profile +!! at observation location. +! call tintrp2a1(geop_hgtl,zges,dlat,dlon,dtime,hrdifsig,& +! nsig,mype,nfldsig) +!<=223 .and. itype<=228) .or. itype == 218 .or. sfc_data) .and. .not.twodvar_regional) then -! Convert geopotential height at layer midpoints to geometric -! height using equations (17, 20, 23) in MJ Mahoney's note -! "A discussion of various measures of altitude" (2001). -! Available on the web at -! http://mtp.jpl.nasa.gov/notes/altitude/altitude.html +!>>orig +!! Convert geopotential height at layer midpoints to geometric +!! height using equations (17, 20, 23) in MJ Mahoney's note +!! "A discussion of various measures of altitude" (2001). +!! Available on the web at +!! http://mtp.jpl.nasa.gov/notes/altitude/altitude.html +!! +!! termg = equation 17 +!! termr = equation 21 +!! termrg = first term in the denominator of equation 23 +!! zges = equation 23 ! -! termg = equation 17 -! termr = equation 21 -! termrg = first term in the denominator of equation 23 -! zges = equation 23 - - slat = data(ilate,i)*deg2rad - sin2 = sin(slat)*sin(slat) - termg = grav_equator * & - ((one+somigliana*sin2)/sqrt(one-eccentricity*eccentricity*sin2)) - termr = semi_major_axis /(one + flattening + grav_ratio - & - two*flattening*sin2) - termrg = (termg/grav)*termr - do k=1,nsig - zges(k) = (termr*zges(k)) / (termrg-zges(k)) ! eq (23) - end do +! slat = data(ilate,i)*deg2rad +! sin2 = sin(slat)*sin(slat) +! termg = grav_equator * & +! ((one+somigliana*sin2)/sqrt(one-eccentricity*eccentricity*sin2)) +! termr = semi_major_axis /(one + flattening + grav_ratio - & +! two*flattening*sin2) +! termrg = (termg/grav)*termr +! do k=1,nsig +! zges(k) = (termr*zges(k)) / (termrg-zges(k)) ! eq (23) +! zges_geometric(k) = (termr*zges_read(k)) / (termrg-zges_read(k)) ! eq (23) !emily_gmao +! end do +!<>emily @@ -1938,8 +1980,12 @@ subroutine contents_netcdf_diag_(udiag,vdiag) utmp_reverse(kk) = utmp(k) vtmp_reverse(kk) = vtmp(k) ttmp_reverse(kk) = ttmp(k) + tvtmp_reverse(kk) = tges(k) !emily_gmao qtmp_reverse(kk) = qtmp(k) hsges_reverse(kk) = hsges(k) + zges_read_reverse(kk)= zges_read(k) + zges_geometric_reverse(kk)= zges_geometric(k) + zges_reverse(kk) = zges(k) prsltmp2_reverse(kk) = prsltmp2(k) enddo do k = 1, nsig+1 @@ -1949,13 +1995,16 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2_reverse*r1000)) call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp_reverse*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp_reverse)) + call nc_diag_data2d("virtual_temperature", sngl(tvtmp_reverse)) !emily_gmao call nc_diag_data2d("specific_humidity", sngl(qtmp_reverse)) call nc_diag_data2d("eastward_wind", sngl(utmp_reverse)) call nc_diag_data2d("northward_wind", sngl(vtmp_reverse)) - call nc_diag_data2d("geopotential_height", sngl(hsges_reverse) ) +! call nc_diag_data2d("geopotential_height", sngl(hsges_reverse) ) !orig + call nc_diag_data2d("geopotential_height", sngl(zges_read_reverse) ) !emily_gmao + call nc_diag_data2d("geometric_height", sngl(zges_geometric_reverse) ) !emily_gmao !<>orig +!!>>orig ! call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2*r1000)) ! call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp*r1000)) ! call nc_diag_data2d("air_temperature", sngl(ttmp)) @@ -1963,10 +2012,14 @@ subroutine contents_netcdf_diag_(udiag,vdiag) ! call nc_diag_data2d("eastward_wind", sngl(utmp)) ! call nc_diag_data2d("northward_wind", sngl(vtmp)) ! call nc_diag_data2d("geopotential_height", sngl(hsges) ) +! call nc_diag_data2d("model_height", sngl(zges) ) !<= r40 ) then itrop_k = itrp_pv elseif (slatd(i) >= r20) then @@ -197,6 +198,7 @@ subroutine tpause(mype,method) trop_pv(i,j) = prs(itrp_pv)*r0_01 !hPa trop_oz(i,j) = prs(itrp_oz)*r0_01 !hPa trop_pvoz(i,j) = prs(itrop_k)*r0_01 !hPa + end do end do From e9f68cfbde7d2e1411137fcdc4342c72b8d5c3a7 Mon Sep 17 00:00:00 2001 From: Emily Liu Date: Fri, 13 Oct 2023 21:07:05 -0500 Subject: [PATCH 24/26] Revert back to the develop version --- modulefiles/gsi_hera.gnu.lua | 2 -- src/gsi/general_specmod.f90 | 31 ------------------------------- 2 files changed, 33 deletions(-) diff --git a/modulefiles/gsi_hera.gnu.lua b/modulefiles/gsi_hera.gnu.lua index d184ea10e9..37504485e3 100644 --- a/modulefiles/gsi_hera.gnu.lua +++ b/modulefiles/gsi_hera.gnu.lua @@ -24,6 +24,4 @@ load(pathJoin("openblas", openblas_ver)) pushenv("GSI_BINARY_SOURCE_DIR", "/scratch1/NCEPDEV/global/glopara/fix/gsi/20230911") -pushenv("GSI_BINARY_SOURCE_DIR", "/scratch1/NCEPDEV/global/glopara/fix/gsi/20230601") - whatis("Description: GSI environment on Hera with GNU Compilers") diff --git a/src/gsi/general_specmod.f90 b/src/gsi/general_specmod.f90 index c90187bf70..439e26e431 100644 --- a/src/gsi/general_specmod.f90 +++ b/src/gsi/general_specmod.f90 @@ -64,7 +64,6 @@ module general_specmod ! set subroutines to public public :: general_init_spec_vars public :: general_destroy_spec_vars - public :: general_spec_multwgt ! set passed variables to public public :: spec_vars public :: spec_cut @@ -307,36 +306,6 @@ subroutine general_init_spec_vars(sp,jcap,jcap_test,nlat_a,nlon_a,eqspace) return end subroutine general_init_spec_vars - subroutine general_spec_multwgt(sp,spcwrk,spcwgt) -! 2017-03-30 J. Kay, X. Wang - add general_spec_multwgt for scale-dependent -! weighting of mixed resolution ensemble, -! POC: xuguang.wang@ou.edu -! - implicit none - type(spec_vars),intent(in) :: sp - real(r_kind),dimension(sp%nc),intent(inout) :: spcwrk - real(r_kind),dimension(0:sp%jcap),intent(in) :: spcwgt - - integer(i_kind) l,jmax,ks,n - -!! Code borrowed from spvar in splib - jmax=sp%jcap - - do n=0,jmax - ks=2*n - spcwrk(ks+1)=spcwrk(ks+1)*spcwgt(n) - end do - do n=0,jmax - do l=MAX(1,n-jmax),MIN(n,jmax) - ks=l*(2*jmax+(-1)*(l-1))+2*n - spcwrk(ks+1) = spcwrk(ks+1)*spcwgt(n) - spcwrk(ks+2) = spcwrk(ks+2)*spcwgt(n) - end do - end do - - return - end subroutine general_spec_multwgt - subroutine general_destroy_spec_vars(sp) !$$$ subprogram documentation block ! . . . . From fbf39623f3b6b2b4bdcc361f0c64b7ee710835c3 Mon Sep 17 00:00:00 2001 From: Emily Liu Date: Sat, 14 Oct 2023 15:37:48 -0500 Subject: [PATCH 25/26] Tidy up the code --- src/gsi/read_satwnd.f90 | 4 +- src/gsi/setupw.f90 | 104 +++++++++++++++++++--------------------- 2 files changed, 51 insertions(+), 57 deletions(-) diff --git a/src/gsi/read_satwnd.f90 b/src/gsi/read_satwnd.f90 index 3c07be891b..0077b4a867 100644 --- a/src/gsi/read_satwnd.f90 +++ b/src/gsi/read_satwnd.f90 @@ -1666,8 +1666,8 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis cdata_all(23,iout)=r_sprvstg(1,1) ! subprovider name cdata_all(25,iout)=var_jb ! non linear qc parameter cdata_all(26,iout)=one ! hilbert curve weight - cdata_all(27,iout)=obsdat(5) ! AMVQ for GOES-17 mitig.AMVs ! extra variables for satwind qc for brett + cdata_all(27,iout)=obsdat(5) ! AMVQ for GOES-17 mitig.AMVs cdata_all(28,iout)=hdrdat(9) ! wind computation method cdata_all(29,iout)=hdrdat(10) ! satellite zenith angle cdata_all(30,iout)=hdrdat(1) ! satellite identifier @@ -1679,7 +1679,6 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis if(perturb_obs)then cdata_all(35,iout)=ran01dom()*perturb_fact ! u perturbation cdata_all(36,iout)=ran01dom()*perturb_fact ! v perturbation - !>>orig ! if(perturb_obs)then ! cdata_all(27,iout)=ran01dom()*perturb_fact ! u perturbation @@ -1687,7 +1686,6 @@ subroutine read_satwnd(nread,ndata,nodata,infile,obstype,lunout,gstime,twind,sis !<> JEDI + real(r_kind),dimension(nsig):: prsltmp2 + real(r_kind),dimension(nsig+1):: prsitmp real(r_kind),dimension(nsig):: ttmp,qtmp,utmp,vtmp,hsges - real(r_kind),dimension(nsig):: ttmp_reverse,tvtmp_reverse,qtmp_reverse,utmp_reverse,vtmp_reverse,hsges_reverse, zges_reverse,prsltmp2_reverse !emily - real(r_kind),dimension(nsig):: zges_read_reverse, zges_geometric_reverse !emily_gmao - real(r_kind),dimension(nsig+1):: prsitmp_reverse !emily + ! GSI profiles are stored with bottom up index; output the profiles + ! with top down index + real(r_kind),dimension(nsig):: ttmp_reverse,tvtmp_reverse,qtmp_reverse,utmp_reverse,vtmp_reverse + real(r_kind),dimension(nsig):: hsges_reverse, zges_reverse,prsltmp2_reverse + real(r_kind),dimension(nsig):: zges_read_reverse, zges_geometric_reverse + real(r_kind),dimension(nsig+1):: prsitmp_reverse real(r_kind) psges2 + !<< JEDI integer(i_kind) i,nchar,nreal,k,j,l,ii,itype,ijb ! Variables needed for new polar winds QC based on Log Normalized Vector Departure (LNVD) @@ -304,8 +309,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav integer(i_kind) ihgt,ier2,iuse,ilate,ilone integer(i_kind) izz,iprvd,isprvd integer(i_kind) idomsfc,isfcr,iskint,iff10 - integer(i_kind) ibb,ikk,ihil,idddd,iamvq - integer(i_kind) kk !emily + integer(i_kind) kk,ibb,ikk,ihil,idddd,iamvq integer(i_kind) water_frac,land_frac,ice_frac, snow_frac !emily integer(i_kind) num_bad_ikx,iprev_station @@ -593,6 +597,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav call tintrp2a1(ges_lnprsl,prsltmp,dlat,dlon,dtime,hrdifsig,& nsig,mype,nfldsig) +!>>JEDI ! GEOVALS for UFO eval psges2 = psges ! keep in cb prsltmp2 = exp(prsltmp) @@ -608,11 +613,14 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav nsig,mype,nfldsig) call tintrp2a1(geop_hgtl,hsges,dlat,dlon,dtime,hrdifsig,& !orig nsig,mype,nfldsig) -!>>emily_gmao - call tintrp2a1(geop_hgtl,zges_read,dlat,dlon,dtime,hrdifsig,& !emily_gmao + ! geopotential height at obs location (lat/lon) and time + call tintrp2a1(geop_hgtl,zges_read,dlat,dlon,dtime,hrdifsig, & nsig,mype,nfldsig) + ! model virtual temperature (ges_tv) at obs location (lat/lon) + ! obs time, and model surface (lower model level) call tintrp31(ges_tv,sfctges,dlat,dlon,log(psges),dtime, & hrdifsig,mype,nfldsig) + ! Convert geopotential height at layer midpoints to geometric ! height using equations (17, 20, 23) in MJ Mahoney's note ! "A discussion of various measures of altitude" (2001). @@ -634,9 +642,8 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav do k=1,nsig zges_geometric(k) = (termr*zges_read(k)) / (termrg-zges_read(k)) ! eq (23) end do -!<=280 .and. itype < 300) if (z_height .or. sfc_data) then -! write(6,*)'emily setupw: you are here 1 ...' -! write(6,*)'emily setupw: itype = ', itype -! write(6,*)'emily setupw: sfc_data = ', sfc_data -! write(6,*)'emily setupw: sfcmod_gfs, sfcmod_mm5 = ', sfcmod_gfs, sfcmod_mm5 drpx = zero dpres = data(ihgt,i) @@ -682,7 +685,6 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav end if dpres=dpres-(dstn+fact*(zsges-dstn)) if(itype==261) dpres = data(ihgt,i) -! write(6,*)'emily setupw: dpres = ', dpres !>>orig !! Get guess surface elevation and geopotential height profile @@ -690,7 +692,7 @@ subroutine setupw(obsLL,odiagLL,lunin,mype,bwork,awork,nele,nobs,is,conv_diagsav ! call tintrp2a1(geop_hgtl,zges,dlat,dlon,dtime,hrdifsig,& ! nsig,mype,nfldsig) !<>JEDI ! GEOVALS - !>>emily do k = 1, nsig kk = nsig-k+1 utmp_reverse(kk) = utmp(k) vtmp_reverse(kk) = vtmp(k) ttmp_reverse(kk) = ttmp(k) - tvtmp_reverse(kk) = tges(k) !emily_gmao + tvtmp_reverse(kk) = tges(k) !emily qtmp_reverse(kk) = qtmp(k) hsges_reverse(kk) = hsges(k) zges_read_reverse(kk)= zges_read(k) @@ -1995,13 +1991,13 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_data2d("atmosphere_pressure_coordinate", sngl(prsltmp2_reverse*r1000)) call nc_diag_data2d("atmosphere_pressure_coordinate_interface", sngl(prsitmp_reverse*r1000)) call nc_diag_data2d("air_temperature", sngl(ttmp_reverse)) - call nc_diag_data2d("virtual_temperature", sngl(tvtmp_reverse)) !emily_gmao + call nc_diag_data2d("virtual_temperature", sngl(tvtmp_reverse)) !emily call nc_diag_data2d("specific_humidity", sngl(qtmp_reverse)) call nc_diag_data2d("eastward_wind", sngl(utmp_reverse)) call nc_diag_data2d("northward_wind", sngl(vtmp_reverse)) ! call nc_diag_data2d("geopotential_height", sngl(hsges_reverse) ) !orig - call nc_diag_data2d("geopotential_height", sngl(zges_read_reverse) ) !emily_gmao - call nc_diag_data2d("geometric_height", sngl(zges_geometric_reverse) ) !emily_gmao + call nc_diag_data2d("geopotential_height", sngl(zges_read_reverse) ) !emily + call nc_diag_data2d("geometric_height", sngl(zges_geometric_reverse) ) !emily !<>orig @@ -2018,27 +2014,26 @@ subroutine contents_netcdf_diag_(udiag,vdiag) call nc_diag_metadata("surface_geopotential_height", sngl(zsges) ) !emily call nc_diag_metadata("surface_altitude", sngl(zsges) ) !emily ! call nc_diag_metadata("surface_temperature", sngl(data(iskint,i)) ) !emily_orig - call nc_diag_metadata("surface_temperature", sngl(sfctges )) !emily_gmao - call nc_diag_metadata("surface_skin_temperature", sngl(data(iskint,i)) )!emily_gmao + call nc_diag_metadata("surface_temperature", sngl(sfctges )) !emily: check me + call nc_diag_metadata("surface_skin_temperature", sngl(data(iskint,i)) )!emily: check me call nc_diag_metadata("tropopause_pressure", sngl(trop5*r100) ) call nc_diag_metadata("surface_air_pressure", sngl(psges2*r1000) ) call nc_diag_metadata("Land_Type_Index", sngl(isli)) -!>>emily - water_frac = 0.0 - land_frac = 0.0 - ice_frac = 0.0 - snow_frac = 0.0 - if (isli == 0) water_frac = 1.0 - if (isli == 1) land_frac = 1.0 - if (isli == 2) ice_frac = 1.0 - if (isli == 3) snow_frac = 1.0 - call nc_diag_metadata("Water_Fraction", sngl(water_frac)) - call nc_diag_metadata("Land_Fraction", sngl(land_frac)) - call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) - call nc_diag_metadata("Snow_Fraction", sngl(snow_frac)) -!<>emily + water_frac = 0.0 + land_frac = 0.0 + ice_frac = 0.0 + snow_frac = 0.0 + if (isli == 0) water_frac = 1.0 + if (isli == 1) land_frac = 1.0 + if (isli == 2) ice_frac = 1.0 + if (isli == 3) snow_frac = 1.0 + call nc_diag_metadata("Water_Fraction", sngl(water_frac)) + call nc_diag_metadata("Land_Fraction", sngl(land_frac)) + call nc_diag_metadata("Ice_Fraction", sngl(ice_frac)) + call nc_diag_metadata("Snow_Fraction", sngl(snow_frac)) + !< Date: Sat, 14 Oct 2023 20:51:31 -0500 Subject: [PATCH 26/26] remove debugging lines --- src/gsi/read_prepbufr.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gsi/read_prepbufr.f90 b/src/gsi/read_prepbufr.f90 index 2a084745bf..d58672f409 100644 --- a/src/gsi/read_prepbufr.f90 +++ b/src/gsi/read_prepbufr.f90 @@ -1052,7 +1052,7 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& !------------------------------------------------------------------------ - write(6,*)'emily checking offtime_data = ', offtime_data +! write(6,*)'emily checking offtime_data = ', offtime_data if(offtime_data) then ! in time correction for observations to account for analysis @@ -1636,11 +1636,11 @@ subroutine read_prepbufr(nread,ndata,nodata,infile,obstype,lunout,twindin,sis,& ! If temperature ob, extract information regarding virtual ! versus sensible temperature -! if(tob) then !orig +! if(tob) then !orig if(tob .or. psob ) then !emily ! use tvirtual if tsensible flag not set, and not in either 2Dregional or global_2m DA mode if ( (.not. tsensible) .and. .not. (twodvar_regional .or. global_2m_land) ) then - ! write(6,*)'emily checking vtcd = ', vtcd + !write(6,*)'emily checking vtcd = ', vtcd do k=1,levs tvflg(k)=one ! initialize as sensible do j=1,20