C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_init_fixed.F,v 1.26 2013/10/05 19:36:12 jmc Exp $
C $Name:  $

#include "EXF_OPTIONS.h"
#ifdef ALLOW_ICEFRONT
# include "ICEFRONT_OPTIONS.h"
#endif

CBOP
C     !ROUTINE: EXF_INIT_FIXED
C     !INTERFACE:
      SUBROUTINE EXF_INIT_FIXED( myThid )

C     !DESCRIPTION: \bv
C     *==========================================================*
C     | SUBROUTINE EXF_INIT_FIXED
C     | o Routine to initialize EXF variables
C     |   that are kept fixed during the run.
C     *==========================================================*
C     \ev
C     !USES:
      IMPLICIT NONE

C     === Global variables ===
#include "EEPARAMS.h"
#include "SIZE.h"
#include "PARAMS.h"
#include "EXF_PARAM.h"
#include "EXF_CONSTANTS.h"
#ifdef ALLOW_ICEFRONT
# include "ICEFRONT.h"
#endif

C     !INPUT/OUTPUT PARAMETERS:
C     === Routine arguments ===
C     myThid ::  my Thread Id number
      INTEGER myThid
CEOP

C     !LOCAL VARIABLES:
C     === Local variables ===
#ifdef USE_EXF_INTERPOLATION
      INTEGER j
#endif

#ifdef ALLOW_DEBUG
      IF (debugMode) CALL DEBUG_ENTER('EXF_INIT_FIXED',myThid)
#endif

      _BEGIN_MASTER( myThid )

C--   Set mask for each input field
C     ' ' = no masking; 'c' = centered mask; 'w' = western mask; 's' = southern
      hfluxmask    = 'c'
      sfluxmask    = 'c'
      atempmask    = 'c'
      aqhmask      = 'c'
      evapmask     = 'c'
      precipmask   = 'c'
      snowprecipmask='c'
      runoffmask   = 'c'
      IF ( stressIsOnCgrid ) THEN
       ustressmask = 'w'
       vstressmask = 's'
      ELSE
       ustressmask = 'c'
       vstressmask = 'c'
      ENDIF
      uwindmask    = 'c'
      vwindmask    = 'c'
      wspeedmask   = 'c'
      swfluxmask   = 'c'
      lwfluxmask   = 'c'
      swdownmask   = 'c'
      lwdownmask   = 'c'
      apressuremask= 'c'
      areamaskmask = 'c'
      climsstmask  = 'c'
      climsssmask  = 'c'
      climustrmask = 'w'
      climvstrmask = 's'
      sgrunoffmask = 'c'

      IF ( useSEAICE ) THEN
C     Avoid masking of vector fields with pkg/seaice (for B/C-grid interp.)
C     but keep it for fields that might involve calculation using SST on land
       hfluxmask    = ' '
       sfluxmask    = ' '
c      atempmask    = ' '
c      aqhmask      = ' '
c      evapmask     = ' '
c      precipmask   = ' '
c      snowprecipmask=' '
c      runoffmask   = ' '
       ustressmask  = ' '
       vstressmask  = ' '
       uwindmask    = ' '
       vwindmask    = ' '
       wspeedmask   = ' '
       swfluxmask   = ' '
       swdownmask   = ' '
c      lwfluxmask   = ' '
c      lwdownmask   = ' '
       apressuremask= ' '
c      areamaskmask = ' '
c      climsstmask  = ' '
c      climsssmask  = ' '
       climustrmask = ' '
       climvstrmask = ' '
c      sgrunoffmask = ' '
      ENDIF

