!=======================================================================
!BOP
!
! !MODULE: ice_flux - flux variable declarations: coupler, diagnostic and
! internal
!
! !DESCRIPTION:
!
! Flux variable declarations; these include fields sent from the coupler
! ("in"), sent to the coupler ("out"), written to diagnostic history files
! ("diagnostic"), and used internally ("internal").
!
! !REVISION HISTORY:
! SVN:$Id: ice_flux.F90 51 2007-01-29 22:25:24Z eclare $
!
! author Elizabeth C. Hunke, LANL
!
! 2004: Block structure added by William Lipscomb
! Swappped, revised, and added some subroutines
! 2006: Converted to free source form (F90) by Elizabeth Hunke
!
! !INTERFACE:
!
module ice_flux 33,4
!
! !USES:
!
use ice_kinds_mod
use ice_blocks
use ice_domain_size
use ice_constants
!
!EOP
!
implicit none
save
!-----------------------------------------------------------------
! Dynamics component
!-----------------------------------------------------------------
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
! in from atmos (if .not.calc_strair)
strax , & ! wind stress components (N/m^2)
stray , & !
! in from ocean
uocn , & ! ocean current, x-direction (m/s)
vocn , & ! ocean current, y-direction (m/s)
ss_tltx , & ! sea surface slope, x-direction (m/m)
ss_tlty , & ! sea surface slope, y-direction
! out to atmosphere (if calc_strair)
strairxT, & ! stress on ice by air, x-direction
strairyT, & ! stress on ice by air, y-direction
! use for super-cycling the dynamics
strairxT_accum, & ! stress on ice by air, x-direction
strairyT_accum, & ! stress on ice by air, y-direction
! out to ocean T-cell (kg/m s^2)
! Note, CICE_IN_NEMO uses strocnx and strocny for coupling
strocnxT, & ! ice-ocean stress, x-direction
strocnyT ! ice-ocean stress, y-direction
! diagnostic
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
sig1 , & ! principal stress component
sig2 , & ! principal stress component
strairx , & ! stress on ice by air, x-direction
strairy , & ! stress on ice by air, y-direction
strocnx , & ! ice-ocean stress, x-direction
strocny , & ! ice-ocean stress, y-direction
strtltx , & ! stress due to sea surface slope, x-direction
strtlty , & ! stress due to sea surface slope, y-direction
strintx , & ! divergence of internal ice stress, x (N/m^2)
strinty , & ! divergence of internal ice stress, y (N/m^2)
daidtd , & ! ice area tendency due to transport (1/s)
dvidtd , & ! ice volume tendency due to transport (m/s)
dardg1dt, & ! rate of area loss by ridging ice (1/s)
dardg2dt, & ! rate of area gain by new ridges (1/s)
dvirdgdt, & ! rate of ice volume ridged (m/s)
opening ! rate of opening due to divergence/shear (1/s)
! restart
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
! ice stress tensor in each corner of T cell (kg/s^2)
stressp_1, stressp_2, stressp_3, stressp_4 , & ! sigma11+sigma22
stressm_1, stressm_2, stressm_3, stressm_4 , & ! sigma11-sigma22
stress12_1,stress12_2,stress12_3,stress12_4 ! sigma12
logical (kind=log_kind), &
dimension (nx_block,ny_block,max_blocks) :: &
iceumask ! ice extent mask (U-cell)
! internal
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
prs_sig , & ! replacement pressure, for stress calc
fm ! Coriolis param. * mass in U-cell (kg/s)
!-----------------------------------------------------------------
! Thermodynamic component
!-----------------------------------------------------------------
! in from atmosphere (if calc_Tsfc)
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
zlvl , & ! atm level height (m)
uatm , & ! wind velocity components (m/s)
vatm , &
wind , & ! wind speed (m/s)
potT , & ! air potential temperature (K)
Tair , & ! air temperature (K)
Qa , & ! specific humidity (kg/kg)
rhoa , & ! air density (kg/m^3)
swvdr , & ! sw down, visible, direct (W/m^2)
swvdf , & ! sw down, visible, diffuse (W/m^2)
swidr , & ! sw down, near IR, direct (W/m^2)
swidf , & ! sw down, near IR, diffuse (W/m^2)
flw ! incoming longwave radiation (W/m^2)
! in from atmosphere (if .not. Tsfc_calc)
! required for coupling to HadGEM3
! NOTE: when in CICE_IN_NEMO mode, these are gridbox mean fields,
! not per ice area. When in standalone mode, these are per ice area.
real (kind=dbl_kind), &
dimension (nx_block,ny_block,ncat,max_blocks) :: &
fsurfn_f , & ! net flux to top surface, excluding fcondtop
fcondtopn_f, & ! downward cond flux at top surface (W m-2)
flatn_f ! latent heat flux (W m-2)
! in from atmosphere
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
frain , & ! rainfall rate (kg/m^2 s)
fsnow ! snowfall rate (kg/m^2 s)
real (kind=dbl_kind), &
dimension (nx_block,ny_block,n_aeromx,max_blocks) :: &
faero ! aerosol deposition rate (kg/m^2 s) MH
! in from ocean
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
sss , & ! sea surface salinity (ppt)
sst , & ! sea surface temperature (C)
frzmlt , & ! freezing/melting potential (W/m^2)
Tf , & ! freezing temperature (C)
qdp , & ! deep ocean heat flux (W/m^2), negative upward
hmix ! mixed layer depth (m)
character (char_len) :: &
Tfrzpt ! ocean freezing temperature formulation
! 'constant' (-1.8C), 'linear_S'
! out to atmosphere (if calc_Tsfc)
! note Tsfc is in ice_state.F
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
fsens , & ! sensible heat flux (W/m^2)
flat , & ! latent heat flux (W/m^2)
fswabs , & ! shortwave flux absorbed in ice and ocean (W/m^2)
flwout , & ! outgoing longwave radiation (W/m^2)
Tref , & ! 2m atm reference temperature (K)
Qref , & ! 2m atm reference spec humidity (kg/kg)
evap ! evaporative water flux (kg/m^2/s)
! albedos aggregated over categories (if calc_Tsfc)
real (kind=dbl_kind), dimension(nx_block,ny_block,max_blocks) :: &
alvdr , & ! visible, direct (fraction)
alidr , & ! near-ir, direct (fraction)
alvdf , & ! visible, diffuse (fraction)
alidf , & ! near-ir, diffuse (fraction)
#ifdef AEROFRC
dalvdr_noaero , & ! visible, direct (fraction) (diag)
dalidr_noaero , & ! near-ir, direct (fraction) (diag)
dalvdf_noaero , & ! visible, diffuse (fraction) (diag)
dalidf_noaero , & ! near-ir, diffuse (fraction) (diag)
#endif
#ifdef CCSM3FRC
dalvdr_ccsm3 , & ! visible, direct (fraction) (diag)
dalidr_ccsm3 , & ! near-ir, direct (fraction) (diag)
dalvdf_ccsm3 , & ! visible, diffuse (fraction) (diag)
dalidf_ccsm3 , & ! near-ir, diffuse (fraction) (diag)
#endif
#ifdef PONDFRC
dalvdr_nopond , & ! visible, direct (fraction) (diag)
dalidr_nopond , & ! near-ir, direct (fraction) (diag)
dalvdf_nopond , & ! visible, diffuse (fraction) (diag)
dalidf_nopond , & ! near-ir, diffuse (fraction) (diag)
#endif
! grid-box-mean versions
alvdr_gbm, & ! visible, direct (fraction)
alidr_gbm, & ! near-ir, direct (fraction)
alvdf_gbm, & ! visible, diffuse (fraction)
alidf_gbm, & ! near-ir, diffuse (fraction)
! components for history
#ifdef AEROFRC
dalbice_noaero , & ! bare ice albedo (diag)
dalbsno_noaero , & ! snow albedo (diag)
dalbpnd_noaero , & ! melt pond albedo (diag)
#endif
#ifdef CCSM3FRC
dalbice_ccsm3 , & ! bare ice albedo (diag)
dalbsno_ccsm3 , & ! snow albedo (diag)
#endif
#ifdef PONDFRC
dalbice_nopond , & ! bare ice albedo (diag)
dalbsno_nopond , & ! snow albedo (diag)
dalbpnd_nopond , & ! melt pond albedo (diag)
#endif
albice , & ! bare ice albedo
albsno , & ! snow albedo
albpnd ! melt pond albedo
real (kind=dbl_kind), &
dimension(nx_block,ny_block,max_blocks,max_nstrm) :: &
albcnt ! counter for zenith angle
! out to ocean
! (Note CICE_IN_NEMO does not use these for coupling.
! It uses fresh_gbm,fsalt_gbm,fhocn_gbm and fswthru_gbm)
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
fresh , & ! fresh water flux to ocean (kg/m^2/s)
fsalt , & ! salt flux to ocean (kg/m^2/s)
fhocn , & ! net heat flux to ocean (W/m^2)
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfc , & ! shortwave absorbed at the surface (W/m^2)
fswint , & ! shortwave absorbed internally (W/m^2)
#endif
#ifdef AEROFRC
dfswabs_noaero , & ! shortwave absorbed (diag) (W/m^2)
dfswsfc_noaero , & ! shortwave absorbed at the surface (diag) (W/m^2)
dfswint_noaero , & ! shortwave absorbed internally (diag) (W/m^2)
dfswthru_noaero , & ! shortwave penetrating to ocean (diag) (W/m^2)
#endif
#ifdef CCSM3FRC
dfswabs_ccsm3 , & ! shortwave absorbed (diag) (W/m^2)
dfswsfc_ccsm3 , & ! shortwave absorbed at the surface (diag) (W/m^2)
dfswint_ccsm3 , & ! shortwave absorbed internally (diag) (W/m^2)
dfswthru_ccsm3 , & ! shortwave penetrating to ocean (diag) (W/m^2)
#endif
#ifdef PONDFRC
dfswabs_nopond , & ! shortwave absorbed (diag) (W/m^2)
dfswsfc_nopond , & ! shortwave absorbed at the surface (diag) (W/m^2)
dfswint_nopond , & ! shortwave absorbed internally (diag) (W/m^2)
dfswthru_nopond , & ! shortwave penetrating to ocean (diag) (W/m^2)
#endif
fswthru ! shortwave penetrating to ocean (W/m^2)
real (kind=dbl_kind), &
dimension (nx_block,ny_block,n_aeromx,max_blocks) :: &
fsoot
! internal
real (kind=dbl_kind), &
dimension (nx_block,ny_block,max_blocks) :: &
fswfac , & ! for history
scale_factor! scaling factor for shortwave components
logical (kind=log_kind) :: &
update_ocn_f ! if true, update fresh water and salt fluxes
!-----------------------------------------------------------------
! quantities passed from ocean mixed layer to atmosphere
! (for running with CAM)
!-----------------------------------------------------------------
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
strairx_ocn , & ! stress on ocean by air, x-direction
strairy_ocn , & ! stress on ocean by air, y-direction
fsens_ocn , & ! sensible heat flux (W/m^2)
flat_ocn , & ! latent heat flux (W/m^2)
flwout_ocn , & ! outgoing longwave radiation (W/m^2)
evap_ocn , & ! evaporative water flux (kg/m^2/s)
alvdr_ocn , & ! visible, direct (fraction)
alidr_ocn , & ! near-ir, direct (fraction)
alvdf_ocn , & ! visible, diffuse (fraction)
alidf_ocn , & ! near-ir, diffuse (fraction)
Tref_ocn , & ! 2m atm reference temperature (K)
Qref_ocn ! 2m atm reference spec humidity (kg/kg)
!-----------------------------------------------------------------
! diagnostic
!-----------------------------------------------------------------
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
fsurf , & ! net surface heat flux (excluding fcondtop)(W/m^2)
fcondtop,&! top surface conductive flux (W/m^2)
congel, & ! basal ice growth (m/step-->cm/day)
frazil, & ! frazil ice growth (m/step-->cm/day)
snoice, & ! snow-ice formation (m/step-->cm/day)
meltt , & ! top ice melt (m/step-->cm/day)
melts , & ! snow melt (m/step-->cm/day)
meltb , & ! basal ice melt (m/step-->cm/day)
meltl , & ! lateral ice melt (m/step-->cm/day)
daidtt, & ! ice area tendency thermo. (s^-1)
dvidtt, & ! ice volume tendency thermo. (m/s)
mlt_onset, &! day of year that sfc melting begins
frz_onset ! day of year that freezing begins (congel or frazil)
real (kind=dbl_kind), &
dimension (nx_block,ny_block,ncat,max_blocks) :: &
fsurfn, & ! category fsurf
fcondtopn,& ! category fcondtop
flatn ! cagegory latent heat flux
! As above but these remain grid box mean values i.e. they are not
! divided by aice at end of ice_dynamics. These are used in
! CICE_IN_NEMO for coupling and also for generating
! ice diagnostics and history files as these are more accurate.
! (The others suffer from problem of incorrect values at grid boxes
! that change from an ice free state to an icy state.)
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
fresh_gbm, & ! fresh water flux to ocean (kg/m^2/s)
fsalt_gbm, & ! salt flux to ocean (kg/m^2/s)
fhocn_gbm, & ! net heat flux to ocean (W/m^2)
fswthru_gbm ! shortwave penetrating to ocean (W/m^2)
!-----------------------------------------------------------------
! internal
!-----------------------------------------------------------------
real (kind=dbl_kind), dimension (nx_block,ny_block,max_blocks) :: &
rside , & ! fraction of ice that melts laterally
fsw , & ! incoming shortwave radiation (W/m^2)
coszen , & ! cosine solar zenith angle, < 0 for sun below horizon
rdg_conv, & ! convergence term for ridging (1/s)
rdg_shear ! shear term for ridging (1/s)
!=======================================================================
contains
!=======================================================================
!BOP
!
! !IROUTINE: init_coupler_flux - initialize fluxes exchanged with coupler
!
! !INTERFACE:
!
subroutine init_coupler_flux 1
!
! !DESCRIPTION:
!
! Initialize all fluxes exchanged with flux coupler
! and some data-derived fields
!
! !REVISION HISTORY:
!
! author Elizabeth C. Hunke, LANL
!
! !USES:
!
! !INPUT/OUTPUT PARAMETERS:
!
!EOP
!
integer (kind=int_kind) :: i, j, n, iblk
logical (kind=log_kind), parameter :: &
! l_winter = .true. ! winter/summer default switch
l_winter = .false. ! winter/summer default switch
real (kind=dbl_kind) :: fcondtopn_d(6), fsurfn_d(6)
data fcondtopn_d / -50.0_dbl_kind,-17.0_dbl_kind,-12.0_dbl_kind, &
-9.0_dbl_kind, -7.0_dbl_kind, -3.0_dbl_kind /
data fsurfn_d / 0.20_dbl_kind, 0.15_dbl_kind, 0.10_dbl_kind, &
0.05_dbl_kind, 0.01_dbl_kind, 0.01_dbl_kind /
!-----------------------------------------------------------------
! fluxes received from atmosphere
!-----------------------------------------------------------------
zlvl (:,:,:) = c10 ! atm level height (m)
rhoa (:,:,:) = 1.3_dbl_kind ! air density (kg/m^3)
uatm (:,:,:) = c5 ! wind velocity (m/s)
vatm (:,:,:) = c5
strax (:,:,:) = 0.05_dbl_kind
stray (:,:,:) = 0.05_dbl_kind
if (l_winter) then
!typical winter values
potT (:,:,:) = 253.0_dbl_kind ! air potential temp (K)
Tair (:,:,:) = 253.0_dbl_kind ! air temperature (K)
Qa (:,:,:) = 0.0006_dbl_kind ! specific humidity (kg/kg)
swvdr (:,:,:) = c0 ! shortwave radiation (W/m^2)
swvdf (:,:,:) = c0 ! shortwave radiation (W/m^2)
swidr (:,:,:) = c0 ! shortwave radiation (W/m^2)
swidf (:,:,:) = c0 ! shortwave radiation (W/m^2)
flw (:,:,:) = c180 ! incoming longwave rad (W/m^2)
frain (:,:,:) = c0 ! rainfall rate (kg/m2/s)
fsnow (:,:,:) = 4.0e-6_dbl_kind ! snowfall rate (kg/m2/s)
do n = 1, ncat ! conductive heat flux (W/m^2)
fcondtopn_f(:,:,n,:) = fcondtopn_d(n)
enddo
fsurfn_f = fcondtopn_f ! surface heat flux (W/m^2)
flatn_f(:,:,:,:) = c0 ! latent heat flux (kg/m2/s)
else
!typical summer values
potT (:,:,:) = 273.0_dbl_kind ! air potential temp (K)
Tair (:,:,:) = 273.0_dbl_kind ! air temperature (K)
Qa (:,:,:) = 0.0035_dbl_kind ! specific humidity (kg/kg)
swvdr (:,:,:) = 50._dbl_kind ! shortwave radiation (W/m^2)
swvdf (:,:,:) = 50._dbl_kind ! shortwave radiation (W/m^2)
swidr (:,:,:) = 50._dbl_kind ! shortwave radiation (W/m^2)
swidf (:,:,:) = 50._dbl_kind ! shortwave radiation (W/m^2)
flw (:,:,:) = 280.0_dbl_kind ! incoming longwave rad (W/m^2)
frain (:,:,:) = c0 ! rainfall rate (kg/m2/s)
fsnow (:,:,:) = c0 ! snowfall rate (kg/m2/s)
do n = 1, ncat ! surface heat flux (W/m^2)
fsurfn_f(:,:,n,:) = fsurfn_d(n)
enddo
fcondtopn_f(:,:,:,:) = 0.0_dbl_kind ! conductive heat flux (W/m^2)
flatn_f(:,:,:,:) = -2.0_dbl_kind ! latent heat flux (W/m^2)
endif ! l_winter
faero (:,:,:,:) = c0 ! aerosol deposition rate (kg/m2/s) MH
!-----------------------------------------------------------------
! fluxes received from ocean
!-----------------------------------------------------------------
ss_tltx(:,:,:)= c0 ! sea surface tilt (m/m)
ss_tlty(:,:,:)= c0
uocn (:,:,:) = c0 ! surface ocean currents (m/s)
vocn (:,:,:) = c0
frzmlt(:,:,:) = c0 ! freezing/melting potential (W/m^2)
sss (:,:,:) = 34.0_dbl_kind ! sea surface salinity (o/oo)
if (trim(Tfrzpt) == 'constant') then
Tf (:,:,:) = -1.8_dbl_kind ! freezing temp (C)
else ! default: Tfrzpt = 'linear_S'
Tf (:,:,:) = -depressT*sss(:,:,:) ! freezing temp (C)
endif
#ifndef CICE_IN_NEMO
sst (:,:,:) = Tf(:,:,:) ! sea surface temp (C)
#endif
qdp (:,:,:) = c0 ! deep ocean heat flux (W/m^2)
hmix (:,:,:) = c20 ! ocean mixed layer depth
!-----------------------------------------------------------------
! fluxes sent to atmosphere
!-----------------------------------------------------------------
!echmod - for rectangular grid tests without thermo
! strairxT(:,:,:) = 0.15_dbl_kind
! strairyT(:,:,:) = 0.15_dbl_kind
strairxT(:,:,:) = c0 ! wind stress, T grid
strairyT(:,:,:) = c0
!echmod
fsens (:,:,:) = c0
flat (:,:,:) = c0
fswabs (:,:,:) = c0
flwout (:,:,:) = -stefan_boltzmann*Tffresh**4
! in case atm model diagnoses Tsfc from flwout
evap (:,:,:) = c0
Tref (:,:,:) = c0
Qref (:,:,:) = c0
alvdr (:,:,:) = c0
alidr (:,:,:) = c0
alvdf (:,:,:) = c0
alidf (:,:,:) = c0
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfc (:,:,:) = c0
fswint (:,:,:) = c0
#endif
#ifdef AEROFRC
dfswabs_noaero (:,:,:) = c0
dfswsfc_noaero (:,:,:) = c0
dfswint_noaero (:,:,:) = c0
dfswthru_noaero (:,:,:) = c0
dalvdr_noaero (:,:,:) = c0
dalidr_noaero (:,:,:) = c0
dalvdf_noaero (:,:,:) = c0
dalidf_noaero (:,:,:) = c0
#endif
#ifdef CCSM3FRC
dfswabs_ccsm3 (:,:,:) = c0
dfswsfc_ccsm3 (:,:,:) = c0
dfswint_ccsm3 (:,:,:) = c0
dfswthru_ccsm3 (:,:,:) = c0
dalvdr_ccsm3 (:,:,:) = c0
dalidr_ccsm3 (:,:,:) = c0
dalvdf_ccsm3 (:,:,:) = c0
dalidf_ccsm3 (:,:,:) = c0
#endif
#ifdef PONDFRC
dfswabs_nopond (:,:,:) = c0
dfswsfc_nopond (:,:,:) = c0
dfswint_nopond (:,:,:) = c0
dfswthru_nopond (:,:,:) = c0
dalvdr_nopond (:,:,:) = c0
dalidr_nopond (:,:,:) = c0
dalvdf_nopond (:,:,:) = c0
dalidf_nopond (:,:,:) = c0
#endif
!-----------------------------------------------------------------
! fluxes sent to ocean
!-----------------------------------------------------------------
strocnxT(:,:,:) = c0 ! ice-ocean stress, x-direction (T-cell)
strocnyT(:,:,:) = c0 ! ice-ocean stress, y-direction (T-cell)
fresh (:,:,:) = c0
fsalt (:,:,:) = c0
fhocn (:,:,:) = c0
fswthru (:,:,:) = c0
!-----------------------------------------------------------------
! derived or computed fields
!-----------------------------------------------------------------
fsw (:,:,:) = c0 ! shortwave radiation (W/m^2)
scale_factor(:,:,:) = c0 ! shortwave scaling factor
wind (:,:,:) = sqrt(uatm(:,:,:)**2 &
+ vatm(:,:,:)**2) ! wind speed, (m/s)
coszen (:,:,:) = c0
end subroutine init_coupler_flux
!=======================================================================
!BOP
!
! !IROUTINE: init_flux_atm - initialize all atmospheric fluxes sent to coupler
!
! !INTERFACE:
!
subroutine init_flux_atm 2
!
! !DESCRIPTION:
!
! Initialize some fluxes sent to coupler for use by the atm model
!
! !REVISION HISTORY:
!
! author: Elizabeth C. Hunke, LANL
!
! !USES:
!
! !INPUT/OUTPUT PARAMETERS:
!
!
!EOP
!
!-----------------------------------------------------------------
! initialize albedo and fluxes
!-----------------------------------------------------------------
strairxT(:,:,:) = c0 ! wind stress, T grid
strairyT(:,:,:) = c0
fsens (:,:,:) = c0
flat (:,:,:) = c0
fswabs (:,:,:) = c0
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfc (:,:,:) = c0
fswint (:,:,:) = c0
#endif
#ifdef AEROFRC
dfswabs_noaero (:,:,:) = c0
dfswsfc_noaero (:,:,:) = c0
dfswint_noaero (:,:,:) = c0
dfswthru_noaero (:,:,:) = c0
#endif
#ifdef CCSM3FRC
dfswabs_ccsm3 (:,:,:) = c0
dfswsfc_ccsm3 (:,:,:) = c0
dfswint_ccsm3 (:,:,:) = c0
dfswthru_ccsm3 (:,:,:) = c0
#endif
#ifdef PONDFRC
dfswabs_nopond (:,:,:) = c0
dfswsfc_nopond (:,:,:) = c0
dfswint_nopond (:,:,:) = c0
dfswthru_nopond (:,:,:) = c0
#endif
flwout (:,:,:) = c0
evap (:,:,:) = c0
Tref (:,:,:) = c0
Qref (:,:,:) = c0
end subroutine init_flux_atm
!=======================================================================
!BOP
!
! !IROUTINE: init_flux_ocn - initialize ocean fluxes sent to coupler
!
! !INTERFACE:
!
subroutine init_flux_ocn 3
!
! !DESCRIPTION:
!
! Initialize some fluxes sent to coupler for use by the ocean model
!
! NOTE: These fluxes should be initialized immediately after the
! call to the coupler. The atmospheric fluxes can be initialized
! at the beginning of the following time step because they are
! not modified by any subroutines between the call to_coupler
! and the end of the time step.
!
! !REVISION HISTORY:
!
! author: Elizabeth C. Hunke, LANL
!
! !USES:
!
! !INPUT/OUTPUT PARAMETERS:
!
!
!EOP
!
!-----------------------------------------------------------------
! fluxes sent
!-----------------------------------------------------------------
fresh (:,:,:) = c0
fsalt (:,:,:) = c0
fhocn (:,:,:) = c0
fsoot (:,:,:,:) = c0
fswthru(:,:,:) = c0
end subroutine init_flux_ocn
!=======================================================================
!BOP
!
! !IROUTINE: init_history_therm - initialize thermo history fields
!
! !INTERFACE:
!
subroutine init_history_therm 2,1
!
! !DESCRIPTION:
!
! Initialize thermodynamic fields written to history files.
!
! !REVISION HISTORY:
!
! authors: William H. Lipscomb, LANL
! Elizabeth C. Hunke, LANL
!
! !USES:
!
!
! !INPUT/OUTPUT PARAMETERS:
!
!EOP
!
use ice_state
, only: aice, vice
fsurf (:,:,:) = c0
fcondtop(:,:,:)= c0
congel (:,:,:) = c0
frazil (:,:,:) = c0
snoice (:,:,:) = c0
meltt (:,:,:) = c0
melts (:,:,:) = c0
meltb (:,:,:) = c0
meltl (:,:,:) = c0
daidtt (:,:,:) = aice(:,:,:) ! temporary initial area
dvidtt (:,:,:) = vice(:,:,:) ! temporary initial volume
fsurfn (:,:,:,:) = c0
fcondtopn (:,:,:,:) = c0
flatn (:,:,:,:) = c0
fresh_gbm (:,:,:) = c0
fsalt_gbm (:,:,:) = c0
fhocn_gbm (:,:,:) = c0
fswthru_gbm(:,:,:) = c0
albice (:,:,:) = c0
albsno (:,:,:) = c0
albpnd (:,:,:) = c0
#ifdef AEROFRC
dalbice_noaero (:,:,:) = c0
dalbsno_noaero (:,:,:) = c0
dalbpnd_noaero (:,:,:) = c0
#endif
#ifdef CCSM3FRC
dalbice_ccsm3 (:,:,:) = c0
dalbsno_ccsm3 (:,:,:) = c0
#endif
#ifdef PONDFRC
dalbice_nopond (:,:,:) = c0
dalbsno_nopond (:,:,:) = c0
dalbpnd_nopond (:,:,:) = c0
#endif
end subroutine init_history_therm
!=======================================================================
!BOP
!
! !IROUTINE: init_history_dyn - initialize dynamic history fields
!
! !INTERFACE:
!
subroutine init_history_dyn 2,1
!
! !DESCRIPTION:
!
! Initialize dynamic fields written to history files.
!
! !REVISION HISTORY:
!
! authors: William H. Lipscomb, LANL
! Elizabeth C. Hunke, LANL
!
! !USES:
!
use ice_state
, only: aice, vice
!
! !INPUT/OUTPUT PARAMETERS:
!
!EOP
!
sig1 (:,:,:) = c0
sig2 (:,:,:) = c0
strocnx (:,:,:) = c0
strocny (:,:,:) = c0
strairx (:,:,:) = c0
strairy (:,:,:) = c0
strtltx (:,:,:) = c0
strtlty (:,:,:) = c0
strintx (:,:,:) = c0
strinty (:,:,:) = c0
dardg1dt(:,:,:) = c0
dardg2dt(:,:,:) = c0
dvirdgdt(:,:,:) = c0
opening (:,:,:) = c0
daidtd (:,:,:) = aice(:,:,:) ! temporary initial area
dvidtd (:,:,:) = vice(:,:,:) ! temporary initial volume
fm (:,:,:) = c0
prs_sig (:,:,:) = c0
end subroutine init_history_dyn
!=======================================================================
!BOP
!
! !IROUTINE: merge_fluxes - aggregate flux information over ITD
!
! !INTERFACE:
!
subroutine merge_fluxes (nx_block, ny_block, & 1
icells, &
indxi, indxj, &
aicen, &
flw, coszn, &
strairxn, strairyn, &
fsurfn, fcondtopn, &
fsensn, flatn, &
fswabsn, flwoutn, &
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfcn, fswintn, &
#endif
#ifdef AEROFRC
dfswabsn_noaero, dfswsfcn_noaero, &
dfswintn_noaero, dfswthrun_noaero, &
#endif
#ifdef CCSM3FRC
dfswabsn_ccsm3, dfswsfcn_ccsm3, &
dfswintn_ccsm3, dfswthrun_ccsm3, &
#endif
#ifdef PONDFRC
dfswabsn_nopond, dfswsfcn_nopond, &
dfswintn_nopond, dfswthrun_nopond, &
#endif
evapn, &
Trefn, Qrefn, &
freshn, fsaltn, &
fhocnn, fswthrun, &
strairxT, strairyT, &
fsurf, fcondtop, &
fsens, flat, &
fswabs, flwout, &
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfc, fswint, &
#endif
#ifdef AEROFRC
dfswabs_noaero, dfswsfc_noaero, &
dfswint_noaero, dfswthru_noaero, &
#endif
#ifdef CCSM3FRC
dfswabs_ccsm3, dfswsfc_ccsm3, &
dfswint_ccsm3, dfswthru_ccsm3, &
#endif
#ifdef PONDFRC
dfswabs_nopond, dfswsfc_nopond, &
dfswint_nopond, dfswthru_nopond, &
#endif
evap, &
Tref, Qref, &
fresh, fsalt, &
fhocn, fswthru, &
melttn, meltsn, meltbn, congeln, snoicen, &
meltt, melts, &
meltb, &
congel, snoice)
!
! !DESCRIPTION:
!
! Aggregate flux information from all ice thickness categories
!
! !REVISION HISTORY:
!
! author: Elizabeth C. Hunke and William H. Lipscomb, LANL
!
! !USES:
!
! !INPUT/OUTPUT PARAMETERS:
!
integer (kind=int_kind), intent(in) :: &
nx_block, ny_block, & ! block dimensions
icells ! number of cells with aicen > puny
integer (kind=int_kind), dimension(nx_block*ny_block), &
intent(in) :: &
indxi, indxj ! compressed indices for cells with aicen > puny
! single category fluxes
real (kind=dbl_kind), dimension(nx_block,ny_block), intent(in):: &
aicen , & ! concentration of ice
flw , & ! downward longwave flux (W/m**2)
coszn , & ! cosine of solar zenith angle
strairxn, & ! air/ice zonal strss, (N/m**2)
strairyn, & ! air/ice merdnl strss, (N/m**2)
fsurfn , & ! net heat flux to top surface (W/m**2)
fcondtopn,& ! downward cond flux at top sfc (W/m**2)
fsensn , & ! sensible heat flx (W/m**2)
flatn , & ! latent heat flx (W/m**2)
fswabsn , & ! shortwave absorbed heat flx (W/m**2)
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfcn , & ! shortwave surface absorbed heat flx (W/m**2)
fswintn , & ! shortwave internal absorbed heat flx (W/m**2)
#endif
#ifdef AEROFRC
dfswabsn_noaero, & ! shortwave absorbed heat flx (W/m**2)
dfswsfcn_noaero, & ! shortwave absorbed heat flx (W/m**2)
dfswintn_noaero, & ! shortwave absorbed heat flx (W/m**2)
dfswthrun_noaero, & ! shortwave absorbed heat flx (W/m**2)
#endif
#ifdef CCSM3FRC
dfswabsn_ccsm3, & ! shortwave absorbed heat flx (W/m**2)
dfswsfcn_ccsm3, & ! shortwave absorbed heat flx (W/m**2)
dfswintn_ccsm3, & ! shortwave absorbed heat flx (W/m**2)
dfswthrun_ccsm3, & ! shortwave absorbed heat flx (W/m**2)
#endif
#ifdef PONDFRC
dfswabsn_nopond, & ! shortwave absorbed heat flx (W/m**2)
dfswsfcn_nopond, & ! shortwave absorbed heat flx (W/m**2)
dfswintn_nopond, & ! shortwave absorbed heat flx (W/m**2)
dfswthrun_nopond, & ! shortwave absorbed heat flx (W/m**2)
#endif
flwoutn , & ! upwd lw emitted heat flx (W/m**2)
evapn , & ! evaporation (kg/m2/s)
Trefn , & ! air tmp reference level (K)
Qrefn , & ! air sp hum reference level (kg/kg)
freshn , & ! fresh water flux to ocean (kg/m2/s)
fsaltn , & ! salt flux to ocean (kg/m2/s)
fhocnn , & ! actual ocn/ice heat flx (W/m**2)
fswthrun, & ! sw radiation through ice bot (W/m**2)
melttn , & ! top ice melt (m)
meltbn , & ! bottom ice melt (m)
meltsn , & ! snow melt (m)
congeln , & ! congelation ice growth (m)
snoicen ! snow-ice growth (m)
! cumulative fluxes
real (kind=dbl_kind), dimension(nx_block,ny_block), &
intent(inout):: &
strairxT, & ! air/ice zonal strss, (N/m**2)
strairyT, & ! air/ice merdnl strss, (N/m**2)
fsurf , & ! net heat flux to top surface (W/m**2)
fcondtop, & ! downward cond flux at top sfc (W/m**2)
fsens , & ! sensible heat flx (W/m**2)
flat , & ! latent heat flx (W/m**2)
fswabs , & ! shortwave absorbed heat flx (W/m**2)
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswsfc , & ! shortwave surface absorbed heat flx (W/m**2)
fswint , & ! shortwave internal absorbed heat flx (W/m**2)
#endif
#ifdef AEROFRC
dfswabs_noaero , & ! shortwave absorbed heat flx (W/m**2)
dfswsfc_noaero , & ! shortwave surface absorbed heat flx (W/m**2)
dfswint_noaero , & ! shortwave internal absorbed heat flx (W/m**2)
dfswthru_noaero , & ! shortwave penetrating heat flux (W/m**2)
#endif
#ifdef CCSM3FRC
dfswabs_ccsm3 , & ! shortwave absorbed heat flx (W/m**2)
dfswsfc_ccsm3 , & ! shortwave surface absorbed heat flx (W/m**2)
dfswint_ccsm3 , & ! shortwave internal absorbed heat flx (W/m**2)
dfswthru_ccsm3 , & ! shortwave penetrating heat flux (W/m**2)
#endif
#ifdef PONDFRC
dfswabs_nopond , & ! shortwave absorbed heat flx (W/m**2)
dfswsfc_nopond , & ! shortwave surface absorbed heat flx (W/m**2)
dfswint_nopond , & ! shortwave internal absorbed heat flx (W/m**2)
dfswthru_nopond , & ! shortwave penetrating heat flux (W/m**2)
#endif
flwout , & ! upwd lw emitted heat flx (W/m**2)
evap , & ! evaporation (kg/m2/s)
Tref , & ! air tmp reference level (K)
Qref , & ! air sp hum reference level (kg/kg)
fresh , & ! fresh water flux to ocean (kg/m2/s)
fsalt , & ! salt flux to ocean (kg/m2/s)
fhocn , & ! actual ocn/ice heat flx (W/m**2)
fswthru , & ! sw radiation through ice bot (W/m**2)
meltt , & ! top ice melt (m)
meltb , & ! bottom ice melt (m)
melts , & ! snow melt (m)
congel , & ! congelation ice growth (m)
snoice ! snow-ice growth (m)
!
!EOP
!
integer (kind=int_kind) :: &
ij, i, j ! horizontal indices
!-----------------------------------------------------------------
! Merge fluxes
!-----------------------------------------------------------------
!DIR$ CONCURRENT !Cray
!cdir nodep !NEC
!ocl novrec !Fujitsu
do ij = 1, icells
i = indxi(ij)
j = indxj(ij)
! atmo fluxes
strairxT (i,j) = strairxT(i,j) + strairxn(i,j)*aicen(i,j)
strairyT (i,j) = strairyT(i,j) + strairyn(i,j)*aicen(i,j)
fsurf (i,j) = fsurf (i,j) + fsurfn (i,j)*aicen(i,j)
fcondtop (i,j) = fcondtop(i,j) + fcondtopn(i,j)*aicen(i,j)
fsens (i,j) = fsens (i,j) + fsensn (i,j)*aicen(i,j)
flat (i,j) = flat (i,j) + flatn (i,j)*aicen(i,j)
fswabs (i,j) = fswabs (i,j) + fswabsn (i,j)*aicen(i,j)
#if (defined AEROFRC) || (defined PONDFRC) || (defined CCSM3FRC)
fswint(i,j)=fswint(i,j) + fswintn(i,j)*aicen(i,j)
fswsfc(i,j)=fswsfc(i,j) + fswsfcn(i,j)*aicen(i,j)
#endif
#ifdef AEROFRC
dfswsfc_noaero(i,j)=dfswsfc_noaero(i,j) + dfswsfcn_noaero(i,j)*aicen(i,j)
dfswabs_noaero(i,j)=dfswabs_noaero(i,j) + dfswabsn_noaero(i,j)*aicen(i,j)
dfswint_noaero(i,j)=dfswint_noaero(i,j) + dfswintn_noaero(i,j)*aicen(i,j)
dfswthru_noaero(i,j)=dfswthru_noaero(i,j)+dfswthrun_noaero(i,j)*aicen(i,j)
#endif
#ifdef CCSM3FRC
dfswsfc_ccsm3(i,j)=dfswsfc_ccsm3(i,j) + dfswsfcn_ccsm3(i,j)*aicen(i,j)
dfswabs_ccsm3(i,j)=dfswabs_ccsm3(i,j) + dfswabsn_ccsm3(i,j)*aicen(i,j)
dfswint_ccsm3(i,j)=dfswint_ccsm3(i,j) + dfswintn_ccsm3(i,j)*aicen(i,j)
dfswthru_ccsm3(i,j)=dfswthru_ccsm3(i,j)+dfswthrun_ccsm3(i,j)*aicen(i,j)
#endif
#ifdef PONDFRC
dfswsfc_nopond(i,j)=dfswsfc_nopond(i,j) + dfswsfcn_nopond(i,j)*aicen(i,j)
dfswabs_nopond(i,j)=dfswabs_nopond(i,j) + dfswabsn_nopond(i,j)*aicen(i,j)
dfswint_nopond(i,j)=dfswint_nopond(i,j) + dfswintn_nopond(i,j)*aicen(i,j)
dfswthru_nopond(i,j)=dfswthru_nopond(i,j)+dfswthrun_nopond(i,j)*aicen(i,j)
#endif
flwout (i,j) = flwout (i,j) &
+ (flwoutn(i,j) - (c1-emissivity)*flw(i,j))*aicen(i,j)
evap (i,j) = evap (i,j) + evapn (i,j)*aicen(i,j)
Tref (i,j) = Tref (i,j) + Trefn (i,j)*aicen(i,j)
Qref (i,j) = Qref (i,j) + Qrefn (i,j)*aicen(i,j)
! ocean fluxes
fresh (i,j) = fresh (i,j) + freshn (i,j)*aicen(i,j)
fsalt (i,j) = fsalt (i,j) + fsaltn (i,j)*aicen(i,j)
fhocn (i,j) = fhocn (i,j) + fhocnn (i,j)*aicen(i,j)
fswthru (i,j) = fswthru (i,j) + fswthrun(i,j)*aicen(i,j)
! ice/snow thickness
meltt (i,j) = meltt (i,j) + melttn (i,j)*aicen(i,j)
meltb (i,j) = meltb (i,j) + meltbn (i,j)*aicen(i,j)
melts (i,j) = melts (i,j) + meltsn (i,j)*aicen(i,j)
congel (i,j) = congel (i,j) + congeln (i,j)*aicen(i,j)
snoice (i,j) = snoice (i,j) + snoicen (i,j)*aicen(i,j)
enddo ! ij
end subroutine merge_fluxes
!=======================================================================
!BOP
!
! !IROUTINE: scale_fluxes
!
! !DESCRIPTION:
!
! Divide ice fluxes by ice area before sending them to the
! coupler, since the coupler multiplies by ice area. This
! is the ice area at the beginning of the timestep, i.e.
! coupler, since the coupler multiplies by ice area.
!
! !INTERFACE:
!
subroutine scale_fluxes (nx_block, ny_block, & 1
tmask, &
aice, Tf, &
Tair, Qa, &
strairxT, strairyT, &
fsens, flat, &
fswabs, flwout, &
evap, &
Tref, Qref, &
fresh, fsalt, &
fhocn, fswthru, &
fsoot, &
alvdr, alidr, &
alvdf, alidf)
!
! !REVISION HISTORY:
!
! authors: C.M.Bitz, William H. Lipscomb
!
! !USES:
!
! !INPUT/OUTPUT PARAMETERS:
!
integer (kind=int_kind), intent(in) :: &
nx_block, ny_block ! block dimensions
logical (kind=log_kind), dimension (nx_block,ny_block), &
intent(in) :: &
tmask ! land/boundary mask, thickness (T-cell)
real (kind=dbl_kind), dimension(nx_block,ny_block), &
intent(in):: &
aice , & ! fractional ice area
Tf , & ! freezing temperature (C)
Tair , & ! surface air temperature (K)
Qa ! sfc air specific humidity (kg/kg)
real (kind=dbl_kind), dimension(nx_block,ny_block), &
intent(inout):: &
strairxT, & ! air/ice zonal stress (N/m**2)
strairyT, & ! air/ice merdnl stress (N/m**2)
fsens , & ! sensible heat flx (W/m**2)
flat , & ! latent heat flx (W/m**2)
fswabs , & ! shortwave absorbed heat flx (W/m**2)
flwout , & ! upwd lw emitted heat flx (W/m**2)
evap , & ! evaporation (kg/m2/s)
Tref , & ! air tmp reference level (K)
Qref , & ! air sp hum reference level (kg/kg)
fresh , & ! fresh water flux to ocean (kg/m2/s)
fsalt , & ! salt flux to ocean (kg/m2/s)
fhocn , & ! actual ocn/ice heat flx (W/m**2)
fswthru , & ! sw radiation through ice bot (W/m**2)
alvdr , & ! visible, direct (fraction)
alidr , & ! near-ir, direct (fraction)
alvdf , & ! visible, diffuse (fraction)
alidf ! near-ir, diffuse (fraction)
real (kind=dbl_kind), dimension(nx_block,ny_block,n_aeromx), &
intent(inout):: &
fsoot !
!
!EOP
!
real (kind=dbl_kind) :: ar ! 1/aice
integer (kind=int_kind) :: &
i, j ! horizontal indices
!DIR$ CONCURRENT !Cray
!cdir nodep !NEC
!ocl novrec !Fujitsu
do j = 1, ny_block
do i = 1, nx_block
if (tmask(i,j) .and. aice(i,j) > c0) then
ar = c1 / aice(i,j)
strairxT(i,j) = strairxT(i,j) * ar
strairyT(i,j) = strairyT(i,j) * ar
fsens (i,j) = fsens (i,j) * ar
flat (i,j) = flat (i,j) * ar
fswabs (i,j) = fswabs (i,j) * ar
flwout (i,j) = flwout (i,j) * ar
evap (i,j) = evap (i,j) * ar
Tref (i,j) = Tref (i,j) * ar
Qref (i,j) = Qref (i,j) * ar
fresh (i,j) = fresh (i,j) * ar
fsalt (i,j) = fsalt (i,j) * ar
fhocn (i,j) = fhocn (i,j) * ar
fswthru (i,j) = fswthru (i,j) * ar
alvdr (i,j) = alvdr (i,j) * ar
alidr (i,j) = alidr (i,j) * ar
alvdf (i,j) = alvdf (i,j) * ar
alidf (i,j) = alidf (i,j) * ar
fsoot (i,j,:) = fsoot (i,j,:) * ar
else ! zero out fluxes
strairxT(i,j) = c0
strairyT(i,j) = c0
fsens (i,j) = c0
flat (i,j) = c0
fswabs (i,j) = c0
flwout (i,j) = -stefan_boltzmann *(Tf(i,j) + Tffresh)**4
! to make upward longwave over ocean reasonable for history file
evap (i,j) = c0
Tref (i,j) = Tair(i,j)
Qref (i,j) = Qa (i,j)
fresh (i,j) = c0
fsalt (i,j) = c0
fhocn (i,j) = c0
fsoot (i,j,:) = c0
fswthru (i,j) = c0
alvdr (i,j) = c0 ! zero out albedo where ice is absent
alidr (i,j) = c0
alvdf (i,j) = c0
alidf (i,j) = c0
endif ! tmask and aice > 0
enddo ! i
enddo ! j
end subroutine scale_fluxes
!=======================================================================
end module ice_flux
!=======================================================================