The coupler is required to do certain flux calculations - those calculations are located in this module. Details about the calculations performed can be found in Part III of the Cpl6 Combined User's Guide, Source Code Reference and Scientific Description.
REVISION HISTORY:
2002-Jun-10 - B. Kauffman - first versionINTERFACE:
module flux_modUSES:
use shr_sys_mod ! shared system routines
use shr_date_mod ! shared date module
use shr_mpi_mod ! shared mpi layer
use cpl_kind_mod ! kinds
use cpl_const_mod ! constants module
use cpl_mct_mod ! mct library
use cpl_comm_mod ! communicator module
use cpl_fields_mod ! list of fields found in bundles
use cpl_domain_mod ! domain data types
use cpl_bundle_mod ! bundle data types
use cpl_control_mod, dbug=>cpl_control_infoDBug
implicit none
private ! except
PUBLIC TYPES:
! nonePUBLIC MEMBER FUNCTIONS:
public :: flux_atmOcn ! computes atm/ocn fluxes
public :: flux_albo ! computes ocn albedos
public :: flux_albi ! modifies ice reference albedo
public :: flux_solar ! computes ocn net solar
public :: flux_epbal ! forces evap/precip/runoff balance
PUBLIC DATA MEMBERS:
! none
Using data from the ocean model in bun_ocn and data from the atmosphere model (already mapped to the ocean grid) in bun_atm, calculate the ocean-atmosphere fluxes and return them in bun_flux.
If optional argument fabricate is present, this routine will use pre-set values instead of the input data. This is useful when using dead models.
REMARKS:
All data must be on the ocean domain.REVISION HISTORY:
2002-Jun-10 - B. Kauffman - first versionINTERFACE:
subroutine flux_atmOcn(bun_ocn,bun_atm,fabricate,bun_flux)USES:
use shr_timer_modINPUT/OUTPUT PARAMETERS:
type(cpl_bundle),intent(in ) :: bun_ocn ! ocn state fields on ocn domain
type(cpl_bundle),intent(in ) :: bun_atm ! atm state fields on ocn domain
logical ,intent(in ) :: fabricate ! T <=> fabriate/clobber input data
type(cpl_bundle),intent(out) :: bun_flux ! flux fields on ocn grid
Depending on choices below, alter the abledos in the input bun_ocn
If Coupler namelist variable flux_albav = .true.
Compute four effective daily avg surface albedos for all
combinations of visible/near-infrared and direct/diffuse radiation
without accounting for zenith angle (ie. a "daily average" albedo)
If flux_albav = .false. then
Compute four surface albedos for all combinations of visible/
near-infrared and direct/diffuse radiation, accounting for
instantaneous zenith angle calculated from input argument
date and the following:
For more details see Briegleb, Bruce P., 1992: ``Delta-Eddington Approximation for Solar Radiation in the NCAR Community Climate Model'', Journal of Geophysical Research, Vol. 97, D7, pp7603-7612.
REVISION HISTORY:
198x - CCM1, original version
1992-Jun - J. Rosinski -- standardized
1994-May - J. Rosinski -- rewritten for land only
1994-Jul - B. Kauffman -- rewritten for ocean only
2002-Oct-26 - R. Jacob -- Rewritten for cpl6
INTERFACE:
subroutine flux_albo(date,bun_ocn)USES:
use shr_orb_mod ! orbital constants and methods
implicit none
INPUT/OUTPUT PARAMETERS:
type(cpl_bundle),intent(inout ) :: bun_ocn ! ocn albedo fields
type(shr_date) ,intent(in ) :: date ! current date
Depending on choices below, alter the albedos in the input bun_ice
If Coupler namelist variable flux_albav = .false.,
impose a zenith angle dependance on the ice model ``reference albedo''.
Currently this only involves setting albedos to zero
on the dark side of the earth. Use input date to determine
zenith angle.
If Coupler namelist variable flux_albav = .true.,
do not alter ice albedos. Ice albedos are zenith-angle independent
REMARKS:
o upon input, albedos are assumed to be a 60 degree reference albedoREVISION HISTORY:
199x- - B. Kauffman -- original cpl5 version
2002-Oct-26 - R. Jacob -- rewritten for cpl6
INTERFACE:
subroutine flux_albi(date,bun_ice)USES:
use shr_orb_mod
implicit none
INPUT/OUTPUT PARAMETERS:
type(cpl_bundle),intent(inout) :: bun_ice ! contains ice albedo fields
type(shr_date) ,intent(in ) :: date ! current date
Use the downward shortwave radiation in bun_atm and the albedos in bun_ocn and compute the atm/ocn absorbed short-wave (net sw) and return it in bun_aoflux.
REVISION HISTORY:
2000-Jan-03 - B. Kauffman -- original cpl5 version
2002-Oct-26 - R. Jacob -- rewritten for cpl6
INTERFACE:
subroutine flux_solar(bun_atm,bun_ocn,bun_aoflux)USES:
implicit none
INPUT/OUTPUT PARAMETERS:
type(cpl_bundle),intent(in ) :: bun_atm ! contains atm sw down fields
type(cpl_bundle),intent(in ) :: bun_ocn ! contains ocn albedo fields
type(cpl_bundle),intent(out ) :: bun_aoflux ! contains a/o net-sw fields
If Coupler namelist varible flx_epbal is not ``off'', adjust precip
(an atm output flux) and runoff (a lnd output) sent to
ice & ocn by a scalar factor
, so that
if flx_epbal = ``ocn'', factor
must be sent by the ocean
model in the infobuffer.
if flx_epbal = ``inst'', factor
will be calculated
by this routine.
bun_aoflux contains the atm/ocean evaporation, bun_i2c the ice/atm evaporation, bun_prec contains the total snow and rain, bun_r2c contains the runoff and bun_frac contains the ocean domain surface fractions. If adjustment is performed, on return the runoff in bun_r2c and rain and snow in bun_prec will be altered to balance the evaporation.
REVISION HISTORY:
199x - B. Kauffman -- Original cpl5 version
2003-Feb-17 - R. Jacob -- rewritten for cpl6
INTERFACE:
subroutine flux_epbal(date,bun_aoflux,bun_i2c,bun_prec,bun_r2c,bun_frac)USES:
implicit none
INPUT/OUTPUT PARAMETERS:
type(shr_date) ,intent(in ) :: date ! current date
type(cpl_bundle),intent(in ) :: bun_i2c ! ice to cpl bundle: ice evap
type(cpl_bundle),intent(in ) :: bun_aoflux ! a/o flux bundle : ocn evap
type(cpl_bundle),intent(inout) :: bun_prec ! a/x precip bundle: i+o prec
type(cpl_bundle),intent(inout) :: bun_r2c ! runoff bundle : ocn roff
type(cpl_bundle),intent(in ) :: bun_frac ! fractions on ocn domain