From 3150d29362d2143d97bd96071fd50cf9a7efa5b3 Mon Sep 17 00:00:00 2001 From: Hongli Wang Date: Thu, 5 Oct 2023 05:38:10 +0000 Subject: [PATCH] Add ensemble component for RRFS-SD DA Changes to be committed: modified: src/gsi/control2state.f90 modified: src/gsi/cplr_get_fv3_regional_ensperts.f90 modified: src/gsi/ensctl2model.f90 modified: src/gsi/ensctl2model_ad.f90 modified: src/gsi/ensctl2state.f90 modified: src/gsi/ensctl2state_ad.f90 modified: src/gsi/gsi_rfv3io_mod.f90 modified: src/gsi/gsimod.F90 modified: src/gsi/obsmod.F90 modified: src/gsi/wrf_vars_mod.f90 --- src/gsi/control2state.f90 | 20 ++ src/gsi/cplr_get_fv3_regional_ensperts.f90 | 238 ++++++++++++++++----- src/gsi/ensctl2model.f90 | 24 ++- src/gsi/ensctl2model_ad.f90 | 24 +++ src/gsi/ensctl2state.f90 | 24 +++ src/gsi/ensctl2state_ad.f90 | 24 +++ src/gsi/gsi_rfv3io_mod.f90 | 79 ++++++- src/gsi/gsimod.F90 | 6 +- src/gsi/obsmod.F90 | 4 +- src/gsi/wrf_vars_mod.f90 | 17 +- 10 files changed, 388 insertions(+), 72 deletions(-) diff --git a/src/gsi/control2state.f90 b/src/gsi/control2state.f90 index 5836e082b2..9d52a1dd75 100644 --- a/src/gsi/control2state.f90 +++ b/src/gsi/control2state.f90 @@ -35,6 +35,7 @@ module control2state_mod 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 +use wrf_vars_mod, only : sdp_exist implicit none @@ -283,6 +284,15 @@ subroutine control2state(xhat,sval,bval) enddo end if +! Add smoke + if (sdp_exist) then + call gsi_bundlegetpointer (sval(jj),'smoke',sv_rank3,istatus) + call gsi_bundlegetvar (wbundle, 'smoke',sv_rank3,istatus) + call gsi_bundlegetpointer (sval(jj),'dust' ,sv_rank3,istatus) + call gsi_bundlegetvar (wbundle, 'dust' ,sv_rank3,istatus) + call gsi_bundlegetpointer (sval(jj),'coarsepm',sv_rank3,istatus) + call gsi_bundlegetvar (wbundle, 'coarsepm',sv_rank3,istatus) + end if call gsi_bundlegetpointer (sval(jj),'ps' ,sv_ps, istatus) call gsi_bundlegetvar ( wbundle, 'ps' , sv_ps, istatus ) @@ -732,6 +742,16 @@ subroutine control2state_ad(rval,bval,grad) enddo end if +! Add smoke + if (sdp_exist) then + call gsi_bundlegetpointer (rval(jj),'smoke',rv_rank3,istatus) + call gsi_bundleputvar (wbundle, 'smoke',rv_rank3,istatus) + call gsi_bundlegetpointer (rval(jj),'dust' ,rv_rank3,istatus) + call gsi_bundleputvar (wbundle, 'dust' ,rv_rank3,istatus) + call gsi_bundlegetpointer (rval(jj),'coarsepm',rv_rank3,istatus) + call gsi_bundleputvar (wbundle, 'coarsepm',rv_rank3,istatus) + end if + ! Calculate sensible temperature if(do_tv_to_tsen) call tv_to_tsen_ad(cv_t,rv_q,rv_tsen) diff --git a/src/gsi/cplr_get_fv3_regional_ensperts.f90 b/src/gsi/cplr_get_fv3_regional_ensperts.f90 index ff5d57c7ac..764ee94111 100644 --- a/src/gsi/cplr_get_fv3_regional_ensperts.f90 +++ b/src/gsi/cplr_get_fv3_regional_ensperts.f90 @@ -74,7 +74,7 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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,if_model_fed + use obsmod, only: if_model_dbz,if_model_fed,if_model_sdp implicit none @@ -86,11 +86,12 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,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,dbz,fed + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig):: smoke,dust,coarsepm 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,gg_fed real(r_kind),dimension(:,:),allocatable :: gg_ps - + real(r_kind),dimension(:,:,:),allocatable :: gg_smoke, gg_dust, gg_coarsepm real(r_single),pointer,dimension(:,:,:):: w3 =>NULL() real(r_single),pointer,dimension(:,:):: w2 =>NULL() real(r_kind),pointer,dimension(:,:,:):: x3 =>NULL() @@ -325,30 +326,55 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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 .and. .not.if_model_fed ) 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 + + if ( if_model_dbz .or. if_model_fed ) then 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)) - if ( if_model_dbz .and. if_model_fed) then - allocate(gg_dbz(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) - allocate(gg_fed(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,g_fed=gg_fed) - elseif ( if_model_dbz ) then - allocate(gg_dbz(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, & + end if + if ( if_model_dbz) then + allocate(gg_dbz(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + end if + if ( if_model_fed) then + allocate(gg_fed(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + end if + if ( if_model_sdp) then + allocate(gg_smoke(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_dust(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + allocate(gg_coarsepm(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig)) + end if + print*,"call_this_dbz_fed_sdp ",if_model_dbz,if_model_fed,if_model_sdp + if ( if_model_dbz .and. if_model_fed .and. if_model_sdp) 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,& + 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,g_fed=gg_fed, & + g_smoke=gg_smoke,g_dust=gg_dust,g_coarsepm=gg_coarsepm) + else if ( if_model_dbz .and. if_model_fed )then + print*,"call_this_dbz_fed ",if_model_dbz,if_model_fed,if_model_sdp + 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,g_fed=gg_fed) + elseif ( if_model_dbz .and. if_model_sdp) 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,& + 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,g_smoke=gg_smoke,g_dust=gg_dust,g_coarsepm=gg_coarsepm) + elseif ( if_model_fed .and. if_model_sdp) 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,& + 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_fed=gg_fed,g_smoke=gg_smoke,g_dust=gg_dust,g_coarsepm=gg_coarsepm) + elseif ( 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, & 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) - elseif ( if_model_fed ) then - allocate(gg_fed(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, & + elseif ( if_model_fed ) 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, & 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_fed=gg_fed) - end if + elseif ( if_model_sdp) 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,& + g_smoke=gg_smoke,g_dust=gg_dust,g_coarsepm=gg_coarsepm) + else + print*,"Run without if_model_dbz,fed,sdp.",if_model_dbz,if_model_fed,if_model_sdp + call this%general_read_fv3_regional_parallel_over_ens(iope,fv3_filename,gg_ps,gg_u,gg_v,gg_tv,gg_rh,gg_oz) end if end if end do @@ -405,31 +431,21 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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. if_model_fed) then !not FED_DA - 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 - else !fed_da + if (if_model_fed .or. if_model_sdp )then + write(6,*)"This is not implemented for FED, SMOKE Ensemble" + write(6,*)"Please turn on parallelization_over_ensmembers when if_model_fed or if_model_sdp is .true. STOP(333)!" + call stop2(333) + end if + + 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 .and. if_model_fed)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,g_fed=fed) 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) - else if( if_model_fed )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_fed=fed) end if end if end if @@ -438,13 +454,42 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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 .and. if_model_fed)then + if( if_model_dbz .and. if_model_fed .and. if_model_sdp)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,g_fed=fed,& + g_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm,& + 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_fed=gg_fed, & + gg_smoke=gg_smoke,gg_dust=gg_dust,gg_coarsepm=gg_coarsepm,& + gg_qr=gg_qr,gg_qs=gg_qs,gg_qi=gg_qi,gg_qg=gg_qg,gg_ql=gg_cwmr) + elseif( if_model_dbz .and. if_model_fed)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,g_fed=fed,& 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_fed=gg_fed,gg_qr=gg_qr,& gg_qs=gg_qs,gg_qi=gg_qi,gg_qg=gg_qg,gg_ql=gg_cwmr) + elseif( if_model_dbz .and. if_model_sdp)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, & + g_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm,& + 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_smoke=gg_smoke,gg_dust=gg_dust,gg_coarsepm=gg_coarsepm, & + gg_qr=gg_qr,& + gg_qs=gg_qs,gg_qi=gg_qi,gg_qg=gg_qg,gg_ql=gg_cwmr) + elseif( if_model_fed .and. if_model_sdp)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_fed=fed,& + g_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm,& + 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_fed=gg_fed, & + gg_smoke=gg_smoke,gg_dust=gg_dust,gg_coarsepm=gg_coarsepm,& + gg_qr=gg_qr,& + gg_qs=gg_qs,gg_qi=gg_qi,gg_qg=gg_qg,gg_ql=gg_cwmr) elseif( 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,& @@ -459,16 +504,37 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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_fed=gg_fed,gg_qr=gg_qr,& gg_qs=gg_qs,gg_qi=gg_qi,gg_qg=gg_qg,gg_ql=gg_cwmr) + elseif( if_model_sdp )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_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm,& + gg_ps=gg_ps,gg_tv=gg_tv,gg_u=gg_u,gg_v=gg_v,gg_rh=gg_rh, & + gg_smoke=gg_smoke,gg_dust=gg_dust,gg_coarsepm=gg_coarsepm) 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 .and. if_model_fed)then + if( if_model_dbz .and. if_model_fed .and. if_model_sdp)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,g_fed=fed,& + g_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm) + elseif( if_model_dbz .and. if_model_fed)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,g_fed=fed) + elseif ( if_model_dbz .and. if_model_sdp ) 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,& + g_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm) + elseif ( if_model_fed .and. if_model_sdp ) 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_fed=fed,& + g_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm) elseif( 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,& @@ -477,6 +543,10 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) 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_fed=fed) + elseif ( if_model_sdp ) 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_smoke=smoke,g_dust=dust,g_coarsepm=coarsepm) 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) @@ -487,8 +557,9 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) end if ! SAVE ENSEMBLE MEMBER DATA IN COLUMN VECTOR + print*,"0_TEST_SAVE_ENS: ",nc3d,cvars3d do ic3=1,nc3d - + print*,"TEST_SAVE_ENS: ",ic3,trim(cvars3d(ic3)) 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 @@ -661,6 +732,34 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) end do end do end do + case('smoke','SMOKE') + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = smoke(j,i,k) + x3(j,i,k)=x3(j,i,k)+smoke(j,i,k) + end do + end do + end do + + case('dust','DUST') + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = dust(j,i,k) + x3(j,i,k)=x3(j,i,k)+dust(j,i,k) + end do + end do + end do + case('coarsepm','COARSEPM') + do k=1,grd_ens%nsig + do i=1,grd_ens%lon2 + do j=1,grd_ens%lat2 + w3(j,i,k) = coarsepm(j,i,k) + x3(j,i,k)=x3(j,i,k)+coarsepm(j,i,k) + end do + end do + end do end select @@ -744,7 +843,7 @@ subroutine get_fv3_regional_ensperts_run(this,en_perts,nelen,ps_bar) enddo ! it 4d loop ! CALCULATE ENSEMBLE SPREAD - write_ens_sprd=.true. + write_ens_sprd=.false. if(write_ens_sprd ) then call this%ens_spread_dualres_regional(mype,en_perts,nelen) call mpi_barrier(mpi_comm_world,ierror) ! do we need this mpi_barrier here? @@ -770,7 +869,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_dbz,g_fed) + g_ql,g_qi,g_qr,g_qs,g_qg,g_qnr,g_w,g_dbz,g_fed,g_smoke,g_dust,g_coarsepm) !$$$ subprogram documentation block ! first compied from general_read_arw_regional . . . . ! subprogram: general_read_fv3_regional read fv3sar model ensemble members @@ -821,7 +920,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,if_model_fed + use obsmod, only:if_model_dbz,if_model_fed,if_model_sdp implicit none @@ -830,7 +929,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,g_dbz,g_fed + real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2,grd_ens%nsig),optional,intent(out)::g_ql,g_qi,g_qr,g_dbz,g_fed,g_smoke,g_dust,g_coarsepm 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 @@ -946,7 +1045,11 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g if( if_model_fed )& call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_phyvar_nouv, 'fed' , g_fed, istatus );ier=ier+istatus end if - + if ( if_model_sdp )then + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'smoke' , g_smoke, istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'dust' , g_dust, istatus );ier=ier+istatus + call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_tracer_nouv, 'coarsepm' , g_coarsepm, istatus );ier=ier+istatus + end if if (fv3sar_ensemble_opt == 0) then call GSI_Bundlegetvar ( gsibundle_fv3lam_ens_dynvar_nouv, 'delp' ,g_delp ,istatus );ier=ier+istatus @@ -1053,7 +1156,7 @@ subroutine general_read_fv3_regional(this,fv3_filenameginput,g_ps,g_u,g_v,g_tv,g 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,g_fed) + g_ql,g_qi,g_qr,g_qs,g_qg,g_qnr,g_w,g_dbz,g_fed,g_smoke,g_dust,g_coarsepm) !$$$ subprogram documentation block ! first compied from general_read_arw_regional . . . . ! subprogram: general_read_fv3_regional read fv3sar model ensemble members @@ -1102,7 +1205,7 @@ subroutine general_read_fv3_regional_parallel_over_ens(this,iope,fv3_filenamegin 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,if_model_fed + use obsmod, only: if_model_dbz,if_model_fed,if_model_sdp use gsi_rfv3io_mod, only: gsi_fv3ncdf_read_ens_parallel_over_ens,gsi_fv3ncdf_readuv_ens_parallel_over_ens @@ -1114,7 +1217,7 @@ subroutine general_read_fv3_regional_parallel_over_ens(this,iope,fv3_filenamegin 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,g_fed + real(r_kind),dimension(grd_ens%nlat,grd_ens%nlon,grd_ens%nsig),optional,intent(out)::g_ql,g_qi,g_qr,g_dbz,g_fed,g_smoke,g_dust,g_coarsepm 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 @@ -1165,19 +1268,31 @@ subroutine general_read_fv3_regional_parallel_over_ens(this,iope,fv3_filenamegin endif if(fv3sar_ensemble_opt == 0) then - if (if_model_dbz .or. if_model_fed) then + print*,"0_if_model_dbz_fed_sdp= ",if_model_dbz,if_model_fed,if_model_sdp + if (if_model_dbz .or. if_model_fed .or. if_model_sdp) 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) + print*,"call_2_oz_q_hydros" 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) if(if_model_dbz) then + print*,"call_3_dbz" call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%phyvars,fv3_filenameginput,dbz=g_dbz,iope=iope) end if if(if_model_fed) then + print*,"call_4_fed" call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%phyvars,fv3_filenameginput,fed=g_fed,iope=iope) end if + if(if_model_sdp) then + print*,"call_5_sdp" + call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%tracers,fv3_filenameginput,smoke=g_smoke,dust=g_dust,coarsepm=g_coarsepm,iope=iope) + end if else + print*,"1_if_model_dbz_fed_sdp= ",if_model_dbz,if_model_fed,if_model_sdp + print*,"call_1b_delp_tsen" call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%dynvars,fv3_filenameginput,delp=g_delp,tsen=g_tsen,iope=iope) + print*,"call_2b_q_oz" call gsi_fv3ncdf_read_ens_parallel_over_ens(fv3_filenameginput%tracers,fv3_filenameginput,q=g_q,oz=g_oz,iope=iope) + print*,"call_2b_q_oz_end" end if else write(6,*) "Warning: we can only grab fields from restart files not cold start files for ensemble!" @@ -1237,8 +1352,8 @@ 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,g_fed, & - gg_ps,gg_tv,gg_u,gg_v,gg_rh,gg_w,gg_dbz,gg_fed,gg_qr,& + g_qg,g_dbz,g_fed,g_smoke,g_dust,g_coarsepm, & + gg_ps,gg_tv,gg_u,gg_v,gg_rh,gg_w,gg_dbz,gg_fed,gg_smoke,gg_dust,gg_coarsepm,gg_qr,& gg_qs,gg_qi,gg_qg,gg_ql) !$$$ subprogram documentation block @@ -1278,7 +1393,7 @@ subroutine parallel_read_fv3_step2(this,mype,iope, & 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,g_fed + g_w,g_qr,g_qs,g_qi,g_qg,g_dbz,g_fed,g_smoke,g_dust,g_coarsepm integer(i_kind), intent(in) :: mype, iope real(r_kind),dimension(grd_ens%lat2,grd_ens%lon2),intent(out):: g_ps @@ -1287,7 +1402,7 @@ subroutine parallel_read_fv3_step2(this,mype,iope, & 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_fed,gg_qr,gg_qs,gg_qi,gg_qg,gg_ql + gg_w,gg_dbz,gg_fed,gg_smoke,gg_dust,gg_coarsepm,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 @@ -1348,7 +1463,22 @@ subroutine parallel_read_fv3_step2(this,mype,iope, & g_fed(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) end if end if - enddo + if( present(g_smoke)) then + if (mype==iope) call this%fill_regional_2d(gg_smoke(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_smoke(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + end if + if( present(g_dust)) then + if (mype==iope) call this%fill_regional_2d(gg_dust(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_dust(1,1,k),grd_ens%ijn_s(mype+1),mpi_rtype,iope,mpi_comm_world,ierror) + end if + if( present(g_coarsepm)) then + if (mype==iope) call this%fill_regional_2d(gg_coarsepm(1,1,k),wrk_send_2d) + call mpi_scatterv(wrk_send_2d,grd_ens%ijn_s,grd_ens%displs_s,mpi_rtype,& + g_coarsepm(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 diff --git a/src/gsi/ensctl2model.f90 b/src/gsi/ensctl2model.f90 index 12e1fe374e..4ad5fa56ab 100644 --- a/src/gsi/ensctl2model.f90 +++ b/src/gsi/ensctl2model.f90 @@ -44,6 +44,7 @@ subroutine ensctl2model(xhat,mval,eval) use mod_strong, only: tlnmc_option use timermod, only: timer_ini,timer_fnl use hybrid_ensemble_parameters,only: naensgrp +use wrf_vars_mod, only : sdp_exist implicit none ! Declare passed variables @@ -212,7 +213,28 @@ subroutine ensctl2model(xhat,mval,eval) call gsi_bundlegetvar (wbundle_c, clouds(ic),sv_rank3,istatus) endif enddo - +! add smoke + if (sdp_exist) then + print*,"SMOKE_ensctl2model.f90" + call gsi_bundlegetpointer (eval(jj),'smoke',sv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: smoke ' + else + call gsi_bundlegetvar (wbundle_c, 'smoke',sv_rank3,istatus) + end if + call gsi_bundlegetpointer (eval(jj),'dust',sv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: dust ' + else + call gsi_bundlegetvar (wbundle_c, 'dust',sv_rank3,istatus) + end if + call gsi_bundlegetpointer (eval(jj),'coarsepm',sv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: coarsepm ' + else + call gsi_bundlegetvar (wbundle_c, 'coarsepm',sv_rank3,istatus) + end if + end if ! Add contribution from static B, if necessary call self_add(eval(jj),mval) diff --git a/src/gsi/ensctl2model_ad.f90 b/src/gsi/ensctl2model_ad.f90 index 769ea611fe..688191854c 100644 --- a/src/gsi/ensctl2model_ad.f90 +++ b/src/gsi/ensctl2model_ad.f90 @@ -43,6 +43,7 @@ subroutine ensctl2model_ad(eval,mval,grad) use mod_strong, only: tlnmc_option use timermod, only: timer_ini,timer_fnl use hybrid_ensemble_parameters,only: naensgrp +use wrf_vars_mod, only : sdp_exist implicit none ! Declare passed variables @@ -190,6 +191,29 @@ subroutine ensctl2model_ad(eval,mval,grad) call gsi_bundleputvar (wbundle_c, clouds(ic),rv_rank3,istatus) endif enddo + +! add smoke + if (sdp_exist) then + print*,"SMOKE_ensctl2model_ad.f90" + call gsi_bundlegetpointer (eval(jj), 'smoke',rv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: smoke ' + else + call gsi_bundleputvar (wbundle_c,'smoke',rv_rank3,istatus) + endif + call gsi_bundlegetpointer (eval(jj), 'dust',rv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: dust ' + else + call gsi_bundleputvar (wbundle_c,'dust',rv_rank3,istatus) + endif + call gsi_bundlegetpointer (eval(jj), 'coarsepm',rv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: coarsepm ' + else + call gsi_bundleputvar (wbundle_c,'coarsepm',rv_rank3,istatus) + endif + end if ! Convert RHS calculations for u,v to st/vp if (do_getuv) then if(uv_hyb_ens) then diff --git a/src/gsi/ensctl2state.f90 b/src/gsi/ensctl2state.f90 index 3752f8bdee..7871a5d703 100644 --- a/src/gsi/ensctl2state.f90 +++ b/src/gsi/ensctl2state.f90 @@ -47,6 +47,8 @@ subroutine ensctl2state(xhat,mval,eval) use cwhydromod, only: cw2hydro_tl_hwrf use timermod, only: timer_ini,timer_fnl use gridmod, only: nems_nmmb_regional +use wrf_vars_mod, only : sdp_exist + implicit none ! Declare passed variables @@ -236,6 +238,28 @@ subroutine ensctl2state(xhat,mval,eval) enddo endif +! add smoke + if (sdp_exist) then + print*,"SMOKE_ensctl2state.f90" + call gsi_bundlegetpointer (eval(jj),'smoke',sv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: smoke ' + else + call gsi_bundlegetvar (wbundle_c, 'smoke',sv_rank3,istatus) + end if + call gsi_bundlegetpointer (eval(jj),'dust',sv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: dust ' + else + call gsi_bundlegetvar (wbundle_c, 'dust',sv_rank3,istatus) + end if + call gsi_bundlegetpointer (eval(jj),'coarsepm',sv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: coarsepm ' + else + call gsi_bundlegetvar (wbundle_c, 'coarsepm',sv_rank3,istatus) + end if + end if !$omp section ! Get pointers to required state variables diff --git a/src/gsi/ensctl2state_ad.f90 b/src/gsi/ensctl2state_ad.f90 index d350743998..1ffdb59e45 100644 --- a/src/gsi/ensctl2state_ad.f90 +++ b/src/gsi/ensctl2state_ad.f90 @@ -46,6 +46,8 @@ subroutine ensctl2state_ad(eval,mval,grad) use cwhydromod, only: cw2hydro_ad_hwrf use timermod, only: timer_ini,timer_fnl use gridmod, only: nems_nmmb_regional +use wrf_vars_mod, only : sdp_exist + implicit none ! Declare passed variables @@ -245,6 +247,28 @@ subroutine ensctl2state_ad(eval,mval,grad) enddo endif +! add smoke + if (sdp_exist) then + print*,"SMOKE_ensctl2state_ad.f90" + call gsi_bundlegetpointer (eval(jj), 'smoke',rv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: smoke ' + else + call gsi_bundleputvar (wbundle_c,'smoke',rv_rank3,istatus) + endif + call gsi_bundlegetpointer (eval(jj), 'dust',rv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: dust ' + else + call gsi_bundleputvar (wbundle_c,'dust',rv_rank3,istatus) + endif + call gsi_bundlegetpointer (eval(jj), 'coarsepm',rv_rank3,istatus) + if(istatus/=0) then + write(6,*) trim(myname), ': trouble_get_pointer: coarsepm ' + else + call gsi_bundleputvar (wbundle_c,'coarsepm',rv_rank3,istatus) + endif + end if ! Calculate sensible temperature if(do_q_copy) then call gsi_bundleputvar (wbundle_c, 'q', rv_q, istatus ) diff --git a/src/gsi/gsi_rfv3io_mod.f90 b/src/gsi/gsi_rfv3io_mod.f90 index 71950010e5..dc488ef63e 100644 --- a/src/gsi/gsi_rfv3io_mod.f90 +++ b/src/gsi/gsi_rfv3io_mod.f90 @@ -1014,22 +1014,22 @@ subroutine read_fv3_netcdf_guess(fv3filenamegin) endif end do if (iuv /= 2.or. ndynvario3d<=0.or.ntracerio3d<=0 ) then - write(6,*)"the set up for met variable is not as expected, abort" + write(6,*)"The set up for met variable is not as expected, abort" call stop2(222) endif if ( if_model_dbz .and. if_model_fed ) then if( nphyvario3d<=1 ) then - write(6,*)"the set up for met variable (dbz and fed in phyvar) is not as expected,abort" + write(6,*)"The set up for met variable (dbz and fed in phyvar) is not as expected,abort" call stop2(223) end if elseif ( if_model_dbz ) then if( nphyvario3d<=0 ) then - write(6,*)"the set up for met variable (dbz in phyvar) is not as expected, abort" + write(6,*)"The set up for met variable (dbz in phyvar) is not as expected, abort" call stop2(223) end if elseif ( if_model_fed ) then if( nphyvario3d<=0 ) then - write(6,*)"the set up for met variable (fed in phyvar) is not as expected, abort" + write(6,*)"The set up for met variable (fed in phyvar) is not as expected, abort" call stop2(223) end if endif @@ -2862,7 +2862,7 @@ 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,fed,iope) + delp,tsen,w,q,oz,ql,qr,qs,qi,qg,dbz,fed,smoke,dust,coarsepm,iope) !$$$ subprogram documentation block ! . . . . ! subprogram: gsi_fv3ncdf_read_ens_parallel_over_ens @@ -2897,6 +2897,7 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & use mod_fv3_lola, only: fv3_h_to_ll use gsi_bundlemod, only: gsi_bundle use general_sub2grid_mod, only: sub2grid_info,general_grid2sub + use gsi_io, only: verbose implicit none character(*),intent(in):: filenamein @@ -2904,7 +2905,7 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,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,fed + real(r_kind),dimension(nlat,nlon,nsig),intent(out),optional:: delp,tsen,w,q,oz,ql,qr,qs,qi,qg,dbz,fed,smoke,dust,coarsepm character(len=max_varname_length) :: varname character(len=max_varname_length) :: name character(len=max_filename_length), allocatable,dimension(:) :: varname_files @@ -2921,6 +2922,12 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & integer(i_kind),allocatable :: gfile_loc_layout(:) character(len=180) :: filename_layout + logical print_verbose + + + print_verbose = .false. + if(verbose)print_verbose=.true. + mm1=mype+1 nloncase=nlon nlatcase=nlat @@ -2928,10 +2935,27 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & nycase=ny kbgn=1 kend=nsig - + !if (print_verbose) then + write(6,*)"G1_READ_ENS_Present_delp ",present(delp) + write(6,*)"G1_READ_ENS_Present_tsen ",present(tsen) + write(6,*)"G1_READ_ENS_Present_w ",present(w) + write(6,*)"G2_READ_ENS_Present_q ",present(q) + write(6,*)"G2_READ_ENS_Present_oz ",present(oz) + write(6,*)"G2_READ_ENS_Present_ql ",present(ql) + write(6,*)"G2_READ_ENS_Present_qr ",present(qr) + write(6,*)"G2_READ_ENS_Present_qs ",present(qs) + write(6,*)"G2_READ_ENS_Present_qi ",present(qi) + write(6,*)"G2_READ_ENS_Present_qg ",present(qg) + write(6,*)"G3_READ_ENS_Present_dbz ",present(dbz) + write(6,*)"G4_READ_ENS_Present_fed ",present(fed) + write(6,*)"G5_READ_ENS_Present_smoke",present(smoke) + write(6,*)"G5_READ_ENS_Present_dust ",present(dust) + write(6,*)"G5_READ_ENS_Present_copm ",present(coarsepm) + !end if if( mype == iope )then allocate(uu2d(nxcase,nycase)) if( present(delp).or.present(tsen).or.present(w) )then ! dynvars + print*,"READ_ENS_Size_T_p_W ", present(delp),present(tsen),present(w) if( present(w) )then allocate(varname_files(3)) varname_files = (/'T ','delp','W '/) @@ -2939,8 +2963,10 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & allocate(varname_files(2)) varname_files = (/'T ','delp'/) end if + print*,"READ_ENS_Size_T_p_W ",size(varname_files),varname_files end if if( present(q).or.present(ql).or.present(qr) )then ! tracers + print*,"READ_ENS_Size_q_o3_hydro ", present(q),present(ql),present(qr) if(present(qr))then allocate(varname_files(7)) varname_files = (/'sphum ','o3mr ','liq_wat','ice_wat','rainwat','snowwat','graupel'/) @@ -2948,16 +2974,26 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & allocate(varname_files(2)) varname_files = (/'sphum',' o3mr'/) end if + print*,"READ_ENS_Size_q_o3_hydro ",size(varname_files),varname_files end if + print*,"READ_ENS_Size_dbz ", present(dbz) if( present(dbz) )then ! phyvars: dbz allocate(varname_files(1)) varname_files = (/'ref_f3d'/) + print*,"READ_ENS_Size_dbz ",size(varname_files),varname_files end if + print*,"READ_ENS_Size_fed ", present(fed) if( present(fed) )then ! phyvars: fed allocate(varname_files(1)) varname_files = (/'flash_extent_density'/) + print*,"READ_ENS_Size_fed ",size(varname_files),varname_files + end if + print*,"READ_ENS_Size_sdp ", present(smoke),present(dust),present(coarsepm) + if( present(smoke).or.present(dust).or.present(coarsepm) )then ! tracers + allocate(varname_files(3)) + varname_files = (/'smoke','dust','coarsepm'/) + print*,"READ_ENS_Size_sdp ",size(varname_files),varname_files end if - if(fv3_io_layout_y > 1) then allocate(gfile_loc_layout(0:fv3_io_layout_y-1)) @@ -2978,7 +3014,14 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & call stop2(333) endif endif + print*,"READ_ENS_size_varname_files ",size(varname_files),varname_files + if (size(varname_files) == 0) then + !if (print_verbose) + write(6,*)"Please check your subroutine call, No variale is setup to read !!!! " + return + end if do ivar = 1, size(varname_files) + print*,"READ_ENS: ivar= ",ivar,trim(varname_files(ivar)) do ilevtot=kbgn,kend ilev=ilevtot nz=nsig @@ -3069,7 +3112,15 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & if( present(fed) )then ! phyvars: fed fed = hwork end if - + if( present(smoke) )then + smoke = hwork + end if + if( present(dust) )then + dust = hwork + end if + if( present(coarsepm) )then + coarsepm = hwork + end if end do if(fv3_io_layout_y > 1) then @@ -3080,7 +3131,14 @@ subroutine gsi_fv3ncdf_read_ens_parallel_over_ens(filenamein,fv3filenamegin, & else iret=nf90_close(gfile_loc) endif - + !if(ALLOCATED(uu2d))then + ! deallocate (uu2d) + ! print*,"ASSOCIATED_uu2d" + !end if + !if(ALLOCATED(varname_files))then + ! deallocate(varname_files) + ! print*,"ASSOCIATED_varname_files" + !end if deallocate (uu2d,varname_files) end if @@ -5152,6 +5210,7 @@ subroutine gsi_copy_bundle(bundi,bundo) call gsi_bundleinquire(bundo,'shortnames::3d',target_name_vars3d,istatus) call gsi_bundleinquire(bundo,'shortnames::2d',target_name_vars2d,istatus) do ivar=1,src_nc3d + print*,"COPY_BUND_ivar= ",ivar,trim(src_name_vars3d(ivar)) varname=trim(src_name_vars3d(ivar)) do jvar=1,target_nc3d if(index(target_name_vars3d(jvar),varname) > 0) then diff --git a/src/gsi/gsimod.F90 b/src/gsi/gsimod.F90 index 22ad0eb1b6..d8c9f49b43 100644 --- a/src/gsi/gsimod.F90 +++ b/src/gsi/gsimod.F90 @@ -25,11 +25,11 @@ module gsimod use obsmod, only: doradaroneob,dofedoneob,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_model_fed,innov_use_model_fed,if_vrobs_raw,if_use_w_vr,& + 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 - + use obsmod, only: if_model_fed,innov_use_model_fed,if_model_sdp use obsmod, only: lwrite_predterms, & lwrite_peakwt,use_limit,lrun_subdirs,l_foreaft_thin,lobsdiag_forenkf,& obsmod_init_instr_table,obsmod_final_instr_table @@ -775,7 +775,7 @@ module gsimod 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,if_use_w_vr,& - if_model_dbz,if_model_fed,innov_use_model_fed,imp_physics,lupp,netcdf_diag,binary_diag,l_wcp_cwm,aircraft_recon,diag_version,& + if_model_dbz,if_model_fed,innov_use_model_fed,if_model_sdp,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,& l_reg_update_hydro_delz, l_obsprvdiag,& diff --git a/src/gsi/obsmod.F90 b/src/gsi/obsmod.F90 index 6995da3472..ae0f7350d3 100644 --- a/src/gsi/obsmod.F90 +++ b/src/gsi/obsmod.F90 @@ -474,7 +474,7 @@ module obsmod public :: ntilt_radarfiles public :: whichradar public :: vr_dealisingopt, if_vterminal, if_model_dbz,if_model_fed, innov_use_model_fed, inflate_obserr, if_vrobs_raw, if_use_w_vr, l2rwthin - + public :: if_model_sdp public :: doradaroneob,oneoblat,oneoblon public :: oneobddiff,oneobvalue,oneobheight,oneobradid public :: ens_hx_dbz_cut,static_gsi_nopcp_dbz,rmesh_dbz,zmesh_dbz,rmesh_vr,zmesh_vr @@ -624,6 +624,7 @@ module obsmod logical :: ta2tb logical :: doradaroneob,dofedoneob logical :: vr_dealisingopt, if_vterminal, if_model_dbz,if_model_fed, innov_use_model_fed,inflate_obserr, if_vrobs_raw, if_use_w_vr, l2rwthin + logical :: if_model_sdp character(4) :: whichradar,oneobradid real(r_kind) :: oneoblat,oneoblon,oneobddiff,oneobvalue,oneobheight logical :: radar_no_thinning @@ -758,6 +759,7 @@ subroutine init_obsmod_dflts if_model_dbz=.false. if_model_fed=.false. innov_use_model_fed=.false. + if_model_sdp=.false. inflate_obserr=.false. whichradar="KKKK" diff --git a/src/gsi/wrf_vars_mod.f90 b/src/gsi/wrf_vars_mod.f90 index 70a14cf7be..479f9c598f 100644 --- a/src/gsi/wrf_vars_mod.f90 +++ b/src/gsi/wrf_vars_mod.f90 @@ -47,8 +47,12 @@ module wrf_vars_mod public :: w_exist public :: dbz_exist public :: fed_exist +public :: sdp_exist +public :: smoke_exist +public :: dust_exist +public :: coarsepm_exist -logical,save :: w_exist, dbz_exist, fed_exist +logical,save :: w_exist, dbz_exist,fed_exist,sdp_exist,smoke_exist,dust_exist,coarsepm_exist contains subroutine init_wrf_vars @@ -57,13 +61,20 @@ subroutine init_wrf_vars w_exist=.false. dbz_exist=.false. fed_exist=.false. +smoke_exist=.false. +dust_exist=.false. +coarsepm_exist=.false. +sdp_exist=.false. do ii=1,nc3d - if(mype == 0 ) write(6,*)"anacv cvars3d is ",cvars3d(ii) + if(mype == 0 ) write(6,*)"anacv_cvars3d_is ",cvars3d(ii) if(trim(cvars3d(ii)) == 'w'.or.trim(cvars3d(ii))=='W') w_exist=.true. if(trim(cvars3d(ii))=='dbz'.or.trim(cvars3d(ii))=='DBZ') dbz_exist=.true. if(trim(cvars3d(ii))=='fed'.or.trim(cvars3d(ii))=='FED') fed_exist=.true. + if(trim(cvars3d(ii))=='smoke'.or.trim(cvars3d(ii))=='SMOKE') smoke_exist=.true. + if(trim(cvars3d(ii))=='dust'.or.trim(cvars3d(ii))=='DUST') dust_exist=.true. + if(trim(cvars3d(ii))=='coarsepm'.or.trim(cvars3d(ii))=='COARSEPM')coarsepm_exist=.true. enddo - + if(smoke_exist .and. dust_exist .and. coarsepm_exist) sdp_exist=.true. end subroutine init_wrf_vars end module wrf_vars_mod