C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_readparms.F,v 1.23 2017/08/09 15:23:36 mlosch Exp $
C $Name:  $

#include "THSICE_OPTIONS.h"

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

C     !DESCRIPTION: \bv
C     *==========================================================*
C     | S/R THSICE_READPARMS
C     | o Routine to initialize THSICE parameters and constants
C     *==========================================================*
C     | Initialize Th-Sea-ICE parameters, read in data.ice
C     *==========================================================*
C     \ev

C     !USES:
      IMPLICIT NONE

C     === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "THSICE_PARAMS.h"
#ifdef ALLOW_MNC
#include "MNC_PARAMS.h"
#endif
#ifdef ALLOW_COST
#include "THSICE_COST.h"
#endif
C     !INPUT/OUTPUT PARAMETERS:
C     === Routine arguments ===
C     myThid    :: My Thread Id. number
      INTEGER myThid
CEOP

#ifdef ALLOW_THSICE

C     === Local variables ===
C     msgBuf    :: Informational/error message buffer
C     iUnit     :: Work variable for IO unit number
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      CHARACTER*(20) fmtR, fmtI, fmtL, fmtC
      INTEGER iUnit

C--   Th-Sea-ICE parameter
      NAMELIST //THSICE_CONST
     &  rhos, rhoi, rhosw, rhofw,
     &  cpIce, cpWater,
     &  kIce, kSnow,
     &  bMeltCoef, Lfresh, qsnow,
     &  albColdSnow, albWarmSnow, tempSnowAlb,
     &  albOldSnow, hNewSnowAge, snowAgTime,
     &  albIceMax, albIceMin, hAlbIce, hAlbSnow,
     &  i0swFrac, ksolar, dhSnowLin,
     &  saltIce, S_winton, mu_Tf,
     &  Tf0kel, Terrmax, nitMaxTsf,
     &  hIceMin, hiMax, hsMax, iceMaskMax, iceMaskMin,
     &  fracEnMelt, fracEnFreez, hThinIce, hThickIce, hNewIceMax

      NAMELIST //THSICE_PARM01
     &     startIceModel, stepFwd_oceMxL, thSIce_calc_albNIR,
     &     thSIce_skipThermo, thSIce_deltaT, thSIce_dtTemp,
     &     ocean_deltaT, tauRelax_MxL, tauRelax_MxL_salt,
     &     hMxL_default, sMxL_default, vMxL_default,
     &     thSIce_diffK, thSIceAdvScheme, stressReduction,
     &     thSIceBalanceAtmFW,
     &     thSIce_taveFreq, thSIce_diagFreq, thSIce_monFreq,
     &     thSIce_tave_mnc, thSIce_snapshot_mnc, thSIce_mon_mnc,
     &     thSIce_pickup_read_mnc, thSIce_pickup_write_mnc,
     &     thSIceFract_InitFile, thSIceThick_InitFile,
     &     thSIceSnowH_InitFile, thSIceSnowA_InitFile,
     &     thSIceEnthp_InitFile, thSIceTsurf_InitFile

#ifdef ALLOW_COST
      NAMELIST //THSICE_COST
     &     mult_thsice, thsice_cost_ice_flag
#endif

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

      IF ( .NOT.useThSIce ) THEN
C-    pkg THSICE is not used
        _BEGIN_MASTER(myThid)
C-    Track pkg activation status:
C     print a (weak) warning if data.ice is found
         CALL PACKAGES_UNUSED_MSG( 'useThSIce', ' ', 'ice' )
        _END_MASTER(myThid)
        RETURN
      ENDIF

      _BEGIN_MASTER(myThid)

      WRITE(msgBuf,'(A)') ' THSICE_READPARMS: opening data.ice'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , 1)

      CALL OPEN_COPY_DATA_FILE(
     I                          'data.ice', 'THSICE_READPARMS',
     O                          iUnit,
     I                          myThid )

