diff --git a/GEOSaana_GridComp/GSI_GridComp/GSI_GridCompMod.F90 b/GEOSaana_GridComp/GSI_GridComp/GSI_GridCompMod.F90 index 4a3eaf8..5e6e7f5 100644 --- a/GEOSaana_GridComp/GSI_GridComp/GSI_GridCompMod.F90 +++ b/GEOSaana_GridComp/GSI_GridComp/GSI_GridCompMod.F90 @@ -1285,6 +1285,7 @@ subroutine Run ( gc, import, export, clock, rc ) real(r_single),dimension(:,:,:), pointer :: dqlmr ! cloud liquid mixing ratio real(r_single),dimension(:,:,:), pointer :: dqrmr ! rain mixing ratio real(r_single),dimension(:,:,:), pointer :: dqsmr ! snow mixing ratio + real(r_single),dimension(:,:,:), pointer :: dclfr ! cloud fraction real(r_single),dimension(:,: ), pointer :: dfrland ! land fraction real(r_single),dimension(:,: ), pointer :: dfrlandice ! land-ice fraction real(r_single),dimension(:,: ), pointer :: dfrlake ! lake fraction @@ -1764,6 +1765,9 @@ subroutine GSI_GridCompGetPointers_() case ('qstot') call ESMFL_StateGetPointerToData(export, dqsmr, trim(cvar), alloc=.true., rc=STATUS) VERIFY_(STATUS) + case ('cloud') + call ESMFL_StateGetPointerToData(export, dclfr, trim(cvar), alloc=.true., rc=STATUS) + VERIFY_(STATUS) case ('ozone') call ESMFL_StateGetPointerToData(export, doz, trim(cvar), alloc=.true., rc=STATUS) VERIFY_(STATUS) @@ -3010,6 +3014,8 @@ subroutine GSI_GridCompCopyInternal2Export_(lit) CALL GSI_GridCompSwapJI_(dqrmr,GSI_MetGuess_Bundle(it)%r3(ipnt)%q) case ('qs') CALL GSI_GridCompSwapJI_(dqsmr,GSI_MetGuess_Bundle(it)%r3(ipnt)%q) + case ('cf') + CALL GSI_GridCompSwapJI_(dclfr,GSI_MetGuess_Bundle(it)%r3(ipnt)%q) end select endif enddo @@ -4062,21 +4068,24 @@ subroutine GSI_GridCompSetupSpecs (GC, opthw, rc) ! Declare export 3d-fields (extra met-guess) ! ------------------------ - integer, parameter :: nex3dx=4 + integer, parameter :: nex3dx=5 character(len=16), parameter :: exsname3dx(nex3dx) = (/ & 'qitot ', & 'qltot ', & 'qrtot ', & - 'qstot ' /) + 'qstot ', & + 'cloud ' /) character(len=40), parameter :: exlname3dx(nex3dx) = (/ & 'mass fraction of cloud ice water inc ', & 'mass fraction of cloud liquid water inc ', & 'mass fraction of rain inc ', & - 'mass fraction of snow inc ' /) + 'mass fraction of snow inc ', & + 'mass fraction of cloud inc ' /) character(len=16), parameter :: exunits3dx(nex3dx) = (/ & '1 ', & '1 ', & '1 ', & + '1 ', & '1 ' /) ! Declare export 2d-fields for trace gases - this needs diff --git a/GEOSaana_GridComp/GSI_GridComp/crtm_interface.f90 b/GEOSaana_GridComp/GSI_GridComp/crtm_interface.f90 index 1c79541..65c9b93 100644 --- a/GEOSaana_GridComp/GSI_GridComp/crtm_interface.f90 +++ b/GEOSaana_GridComp/GSI_GridComp/crtm_interface.f90 @@ -1014,6 +1014,7 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & ! 2015-09-10 zhu - generalize enabling all-sky and aerosol usage in radiance assimilation, ! use n_clouds_fwd_wk,n_aerosols_fwd_wk,cld_sea_only_wk, cld_sea_only_wk,cw_cv,etc ! 2019-03-22 Wei/Martin - added VIIRS AOD obs in addition to MODIS AOD obs +! 2025-07-10 zhu/wei/jinajun - adapt all-sky atms, cloud fraction, cloud overlap into GEOS ! ! input argument list: ! obstype - type of observations for which to get profile @@ -1079,6 +1080,11 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & use obsmod, only: iadate use aeroinfo, only: nsigaerojac use chemmod, only: lread_ext_aerosol !for separate aerosol input file + use crtm_cloudcover_define, only: cloudcover_maximum_overlap, & + cloudcover_random_overlap, & + cloudcover_maxran_overlap, & + cloudcover_average_overlap, & !default + cloudcover_overcast_overlap implicit none @@ -2001,22 +2007,38 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & ! Include cloud guess profiles in mw radiance computation if (n_clouds_fwd_wk>0) then + atmosphere(1)%cloud_fraction(k) = zero + do ii=1,n_clouds_fwd_wk + atmosphere(1)%cloud(ii)%water_content(:) = zero + end do + kgkg_kgm2=(atmosphere(1)%level_pressure(k)-atmosphere(1)%level_pressure(k-1))*r100/grav - if (cw_cv.or.ql_cv) then - if (icmask) then - c6(k) = kgkg_kgm2 - auxdp(k)=abs(prsi_rtm(kk+1)-prsi_rtm(kk))*r10 - auxq (k)=q(kk2) + + if (icmask) then + +! In CRTM, if cloud fraction of the layer < 1.0E-12, set cloud content and +! effective radius of all hydrometer types in that layer to zero +! CRTM minimum thresholds: cloud content=1.0E-6 and cloud fraction=1.E-12 +! print*, 'crtm_interface: icfs=',icfs + if (icfs==0 .and. trim(obstype)=='atms') then + atmosphere(1)%cloud_fraction(k) = cf(kk2) + end if + + c6(k) = kgkg_kgm2 + auxdp(k)=abs(prsi_rtm(kk+1)-prsi_rtm(kk))*r10 + auxq (k)=q(kk2) + + do ii=1,n_clouds_fwd_wk + cloud_cont(k,ii)=cloud(kk2,ii)*c6(k) + cloud_efr (k,ii)=zero + end do + + if ((cw_cv.or.ql_cv).and.(.not. lprecip_wk)) then if (regional .and. (.not. wrf_mass_regional) .and. (.not. cold_start)) then do ii=1,n_clouds_fwd_wk - cloud_cont(k,ii)=cloud(kk2,ii)*c6(k) cloud_efr (k,ii)=cloudefr(kk2,ii) end do - else - do ii=1,n_clouds_fwd_wk - cloud_cont(k,ii)=cloud(kk2,ii)*c6(k) - end do end if ! total column q, tpw @@ -2027,63 +2049,70 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & if(n_clouds_fwd_wk > 3) snow_guess = snow_guess + cloud_cont(k,4) do ii=1,n_clouds_fwd_wk if ( trim(obstype) == 'amsr2' .and. atmosphere(1)%level_pressure(k) <= 50.0_r_kind ) cycle - hwp_guess(ii) = hwp_guess(ii) + cloud_cont(k,ii) + hwp_guess(ii) = hwp_guess(ii) + cloud_cont(k,ii) enddo - atmosphere(1)%cloud_fraction(k) = zero + do ii=1,n_clouds_fwd_wk if (ii==1 .and. atmosphere(1)%temperature(k)-t0c>-20.0_r_kind) & cloud_cont(k,1)=max(1.001_r_kind*1.0E-6_r_kind, cloud_cont(k,1)) if (ii==2 .and. atmosphere(1)%temperature(k) 1.000_r_kind*1.0E-6_r_kind) then - atmosphere(1)%cloud_fraction(k) = one - end if end do -!crtm2.3.x if (.not. regional .and. icfs==0 ) atmosphere(1)%cloud_fraction(k) = cf(kk2) - endif - else - if (icmask) then - c6(k) = kgkg_kgm2 - do ii=1,n_clouds_fwd_wk - !cloud_cont(k,ii)=cloud(kk2,ii)*kgkg_kgm2 - cloud_cont(k,ii)=cloud(kk2,ii)*c6(k) - if (imp_physics==11 .and. lprecip_wk .and. cloud_cont(k,ii) > 1.0e-6_r_kind) then + else ! .not. (cw_cv.or.ql_cv) + if (imp_physics==11 .and. lprecip_wk .and. cloud_cont(k,ii) > 1.0e-6_r_kind) then + do ii=1,n_clouds_fwd_wk cloud_efr (k,ii)=cloudefr(kk2,ii) - else - cloud_efr (k,ii)=zero - endif - enddo + enddo + endif - if (cloud_cont(k,1) >= 1.0e-6_r_kind) clw_guess = clw_guess + cloud_cont(k,1) + ! total column q, tpw + if(present(tpwc_guess)) tpwc_guess = tpwc_guess + q(kk2)*c6(k) + clw_guess = clw_guess + cloud_cont(k,1) + ciw_guess = ciw_guess + cloud_cont(k,2) + if(n_clouds_fwd_wk > 2) rain_guess = rain_guess + cloud_cont(k,3) + if(n_clouds_fwd_wk > 3) snow_guess = snow_guess + cloud_cont(k,4) if(present(tcwv)) & tcwv = tcwv + (atmosphere(1)%absorber(k,1)*0.001_r_kind)*c6(k) do ii=1,n_clouds_fwd_wk - if (cloud_cont(k,ii) >= 1.0e-6_r_kind) hwp_guess(ii) = hwp_guess(ii) + cloud_cont(k,ii) + hwp_guess(ii) = hwp_guess(ii) + cloud_cont(k,ii) enddo !Add lower bound to all hydrometers !note: may want to add lower bound value for effective radius - atmosphere(1)%cloud_fraction(k) = zero do ii=1,n_clouds_fwd_wk - if (trim(cloud_names_fwd(ii))=='ql' .and. atmosphere(1)%temperature(k)-t0c>-20.0_r_kind) & + if (trim(cloud_names_fwd(ii))=='ql' .and. atmosphere(1)%temperature(k)-t0c>-20.0_r_kind) then cloud_cont(k,ii)=max(1.001_r_kind*1.0E-6_r_kind, cloud_cont(k,ii)) - if (trim(cloud_names_fwd(ii))=='qi' .and. atmosphere(1)%temperature(k)-20.0_r_kind) & + end if + if (trim(cloud_names_fwd(ii))=='qr' .and. atmosphere(1)%temperature(k)-t0c>-20.0_r_kind) then cloud_cont(k,ii)=max(1.001_r_kind*1.0E-6_r_kind, cloud_cont(k,ii)) - if (trim(cloud_names_fwd(ii))=='qs' .and. atmosphere(1)%temperature(k) 1.000_r_kind*1.0E-6_r_kind) then - atmosphere(1)%cloud_fraction(k) = one end if end do -!crtm2.3.x if (.not. regional .and. icfs==0 ) atmosphere(1)%cloud_fraction(k) = cf(kk2) - end if - endif - endif + endif + + do ii=1,n_clouds_fwd_wk + if (icfs==0 .and. trim(obstype)=='atms') then + if (cloud_cont(k,ii) > 1.000_r_kind*1.0E-6_r_kind .and. & + atmosphere(1)%cloud_fraction(k)<1.001_r_kind*1.0E-12_r_kind) then + atmosphere(1)%cloud_fraction(k)=1.001_r_kind*1.0E-12_r_kind + endif + else + if (cloud_cont(k,ii) > 1.000_r_kind*1.0E-6_r_kind) then + atmosphere(1)%cloud_fraction(k) = one + end if + end if + end do + endif !icmask + endif !if (n_clouds_fwd_wk>0) ! Add in a drop-off to absorber amount in the stratosphere to be in more ! agreement with ECMWF profiles. The drop-off is removed when climatological CO2 fields @@ -2113,6 +2142,7 @@ subroutine call_crtm(obstype,obstime,data_s,nchanl,nreal,ich, & ! Set clouds for CRTM if(n_clouds_fwd_wk>0) then + if (icfs==0 .and. trim(obstype)=='atms') options(1)%Overlap_Id = cloudcover_average_overlap() atmosphere(1)%n_clouds = n_clouds_fwd_wk call Set_CRTM_Cloud (msig,n_actual_clouds_wk,cloud_names,icmask,n_clouds_fwd_wk,cloud_cont,cloud_efr,jcloud,auxdp, & atmosphere(1)%temperature,atmosphere(1)%pressure,auxq,atmosphere(1)%cloud,lprecip_wk) diff --git a/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_cloudy_radiance_info.txt b/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_cloudy_radiance_info.txt index fe8cc88..127980e 100644 --- a/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_cloudy_radiance_info.txt +++ b/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_cloudy_radiance_info.txt @@ -3,6 +3,7 @@ radiance_mod_instr_input:: gmi sea ex_obserr3 .true. .false. mhs global ex_obserr3 .true. .false. amsr2 sea ex_obserr1 .true. .false. + atms sea ex_obserr1 .true. .true. :: obs_gmi:: @@ -106,3 +107,24 @@ obs_ssmi:: 6 0.050 0.10 0.00 7 0.050 0.10 0.00 :: + +obs_atms:: +! Parameters for the observation error model +! cclr [kg/m2] & ccld [kg/m2]: range of cloud amounts +! over which the main increase in error take place +! ch cclr ccld + 1 0.030 0.35 + 2 0.030 0.35 + 3 0.030 0.40 + 4 0.030 0.45 + 5 0.030 0.50 + 6 0.100 1.00 + 7 0.150 1.00 + 16 0.020 0.35 + 17 0.030 0.40 + 18 0.030 0.50 + 19 0.030 0.50 + 20 0.030 0.50 + 21 0.030 0.50 + 22 0.030 0.50 +:: diff --git a/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_satinfo.txt b/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_satinfo.txt index 9e366b9..1e58347 100644 --- a/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_satinfo.txt +++ b/GEOSaana_GridComp/GSI_GridComp/etc/gmao_global_satinfo.txt @@ -1772,50 +1772,72 @@ seviri_m10 9 -1 1.250 0.000 2.000 10.000 0.000 1 -1 -1 seviri_m10 10 -1 1.450 0.000 2.000 10.000 0.000 1 -1 -1 seviri_m10 11 -1 1.250 0.000 3.000 10.000 0.000 1 -1 -1 - atms_npp 1 1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_npp 2 1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_npp 3 1 5.000 0.000 3.000 10.000 0.000 1 -1 -1 - atms_npp 4 1 3.000 0.000 3.000 10.000 0.000 1 -1 -1 - atms_npp 5 1 0.550 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 6 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 7 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 8 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 9 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 10 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 11 1 0.350 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 12 1 0.400 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 13 1 0.550 0.000 1.000 10.000 0.000 1 -1 -1 - atms_npp 14 1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 - atms_npp 15 -1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_npp 16 1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_npp 17 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_npp 18 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_npp 19 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_npp 20 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_npp 21 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_npp 22 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 1 1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_n20 2 1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_n20 3 1 5.000 0.000 3.000 10.000 0.000 1 -1 -1 - atms_n20 4 1 3.000 0.000 3.000 10.000 0.000 1 -1 -1 - atms_n20 5 1 0.550 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 6 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 7 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 8 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 9 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 10 1 0.300 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 11 1 0.350 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 12 1 0.400 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 13 1 0.550 0.000 1.000 10.000 0.000 1 -1 -1 - atms_n20 14 1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 15 -1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_n20 16 1 5.000 0.000 4.500 10.000 0.000 1 -1 -1 - atms_n20 17 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 18 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 19 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 20 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 21 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 - atms_n20 22 1 2.500 0.000 2.000 10.000 0.000 1 -1 -1 + atms_npp 1 1 5.000 20.000 22.000 10.000 0.000 1 1 -1 + atms_npp 2 1 5.000 27.000 23.000 10.000 0.000 1 1 -1 + atms_npp 3 1 5.000 15.000 16.000 10.000 0.000 1 1 -1 + atms_npp 4 1 3.000 8.000 8.500 10.000 0.000 1 1 -1 + atms_npp 5 1 0.550 3.500 4.000 10.000 0.000 1 1 -1 + atms_npp 6 1 0.300 3.000 4.000 10.000 0.000 1 1 -1 + atms_npp 7 1 0.300 0.500 1.000 10.000 0.000 1 1 -1 + atms_npp 8 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_npp 9 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_npp 10 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_npp 11 1 0.350 0.350 1.000 10.000 0.000 1 1 -1 + atms_npp 12 1 0.400 0.400 1.000 10.000 0.000 1 1 -1 + atms_npp 13 1 0.550 0.550 1.000 10.000 0.000 1 1 -1 + atms_npp 14 1 0.800 0.800 2.000 10.000 0.000 1 1 -1 + atms_npp 15 -1 5.000 5.000 4.500 10.000 0.000 1 1 -1 + atms_npp 16 1 5.000 17.000 17.000 10.000 0.000 1 1 -1 + atms_npp 17 1 2.500 20.000 22.000 10.000 0.000 1 1 -1 + atms_npp 18 1 2.500 17.000 18.000 10.000 0.000 1 1 -1 + atms_npp 19 1 2.500 12.000 12.000 10.000 0.000 1 1 -1 + atms_npp 20 1 2.500 9.000 9.000 10.000 0.000 1 1 -1 + atms_npp 21 1 2.500 6.000 6.500 10.000 0.000 1 1 -1 + atms_npp 22 1 2.500 5.000 6.000 10.000 0.000 1 1 -1 + atms_n20 1 1 5.000 20.000 22.000 10.000 0.000 1 1 -1 + atms_n20 2 1 5.000 27.000 23.000 10.000 0.000 1 1 -1 + atms_n20 3 1 5.000 15.000 16.000 10.000 0.000 1 1 -1 + atms_n20 4 1 3.000 8.000 8.500 10.000 0.000 1 1 -1 + atms_n20 5 1 0.550 3.500 4.000 10.000 0.000 1 1 -1 + atms_n20 6 1 0.300 3.000 4.000 10.000 0.000 1 1 -1 + atms_n20 7 1 0.300 0.500 1.000 10.000 0.000 1 1 -1 + atms_n20 8 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_n20 9 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_n20 10 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_n20 11 1 0.350 0.350 1.000 10.000 0.000 1 1 -1 + atms_n20 12 1 0.400 0.400 1.000 10.000 0.000 1 1 -1 + atms_n20 13 1 0.550 0.550 1.000 10.000 0.000 1 1 -1 + atms_n20 14 1 0.800 0.800 2.000 10.000 0.000 1 1 -1 + atms_n20 15 -1 5.000 5.000 4.500 10.000 0.000 1 1 -1 + atms_n20 16 1 5.000 17.000 17.000 10.000 0.000 1 1 -1 + atms_n20 17 1 2.500 20.000 22.000 10.000 0.000 1 1 -1 + atms_n20 18 1 2.500 17.000 18.000 10.000 0.000 1 1 -1 + atms_n20 19 1 2.500 12.000 12.000 10.000 0.000 1 1 -1 + atms_n20 20 1 2.500 9.000 9.000 10.000 0.000 1 1 -1 + atms_n20 21 1 2.500 6.000 6.500 10.000 0.000 1 1 -1 + atms_n20 22 1 2.500 5.000 6.000 10.000 0.000 1 1 -1 + atms_n21 1 1 5.000 20.000 22.000 10.000 0.000 1 1 -1 + atms_n21 2 1 5.000 27.000 23.000 10.000 0.000 1 1 -1 + atms_n21 3 1 5.000 15.000 16.000 10.000 0.000 1 1 -1 + atms_n21 4 1 3.000 8.000 8.500 10.000 0.000 1 1 -1 + atms_n21 5 1 0.550 3.500 4.000 10.000 0.000 1 1 -1 + atms_n21 6 1 0.300 3.000 4.000 10.000 0.000 1 1 -1 + atms_n21 7 1 0.300 0.500 1.000 10.000 0.000 1 1 -1 + atms_n21 8 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_n21 9 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_n21 10 1 0.300 0.300 1.000 10.000 0.000 1 1 -1 + atms_n21 11 1 0.350 0.350 1.000 10.000 0.000 1 1 -1 + atms_n21 12 1 0.400 0.400 1.000 10.000 0.000 1 1 -1 + atms_n21 13 1 0.550 0.550 1.000 10.000 0.000 1 1 -1 + atms_n21 14 1 0.800 0.800 2.000 10.000 0.000 1 1 -1 + atms_n21 15 -1 5.000 5.000 4.500 10.000 0.000 1 1 -1 + atms_n21 16 1 5.000 17.000 17.000 10.000 0.000 1 1 -1 + atms_n21 17 1 2.500 20.000 22.000 10.000 0.000 1 1 -1 + atms_n21 18 1 2.500 17.000 18.000 10.000 0.000 1 1 -1 + atms_n21 19 1 2.500 12.000 12.000 10.000 0.000 1 1 -1 + atms_n21 20 1 2.500 9.000 9.000 10.000 0.000 1 1 -1 + atms_n21 21 1 2.500 6.000 6.500 10.000 0.000 1 1 -1 + atms_n21 22 1 2.500 5.000 6.000 10.000 0.000 1 1 -1 cris-fsr_npp 19 -2 0.823 0.000 2.000 10.000 0.000 31 -1 -1 cris-fsr_npp 24 -2 0.760 0.000 2.000 10.000 0.000 31 -1 -1 cris-fsr_npp 26 -2 0.736 0.000 2.000 10.000 0.000 31 -1 -1 diff --git a/GEOSaana_GridComp/GSI_GridComp/etc/gsi_atms_beamwidth.txt b/GEOSaana_GridComp/GSI_GridComp/etc/gsi_atms_beamwidth.txt index cb9c129..21a002d 100644 --- a/GEOSaana_GridComp/GSI_GridComp/etc/gsi_atms_beamwidth.txt +++ b/GEOSaana_GridComp/GSI_GridComp/etc/gsi_atms_beamwidth.txt @@ -6,7 +6,7 @@ # Sampling distance (deg) 1.11 # Number of channels to modify -16 +22 # Channel, beam width, new width, cutoff, nxaverage, nyaverage, QC dist # Note: to use FFT technique, set new width and cutoff as required and set # nxaverage and nyaverage to 0. To use simple averaging set new width to 0.0 @@ -28,3 +28,9 @@ 14 2.2 3.33 0.0 0 0 5 15 2.2 3.33 0.0 0 0 5 16 2.2 3.33 0.0 0 0 5 +17 1.1 3.33 0.0 0 0 5 +18 1.1 3.33 0.0 0 0 5 +19 1.1 3.33 0.0 0 0 5 +20 1.1 3.33 0.0 0 0 5 +21 1.1 3.33 0.0 0 0 5 +22 1.1 3.33 0.0 0 0 5 diff --git a/GEOSaana_GridComp/GSI_GridComp/qcmod.f90 b/GEOSaana_GridComp/GSI_GridComp/qcmod.f90 index 3760f66..9418cbf 100644 --- a/GEOSaana_GridComp/GSI_GridComp/qcmod.f90 +++ b/GEOSaana_GridComp/GSI_GridComp/qcmod.f90 @@ -3232,9 +3232,7 @@ subroutine qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse, & enddo endif else if (latms) then - if (si_mean >= 20.0_r_kind) then - efactmc=zero - vfactmc=zero + if (abs(cldeff_obs(16)-cldeff_obs(17))>10.0_r_kind) then if(id_qc(ich890) == igood_qc)id_qc(ich890)=ifail_factch1617_qc errf(ich890) = zero varinv(ich890) = zero @@ -3243,11 +3241,15 @@ subroutine qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse, & errf(i) = zero varinv(i) = zero enddo - errf(1:ich544)=zero - varinv(1:ich544)=zero - do i=1,ich544 - if(id_qc(i) == igood_qc)id_qc(i)=ifail_factch1617_qc - end do + if (abs(cldeff_obs(16)-cldeff_obs(17))>15.0_r_kind) then + efactmc=zero + vfactmc=zero + errf(1:ich544)=zero + varinv(1:ich544)=zero + do i=1,ich544 + if(id_qc(i) == igood_qc)id_qc(i)=ifail_factch1617_qc + end do + end if end if else ! QC based on the sensitivity of Tb to the surface emissivity ! de1,de2,de3,de15 become smaller as the observation is more cloudy -- @@ -3538,7 +3540,7 @@ subroutine qc_amsua(nchanl,is,ndat,nsig,npred,sea,land,ice,snow,mixed,luse, & ework = ework+min(0.002_r_kind*sfc_speed**2*error0(i), 0.5_r_kind*error0(i)) clwtmp=min(abs(clwp_amsua-clw_guess_retrieval), one) ework = ework+min(13.0_r_kind*clwtmp*error0(i), 3.5_r_kind*error0(i)) - if (scatp>9.0_r_kind) then + if (scatp>9.0_r_kind .and. nchanl==15) then ework = ework+min(1.5_r_kind*(scatp-9.0_r_kind)*error0(i), 2.5_r_kind*error0(i)) end if ework=ework**2 diff --git a/GEOSaana_GridComp/GSI_GridComp/radinfo.f90 b/GEOSaana_GridComp/GSI_GridComp/radinfo.f90 index e3a27df..cc57931 100644 --- a/GEOSaana_GridComp/GSI_GridComp/radinfo.f90 +++ b/GEOSaana_GridComp/GSI_GridComp/radinfo.f90 @@ -1904,7 +1904,8 @@ subroutine init_predx ! of the observation is too cold (<50 K) or too warm (>500 K), ! do not use this observation in computing the update to the ! angle dependent bias. - if( ( abs(data_chan(j)%omgnbc) > 200. .or. & + if( ( data_fix%water_frac < 0.99 .or. & + abs(data_chan(j)%omgnbc) > 200. .or. & data_chan(j)%tbobs < 50. .or. & data_chan(j)%tbobs > 500. ) ) cycle loopc diff --git a/GEOSaana_GridComp/GSI_GridComp/setuprad.f90 b/GEOSaana_GridComp/GSI_GridComp/setuprad.f90 index a4f9dae..d3bb689 100644 --- a/GEOSaana_GridComp/GSI_GridComp/setuprad.f90 +++ b/GEOSaana_GridComp/GSI_GridComp/setuprad.f90 @@ -1256,7 +1256,7 @@ 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) call ret_amsua(tsim_bc,nchanl,tsavg5,zasat,clw_guess_retrieval,ierrret) + if(amsua .or. atms) call ret_amsua(tsim_bc,nchanl,tsavg5,zasat,clw_guess_retrieval,ierrret) if(gmi .or. tmi) then call gmi_37pol_diff(tsim_bc(6),tsim_bc(7),tsim_clr_bc(6),tsim_clr_bc(7),clw_guess_retrieval,ierrret_ges) call gmi_37pol_diff(tb_obs(6),tb_obs(7),tsim_clr_bc(6),tsim_clr_bc(7),clw_obs,ierrret) @@ -1638,7 +1638,7 @@ subroutine setuprad(obsLL,odiagLL,lunin,mype,aivals,stats,nchanl,nreal,nobs,& if(radmod%lcloud_fwd .and. eff_area) then if(radmod%rtype == 'amsua' .and. (i <=5 .or. i==15) ) then errf(i) = three*errf(i) - else if(radmod%rtype == 'atms' .and. (i <= 6 .or. i>=16) ) then + else if(radmod%rtype == 'atms' .and. (i <= 6 .or. (i>15 .and. i<19)) ) then errf(i) = min(three*errf(i),10.0_r_kind) else if(radmod%rtype == 'gmi' .or. radmod%rtype == 'tmi' & .or. radmod%rtype == 'ssmi' & @@ -2463,6 +2463,8 @@ subroutine contents_binary_diag_(odiags,idv,iob) if (save_jacobian) then j = 1 do ii = 1, nvarjac + ! skip 'cf' + if (trim(radjacnames(ii)) == 'cf') cycle state_ind = getindex(svars3d, radjacnames(ii)) if (state_ind < 0) state_ind = getindex(svars2d,radjacnames(ii)) if (state_ind < 0) then @@ -2683,6 +2685,8 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) if (save_jacobian) then j = 1 do ii = 1, nvarjac + ! skip 'cf' + if (trim(radjacnames(ii)) == 'cf') cycle state_ind = getindex(svars3d, radjacnames(ii)) if (state_ind < 0) state_ind = getindex(svars2d,radjacnames(ii)) if (state_ind < 0) then @@ -2773,7 +2777,11 @@ subroutine contents_netcdf_diag_(odiags,idv,iob) 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 + if (iabsorb == 1) then + call nc_diag_data2d(trim(fieldname), sngl(atmosphere(1)%absorber(:,iabsorb)/1000.0_r_kind)) ! check %absorber_units + else + call nc_diag_data2d(trim(fieldname), sngl(atmosphere(1)%absorber(:,iabsorb))) ! check %absorber_units + end if enddo do icloud = 1, n_clouds_fwd_wk write (fieldname, "(A,I0.2)") "atmosphere_mass_content_of_cloud_", atmosphere(1)%Cloud(icloud)%Type