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 ! exceptPUBLIC 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 balancePUBLIC 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 cpl6INTERFACE:
subroutine flux_albo(date,bun_ocn)USES:
use shr_orb_mod ! orbital constants and methods implicit noneINPUT/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 cpl6INTERFACE:
subroutine flux_albi(date,bun_ice)USES:
use shr_orb_mod implicit noneINPUT/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 cpl6INTERFACE:
subroutine flux_solar(bun_atm,bun_ocn,bun_aoflux)USES:
implicit noneINPUT/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 cpl6INTERFACE:
subroutine flux_epbal(date,bun_aoflux,bun_i2c,bun_prec,bun_r2c,bun_frac)USES:
implicit noneINPUT/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