C--   Default values (constants)
      rhos     = 330. _d 0
      rhoi     = 900. _d 0
      rhosw    = rhoConst
      rhofw    = rhoConstFresh
      cpIce    = 2106. _d 0
      cpWater  = HeatCapacity_Cp
      kIce     = 2.03 _d 0
      kSnow    = 0.30 _d 0
      bMeltCoef=0.006 _d 0
      Lfresh   = 3.34 _d 5
      qsnow    = Lfresh
      albColdSnow= 0.85 _d 0
      albWarmSnow= 0.70 _d 0
      tempSnowAlb= -10. _d 0
      albOldSnow = 0.55 _d 0
      albIceMax  = 0.65 _d 0
      albIceMin  = 0.20 _d 0
      hAlbIce    = 0.50 _d 0
      hAlbSnow   = 0.30 _d 0
      hNewSnowAge= 2. _d -3
      snowAgTime = 50. _d 0 * 86400. _d 0
      i0swFrac = 0.3 _d 0
      ksolar   = 1.5 _d 0
      dhSnowLin= 0. _d 0
      saltIce  = 4. _d 0
      S_winton = 1. _d 0
      mu_Tf    = 0.054 _d 0
      Tf0kel   = celsius2K
      Terrmax  = 5.0 _d -1
      nitMaxTsf= 20
      hIceMin    = 1. _d -2
      hiMax      = 10. _d 0
      hsMax      = 10. _d 0
      iceMaskMax =  1. _d 0
      iceMaskMin = 0.1 _d 0
      fracEnMelt = 0.4 _d 0
      fracEnFreez=  0. _d 0
      hThinIce   = 0.2 _d 0
      hThickIce  = 2.5 _d 0
      hNewIceMax = UNSET_RL

C--   Default values (parameters)
      stepFwd_oceMxL  = .FALSE.
      thSIce_skipThermo  = .FALSE.
      thSIce_calc_albNIR = .FALSE.
      startIceModel   = 0
      thSIce_deltaT   = dTtracerLev(1)
      thSIce_dtTemp   = UNSET_RL
      ocean_deltaT    = dTtracerLev(1)
      tauRelax_MxL    = 0. _d 0
      tauRelax_MxL_salt = UNSET_RL
      hMxL_default    = 50. _d 0
      sMxL_default    = 35. _d 0
      vMxL_default    = 5. _d -2
      thSIce_diffK    = 0. _d 0
      thSIceAdvScheme = 0
      stressReduction = 1. _d 0
      IF ( useSEAICE ) stressReduction = 0. _d 0
      thSIceBalanceAtmFW  = 0
      thSIce_taveFreq = taveFreq
      thSIce_diagFreq = dumpFreq
      thSIce_monFreq  = monitorFreq
#ifdef ALLOW_MNC
      thSIce_tave_mnc     = timeave_mnc
      thSIce_snapshot_mnc = snapshot_mnc
      thSIce_mon_mnc      = monitor_mnc
      thSIce_pickup_read_mnc  = pickup_read_mnc
      thSIce_pickup_write_mnc = pickup_write_mnc
#else
      thSIce_tave_mnc     = .FALSE.
      thSIce_snapshot_mnc = .FALSE.
      thSIce_mon_mnc      = .FALSE.
      thSIce_pickup_read_mnc  = .FALSE.
      thSIce_pickup_write_mnc = .FALSE.
#endif
      thSIceFract_InitFile = ' '
      thSIceThick_InitFile = ' '
      thSIceSnowH_InitFile = ' '
      thSIceSnowA_InitFile = ' '
      thSIceEnthp_InitFile = ' '
      thSIceTsurf_InitFile = ' '

#ifdef ALLOW_COST
      thsice_cost_ice_flag = 1
      mult_thsice = 0. _d 0
#endif

C--   Read parameters from open data file
      READ(UNIT=iUnit,NML=THSICE_CONST)
      WRITE(msgBuf,'(A)') ' THSICE_READPARMS: read THSICE_CONST'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , 1)

      READ(UNIT=iUnit,NML=THSICE_PARM01)
      WRITE(msgBuf,'(A)') ' THSICE_READPARMS: read THSICE_PARM01'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , 1)

#ifdef ALLOW_COST
      READ(UNIT=iUnit,NML=THSICE_COST)
      WRITE(msgBuf,'(A)') ' THSICE_READPARMS: read THSICE_COST'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , 1)
#endif

C--   Close the open data file
#ifdef SINGLE_DISK_IO
      CLOSE(iUnit)
#else
      CLOSE(iUnit,STATUS='DELETE')
#endif /* SINGLE_DISK_IO */

C-    neutral default:
      IF ( hNewIceMax .EQ. UNSET_RL ) hNewIceMax = hiMax

C     If using the same time step for both icetop temp solver
C     and ice thickness/growth, use thSIce_deltaT value
      IF ( thSIce_dtTemp .EQ. UNSET_RL ) thSIce_dtTemp=thSIce_deltaT

C-    If undef, set salt relax to temperature relax
      IF ( tauRelax_MxL_salt .EQ. UNSET_RL ) THEN
           tauRelax_MxL_salt = tauRelax_MxL
      ENDIF

C-    Define other constants (from previous ones):
      Tmlt1=-mu_Tf*S_winton
      floodFac = (rhosw - rhoi)/rhos

