C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_get_forcing.F,v 1.8 2004/12/27 20:34:11 dimitri Exp $
C $Name:  $

#include "SEAICE_OPTIONS.h"
 
CStartOfInterface
      SUBROUTINE SEAICE_GET_FORCING( myTime, myIter, myThid )
C     /==========================================================\
C     | SUBROUTINE SEAICE_GET_FORCING                            |
C     | o Load atmospheric state and runoff.                     |
C     |==========================================================|
C     \==========================================================/
      IMPLICIT NONE
 
C     === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "FFIELDS.h"
#include "SEAICE_PARAMS.h"
#include "SEAICE_FFIELDS.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

      INTEGER  ILNBLNK
      EXTERNAL 
 
#ifndef SEAICE_EXTERNAL_FORCING

C     === Local arrays ===
      COMMON /TDFIELDS_FLAGS/
     &                 wind0_is_first, flux0_is_first,
     &                 SSS0_is_first, SST0_is_first
      LOGICAL          wind0_is_first, flux0_is_first,
     &                 SSS0_is_first, SST0_is_first

C     === Local variables ===
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER bi,bj,i,j,iRec,iEnd
      _RL aWghtWind,bWghtWind,aWghtFlux,bWghtFlux,
     &     aWghtSSS,bWghtSSS,aWghtSST,bWghtSST
      _RS initValue
      _RL year, seconds, YearTime, four
      INTEGER CurrentYear, CurrentYear2
      logical done
      CHARACTER*(MAX_LEN_MBUF) fName

C--   Compute CurrentYear and YearTime
      four = 4.0
      YearTime = myTime
      done = .false.
      do year = StartingYear, EndingYear
         if( .not. done ) then
            if( mod(year,four) .eq. 0. ) then
               seconds = 366.*24.*60.*60.
            else
               seconds = 365.*24.*60.*60.
            endif
            if( YearTime-seconds .ge. 0. ) then
               YearTime = YearTime-seconds
            else
               CurrentYear = year
               done = .true.
            endif
         endif
      enddo
      if( CurrentYear.ge.2000 ) then
         CurrentYear2 = CurrentYear-2000
      else
         CurrentYear2 = CurrentYear-1900
      endif

C--   Check to see whether myTime is outside available forcing data
      IF(  CurrentYear.gt. EndingYear       .or.
     &     YearTime   .lt. WindForcingStart .or.
     &     YearTime   .gt. WindForcingEnd   .or.
     &     YearTime   .lt. FluxForcingStart .or.
     &     YearTime   .gt. FluxForcingEnd   .or.
     &     YearTime   .lt. SSTforcingStart  .or.
     &     YearTime   .gt. SSTforcingEnd    .or.
     &     YearTime   .lt. SSSforcingStart  .or.
     &     YearTime   .gt. SSSforcingEnd         ) THEN
         WRITE(msgBuf,'(A)') 'No Available Forcing Data'
         CALL PRINT_ERROR( msgBuf , 1)
         STOP 'ABNORMAL END: S/R SEAICE_GET_FORCING'
      ENDIF