C--   Complete the start date specifications for the forcing
C     fields to get a complete calendar date array.
C     FLDstartdate, for FLD = { uwind, vwind, wspeed, etc. },
C     returns time in seconds of first FLD record from the
C     beginning of the model integration or, if useYearlyFields,
C     from the beginning of the year.

      IF ( useAtmWind ) THEN
      IF ( uwindfile .NE. ' ' .AND. uwindperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START uwind',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          uwindstartdate1, uwindstartdate2,
     O                          uwindstartdate,
     I                          myThid )
      ENDIF
      IF ( vwindfile .NE. ' ' .AND. vwindperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START vwind',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          vwindstartdate1, vwindstartdate2,
     O                          vwindstartdate,
     I                          myThid )
      ENDIF
      ENDIF

      IF ( wspeedfile .NE. ' ' .AND. wspeedperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START wspeed',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          wspeedstartdate1, wspeedstartdate2,
     O                          wspeedstartdate,
     I                          myThid )
      ENDIF

      IF ( .NOT.useAtmWind ) THEN
      IF ( ustressfile .NE. ' ' .AND. ustressperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START ustress',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          ustressstartdate1, ustressstartdate2,
     O                          ustressstartdate,
     I                          myThid )
      ENDIF
      IF ( vstressfile .NE. ' ' .AND. vstressperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START vstress',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          vstressstartdate1, vstressstartdate2,
     O                          vstressstartdate,
     I                          myThid )
      ENDIF
      ENDIF

#ifdef ALLOW_ATM_TEMP
      IF ( atempfile .NE. ' ' .AND. atempperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START atemp',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          atempstartdate1, atempstartdate2,
     O                          atempstartdate,
     I                          myThid )
      ENDIF
      IF ( aqhfile .NE. ' ' .AND. aqhperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START aqh',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          aqhstartdate1, aqhstartdate2,
     O                          aqhstartdate,
     I                          myThid )
      ENDIF
      IF ( lwfluxfile .NE. ' ' .AND. lwfluxperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START lwflux',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          lwfluxstartdate1, lwfluxstartdate2,
     O                          lwfluxstartdate,
     I                          myThid )
      ENDIF
      IF ( precipfile .NE. ' ' .AND. precipperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START precip',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          precipstartdate1, precipstartdate2,
     O                          precipstartdate,
     I                          myThid )
      ENDIF
      IF ( snowprecipfile .NE. ' ' .AND. snowprecipperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode)
     &    CALL DEBUG_CALL('GETFIELD_START snowprecip',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                   snowprecipstartdate1, snowprecipstartdate2,
     O                   snowprecipstartdate,
     I                          myThid )
      ENDIF
