-
Notifications
You must be signed in to change notification settings - Fork 868
AHI Cloud Detection based on IR Cloud Mask #1139
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -69,6 +69,7 @@ WRFVAR_OBJS = \ | |
| gsi_kinds.o \ | ||
| gsi_constants.o \ | ||
| gsi_thinning.o \ | ||
| mod_qc.o \ | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The name of mod_qc is too generic for people to know what this is for. Can you use some more meaningful file name? |
||
| da_wrfvar_io.o \ | ||
| da_airsr.o \ | ||
| da_wrfvar_top.o \ | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -508,7 +508,12 @@ module da_define_structures | |
| real, pointer :: bgerr(:) | ||
| real, pointer :: vtox(:,:) | ||
| end type varbc_type | ||
|
|
||
| type cld_qc_type | ||
| real :: RTCT, RFMFT, TEMPIR, terr_hgt | ||
| real :: tb_stddev_10, tb_stddev_13,tb_stddev_14 | ||
| real :: CIRH2O | ||
| !real, allocatable :: CIRH2O(:,:,:) | ||
| end type cld_qc_type | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if this cloud detection is specific to AHI (and ABI?), better to make the type name more specific, e.g., something like 'clddet_geoir'. |
||
| type cv_index_type | ||
| integer :: ts | ||
| integer :: nclouds | ||
|
|
@@ -548,6 +553,7 @@ module da_define_structures | |
| real, pointer :: satazi(:) | ||
| real, pointer :: solzen(:) | ||
| real, pointer :: solazi(:) | ||
| real, pointer :: tropt(:) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. please add a comment to tell this what this variable is? 'tropopause temperature'? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm encountering difficulties in assimilating sunflower data. I've adopted the cloud detection method proposed by Zhuge and Zou, but I'm unable to obtain the "tropt" (tropopause temperature) data, which is preventing me from completing the drawing of the cloud detection map. Does anyone know how this data is obtained? |
||
| real, pointer :: t(:,:) | ||
| real, pointer :: q(:,:) | ||
| real, pointer :: mr(:,:) | ||
|
|
@@ -623,7 +629,7 @@ module da_define_structures | |
| real, pointer :: ice_coverage(:) | ||
| real, pointer :: snow_coverage(:) | ||
| integer, pointer :: crtm_climat(:) ! CRTM only | ||
|
|
||
| type (cld_qc_type), pointer :: cld_qc(:) | ||
| type (varbc_info_type) :: varbc_info | ||
| type (varbc_type),pointer :: varbc(:) | ||
| type (cv_index_type), pointer :: cv_index(:) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,114 @@ | ||
| subroutine da_trop_wmo (t, z, p, nlev, tropt, tropp, tropk) | ||
|
|
||
| !---------------------------------------------------------------------------- | ||
| ! * Computes tropopause T, P, and/or level based on code from Cameron Homeyer | ||
| ! and WMO definition | ||
| ! | ||
| ! * WMO tropopause definition: | ||
| ! The boundary between the troposphere and the stratosphere, where an | ||
| ! abrupt change in lapse rate usually occurs. It is defined as the lowest | ||
| ! level at which the lapse rate decreases to 2 °C/km or less, provided | ||
| ! that the average lapse rate between this level and all higher levels | ||
| ! within 2 km does not exceed 2 °C/km. | ||
| !---------------------------------------------------------------------------- | ||
|
|
||
| implicit none | ||
|
|
||
| ! Assumed shape inputs for single column (size=nlev) | ||
| ! ordered from bottom to top of model | ||
| real, intent(in) :: t(:) ! Temperature, K. (3D) | ||
|
|
||
| !JJG: "z" is supposed to be height, not geopotential height. Does it matter? | ||
| real, intent(in) :: z(:) ! Geopotential height above m.s.l., m. | ||
| real, intent(in) :: p(:) ! Pressure, mb. | ||
| real, optional, intent(out) :: tropt ! Tropopause temperature, K. | ||
| real, optional, intent(out) :: tropp ! Tropopause pressure, mb. | ||
| integer, optional, intent(out) :: tropk | ||
| integer, intent(in) :: nlev | ||
|
|
||
| real :: dtdz,laps !LAPS | ||
| integer :: dtdztest(nlev), ztest(nlev) | ||
| integer :: i, j, k, kk, ktrop | ||
|
|
||
| ! real, parameter :: tropz_min = 5000.0 | ||
| ! real, parameter :: tropz_max = 19000.0 | ||
|
|
||
| if (.not.present(tropt) .and. & | ||
| .not.present(tropp) .and. & | ||
| .not.present(tropk)) return | ||
|
|
||
| if (present(tropt)) tropt = missing_r | ||
| if (present(tropp)) tropp = missing_r | ||
|
|
||
| !Loop over levels to find tropopause (single column) | ||
| ktrop = nlev-1 | ||
| trop_loop: do k = 1, nlev-1 | ||
| if ( p(k) .le. 500.0 ) then | ||
| ! Compute lapse rate (-dT/dz) | ||
| dtdz = ( t(k+1) - t(k) ) / & | ||
| ( z(k) - z(k+1) ) | ||
| else | ||
| ! Set lapse rate for p > 500 hPa | ||
| dtdz = 999.9 | ||
| endif | ||
| !Check if local lapse rate <= 2 K/km | ||
| if (dtdz .le. 0.002) then | ||
| ! Initialize lapse rate and altitude test arrays | ||
| dtdztest = 0 | ||
| ztest = 0 | ||
|
|
||
| ! Compute average lapse rate across levels above current candidate | ||
| do kk = k+1, nlev-1 | ||
| dtdz = ( t(kk+1) - t(k) ) / & | ||
| ( z(k) - z(kk+1) ) | ||
|
|
||
| !If avg. lapse rate <= 2 K/km and z <= trop + 2 km, set pass flag | ||
| if ( ( dtdz .le. 0.002 ) .and. & | ||
| ( (z(k) - z(kk)) .le. 2000. ) ) THEN | ||
| dtdztest(kk) = 1 | ||
| endif | ||
|
|
||
| ! If z <= trop + 2 km, set pass flag | ||
| IF ( (z(k) - z(kk)) .le. 2000.0 ) THEN | ||
| ztest(kk) = 1 | ||
| endif | ||
| enddo !kk loop | ||
| laps=dtdz !LAPS | ||
| IF (SUM(dtdztest) .eq. SUM(ztest)) THEN | ||
| ! If qualified as tropopause, set altitude index and return value | ||
| ktrop = k | ||
| exit trop_loop | ||
| ENDIF | ||
| ENDIF | ||
| end do trop_loop | ||
|
|
||
| ! ! Filter ktrop using tpause height thresholds | ||
| ! ztest = 0 | ||
| ! if ( z(ktrop) .gt. tropz_max ) then | ||
| ! where ( z.le.tropz_max ) | ||
| ! ztest = 1 | ||
| ! end where | ||
| ! do k = nlev, 1, -1 | ||
| ! if (ztest(k) .eq. 1) then | ||
| ! ktrop = k | ||
| ! exit | ||
| ! end if | ||
| ! end do | ||
| ! else if ( z(ktrop) .lt. tropz_min ) then | ||
| ! where ( z.ge.tropz_min ) | ||
| ! ztest = 1 | ||
| ! end where | ||
| ! do k = 1, nlev | ||
| ! if (ztest(k) .eq. 1) then | ||
| ! ktrop = k | ||
| ! exit | ||
| ! end if | ||
| ! end do | ||
| ! end if | ||
|
|
||
| if (present(tropt)) tropt = t(ktrop) | ||
| if (present(tropp)) tropp = p(ktrop) | ||
| if (present(tropk)) tropk = ktrop | ||
|
|
||
| end subroutine da_trop_wmo | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what means '_zz'? Zhuge&Zou (2016)?, If so, please add some description inside " ".