C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/aim_land2aim.F,v 1.6 2004/05/21 17:27:22 jmc Exp $
C $Name: $
#include "AIM_OPTIONS.h"
#ifdef ALLOW_LAND
#include "LAND_OPTIONS.h"
#endif
CBOP
C !ROUTINE: AIM_LAND2AIM
C !INTERFACE:
SUBROUTINE AIM_LAND2AIM(
I land_frc, land_veg, grnd_alb, snowFld,
U aimTld, aimSWA, aimAlb,
I myTime, myIter, bi, bj, myThid )
C !DESCRIPTION: \bv
C *================================================================*
C | S/R AIM_LAND2AIM
C | provide surface Boundary Conditions over land (from land pkg)
C | to atmospheric physics package AIM
C *================================================================*
C | note: by default, use AIM surf.B.C. fields as initial state
C | (myIter=0) for the land model
C *================================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global variables ===
C-- size for MITgcm & Physics package :
#include "AIM_SIZE.h"
C-- MITgcm
#include "EEPARAMS.h"
#include "PARAMS.h"
C-- Physics package
#include "AIM_PARAMS.h"
#include "com_forcon.h"
#ifdef ALLOW_LAND
C-- Land package
#include "LAND_SIZE.h"
#include "LAND_PARAMS.h"
#include "LAND_VARS.h"
#endif
C == Routine arguments ==
C land_frc :: land fraction [0-1]
C land_veg :: vegetation fraction [0-1]
C grnd_alb :: ground albedo [0-1]
C aimTld :: land surface temp (K), used in AIM
C snowFld :: prescribed snow thickness (from AIM input data) [m]
C aimSWA :: soil wetness availability [0-1], used in AIM
C aimAlb :: land albedo [0-1], used in AIM
C myTime :: Current time of simulation ( s )
C myIter :: Current iteration number in simulation
C bi,bj :: Tile index
C myThid :: Number of this instance of the routine
_RS land_frc(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS land_veg(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS grnd_alb(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL snowFld(sNx,sNy)
_RL aimTld(sNx,sNy)
_RL aimSWA(sNx,sNy)
_RL aimAlb(sNx,sNy)
INTEGER myIter, bi, bj, myThid
_RL myTime
CEOP
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#ifdef ALLOW_AIM
#ifdef ALLOW_LAND
C == Local variables ==
C i,j,k :: Loop counters
C grd_HeatCp :: Heat capacity of the ground [J/m3/K]
C mWater :: water content of the ground [kg/m3]
C recip_hSnWet :: reciprol effective snow depth for wetness (m^-1)
C recip_mSnWet :: reciprol effective snow cover for wetness (mm^-1)
INTEGER i,j,k
INTEGER kFillW
_RL grd_HeatCp, mWater
_RL RSD
_RL recip_hSnWet, recip_mSnWet
c IF (useLand) THEN
IF ( land_calc_grT ) THEN
C- Use land-pkg output instead of prescribed ground Temp
DO j=1,sNy
DO i=1,sNx
aimTld(i,j) = land_skinT(i,j,bi,bj)+celsius2K
ENDDO
ENDDO
ELSE
C- Fill in land-pkg ground Temp. using AIM surf. fields
DO k=1,land_nLev
DO j=1,sNy
DO i=1,sNx
land_groundT(i,j,k,bi,bj) = aimTld(i,j)-celsius2K
ENDDO
ENDDO
ENDDO
DO j=1,sNy
DO i=1,sNx
land_skinT(i,j,bi,bj) = land_groundT(i,j,1,bi,bj)
ENDDO
ENDDO
ENDIF
IF (land_calc_grW) THEN
C- Use land-pkg output instead of prescribed soil moisture
IF ( land_calc_snow ) THEN
C Units: hSnow & hSnowWetness are in meter (of snow)
recip_hSnWet = 0. _d 0
IF ( hSnowWetness .NE. 0. _d 0 )
& recip_hSnWet = 1. _d 0 / hSnowWetness
DO j=1,sNy
DO i=1,sNx
aimSWA(i,j) = land_groundW(i,j,1,bi,bj)
& + land_hSnow(i,j,bi,bj)*recip_hSnWet
aimSWA(i,j) = MIN( MAX(0. _d 0, aimSWA(i,j)), 1. _d 0 )
ENDDO
ENDDO
ELSE
C Units: snowFld is in milimeter of equivalent liquid water
recip_mSnWet = 0. _d 0
IF ( hSnowWetness .NE. 0. _d 0 )
& recip_mSnWet = land_rhoLiqW
& / (land_rhoSnow*hSnowWetness*1000. _d 0)
DO j=1,sNy
DO i=1,sNx
aimSWA(i,j) = land_groundW(i,j,1,bi,bj)
& + snowFld(i,j)*recip_mSnWet
aimSWA(i,j) = MIN( MAX(0. _d 0, aimSWA(i,j)), 1. _d 0 )
ENDDO
ENDDO
ENDIF
ELSE
C- Fill in land-pkg soil moisture using AIM surf. fields
kFillW = land_nLev
IF (land_calc_grT) kFillW = 1
DO k=1,kFillW
DO j=1,sNy
DO i=1,sNx
land_groundW(i,j,k,bi,bj) = aimSWA(i,j)
ENDDO
ENDDO
ENDDO
c IF ( land_calc_grT ) THEN
C- needs to recompute enthalpy since grdW has changed:
C not a good idea: frozen water in the ground will be lost !
IF ( .FALSE. ) THEN
DO j=1,sNy
DO i=1,sNx
c IF ( land_frc(i,j,bi,bj).GT.0. ) THEN
DO k=1,land_nLev
mWater = land_rhoLiqW*land_waterCap
& *land_groundW(i,j,k,bi,bj)
grd_HeatCp = land_heatCs + land_CpWater*mWater
land_enthalp(i,j,k,bi,bj) =
& grd_HeatCp*land_groundT(i,j,k,bi,bj)
ENDDO
c ENDIF
ENDDO
ENDDO
ENDIF
C- end: if land_calc_grW
ENDIF
IF (land_calc_snow) THEN
IF (land_calc_alb) THEN
C- Compute albedo of snow ; and replace albedo of land.
CALL LAND_ALBEDO(
I land_frc, grnd_alb,
O aimAlb,
I bi,bj, myTime, myIter, myThid )
ELSE
C- Surface Albedo : (from F.M. FORDATE S/R)
RSD = 1. _d 0/SDALB
DO j=1,sNy
DO i=1,sNx
aimAlb(i,j) = grnd_alb(i,j,bi,bj)
& + MAX( 0. _d 0, ALBSN-grnd_alb(i,j,bi,bj) )
& *MIN( 1. _d 0, RSD*snowFld(i,j) )
ENDDO
ENDDO
ENDIF
ENDIF
c ENDIF
#endif /* ALLOW_LAND */
#endif /* ALLOW_AIM */
RETURN
END