C $Header: /u/gcmpack/MITgcm/pkg/land/land_ini_vars.F,v 1.7 2007/11/05 15:40:53 jmc Exp $ C $Name: $ #include "LAND_OPTIONS.h" CBOP C !ROUTINE: LAND_INI_VARS C !INTERFACE: SUBROUTINE LAND_INI_VARS( myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R LAND_INI_VARS C | o Initialize Land package variables C *==========================================================* C | for now, used only for a restart C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === C-- size for MITgcm & Land package : #include "LAND_SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "LAND_PARAMS.h" #include "LAND_VARS.h" C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C myThid - Number of this instance INTEGER myThid CEOP #ifdef ALLOW_LAND C == Local Variables == C msgBuf - Informational/error meesage buffer C i,j,k,bi,bj :: loop indices C grd_HeatCp :: Heat capacity of the ground (J/m3/K) C mWater :: water content of the ground (kg/m3) C temp_af :: ground temperature if above freezing C temp_bf :: ground temperature if below freezing c CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER i,j,k,bi,bj _RL grd_HeatCp, mWater _RL temp_af, temp_bf C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Initialize Land package variables C- Over all tiles DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) C- 3D arrays DO k=1,land_nLev DO J=1-Oly,sNy+Oly DO I=1-Olx,sNx+Olx land_groundT(i,j,k,bi,bj) = 0. _d 0 land_enthalp(i,j,k,bi,bj) = 0. _d 0 land_groundW(i,j,k,bi,bj) = 0. _d 0 ENDDO ENDDO ENDDO C- 2D arrays DO J=1-Oly,sNy+Oly DO I=1-Olx,sNx+Olx land_skinT (i,j,bi,bj) = 0. _d 0 land_hSnow (i,j,bi,bj) = 0. _d 0 land_snowAge(i,j,bi,bj) = 0. _d 0 land_runOff (i,j,bi,bj) = 0. _d 0 land_enRnOf (i,j,bi,bj) = 0. _d 0 land_HeatFLx(i,j,bi,bj) = 0. _d 0 land_Pr_m_Ev(i,j,bi,bj) = 0. _d 0 land_EnWFlux(i,j,bi,bj) = 0. _d 0 ENDDO ENDDO C- end bi,bj loops ENDDO ENDDO C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C- Need to synchronize here before doing master-thread IO _BARRIER IF ( startTime.EQ.baseTime .AND. nIter0.EQ.0 ) THEN C-- Define the initial state : read from file IF ( land_grT_iniFile .NE. ' ' ) THEN CALL READ_REC_3D_RL( land_grT_iniFile, readBinaryPrec, & land_nLev, land_groundT, 1, nIter0, myThid ) ENDIF IF ( land_grW_iniFile .NE. ' ' ) THEN CALL READ_REC_3D_RL( land_grW_iniFile, readBinaryPrec, & land_nLev, land_groundW, 1, nIter0, myThid ) ENDIF IF ( land_snow_iniFile .NE. ' ' ) THEN CALL READ_FLD_XY_RL( land_snow_iniFile, ' ', & land_hSnow, nIter0, myThid ) ENDIF ELSEIF ( land_calc_grT .OR. land_calc_grW ) THEN C-- Read Land package state variables from pickup file CALL LAND_READ_PICKUP( nIter0, myThid ) c ELSE C- a trick to allow to start without a land pickup: C load grT & grW from AIM surf. BC in S/R aim_land2aim ENDIF C- Every one else must wait until loading is done. _BARRIER C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) C- to have a consistent initial state: set surface Temp & enthalpy C assuming all the water in 1 phase only (solid or liquid): IF ( ( startTime.EQ.baseTime .AND. nIter0.EQ.0 ) .OR. & .NOT.( land_calc_grT .OR. land_calc_grW ) .OR. & land_oldPickup ) 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) IF (land_groundT(i,j,k,bi,bj).LT. 0. _d 0) & land_enthalp(i,j,k,bi,bj) = land_enthalp(i,j,k,bi,bj) & - land_Lfreez*mWater ENDDO land_skinT(i,j,bi,bj) = land_groundT(i,j,1,bi,bj) c ENDIF ENDDO ENDDO ELSE DO j=1,sNy DO i=1,sNx DO k=1,land_nLev mWater = land_rhoLiqW*land_waterCap & *land_groundW(i,j,k,bi,bj) grd_HeatCp = land_heatCs + land_CpWater*mWater C temperature if below freezing: temp_bf = (land_enthalp(i,j,k,bi,bj)+land_Lfreez*mWater) & / grd_HeatCp C temperature if above freezing: temp_af = land_enthalp(i,j,k,bi,bj) / grd_HeatCp land_groundT(i,j,k,bi,bj) = & MIN( temp_bf, MAX(temp_af, 0. _d 0) ) ENDDO ENDDO ENDDO ENDIF C- end bi,bj loops ENDDO ENDDO #endif /* ALLOW_LAND */ RETURN END