#else /* ifndef ALLOW_ATM_TEMP */
      IF ( hfluxfile .NE. ' ' .AND. hfluxperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START hflux',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          hfluxstartdate1, hfluxstartdate2,
     O                          hfluxstartdate,
     I                          myThid )
      ENDIF
      IF ( sfluxfile .NE. ' ' .AND. sfluxperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START sflux',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          sfluxstartdate1, sfluxstartdate2,
     O                          sfluxstartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_ATM_TEMP */

#if defined(ALLOW_ATM_TEMP)  defined(SHORTWAVE_HEATING)
      IF ( swfluxfile .NE. ' ' .AND. swfluxperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START swflux',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          swfluxstartdate1, swfluxstartdate2,
     O                          swfluxstartdate,
     I                          myThid )
      ENDIF
#endif /* defined(ALLOW_ATM_TEMP) || defined(SHORTWAVE_HEATING) */

#ifdef EXF_READ_EVAP
      IF ( evapfile .NE. ' ' .AND. evapperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START evap',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          evapstartdate1, evapstartdate2,
     O                          evapstartdate,
     I                          myThid )
      ENDIF
#endif /* EXF_READ_EVAP */

#ifdef ALLOW_RUNOFF
      IF ( runofffile .NE. ' ' .AND. runoffperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START runoff',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          runoffstartdate1, runoffstartdate2,
     O                          runoffstartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_RUNOFF */

#ifdef ALLOW_ICEFRONT
      IF ( sgrunofffile .NE. ' ' .AND. sgrunoffperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START sgrunoff',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          sgrunoffstartdate1, sgrunoffstartdate2,
     O                          sgrunoffstartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_ICEFRONT */

#ifdef ALLOW_DOWNWARD_RADIATION
      IF ( swdownfile .NE. ' ' .AND. swdownperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START swdown',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          swdownstartdate1, swdownstartdate2,
     O                          swdownstartdate,
     I                          myThid )
      ENDIF
      IF ( lwdownfile .NE. ' ' .AND. lwdownperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START lwdown',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          lwdownstartdate1, lwdownstartdate2,
     O                          lwdownstartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_DOWNWARD_RADIATION */

#ifdef ATMOSPHERIC_LOADING
      IF ( apressurefile .NE. ' ' .AND. apressureperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode)
     &    CALL DEBUG_CALL('GETFIELD_START apressure',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                   apressurestartdate1, apressurestartdate2,
     O                   apressurestartdate,
     I                          myThid )
      ENDIF
#endif /* ATMOSPHERIC_LOADING */

#ifdef EXF_SEAICE_FRACTION
      IF ( areamaskfile .NE. ' ' .AND. areamaskperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START areamask',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          areamaskstartdate1, areamaskstartdate2,
     O                          areamaskstartdate,
     I                          myThid )
      ENDIF
#endif /* EXF_SEAICE_FRACTION */

#ifdef ALLOW_OBCS
      IF ( obcsNperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START obcsN',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          obcsNstartdate1, obcsNstartdate2,
     O                          obcsNstartdate,
     I                          myThid )
      ENDIF
      IF ( obcsSperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START obcsS',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          obcsSstartdate1, obcsSstartdate2,
     O                          obcsSstartdate,
     I                          myThid )
      ENDIF
      IF ( obcsEperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START obcsE',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          obcsEstartdate1, obcsEstartdate2,
     O                          obcsEstartdate,
     I                          myThid )
      ENDIF
      IF ( obcsWperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START obcsW',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          obcsWstartdate1, obcsWstartdate2,
     O                          obcsWstartdate,
     I                          myThid )
      ENDIF
# ifdef ALLOW_SEAICE
      IF ( siobNperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START siobN',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          siobNstartdate1, siobNstartdate2,
     O                          siobNstartdate,
     I                          myThid )
      ENDIF
      IF ( siobSperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START siobS',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          siobSstartdate1, siobSstartdate2,
     O                          siobSstartdate,
     I                          myThid )
      ENDIF
      IF ( siobEperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START siobE',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          siobEstartdate1, siobEstartdate2,
     O                          siobEstartdate,
     I                          myThid )
      ENDIF
      IF ( siobWperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START siobW',myThid)
# endif
       CALL EXF_GETFIELD_START( useOBCSYearlyFields,
     I                          siobWstartdate1, siobWstartdate2,
     O                          siobWstartdate,
     I                          myThid )
      ENDIF
# endif /* ALLOW_SEAICE */
#endif /* ALLOW_OBCS */

#ifdef ALLOW_CLIMSST_RELAXATION
      IF ( climsstfile .NE. ' ' .AND. climsstperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START climsst',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          climsststartdate1, climsststartdate2,
     O                          climsststartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_CLIMSST_RELAXATION */

#ifdef ALLOW_CLIMSSS_RELAXATION
      IF ( climsssfile .NE. ' ' .AND. climsssperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START climsss',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          climsssstartdate1, climsssstartdate2,
     O                          climsssstartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_CLIMSSS_RELAXATION */

#ifdef ALLOW_CLIMSTRESS_RELAXATION
      IF ( climustrfile .NE. ' ' .AND. climustrperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START climustr',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          climustrstartdate1, climustrstartdate2,
     O                          climustrstartdate,
     I                          myThid )
      ENDIF

      IF ( climvstrfile .NE. ' ' .AND. climvstrperiod .GT. 0. ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('GETFIELD_START climvstr',myThid)
# endif
       CALL EXF_GETFIELD_START( useExfYearlyFields,
     I                          climvstrstartdate1, climvstrstartdate2,
     O                          climvstrstartdate,
     I                          myThid )
      ENDIF
#endif /* ALLOW_CLIMSTRESS_RELAXATION */

#ifdef USE_EXF_INTERPOLATION
C--   For vector fields, set flag to interpolate the 2 components together
C-    wind-stress:
      IF ( .NOT.useAtmWind ) THEN
      uvInterp_stress = ustressfile.NE.' ' .AND. vstressfile.NE.' '
     &  .AND. ustress_interpMethod.GE.1 .AND. vstress_interpMethod.GE.1
      uvInterp_stress = uvInterp_stress
     &  .AND. ustressstartdate .EQ. vstressstartdate
     &  .AND. ustressperiod    .EQ. vstressperiod
      uvInterp_stress = uvInterp_stress
     &  .AND. ustress_nlon .EQ. vstress_nlon
     &  .AND. ustress_nlat .EQ. vstress_nlat
     &  .AND. ustress_lon0 .EQ. vstress_lon0
     &  .AND. ustress_lat0 .EQ. vstress_lat0
     &  .AND. ustress_lon_inc .EQ. vstress_lon_inc
      IF ( uvInterp_stress ) THEN
        DO j=1,MIN(ustress_nlat-1,MAX_LAT_INC)
          uvInterp_stress = uvInterp_stress
     &     .AND. ustress_lat_inc(j) .EQ. vstress_lat_inc(j)
        ENDDO
      ENDIF
      ENDIF
C-    wind:
      IF ( useAtmWind ) THEN
      uvInterp_wind = uwindfile.NE.' ' .AND. vwindfile.NE.' '
     &  .AND. uwind_interpMethod.GE.1 .AND. vwind_interpMethod.GE.1
      uvInterp_wind = uvInterp_wind
     &  .AND. uwindstartdate .EQ. vwindstartdate
     &  .AND. uwindperiod    .EQ. vwindperiod
      uvInterp_wind = uvInterp_wind
     &  .AND. uwind_nlon .EQ. vwind_nlon
     &  .AND. uwind_nlat .EQ. vwind_nlat
     &  .AND. uwind_lon0 .EQ. vwind_lon0
     &  .AND. uwind_lat0 .EQ. vwind_lat0
     &  .AND. uwind_lon_inc .EQ. vwind_lon_inc
      IF ( uvInterp_wind ) THEN
        DO j=1,MIN(uwind_nlat-1,MAX_LAT_INC)
          uvInterp_wind = uvInterp_wind
     &     .AND. uwind_lat_inc(j) .EQ. vwind_lat_inc(j)
        ENDDO
      ENDIF
      ENDIF
C-    clim wind-stress:
      uvInterp_climstr = climustrfile.NE.' ' .AND. climvstrfile.NE.' '
     &  .AND.climustr_interpMethod.GE.1 .AND.climvstr_interpMethod.GE.1
      uvInterp_climstr = uvInterp_climstr
     &  .AND. climustrstartdate .EQ. climvstrstartdate
     &  .AND. climustrperiod    .EQ. climvstrperiod
      uvInterp_climstr = uvInterp_climstr
     &  .AND. climustr_nlon .EQ. climvstr_nlon
     &  .AND. climustr_nlat .EQ. climvstr_nlat
     &  .AND. climustr_lon0 .EQ. climvstr_lon0
     &  .AND. climustr_lat0 .EQ. climvstr_lat0
     &  .AND. climustr_lon_inc .EQ. climvstr_lon_inc
      IF ( uvInterp_climstr ) THEN
        DO j=1,MIN(climustr_nlat-1,MAX_LAT_INC)
          uvInterp_climstr = uvInterp_climstr
     &     .AND. climustr_lat_inc(j) .EQ. climvstr_lat_inc(j)
        ENDDO
      ENDIF
# ifdef EXF_USE_OLD_INTERP_POLE
      uvInterp_stress = .FALSE.
      uvInterp_wind   = .FALSE.
      uvInterp_climstr= .FALSE.
# endif
#endif  /* USE_EXF_INTERPOLATION */

      _END_MASTER( myThid )
      _BARRIER

#ifdef ALLOW_ZENITHANGLE
      IF ( useExfZenAlbedo .OR. useExfZenIncoming ) THEN
# ifdef ALLOW_DEBUG
       IF (debugMode) CALL DEBUG_CALL('EXF_ZENITHANGLE_TABLE',myThid)
# endif
       CALL EXF_ZENITHANGLE_TABLE(myThid)
      ENDIF
#endif /* ALLOW_ZENITHANGLE */

C--   Summarize the External forcing setup.
# ifdef ALLOW_DEBUG
      IF (debugMode) CALL DEBUG_CALL('EXF_SUMMARY',myThid)
# endif
      CALL EXF_SUMMARY( myThid )

#ifdef ALLOW_DIAGNOSTICS
      IF ( useDiagnostics ) THEN
# ifdef ALLOW_DEBUG
        IF (debugMode) CALL DEBUG_CALL('EXF_DIAGNOSTICS_INIT',myThid)
# endif
        CALL EXF_DIAGNOSTICS_INIT( myThid )
      ENDIF
#endif

#ifdef ALLOW_DEBUG
      IF (debugMode) CALL DEBUG_LEAVE('EXF_INIT_FIXED',myThid)
#endif

      RETURN
      END