C--   First call requires that we initialize everything for safety
      IF ( myIter .EQ. nIter0 ) THEN
       initValue = ZERO
       CALL INIT_ARRAY_RS( uwind0  , initValue, myThid )
       CALL INIT_ARRAY_RS( uwind1  , initValue, myThid )
       CALL INIT_ARRAY_RS( vwind0  , initValue, myThid )
       CALL INIT_ARRAY_RS( vwind1  , initValue, myThid )
       initValue = 283. _d 0
       CALL INIT_ARRAY_RS( atemp0  , initValue, myThid )
       CALL INIT_ARRAY_RS( atemp1  , initValue, myThid )
       initValue = 0.005 _d 0
       CALL INIT_ARRAY_RS( aqh0    , initValue, myThid )
       CALL INIT_ARRAY_RS( aqh1    , initValue, myThid )
       initValue = 300. _d 0
       CALL INIT_ARRAY_RS( lwdown0 , initValue, myThid )
       CALL INIT_ARRAY_RS( lwdown1 , initValue, myThid )
       initValue = 200. _d 0
       CALL INIT_ARRAY_RS( swdown0 , initValue, myThid )
       CALL INIT_ARRAY_RS( swdown1 , initValue, myThid )
       initValue = ZERO
       CALL INIT_ARRAY_RS( precip0 , initValue, myThid )
       CALL INIT_ARRAY_RS( precip1 , initValue, myThid )
       CALL INIT_ARRAY_RS( evap0   , initValue, myThid )
       CALL INIT_ARRAY_RS( evap1   , initValue, myThid )
       CALL INIT_ARRAY_RS( runoff0 , initValue, myThid )
       CALL INIT_ARRAY_RS( runoff1 , initValue, myThid )
       initValue = 35. _d 0
       CALL INIT_ARRAY_RS( SSSsi0  , initValue, myThid )
       CALL INIT_ARRAY_RS( SSSsi1  , initValue, myThid )
       initValue = 10. _d 0
       CALL INIT_ARRAY_RS( SSTsi0  , initValue, myThid )
       CALL INIT_ARRAY_RS( SSTsi1  , initValue, myThid )

       wind0_is_first = .TRUE.
       flux0_is_first = .TRUE.
       SSS0_is_first  = .TRUE.
       SST0_is_first  = .TRUE.

       _BEGIN_MASTER(myThid)
       write(0,*)
     &  'S/R SEAICE_GET_FORCING: initialize',myTime,myIter

       iRec = int((YearTime-WindForcingStart)/WindForcingPeriod) + 1
       IF ( uwindFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( uwindFile ) - 2
        WRITE(fName,'(A,I2.2)') uwindFile(1:iEnd), CurrentYear2
        CALL READ_REC_XY_RS( fName,uwind0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,uwind1,iRec+1,myIter,myThid )
       ENDIF
       IF ( vwindFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( vwindFile ) - 2
        WRITE(fName,'(A,I2.2)') vwindFile(1:iEnd), CurrentYear2
        CALL READ_REC_XY_RS( fName,vwind0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,vwind1,iRec+1,myIter,myThid )
       ENDIF

       iRec = int((YearTime-FluxForcingStart)/FluxForcingPeriod) + 1
       IF ( atempFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( atempFile ) - 4
        WRITE(fName,'(A,I4.4)') atempFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,atemp0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,atemp1,iRec+1,myIter,myThid )
       ENDIF
       IF ( aqhFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( aqhFile ) - 4
        WRITE(fName,'(A,I4.4)') aqhFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,aqh0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,aqh1,iRec+1,myIter,myThid )
       ENDIF
       IF ( lwdownFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( lwdownFile ) - 4
        WRITE(fName,'(A,I4.4)') lwdownFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,lwdown0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,lwdown1,iRec+1,myIter,myThid )
       ENDIF
       IF ( swdownFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( swdownFile ) - 4
        WRITE(fName,'(A,I4.4)') swdownFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,swdown0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,swdown1,iRec+1,myIter,myThid )
       ENDIF
       IF ( precipFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( precipFile ) - 4
        WRITE(fName,'(A,I4.4)') precipFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,precip0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,precip1,iRec+1,myIter,myThid )
       ENDIF
       IF ( evapFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( evapFile ) - 4
        WRITE(fName,'(A,I4.4)') evapFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,evap0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,evap1,iRec+1,myIter,myThid )
       ENDIF
       IF ( runoffFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( runoffFile ) - 4
        WRITE(fName,'(A,I4.4)') runoffFile(1:iEnd), CurrentYear
        CALL READ_REC_XY_RS( fName,runoff0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,runoff1,iRec+1,myIter,myThid )
       ENDIF

       iRec = int((YearTime-SSTforcingStart)/SSTforcingPeriod) + 1
       IF ( thetaClimFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( thetaClimFile ) - 2
        WRITE(fName,'(A,I2.2)') thetaClimFile(1:iEnd), CurrentYear2
        CALL READ_REC_XY_RS( fName,SSTsi0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( fName,SSTsi1,iRec+1,myIter,myThid )
       ENDIF

       iRec = int((YearTime-SSSforcingStart)/SSSforcingPeriod) + 1
       IF ( saltClimFile .NE. ' ' ) THEN
        CALL READ_REC_XY_RS( saltClimFile,SSSsi0,iRec  ,myIter,myThid )
        CALL READ_REC_XY_RS( saltClimFile,SSSsi1,iRec+1,myIter,myThid )
       ENDIF

       _END_MASTER(myThid)

       CALL EXCH_UV_XY_RS(uwind0, vwind0, .TRUE., myThid)
       CALL EXCH_UV_XY_RS(uwind1, vwind1, .TRUE., myThid)
       _EXCH_XY_R4( atemp0,  myThid )
       _EXCH_XY_R4( atemp1,  myThid )
       _EXCH_XY_R4( aqh0,    myThid )
       _EXCH_XY_R4( aqh1,    myThid )
       _EXCH_XY_R4( lwdown0, myThid )
       _EXCH_XY_R4( lwdown1, myThid )
       _EXCH_XY_R4( swdown0, myThid )
       _EXCH_XY_R4( swdown1, myThid )
       _EXCH_XY_R4( precip0, myThid )
       _EXCH_XY_R4( precip1, myThid )
       _EXCH_XY_R4( evap0,   myThid )
       _EXCH_XY_R4( evap1,   myThid )
       _EXCH_XY_R4( runoff0, myThid )
       _EXCH_XY_R4( runoff1, myThid )
       _EXCH_XY_R4( SSTsi0,  myThid )
       _EXCH_XY_R4( SSTsi1,  myThid )
       _EXCH_XY_R4( SSSsi0,  myThid )
       _EXCH_XY_R4( SSSsi1,  myThid )

      ENDIF

C--   Now calculate whether if it is time to update wind speed arrays
      iRec = int((YearTime-WindForcingStart)/WindForcingPeriod) + 2
      aWghtWind = mod(YearTime-WindForcingStart,WindForcingPeriod) /
     &        WindForcingPeriod
      bWghtWind=ONE-aWghtWind
      IF ( aWghtWind .EQ. 0 ) THEN
       _BEGIN_MASTER(myThid)
       write(0,*)
     &  'S/R SEAICE_GET_FORCING: reading winds',myTime,myIter
       IF ( uwindFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( uwindFile ) - 2
        WRITE(fName,'(A,I2.2)') uwindFile(1:iEnd), CurrentYear2
        IF (wind0_is_first) THEN
         CALL READ_REC_XY_RS( fName,uwind0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,uwind1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( vwindFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( vwindFile ) - 2
        WRITE(fName,'(A,I2.2)') vwindFile(1:iEnd), CurrentYear2
        IF (wind0_is_first) THEN
         CALL READ_REC_XY_RS( fName,vwind0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,vwind1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       _END_MASTER(myThid)
       IF (wind0_is_first) THEN
        CALL EXCH_UV_XY_RS(uwind0, vwind0, .TRUE., myThid)
        wind0_is_first=.FALSE.
       ELSE
        CALL EXCH_UV_XY_RS(uwind1, vwind1, .TRUE., myThid)
        wind0_is_first=.TRUE.
       ENDIF
      ENDIF

C--   Now calculate whether if it is time to update heat and freshwater flux
      iRec = int((YearTime-FluxForcingStart)/FluxForcingPeriod) + 2
      aWghtFlux = mod(YearTime-FluxForcingStart,FluxForcingPeriod) /
     &        FluxForcingPeriod
      bWghtFlux=ONE-aWghtFlux
      IF ( aWghtFlux .EQ. 0 ) THEN
       _BEGIN_MASTER(myThid)
       write(0,*)
     &  'S/R SEAICE_GET_FORCING: reading fluxes',myTime,myIter
       IF ( atempFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( atempFile ) - 4
        WRITE(fName,'(A,I4.4)') atempFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,atemp0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,atemp1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( aqhFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( aqhFile ) - 4
        WRITE(fName,'(A,I4.4)') aqhFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,aqh0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,aqh1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( lwdownFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( lwdownFile ) - 4
        WRITE(fName,'(A,I4.4)') lwdownFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,lwdown0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,lwdown1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( swdownFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( swdownFile ) - 4
        WRITE(fName,'(A,I4.4)') swdownFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,swdown0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,swdown1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( precipFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( precipFile ) - 4
        WRITE(fName,'(A,I4.4)') precipFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,precip0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,precip1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( evapFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( evapFile ) - 4
        WRITE(fName,'(A,I4.4)') evapFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,evap0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,evap1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       IF ( runoffFile .NE. ' ' ) THEN
        iEnd = ILNBLNK( runoffFile ) - 4
        WRITE(fName,'(A,I4.4)') runoffFile(1:iEnd), CurrentYear
        IF (flux0_is_first) THEN
         CALL READ_REC_XY_RS( fName,runoff0,iRec,myIter,myThid )
        ELSE
         CALL READ_REC_XY_RS( fName,runoff1,iRec,myIter,myThid )
        ENDIF
       ENDIF
       _END_MASTER(myThid)
       IF (flux0_is_first) THEN
        _EXCH_XY_R4(atemp0,  myThid )
        _EXCH_XY_R4(aqh0,    myThid )
        _EXCH_XY_R4(lwdown0, myThid )
        _EXCH_XY_R4(swdown0, myThid )
        _EXCH_XY_R4(precip0, myThid )
        _EXCH_XY_R4(evap0,   myThid )
        _EXCH_XY_R4(runoff0, myThid )
        flux0_is_first=.FALSE.
       ELSE
        _EXCH_XY_R4(atemp1,  myThid )
        _EXCH_XY_R4(aqh1,    myThid )
        _EXCH_XY_R4(lwdown1, myThid )
        _EXCH_XY_R4(swdown1, myThid )
        _EXCH_XY_R4(precip1, myThid )
        _EXCH_XY_R4(evap1,   myThid )
        _EXCH_XY_R4(runoff1, myThid )
        flux0_is_first=.TRUE.
       ENDIF
      ENDIF

C--   Now calculate whether if it is time to update SST array
      iRec = int((YearTime-SSTforcingStart)/SSTforcingPeriod) + 2
      aWghtSST = mod(YearTime-SSTforcingStart,SSTforcingPeriod) /
     &        SSTforcingPeriod
      bWghtSST=ONE-aWghtSST
      IF ( aWghtSST .EQ. 0 .AND. thetaClimFile .NE. ' ' ) THEN
       _BEGIN_MASTER(myThid)
       write(0,*) 'S/R SEAICE_GET_FORCING: reading SST',myTime,myIter
       iEnd = ILNBLNK( thetaClimFile ) - 2
       WRITE(fName,'(A,I2.2)') thetaClimFile(1:iEnd), CurrentYear2
       IF (SST0_is_first) THEN
        CALL READ_REC_XY_RS( fName,SSTsi0,iRec,myIter,myThid )
       ELSE
        CALL READ_REC_XY_RS( fName,SSTsi1,iRec,myIter,myThid )
       ENDIF
       _END_MASTER(myThid)
       IF (SST0_is_first) THEN
        _EXCH_XY_R4( SSTsi0, myThid )
        SST0_is_first=.FALSE.
       ELSE
        _EXCH_XY_R4( SSTsi1, myThid )
        SST0_is_first=.TRUE.
       ENDIF
      ENDIF

C--   Now calculate whether if it is time to update SSS array
      iRec = int((YearTime-SSSforcingStart)/SSSforcingPeriod) + 2
      aWghtSSS = mod(YearTime-SSSforcingStart,SSSforcingPeriod) /
     &        SSSforcingPeriod
      bWghtSSS=ONE-aWghtSSS
      IF ( aWghtSSS .EQ. 0 .AND. saltClimFile .NE. ' ') THEN
       _BEGIN_MASTER(myThid)
       write(0,*) 'S/R SEAICE_GET_FORCING: reading SSS',myTime,myIter
       IF (SSS0_is_first) THEN
        CALL READ_REC_XY_RS( saltClimFile,SSSsi0,iRec,myIter,myThid )
       ELSE
        CALL READ_REC_XY_RS( saltClimFile,SSSsi1,iRec,myIter,myThid )
       ENDIF
       _END_MASTER(myThid)
       IF (SSS0_is_first) THEN
        _EXCH_XY_R4( SSSsi0, myThid )
        SSS0_is_first=.FALSE.
       ELSE
        _EXCH_XY_R4( SSSsi1, myThid )
        SSS0_is_first=.TRUE.
       ENDIF
      ENDIF

C--   Time interpolation of wind forcing variables.
      IF (wind0_is_first) THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           uwind(i,j,bi,bj) = bWghtWind *  uwind0(i,j,bi,bj) +
     &                        aWghtWind *  uwind1(i,j,bi,bj)
           vwind(i,j,bi,bj) = bWghtWind *  vwind0(i,j,bi,bj) +
     &                        aWghtWind *  vwind1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ELSE
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           uwind(i,j,bi,bj) = aWghtWind *  uwind0(i,j,bi,bj) +
     &                        bWghtWind *  uwind1(i,j,bi,bj)
           vwind(i,j,bi,bj) = aWghtWind *  vwind0(i,j,bi,bj) +
     &                        bWghtWind *  vwind1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDIF

C--   Time interpolation of flux forcing variables.
      IF (flux0_is_first) THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
          atemp(i,j,bi,bj)  = bWghtFlux *  atemp0(i,j,bi,bj) +
     &                        aWghtFlux *  atemp1(i,j,bi,bj)
          aqh(i,j,bi,bj)    = bWghtFlux *    aqh0(i,j,bi,bj) +
     &                        aWghtFlux *    aqh1(i,j,bi,bj)
          lwdown(i,j,bi,bj) = bWghtFlux * lwdown0(i,j,bi,bj) +
     &                        aWghtFlux * lwdown1(i,j,bi,bj)
          swdown(i,j,bi,bj) = bWghtFlux * swdown0(i,j,bi,bj) +
     &                        aWghtFlux * swdown1(i,j,bi,bj)
          precip(i,j,bi,bj) = bWghtFlux * precip0(i,j,bi,bj) +
     &                        aWghtFlux *   precip1(i,j,bi,bj)
          evap(i,j,bi,bj)   = bWghtFlux *   evap0(i,j,bi,bj) +
     &                        aWghtFlux *   evap1(i,j,bi,bj)
          runoff(i,j,bi,bj) = bWghtFlux * runoff0(i,j,bi,bj) +
     &                        aWghtFlux * runoff1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ELSE
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
          atemp(i,j,bi,bj)  = aWghtFlux *  atemp0(i,j,bi,bj) +
     &                        bWghtFlux *  atemp1(i,j,bi,bj)
          aqh(i,j,bi,bj)    = aWghtFlux *    aqh0(i,j,bi,bj) +
     &                        bWghtFlux *    aqh1(i,j,bi,bj)
          lwdown(i,j,bi,bj) = aWghtFlux * lwdown0(i,j,bi,bj) +
     &                        bWghtFlux * lwdown1(i,j,bi,bj)
          swdown(i,j,bi,bj) = aWghtFlux * swdown0(i,j,bi,bj) +
     &                        bWghtFlux * swdown1(i,j,bi,bj)
          precip(i,j,bi,bj) = aWghtFlux * precip0(i,j,bi,bj) +
     &                        bWghtFlux * precip1(i,j,bi,bj)
          evap(i,j,bi,bj)   = aWghtFlux *   evap0(i,j,bi,bj) +
     &                        bWghtFlux *   evap1(i,j,bi,bj)
          runoff(i,j,bi,bj) = aWghtFlux * runoff0(i,j,bi,bj) +
     &                        bWghtFlux * runoff1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDIF

C--   Time interpolation of SSS forcing variables.
      IF (SSS0_is_first) THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           SSS(i,j,bi,bj)   = bWghtSSS  *   SSSsi0(i,j,bi,bj) +
     &                        aWghtSSS  *   SSSsi1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ELSE
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           SSS(i,j,bi,bj)   = aWghtSSS  *   SSSsi0(i,j,bi,bj) +
     &                        bWghtSSS  *   SSSsi1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDIF

C--   Time interpolation of SST forcing variables.
      IF (SST0_is_first) THEN
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           SST(i,j,bi,bj)   = bWghtSST  *   SSTsi0(i,j,bi,bj) +
     &                        aWghtSST  *   SSTsi1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ELSE
       DO bj = myByLo(myThid), myByHi(myThid)
        DO bi = myBxLo(myThid), myBxHi(myThid)
         DO j=1-Oly,sNy+Oly
          DO i=1-Olx,sNx+Olx
           SST(i,j,bi,bj)   = aWghtSST  *   SSTsi0(i,j,bi,bj) +
     &                        bWghtSST  *   SSTsi1(i,j,bi,bj)
          ENDDO
         ENDDO
        ENDDO
       ENDDO
      ENDIF

#endif /* SEAICE_EXTERNAL_FORCING */

      RETURN
      END


C======================================================================= SUBROUTINE INIT_ARRAY_RS( arr, initValue, myThid ) C This routine sets the RS array arr to initValue IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" C === Arguments === _RS arr (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) _RS initValue INTEGER myThid #ifndef SEAICE_EXTERNAL_FORCING C === Local variables === INTEGER i,j,bi,bj C DO bj = myByLo(myThid), myByHi(myThid) DO bi = myBxLo(myThid), myBxHi(myThid) DO j = 1-Oly,sNy+Oly DO i = 1-Olx,sNx+Olx arr(i,j,bi,bj) = initValue ENDDO ENDDO ENDDO ENDDO #endif /* SEAICE_EXTERNAL_FORCING */ RETURN END