Skip to content

Commit

Permalink
Merge pull request #347 from fvitt/cmeps0.14.18_lightning_coupling
Browse files Browse the repository at this point in the history
Cloud-to-ground lightning flash frequency coupling
  • Loading branch information
jedwards4b authored Apr 20, 2023
2 parents 26f997c + ac4d591 commit b4c3d9d
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 2 deletions.
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

0 comments on commit b4c3d9d

Please sign in to comment.