C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/thsice/thsice_readparms.F,v 1.16 2009/07/08 23:35:05 jmc 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, & 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 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- 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: 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