Skip to content
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

Cloud-to-ground lightning flash frequency coupling #347

Merged
merged 6 commits into from
Apr 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 112 additions & 0 deletions cesm/nuopc_cap_share/shr_lightning_coupling_mod.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
module shr_lightning_coupling_mod

!========================================================================
! Module for handling namelist variables related to lightning coupling
!========================================================================

use ESMF , only : ESMF_VMGetCurrent, ESMF_VM, ESMF_VMGet
use ESMF , only : ESMF_LOGERR_PASSTHRU, ESMF_SUCCESS
use ESMF , only : ESMF_VMBroadCast, ESMF_Logical, assignment(=)
use shr_sys_mod , only : shr_sys_abort
use shr_log_mod , only : shr_log_getLogUnit
use shr_nl_mod , only : shr_nl_find_group_name
use nuopc_shr_methods, only : chkerr

implicit none
private

! !PUBLIC MEMBER FUNCTIONS
public shr_lightning_coupling_readnl ! Read namelist

character(len=*), parameter :: &
u_FILE_u=__FILE__

!====================================================================================
CONTAINS
!====================================================================================

subroutine shr_lightning_coupling_readnl(NLFilename, atm_provides_lightning_out)

!========================================================================
! reads lightning_coupling_nl namelist and returns a variable specifying
! if atmosphere model provides lightning flash frequency field to mediator
!========================================================================

! input/output variables
character(len=*), intent(in) :: NLFilename ! Namelist filename
logical, intent(out) :: atm_provides_lightning_out ! if TRUE atm will provide lightning flash frequency

!----- local -----
logical :: atm_provides_lightning
type(ESMF_VM) :: vm
integer :: unitn ! namelist unit number
integer :: ierr ! error code
logical :: exists ! if file exists or not
type(ESMF_Logical):: ltmp(1)
integer :: rc
integer :: localpet
integer :: mpicom
integer :: s_logunit
character(len=*), parameter :: atm_ozone_frequency_not_present = 'NOT_PRESENT'
character(len=*), parameter :: subname = '(shr_lightning_coupling_readnl) '
! ------------------------------------------------------------------

namelist /lightning_coupling_nl/ atm_provides_lightning

rc = ESMF_SUCCESS

atm_provides_lightning_out = .false.
ltmp(1) = .false.

!--- Open and read namelist ---
if ( len_trim(NLFilename) == 0 ) then
call shr_sys_abort( subname//'ERROR: nlfilename not set' )
end if
call shr_log_getLogUnit(s_logunit)
call ESMF_VMGetCurrent(vm, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return

call ESMF_VMGet(vm, localPet=localpet, mpiCommunicator=mpicom, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return

if (localpet==0) then
! ------------------------------------------------------------------------
! Set default values in case namelist file doesn't exist, lightning_coupling_nl group
! doesn't exist within the file, or a given variable isn't present in the namelist
! group in the file.
! ------------------------------------------------------------------------
atm_provides_lightning = .false.

! ------------------------------------------------------------------------
! Read namelist file
! ------------------------------------------------------------------------
inquire( file=trim(NLFileName), exist=exists)
if ( exists ) then
open(newunit=unitn, file=trim(NLFilename), status='old' )
write(s_logunit,'(a)') subname,'Read in lightning_coupling_nl namelist from: ', trim(NLFilename)
call shr_nl_find_group_name(unitn, 'lightning_coupling_nl', ierr)
if (ierr == 0) then
! Note that ierr /= 0 means no namelist is present.
read(unitn, lightning_coupling_nl, iostat=ierr)
if (ierr > 0) then
call shr_sys_abort(subname//'problem reading lightning_coupling_nl')
end if
end if
close( unitn )
end if

ltmp(1) = atm_provides_lightning

end if

! ------------------------------------------------------------------------
! Broadcast values to all tasks
! ------------------------------------------------------------------------
call ESMF_VMBroadcast(vm, ltmp, count=1, rootPet=0, rc=rc)
if (chkerr(rc,__LINE__,u_FILE_u)) return

atm_provides_lightning_out = ltmp(1)

end subroutine shr_lightning_coupling_readnl

end module shr_lightning_coupling_mod
15 changes: 14 additions & 1 deletion cime_config/namelist_definition_drv_flds.xml
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@
</entry>

<!-- ======================================================================================== -->
<!-- Ozone control -->
<!-- Ozone control -->
<!-- ======================================================================================== -->

<entry id="atm_ozone_frequency">
Expand All @@ -157,4 +157,17 @@
</desc>
</entry>

<!-- ======================================================================================== -->
<!-- Lightning -->
<!-- ======================================================================================== -->

<entry id="atm_provides_lightning">
<type>logical</type>
<category>lightning_coupling</category>
<group>lightning_coupling_nl</group>
<desc>
If TRUE atmosphere model will provide prognosed lightning flash frequency (flashes per minute).
</desc>
</entry>

</entry_id>
13 changes: 13 additions & 0 deletions mediator/esmFldsExchange_cesm_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,19 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc)
end if
end if
! ---------------------------------------------------------------------
! to lnd: cld to grnd lightning flash freq
! ---------------------------------------------------------------------
if (phase == 'advertise') then
call addfld_from(compatm, 'Sa_lightning')
call addfld_to(complnd, 'Sa_lightning')
else
if ( fldchk(is_local%wrap%FBexp(complnd) , 'Sa_lightning', rc=rc) .and. &
fldchk(is_local%wrap%FBImp(compatm,compatm ), 'Sa_lightning', rc=rc)) then
call addmap_from(compatm, 'Sa_lightning', complnd, mapbilnr, 'one', atm2lnd_map)
call addmrg_to(complnd, 'Sa_lightning', mrg_from=compatm, mrg_fld='Sa_lightning', mrg_type='copy')
end if
end if
! ---------------------------------------------------------------------
! to lnd: temperature at the lowest model level from atm
! ---------------------------------------------------------------------
if (phase == 'advertise') then
Expand Down
6 changes: 5 additions & 1 deletion mediator/fd_cesm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,10 @@
canonical_units: mol/mol
description: atmosphere export - O3 in the lowest model layer (prognosed or prescribed)
#
- standard_name: Sa_lightning
canonical_units: /min
description: atmosphere export - lightning flash freqency
#
- standard_name: Sa_topo
alias: inst_surface_height
canonical_units: m
Expand Down Expand Up @@ -745,7 +749,7 @@
description: sea-ice export - ice thickness
#
- standard_name: Si_floediam
canonical_units: m
canonical_units: m
description: sea-ice export - ice floe diameter
#
#-----------------------------------
Expand Down