forked from NOAA-EMC/GSI
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
<!-- PLEASE READ --> <!-- Before opening a PR, please note these guidelines: - Each PR should only address ONE topic and have an associated issue - No hardcoded or paths to personal directories should be present - No temporary or backup files should be committed - Any code that was disabled by being commented out should be removed --> **Description** Initialization of the operational RRFSv1 will include assimilation of flash-extent density (FED) observations from the GOES Geostationary Lightning Mapper (GLM). The current PR is the first of at least 3 that will be needed to introduce the capability of FED assimilation into the code and regional workflow. The new capabilities that are added to GSI are: * reading NetCDF FED observations * applying an observation operator that maps the model state to FED. Much of the code was originally developed by Rong Kong at OU-CAPS (Kong et al. 2020, Wang et al. 2021, Kong et al. 2022; https://doi.org/10.1175/MWR-D-19-0192.1, https://doi.org/10.1175/MWR-D-20-0406.1, https://doi.org/10.1175/MWR-D-21-0326.1). Recently, the observation operator has been modified by Amanda Back and Ashley Sebok based on tests with regional, convection-allowing FV3 forecasts. The new observation operator includes a cap of 8 flashes / minute for both the observed and simulated FED. The observation operator is specific to the 3-km regional FV3 application in RRFS. Development of a more general observation operator is left to future work. Fixes NOAA-EMC#588 <!-- Please include relevant motivation and context. --> <!-- Please include a summary of the change and which issue is fixed. --> <!-- List any dependencies that are required for this change. --> <!-- Please provide reference to the issue this pull request is addressing. --> <!-- For e.g. Fixes #IssueNumber --> **Type of change** Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) - [X] 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?** Initial tests were with NOAA-EMC GSI-EnKF code obtained in April 2023 and modified to include the assimilation of FED observations. A prototype of RRFSv1 was cycled hourly for 2.5 days, and the EnKF assimilation included FED data assimilation. For the current PR, only the GSI observer with FED (and radar reflectivity) observations was tested. It produces identical results to those obtained in April 2023. <!-- Please describe the tests that you ran to verify your changes and on the platforms these tests were conducted. --> <!-- Provide instructions so we can reproduce. --> <!-- Please also list any relevant details for your test configuration --> **Checklist** - [ ] My code follows the style guidelines of this project - [X] 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 **DUE DATE for this PR is 8/24/2023.** If this PR is not merged into `develop` by this date, the PR will be closed and returned to the developer. --------- Co-authored-by: Ming Hu <[email protected]>
- Loading branch information
1 parent
be4a3d9
commit d7ac706
Showing
14 changed files
with
2,169 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,174 @@ | ||
module gsi_fedOper | ||
!$$$ subprogram documentation block | ||
! . . . . | ||
! subprogram: module gsi_fedOper | ||
! | ||
! abstract: an obOper extension for fedNode type | ||
! | ||
! program history log: | ||
! 2023-07-10 D. Dowell - created new module for FED (flash extent | ||
! density); gsi_dbzOper.F90 code used as a | ||
! starting point for developing this new module | ||
! | ||
! input argument list: see Fortran 90 style document below | ||
! | ||
! output argument list: see Fortran 90 style document below | ||
! | ||
! attributes: | ||
! language: Fortran 90 and/or above | ||
! machine: | ||
! | ||
!$$$ end subprogram documentation block | ||
|
||
! module interface: | ||
|
||
use gsi_obOper, only: obOper | ||
use m_fedNode , only: fedNode | ||
implicit none | ||
public:: fedOper ! data structure | ||
public:: diag_fed | ||
|
||
type,extends(obOper):: fedOper | ||
contains | ||
procedure,nopass:: mytype | ||
procedure,nopass:: nodeMold | ||
procedure:: setup_ | ||
procedure:: intjo1_ | ||
procedure:: stpjo1_ | ||
end type fedOper | ||
|
||
! def diag_fed- namelist logical to compute/write (=true) FED diag files | ||
logical,save:: diag_fed=.false. | ||
|
||
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
character(len=*),parameter :: myname='gsi_fedOper' | ||
type(fedNode),save,target:: myNodeMold_ | ||
|
||
contains | ||
function mytype(nodetype) | ||
implicit none | ||
character(len=:),allocatable:: mytype | ||
logical,optional, intent(in):: nodetype | ||
mytype="[fedOper]" | ||
if(present(nodetype)) then | ||
if(nodetype) mytype=myNodeMold_%mytype() | ||
endif | ||
end function mytype | ||
|
||
function nodeMold() | ||
!> %nodeMold() returns a mold of its corresponding obsNode | ||
use m_obsNode, only: obsNode | ||
implicit none | ||
class(obsNode),pointer:: nodeMold | ||
nodeMold => myNodeMold_ | ||
end function nodeMold | ||
|
||
subroutine setup_(self, lunin, mype, is, nobs, init_pass, last_pass) | ||
use fed_setup, only: setup | ||
use kinds, only: i_kind | ||
use gsi_obOper, only: len_obstype | ||
use gsi_obOper, only: len_isis | ||
|
||
use m_rhs , only: awork => rhs_awork | ||
use m_rhs , only: bwork => rhs_bwork | ||
use m_rhs , only: iwork => i_fed | ||
|
||
use obsmod , only: write_diag | ||
use jfunc , only: jiter | ||
|
||
use mpeu_util, only: die | ||
|
||
use obsmod, only: dirname, ianldate | ||
|
||
implicit none | ||
class(fedOper ), intent(inout):: self | ||
integer(i_kind), intent(in):: lunin | ||
integer(i_kind), intent(in):: mype | ||
integer(i_kind), intent(in):: is | ||
integer(i_kind), intent(in):: nobs | ||
logical , intent(in):: init_pass ! supporting multi-pass setup() | ||
logical , intent(in):: last_pass ! with incremental backgrounds. | ||
|
||
!---------------------------------------- | ||
character(len=*),parameter:: myname_=myname//"::setup_" | ||
|
||
character(len=len_obstype):: obstype | ||
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( (mype == 0) .and. init_pass ) then | ||
write(string,600) jiter | ||
600 format('fed_',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) | ||
nele = nreal+nchanl | ||
|
||
diagsave = write_diag(jiter) .and. diag_fed | ||
|
||
call setup(self%obsLL(:), self%odiagLL(:), & | ||
lunin,mype,bwork,awork(:,iwork),nele,nobs,is,diagsave,init_pass) | ||
|
||
end subroutine setup_ | ||
|
||
subroutine intjo1_(self, ibin, rval,sval, qpred,sbias) | ||
use gsi_bundlemod , only: gsi_bundle | ||
use bias_predictors, only: predictors | ||
use m_obsNode , only: obsNode | ||
use m_obsLList, only: obsLList_headNode | ||
use kinds , only: i_kind, r_quad | ||
implicit none | ||
class(fedOper ),intent(in ):: self | ||
integer(i_kind ),intent(in ):: ibin | ||
type(gsi_bundle),intent(inout):: rval ! (ibin) | ||
type(gsi_bundle),intent(in ):: sval ! (ibin) | ||
real(r_quad ),target,dimension(:),intent(inout):: qpred ! (ibin) | ||
type(predictors),target, intent(in ):: sbias | ||
|
||
!---------------------------------------- | ||
character(len=*),parameter:: myname_=myname//"::intjo1_" | ||
class(obsNode),pointer:: headNode | ||
|
||
end subroutine intjo1_ | ||
|
||
subroutine stpjo1_(self, ibin, dval,xval,pbcjo,sges,nstep,dbias,xbias) | ||
use gsi_bundlemod, only: gsi_bundle | ||
use bias_predictors, only: predictors | ||
use m_obsNode , only: obsNode | ||
use m_obsLList, only: obsLList_headNode | ||
use kinds, only: r_quad,r_kind,i_kind | ||
implicit none | ||
class(fedOper ),intent(in):: self | ||
integer(i_kind ),intent(in):: ibin | ||
type(gsi_bundle),intent(in):: dval | ||
type(gsi_bundle),intent(in):: xval | ||
real(r_quad ),dimension(:),intent(inout):: pbcjo ! (1:4) | ||
real(r_kind ),dimension(:),intent(in ):: sges | ||
integer(i_kind),intent(in):: nstep | ||
|
||
type(predictors),target, intent(in):: dbias | ||
type(predictors),target, intent(in):: xbias | ||
|
||
!---------------------------------------- | ||
character(len=*),parameter:: myname_=myname//"::stpjo1_" | ||
class(obsNode),pointer:: headNode | ||
|
||
end subroutine stpjo1_ | ||
|
||
end module gsi_fedOper |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.