C     Set I/O parameters
      thSIce_tave_mdsio     = .TRUE.
      thSIce_snapshot_mdsio = .TRUE.
      thSIce_mon_stdio      = .TRUE.
      thSIce_pickup_write_mdsio = .TRUE.
#ifdef ALLOW_MNC
      IF (useMNC) THEN
        IF ( .NOT.outputTypesInclusive
     &       .AND. thSIce_tave_mnc ) thSIce_tave_mdsio = .FALSE.
        IF ( .NOT.outputTypesInclusive
     &       .AND. thSIce_snapshot_mnc )
     &       thSIce_snapshot_mdsio = .FALSE.
        IF ( .NOT.outputTypesInclusive
     &       .AND. thSIce_mon_mnc  ) thSIce_mon_stdio  = .FALSE.
        IF ( .NOT.outputTypesInclusive
     &       .AND. thSIce_pickup_write_mnc  )
     &       thSIce_pickup_write_mdsio = .FALSE.
      ENDIF
#endif

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C--   Check/reset parameters:
      IF ( useSEAICE .AND. stressReduction.NE.0. _d 0 ) THEN
C--     If useSEAICE=.true., the stress is computed in seaice_model,
C--     so that it does not need any further reduction
        WRITE(msgBuf,'(2A)') '** WARNING ** THSICE_READPARMS:',
     &                       ' reset stressReduction to zero'
        CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                      SQUEEZE_RIGHT, myThid )
        WRITE(msgBuf,'(2A)') 'THSICE_READPARMS: useSEAICE=T =>',
     &       ' stress is be computed by SEAICE pkg => no reduction'
        CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                      SQUEEZE_RIGHT, myThid )
        stressReduction = 0. _d 0
      ENDIF
      IF ( fluidIsAir .AND. thSIceBalanceAtmFW.NE.0 ) THEN
        WRITE(msgBuf,'(2A)') '** WARNING ** THSICE_READPARMS:',
     &                       ' reset thSIceBalanceAtmFW to zero'
        CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                      SQUEEZE_RIGHT, myThid )
        WRITE(msgBuf,'(2A)') 'THSICE_READPARMS:',
     &       ' since it is not available in Atmospheric set-up'
        CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
     &                      SQUEEZE_RIGHT, myThid )
        thSIceBalanceAtmFW = 0
      ENDIF

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
      iUnit = standardMessageUnit
      fmtR = '(A6,A20,1PE21.13)'
      fmtI = '(A6,A20,I10)'
      fmtL = '(A6,A20,L10)'
      fmtC = '(A26,1X,A)'
