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