C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_fields_load.F,v 1.5 2015/09/02 12:07:29 dgoldberg Exp $
C $Name: $
#include "STREAMICE_OPTIONS.h"
CStartOfInterface
SUBROUTINE STREAMICE_FIELDS_LOAD(
I myTime, myIter, myThid )
C *==========================================================*
C | SUBROUTINE AIM_FIELDS_LOAD
C | o Control reading of AIM fields from external source.
C *==========================================================*
C | Loads surface boundary condition datasets for AIM.
C | The routine is called every timetep and periodically
C | loads a set of external fields.
C | Monthly climatology files are read either for
C | a) a direct use (useMMsurfFc):
C | Albedo, Soil moisture, Surface Temperature
C | b) time interpolation (useFMsurfBC):
C | Sea & Land surf. Temp, snow, sea-ice, soil-water (2-lev)
C | + (1rst.iter) ground albedo, vegetation, land-sea fraction
C | Most of the work is done by the master thread while
C | the other threads spin (but all inside MDSIO S/R).
C *==========================================================*
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "STREAMICE.h"
C === Routine arguments ===
C myTime :: Simulation time
C myIter :: Simulation timestep number
C myThid :: Thread no. that called this routine.
_RL myTime
INTEGER myIter
INTEGER myThid
CEndOfInterface
C === Functions ===
#ifdef ALLOW_STREAMICE
#ifdef ALLOW_STREAMICE_TIMEDEP_FORCING
C === Local variables ===
C bi,bj, i,j :: Loop counters
C tYear :: Fraction within year of myTime
C mnthIndex :: Current time in whole months
C prevMnthIndex
C fNam :: Strings used in constructing file names
C mnthNam
C pfact :: used to convert Pot.Temp. to in-situ Temp.
C loadNewData :: true when need to load new data from file
INTEGER bi,bj,i,j
c _RL pfact
LOGICAL first, changed
C-- for use with useMMsurfFc:
CHARACTER*(MAX_LEN_FNAM) fNam
INTEGER nm0, nm1, nmP
_RL myRelTime, fac, tmpFac
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C-- find which month to use for surface BC
C aim_surfForc_TimePeriod :: Length of forcing time period (e.g. 1 month)
C aim_surfForc_NppCycle :: Number of time period per Cycle (e.g. 12)
myRelTime = myTime - startTime
first = (myRelTime .lt. 0.5*deltaTClock)
if ( streamice_forcing_period .eq. 0.D0 ) THEN
! & .or. externForcingCycle .eq. 0.D0 ) then
C control parameter is constant in time and only needs to be updated
C once in the beginning
changed = .false.
nm0 = 1
nm1 = 1
fac = 1.D0
else
C-- Now calculate whether it is time to update the forcing arrays
if (externForcingCycle .eq. 0.0 ) THEN
CALL GET_PERIODIC_INTERVAL(
O nmP, nm0, nm1, tmpFac, fac,
I externForcingCycle, streamice_forcing_period,
I deltaTclock,
I myTime+0.5*streamice_forcing_period,
I myThid )
fac = 1.D0 - fac
else
CALL GET_PERIODIC_INTERVAL(
O nmP, nm0, nm1, tmpFac, fac,
I externForcingCycle, streamice_forcing_period,
I deltaTclock, myTime,
I myThid )
endif
IF ( nm0.NE.nmP ) THEN
changed = .true.
ELSE
changed = .false.
ENDIF
IF ( first ) changed = .false.
endif
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C- Load new data:
C- Only one thread updates parameter in common block
C- Wait for everyone to set loadNewData before Master updates prevMnthIndex
_BARRIER
IF ( first ) THEN
#ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
! PRINT *, "GOT HERE FIELDS LOAD 1", first, changed,
! & nm0,nm1,myTime,fac
IF ( STREAMICEuNormalTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEuNormalTimeDepFile,
& streamice_u_normal_stress1,
& nm0,myIter,myThid)
ENDIF
IF ( STREAMICEvNormalTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEvNormalTimeDepFile,
& streamice_v_normal_stress1,
& nm0,myIter,myThid)
ENDIF
IF ( STREAMICEuShearTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEuShearTimeDepFile,
& streamice_u_shear_stress1,
& nm0,myIter,myThid)
ENDIF
IF ( STREAMICEvShearTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEvShearTimeDepFile,
& streamice_v_shear_stress1,
& nm0,myIter,myThid)
ENDIF
! PRINT *, "GOT HERE FIELDS LOAD 2"
#endif
#ifdef ALLOW_STREAMICE_FLUX_CONTROL
IF ( STREAMICEuFluxTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEuFluxTimeDepFile,
& u_flux_bdry_SI_1,
& nm0,myIter,myThid)
ENDIF
IF ( STREAMICEvFluxTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEvFluxTimeDepFile,
& u_flux_bdry_SI_1,
& nm0,myIter,myThid)
ENDIF
#endif
IF ( STREAMICEBdotTimeDepFile .NE. ' ' ) THEN
! PRINT *, "GOT HERE FIELDS LOAD 3", STREAMICEBdotTimeDepFile
CALL READ_REC_XY_RL(STREAMICEBdotTimeDepFile,
& bdot_streamice1,
& nm0,myIter,myThid)
ENDIF
C- endif 1rst iter.
ENDIF
IF ( first .OR. changed) THEN
#ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
DO j=1,sNy
DO i=1,sNx
streamice_u_normal_stress0(i,j,bi,bj) =
& streamice_u_normal_stress1(i,j,bi,bj)
streamice_v_normal_stress0(i,j,bi,bj) =
& streamice_v_normal_stress1(i,j,bi,bj)
streamice_u_shear_stress0(i,j,bi,bj) =
& streamice_u_shear_stress1(i,j,bi,bj)
streamice_v_shear_stress0(i,j,bi,bj) =
& streamice_v_shear_stress1(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
! PRINT *, "GOT HERE FIELDS LOAD 4"
IF ( STREAMICEuNormalTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEuNormalTimeDepFile,
& streamice_u_normal_stress1,
& nm1,myIter,myThid)
ENDIF
IF ( STREAMICEvNormalTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEvNormalTimeDepFile,
& streamice_v_normal_stress1,
& nm1,myIter,myThid)
ENDIF
IF ( STREAMICEuShearTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEuShearTimeDepFile,
& streamice_u_shear_stress1,
& nm1,myIter,myThid)
ENDIF
IF ( STREAMICEvShearTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEvShearTimeDepFile,
& streamice_v_shear_stress1,
& nm1,myIter,myThid)
ENDIF
#endif
#ifdef ALLOW_STREAMICE_FLUX_CONTROL
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
DO j=1,sNy
DO i=1,sNx
u_flux_bdry_SI_0(i,j,bi,bj) =
& u_flux_bdry_SI_1(i,j,bi,bj)
v_flux_bdry_SI_0(i,j,bi,bj) =
& v_flux_bdry_SI_1(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
! PRINT *, "GOT HERE FIELDS LOAD 4"
IF ( STREAMICEuFluxTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEuFluxTimeDepFile,
& u_flux_bdry_SI_1,
& nm1,myIter,myThid)
ENDIF
IF ( STREAMICEuFluxTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEvFluxTimeDepFile,
& v_flux_bdry_SI_1,
& nm1,myIter,myThid)
ENDIF
#endif
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
DO j=1,sNy
DO i=1,sNx
bdot_streamice0(i,j,bi,bj) =
& bdot_streamice1(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
IF ( STREAMICEBdotTimeDepFile .NE. ' ' ) THEN
CALL READ_REC_XY_RL(STREAMICEBdotTimeDepFile,
& bdot_streamice1,
& nm1,myIter,myThid)
ENDIF
C- endif 1rst iter.
ENDIF
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
DO j=1,sNy
DO i=1,sNx
#ifdef STREAMICE_STRESS_BOUNDARY_CONTROL
streamice_u_normal_stress(i,j,bi,bj) =
& fac * streamice_u_normal_stress0(i,j,bi,bj)
& + (1-fac) * streamice_u_normal_stress1(i,j,bi,bj)
streamice_v_normal_stress(i,j,bi,bj) =
& fac * streamice_v_normal_stress0(i,j,bi,bj)
& + (1-fac) * streamice_v_normal_stress1(i,j,bi,bj)
streamice_u_shear_stress(i,j,bi,bj) =
& fac * streamice_u_shear_stress0(i,j,bi,bj)
& + (1-fac) * streamice_u_shear_stress1(i,j,bi,bj)
streamice_v_shear_stress(i,j,bi,bj) =
& fac * streamice_v_shear_stress0(i,j,bi,bj)
& + (1-fac) * streamice_v_shear_stress1(i,j,bi,bj)
#endif
#ifdef ALLOW_STREAMICE_FLUX_CONTROL
u_flux_bdry_pert(i,j,bi,bj) =
& fac * u_flux_bdry_SI_0(i,j,bi,bj)
& + (1-fac) * u_flux_bdry_SI_1(i,j,bi,bj)
v_flux_bdry_pert(i,j,bi,bj) =
& fac * v_flux_bdry_SI_0(i,j,bi,bj)
& + (1-fac) * v_flux_bdry_SI_1(i,j,bi,bj)
#endif
bdot_streamice (i,j,bi,bj) =
& fac * bdot_streamice0(i,j,bi,bj)
& + (1-fac) * bdot_streamice1(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
CALL EXCH_XY_RL
& (streamice_v_shear_stress, myThid)
CALL EXCH_XY_RL
& (streamice_u_shear_stress, myThid)
CALL EXCH_XY_RL
& (streamice_v_normal_stress, myThid)
CALL EXCH_XY_RL
& (streamice_u_normal_stress, myThid)
_EXCH_XY_RL(bdot_streamice, mythid )
#ifdef ALLOW_STREAMICE_FLUX_CONTROL
CALL EXCH_XY_RL
& (u_flux_bdry_pert, myThid)
CALL EXCH_XY_RL
& (v_flux_bdry_pert, myThid)
#endif
! print *, "GOT HERE STREAMICE FIELDS LOAD",
! & first,changed,nm0,nm1,fac
#endif
#endif
RETURN
END