c     CALL MDSFINDUNIT( iUnit, myThid )
c     OPEN(iUnit,file='thsice_check_params',status='unknown')
      WRITE(iUnit,fmtR) 'ThSI:', 'rhos        =', rhos
      WRITE(iUnit,fmtR) 'ThSI:', 'rhoi        =', rhoi
      WRITE(iUnit,fmtR) 'ThSI:', 'rhosw       =', rhosw
      WRITE(iUnit,fmtR) 'ThSI:', 'rhofw       =', rhofw
      WRITE(iUnit,fmtR) 'ThSI:', 'floodFac    =', floodFac
      WRITE(iUnit,fmtR) 'ThSI:', 'cpIce       =', cpIce
      WRITE(iUnit,fmtR) 'ThSI:', 'cpWater     =', cpWater
      WRITE(iUnit,fmtR) 'ThSI:', 'kIce        =', kIce
      WRITE(iUnit,fmtR) 'ThSI:', 'kSnow       =', kSnow
      WRITE(iUnit,fmtR) 'ThSI:', 'bMeltCoef   =', bMeltCoef
      WRITE(iUnit,fmtR) 'ThSI:', 'Lfresh      =', Lfresh
      WRITE(iUnit,fmtR) 'ThSI:', 'qsnow       =', qsnow
      WRITE(iUnit,fmtR) 'ThSI:', 'albColdSnow =', albColdSnow
      WRITE(iUnit,fmtR) 'ThSI:', 'albWarmSnow =', albWarmSnow
      WRITE(iUnit,fmtR) 'ThSI:', 'tempSnowAlb =', tempSnowAlb
      WRITE(iUnit,fmtR) 'ThSI:', 'albOldSnow  =', albOldSnow
      WRITE(iUnit,fmtR) 'ThSI:', 'hNewSnowAge =', hNewSnowAge
      WRITE(iUnit,fmtR) 'ThSI:', 'snowAgTime  =', snowAgTime
      WRITE(iUnit,fmtR) 'ThSI:', 'albIceMax   =', albIceMax
      WRITE(iUnit,fmtR) 'ThSI:', 'albIceMin   =', albIceMin
      WRITE(iUnit,fmtR) 'ThSI:', 'hAlbIce     =', hAlbIce
      WRITE(iUnit,fmtR) 'ThSI:', 'hAlbSnow    =', hAlbSnow
      WRITE(iUnit,fmtR) 'ThSI:', 'i0swFrac    =', i0swFrac
      WRITE(iUnit,fmtR) 'ThSI:', 'ksolar      =', ksolar
      WRITE(iUnit,fmtR) 'ThSI:', 'dhSnowLin   =', dhSnowLin
      WRITE(iUnit,fmtR) 'ThSI:', 'saltIce     =', saltIce
      WRITE(iUnit,fmtR) 'ThSI:', 'S_winton    =', S_winton
      WRITE(iUnit,fmtR) 'ThSI:', 'mu_Tf       =', mu_Tf
      WRITE(iUnit,fmtR) 'ThSI:', 'Tf0kel      =', Tf0kel
      WRITE(iUnit,fmtR) 'ThSI:', 'Tmlt1       =', Tmlt1
      WRITE(iUnit,fmtR) 'ThSI:', 'Terrmax     =', Terrmax
      WRITE(iUnit,fmtI) 'ThSI:', 'nitMaxTsf   =', nitMaxTsf
      WRITE(iUnit,fmtR) 'ThSI:', 'hIceMin     =', hIceMin
      WRITE(iUnit,fmtR) 'ThSI:', 'hiMax       =', hiMax
      WRITE(iUnit,fmtR) 'ThSI:', 'hsMax       =', hsMax
      WRITE(iUnit,fmtR) 'ThSI:', 'iceMaskMax  =', iceMaskMax
      WRITE(iUnit,fmtR) 'ThSI:', 'iceMaskMin  =', iceMaskMin
      WRITE(iUnit,fmtR) 'ThSI:', 'fracEnMelt  =', fracEnMelt
      WRITE(iUnit,fmtR) 'ThSI:', 'fracEnFreez =', fracEnFreez
      WRITE(iUnit,fmtR) 'ThSI:', 'hThinIce    =', hThinIce
      WRITE(iUnit,fmtR) 'ThSI:', 'hThickIce   =', hThickIce
      WRITE(iUnit,fmtR) 'ThSI:', 'hNewIceMax  =', hNewIceMax
      WRITE(iUnit,fmtR) 'ThSI:','stressReduction   =',stressReduction
      WRITE(iUnit,fmtL) 'ThSI:','thSIce_skipThermo =',thSIce_skipThermo
      WRITE(iUnit,fmtI) 'ThSI:','thSIceAdvScheme   =',thSIceAdvScheme
      WRITE(iUnit,fmtI) 'ThSI:','thSIceBalanceAtmFW=',thSIceBalanceAtmFW
      WRITE(iUnit,fmtR) 'ThSI:','thSIce_diffK      =',thSIce_diffK
      WRITE(iUnit,fmtR) 'ThSI:','thSIce_deltaT     =',thSIce_deltaT
      WRITE(iUnit,fmtR) 'ThSI:','ocean_deltaT      =',ocean_deltaT
      WRITE(iUnit,fmtL) 'ThSI:','stepFwd_oceMxL    =',stepFwd_oceMxL
      WRITE(iUnit,fmtR) 'ThSI:','tauRelax_MxL      =',tauRelax_MxL
      WRITE(iUnit,fmtR) 'ThSI:','tauRelax_MxL_salt =',tauRelax_MxL_salt
      WRITE(iUnit,fmtR) 'ThSI:','hMxL_default      =',hMxL_default
      WRITE(iUnit,fmtR) 'ThSI:','sMxL_default      =',sMxL_default
      WRITE(iUnit,fmtR) 'ThSI:','vMxL_default      =',vMxL_default
      WRITE(iUnit,fmtR) 'ThSI:','thSIce_taveFreq   =',thSIce_taveFreq
      WRITE(iUnit,fmtR) 'ThSI:','thSIce_diagFreq   =',thSIce_diagFreq
      WRITE(iUnit,fmtR) 'ThSI:','thSIce_monFreq    =',thSIce_monFreq
      WRITE(iUnit,fmtI) 'ThSI:','startIceModel     =',startIceModel
c     WRITE(iUnit,fmtC) 'thSIceFract_InitFile    =',thSIceFract_InitFile
      IF (iUnit.NE.standardMessageUnit) CLOSE(iUnit)
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

      _END_MASTER(myThid)

C--   Everyone else must wait for the parameters to be loaded
      _BARRIER

#endif /* ALLOW_THSICE */

      RETURN
      END