C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_readparms.F,v 1.17 2009/09/23 20:24:47 dfer 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
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
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_deltaT, thSIce_dtTemp,
& ocean_deltaT, tauRelax_MxL, tauRelax_MxL_salt,
& hMxL_default, sMxL_default, vMxL_default,
& thSIce_diffK, thSIceAdvScheme, stressReduction,
& 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
_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_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
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 = ' '
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)
C-- Close the open data file
CLOSE(iUnit)
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 parameter consistency:
IF ( thSIceAdvScheme.EQ.0 .AND. thSIce_diffK.NE.0. ) THEN
WRITE(msgBuf,'(2A)')
& 'THSICE_READPARMS: to use thSIce_diffK, needs to select',
& ' one advection scheme (thSIceAdvScheme<>0)'
CALL PRINT_ERROR( msgBuf , myThid )
STOP 'ABNORMAL END: THSICE_READPARMS'
ENDIF
#ifndef ALLOW_GENERIC_ADVDIFF
IF ( thSIceAdvScheme.NE.0 ) THEN
WRITE(msgBuf,'(2A)')
& 'THSICE_READPARMS: Need to compile "generic_advdiff" pkg',
& ' in order to use thSIceAdvScheme'
CALL PRINT_ERROR( msgBuf , myThid )
STOP 'ABNORMAL END: THSICE_READPARMS'
ENDIF
#endif /* ndef ALLOW_GENERIC_ADVDIFF */
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)')
& 'THSICE_READPARMS: if useSEAICE, stress will be computed',
& ' by SEAICE pkg => no reduction'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT , myThid)
WRITE(msgBuf,'(A)')
& 'THSICE_READPARMS: WARNING: reset stressReduction to zero'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT , myThid)
stressReduction = 0. _d 0
ENDIF
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
iUnit = standardMessageUnit
c CALL MDSFINDUNIT( iUnit, mythid )
c OPEN(iUnit,file='thsice_check_params',status='unknown')
WRITE(iUnit,*) 'ThSI: rhos =',rhos
WRITE(iUnit,*) 'ThSI: rhoi =',rhoi
WRITE(iUnit,*) 'ThSI: rhosw =',rhosw
WRITE(iUnit,*) 'ThSI: rhofw =',rhofw
WRITE(iUnit,*) 'ThSI: floodFac =',floodFac
WRITE(iUnit,*) 'ThSI: cpIce =',cpIce
WRITE(iUnit,*) 'ThSI: cpWater =',cpWater
WRITE(iUnit,*) 'ThSI: kIce =',kIce
WRITE(iUnit,*) 'ThSI: kSnow =',kSnow
WRITE(iUnit,*) 'ThSI: bMeltCoef =',bMeltCoef
WRITE(iUnit,*) 'ThSI: Lfresh =',Lfresh
WRITE(iUnit,*) 'ThSI: qsnow =',qsnow
WRITE(iUnit,*) 'ThSI: albColdSnow=',albColdSnow
WRITE(iUnit,*) 'ThSI: albWarmSnow=',albWarmSnow
WRITE(iUnit,*) 'ThSI: tempSnowAlb=',tempSnowAlb
WRITE(iUnit,*) 'ThSI: albOldSnow =',albOldSnow
WRITE(iUnit,*) 'ThSI: hNewSnowAge=',hNewSnowAge
WRITE(iUnit,*) 'ThSI: snowAgTime =',snowAgTime
WRITE(iUnit,*) 'ThSI: albIceMax =',albIceMax
WRITE(iUnit,*) 'ThSI: albIceMin =',albIceMin
WRITE(iUnit,*) 'ThSI: hAlbIce =',hAlbIce
WRITE(iUnit,*) 'ThSI: hAlbSnow =',hAlbSnow
WRITE(iUnit,*) 'ThSI: i0swFrac =',i0swFrac
WRITE(iUnit,*) 'ThSI: ksolar =',ksolar
WRITE(iUnit,*) 'ThSI: dhSnowLin =',dhSnowLin
WRITE(iUnit,*) 'ThSI: saltIce =',saltIce
WRITE(iUnit,*) 'ThSI: S_winton =',S_winton
WRITE(iUnit,*) 'ThSI: mu_Tf =',mu_Tf
WRITE(iUnit,*) 'ThSI: Tf0kel =',Tf0kel
WRITE(iUnit,*) 'ThSI: Tmlt1 =',Tmlt1
WRITE(iUnit,*) 'ThSI: Terrmax =',Terrmax
WRITE(iUnit,*) 'ThSI: nitMaxTsf =',nitMaxTsf
WRITE(iUnit,*) 'ThSI: hIceMin =',hIceMin
WRITE(iUnit,*) 'ThSI: hiMax =',hiMax
WRITE(iUnit,*) 'ThSI: hsMax =',hsMax
WRITE(iUnit,*) 'ThSI: iceMaskMax =',iceMaskMax
WRITE(iUnit,*) 'ThSI: iceMaskMin =',iceMaskMin
WRITE(iUnit,*) 'ThSI: fracEnMelt =',fracEnMelt
WRITE(iUnit,*) 'ThSI: fracEnFreez=',fracEnFreez
WRITE(iUnit,*) 'ThSI: hThinIce =',hThinIce
WRITE(iUnit,*) 'ThSI: hThickIce =',hThickIce
WRITE(iUnit,*) 'ThSI: hNewIceMax =',hNewIceMax
WRITE(iUnit,*) 'ThSI: stressReduction =',stressReduction
WRITE(iUnit,*) 'ThSI: thSIceAdvScheme =',thSIceAdvScheme
WRITE(iUnit,*) 'ThSI: thSIce_diffK =',thSIce_diffK
WRITE(iUnit,*) 'ThSI: thSIce_deltaT =',thSIce_deltaT
WRITE(iUnit,*) 'ThSI: ocean_deltaT =',ocean_deltaT
WRITE(iUnit,*) 'ThSI: stepFwd_oceMxL=',stepFwd_oceMxL
WRITE(iUnit,*) 'ThSI: tauRelax_MxL =',tauRelax_MxL
WRITE(iUnit,*) 'ThSI: tauRelax_MxL_salt =',tauRelax_MxL_salt
WRITE(iUnit,*) 'ThSI: hMxL_default =',hMxL_default
WRITE(iUnit,*) 'ThSI: sMxL_default =',sMxL_default
WRITE(iUnit,*) 'ThSI: vMxL_default =',vMxL_default
WRITE(iUnit,*) 'ThSI: thSIce_taveFreq=',thSIce_taveFreq
WRITE(iUnit,*) 'ThSI: thSIce_diagFreq=',thSIce_diagFreq
WRITE(iUnit,*) 'ThSI: thSIce_monFreq =',thSIce_monFreq
WRITE(iUnit,*) 'ThSI: startIceModel =',startIceModel
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