C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_budget_ocean.F,v 1.19 2012/11/09 22:15:18 heimbach Exp $
C $Name: $
#include "SEAICE_OPTIONS.h"
CStartOfInterface
SUBROUTINE SEAICE_BUDGET_OCEAN(
I UG,
I TSURF,
O netHeatFlux, SWHeatFlux,
I bi, bj, myTime, myIter, myThid )
C *================================================================*
C | SUBROUTINE seaice_budget_ocean
C | o Calculate surface heat fluxes over open ocean
C | see Hibler, MWR, 108, 1943-1973, 1980
C | If SEAICE_EXTERNAL_FLUXES is defined this routine simply
C | copies the global fields to the seaice-local fields.
C *================================================================*
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "FFIELDS.h"
#ifndef SEAICE_EXTERNAL_FLUXES
# include "PARAMS.h"
# include "GRID.h"
# include "SEAICE_SIZE.h"
# include "SEAICE_PARAMS.h"
# ifdef ALLOW_EXF
# include "EXF_OPTIONS.h"
# include "EXF_FIELDS.h"
# endif
#endif
C === Routine arguments ===
C INPUT:
C UG :: thermal wind of atmosphere
C TSURF :: ocean surface temperature in Kelvin
C bi,bj :: loop indices
C myTime :: Simulation time
C myIter :: Simulation timestep number
C myThid :: Thread no. that called this routine.
C OUTPUT:
C netHeatFlux :: net surface heat flux over open water or under ice
C SWHeatFlux :: short wave heat flux over open water or under ice
_RL UG (1:sNx,1:sNy)
_RL TSURF (1:sNx,1:sNy)
_RL netHeatFlux(1:sNx,1:sNy)
_RL SWHeatFlux (1:sNx,1:sNy)
_RL myTime
INTEGER bi, bj, myIter, myThid
CEndOfInterface
C === Local variables ===
C i,j - Loop counters
INTEGER i, j
#ifndef SEAICE_EXTERNAL_FLUXES
_RL QS1, D1, D1W, D3, TMELT
C local copies of global variables
_RL tsurfLoc (1:sNx,1:sNy)
_RL atempLoc (1:sNx,1:sNy)
_RL lwdownLoc (1:sNx,1:sNy)
C auxiliary variable
_RL ssq, sstdegC
_RL recip_rhoConstFresh, recip_lhEvap
C NOW DEFINE ASSORTED CONSTANTS
C SATURATION VAPOR PRESSURE CONSTANT
QS1=0.622 _d 0/1013.0 _d 0
C SENSIBLE HEAT CONSTANT
D1=SEAICE_dalton*SEAICE_cpAir*SEAICE_rhoAir
C WATER LATENT HEAT CONSTANT
D1W=SEAICE_dalton*SEAICE_lhEvap*SEAICE_rhoAir
C STEFAN BOLTZMAN CONSTANT TIMES EMISSIVITY
D3=SEAICE_emissivity*SEAICE_boltzmann
C MELTING TEMPERATURE OF ICE
TMELT = celsius2K
C
recip_lhEvap = 1./SEAICE_lhEvap
recip_rhoConstFresh = 1./rhoConstFresh
DO J=1,sNy
DO I=1,sNx
netHeatFlux(I,J) = 0. _d 0
SWHeatFlux (I,J) = 0. _d 0
C
C MAX_TICE does not exist anly longer, lets see if it works without
C tsurfLoc (I,J) = MIN(celsius2K+MAX_TICE,TSURF(I,J))
tsurfLoc (I,J) = TSURF(I,J)
# ifdef ALLOW_ATM_TEMP
C Is this necessary?
atempLoc (I,J) = MAX(celsius2K+MIN_ATEMP,ATEMP(I,J,bi,bj))
# endif
# ifdef ALLOW_DOWNWARD_RADIATION
lwdownLoc(I,J) = MAX(MIN_LWDOWN,LWDOWN(I,J,bi,bj))
# endif
ENDDO
ENDDO
#endif /* SEAICE_EXTERNAL_FLUXES */
C NOW DETERMINE OPEN WATER HEAT BUD. ASSUMING TSURF=WATER TEMP.
C WATER ALBEDO IS ASSUMED TO BE THE CONSTANT SEAICE_waterAlbedo
DO J=1,sNy
DO I=1,sNx
#ifdef SEAICE_EXTERNAL_FLUXES
netHeatFlux(I,J) = Qnet(I,J,bi,bj)
SWHeatFlux (I,J) = Qsw(I,J,bi,bj)
#else /* SEAICE_EXTERNAL_FLUXES undefined */
C This is an example of how one could implement surface fluxes
C over the ocean (if one dislikes the fluxes computed in pkg/exf).
C In this example, the exf-fields are re-used so that they no longer
C have the same values as at the time when they are saved for
C diagnostics (e.g., hl, hs, lwflux, sflux). To properly
C diagnose them, one has to save them again as different (SI-)fields.
# ifdef ALLOW_DOWNWARD_RADIATION
C net upward short wave heat flux
SWHeatFlux(I,J) = (SEAICE_waterAlbedo - 1. _d 0)
& *swdown(I,J,bi,bj)
C lwup = emissivity*stefanBoltzmann*Tsrf^4 + (1-emissivity)*lwdown
C the second terms is the reflected incoming long wave radiation
C so that the net upward long wave heat flux is:
lwflux(I,J,bi,bj) = - lwdownLoc(I,J)*SEAICE_emissivity
& + D3*tsurfLoc(I,J)**4
sstdegC = tsurfLoc(I,J) - TMELT
C downward sensible heat
hs(I,J,bi,bj) = D1*UG(I,J)*(atempLoc(I,J)-tsurfLoc(I,J))
C saturation humidity
ssq = QS1*6.11 _d 0 *EXP( 17.2694 _d 0
& *sstdegC/(sstdegC+237.3 _d 0) )
C downward latent heat
hl(I,J,bi,bj) = D1W*UG(I,J)*(AQH(I,J,bi,bj)-ssq)
C net heat is positive upward
netHeatFlux(I,J)=SWHeatFlux(I,J)
& + lwflux(I,J,bi,bj)
& - hs(I,J,bi,bj) - hl(I,J,bi,bj)
C compute evaporation here again because latent heat is different
C from its previous value
evap(i,j,bi,bj) = -hl(I,J,bi,bj)
& *recip_lhEvap*recip_rhoConstFresh
C Salt flux from Precipitation and Evaporation.
sflux(i,j,bi,bj) = evap(i,j,bi,bj) - precip(i,j,bi,bj)
# ifdef ALLOW_RUNOFF
sflux(i,j,bi,bj) = sflux(i,j,bi,bj) - runoff(i,j,bi,bj)
# endif
sflux(i,j,bi,bj) = sflux(i,j,bi,bj)*maskC(i,j,1,bi,bj)
empmr(i,j,bi,bj) = sflux(i,j,bi,bj)*rhoConstFresh
# endif /* ALLOW_DOWNWARD_RADIATION */
#endif /* SEAICE_EXTERNAL_FLUXES */
ENDDO
ENDDO
RETURN
END