C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_readparms.F,v 1.18 2017/08/09 15:23:36 mlosch Exp $
C $Name:  $

C this needs changes

#include "STREAMICE_OPTIONS.h"

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP 0
      SUBROUTINE STREAMICE_READPARMS( myThid )

C     !DESCRIPTION:
C     Initialize STREAMICE variables and constants.

C     !USES:
      IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "STREAMICE.h"
#include "STREAMICE_BDRY.h"
!#ifdef ALLOW_STREAMICE_FLUX_CONTROL
!#include "STREAMICE_CTRL_FLUX.h"
!#endif

C     !INPUT PARAMETERS:
      INTEGER myThid
CEOP

#ifdef ALLOW_STREAMICE

C     !LOCAL VARIABLES:
C     msgBuf     :: Informational/error message buffer
C     iUnit      :: Work variable for IO unit number
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      INTEGER iUnit, iarr, tarr

      NAMELIST //STREAMICE_PARM01
     &     streamice_density, streamice_density_ocean_avg,
     &     streamice_density_firn,
     &     B_glen_isothermal, n_glen, eps_glen_min, eps_u_min,
     &     C_basal_fric_const, n_basal_friction,
     &     streamice_vel_update,streamice_cg_tol,streamice_nonlin_tol,
     &     streamice_nonlin_tol_fp, streamice_err_norm,
     &     streamice_max_cg_iter, streamice_max_nl_iter,
     &     streamice_maxcgiter_cpl, streamice_maxnliter_cpl,
     &     STREAMICEthickInit,
     &     STREAMICEsigcoordInit,
     &     STREAMICEsigcoordFile,
     &     STREAMICEthickFile,
     &     STREAMICEcalveMaskFile,
     &     STREAMICEcostMaskFile,
     &     STREAMICE_dump_mdsio, STREAMICE_tave_mdsio,
     &     STREAMICE_dump_mnc, STREAMICE_tave_mnc,
     &     STREAMICE_move_front,
     &     STREAMICE_calve_to_mask,
     &     STREAMICE_diagnostic_only,
     &     STREAMICE_lower_cg_tol,
     &     streamice_CFL_factor,
     &     streamice_adjDump,
     &     streamice_bg_surf_slope_x, streamice_bg_surf_slope_y,
     &     streamice_kx_b_init, streamice_ky_b_init,
     &     STREAMICEbasalTracConfig,
     &     STREAMICEBdotConfig,
     &     STREAMICEbasalTracFile,
     &     STREAMICEBdotFile,
     &     STREAMICEBdotTimeDepFile,
     &     STREAMICEvelOptimFile,
     &     STREAMICEtopogFile,
     &     STREAMICEhmaskFile,
     &     STREAMICEHBCyFile,
     &     STREAMICEHBCxFile,
     &     STREAMICEuFaceBdryFile,
     &     STREAMICEvFaceBdryFile,
     &     STREAMICEuDirichValsFile,
     &     STREAMICEvDirichValsFile,
     &     STREAMICEuMassFluxFile,
     &     STREAMICEvMassFluxFile,
     &     STREAMICEuNormalStressFile,
     &     STREAMICEvNormalStressFile,
     &     STREAMICEuShearStressFile,
     &     STREAMICEvShearStressFile,
     &     STREAMICEuNormalTimeDepFile,
     &     STREAMICEvNormalTimeDepFile,
     &     STREAMICEuShearTimeDepFile,
     &     STREAMICEvShearTimeDepFile,
     &     STREAMICEuFluxTimeDepFile, STREAMICEvFluxTimeDepFile,
     &     STREAMICEGlenConstFile, STREAMICEGlenConstConfig,
     &     STREAMICE_ppm_driving_stress,
     &     STREAMICE_h_ctrl_const_surf,
     &     streamice_wgt_drift,streamice_wgt_surf,streamice_wgt_vel,
     &     streamice_wgt_avthick, streamice_wgt_tikh,
     &     streamice_addl_backstress,
     &     streamice_smooth_gl_width,
     &     streamice_adot_uniform,
     &     streamice_firn_correction,
     &     STREAMICE_apply_firn_correction,
     &     STREAMICE_ADV_SCHEME, streamice_forcing_period,
     &     STREAMICE_chkfixedptconvergence,
     &     STREAMICE_chkresidconvergence,
     &     STREAMICE_alt_driving_stress,
#ifdef STREAMICE_FLOWLINE_BUTTRESS
     &     streamice_buttr_width,
     &     useStreamiceFlowlineButtr,
#endif
     &     STREAMICE_allow_cpl
#ifdef ALLOW_OPENAD
     &     ,streamice_smooth_thick_adjoint
#endif

#ifdef ALLOW_STREAMICE_2DTRACER
      NAMELIST //STREAMICE_PARMTRACER
     &     STREAMICETrac2DBCxFile,
     &     STREAMICETrac2DBCyFile,
     &     STREAMICETrac2DINITFile
#endif

#ifdef ALLOW_PETSC
      NAMELIST //STREAMICE_PARMPETSC
     &     PETSC_PRECOND_TYPE, PETSC_SOLVER_TYPE, 
     &     streamice_use_petsc
#endif

#if (defined (ALLOW_OPENAD)  defined (ALLOW_STREAMICE_OAD_FP))
      NAMELIST //STREAMICE_PARMOAD 
     &     streamice_nonlin_tol_adjoint
#ifdef ALLOW_PETSC
     &     ,STREAMICE_OAD_petsc_reuse, 
     &     PETSC_PRECOND_OAD
#endif
#endif

!#ifdef ALLOW_STREAMICE_FLUX_CONTROL
!      NAMELIST /STREAMICE_PARMFLUXCTRL/
!     &     n_fluxes, n_epochs,
!     &     streamice_ctrl_flux_id,
!     &     streamice_ctrl_flux_scaleVel
!#endif

      NAMELIST //STREAMICE_PARM02
     &     shelf_max_draft,
     &     shelf_min_draft,
     &     shelf_edge_pos,
     &     shelf_slope_scale,
     &     shelf_flat_width,
     &     flow_dir

      NAMELIST //STREAMICE_PARM03
     &     min_x_noflow_NORTH, max_x_noflow_NORTH,
     &     min_x_noflow_SOUTH, max_x_noflow_SOUTH,
     &     min_y_noflow_WEST, max_y_noflow_WEST,
     &     min_y_noflow_EAST, max_y_noflow_EAST,
     &     min_x_noStress_NORTH, max_x_noStress_NORTH,
     &     min_x_noStress_SOUTH, max_x_noStress_SOUTH,
     &     min_y_noStress_WEST, max_y_noStress_WEST,
     &     min_y_noStress_EAST, max_y_noStress_EAST,
     &     min_x_FluxBdry_NORTH, max_x_FluxBdry_NORTH,
     &     min_x_FluxBdry_SOUTH, max_x_FluxBdry_SOUTH,
     &     min_y_FluxBdry_WEST, max_y_FluxBdry_WEST,
     &     min_y_FluxBdry_EAST, max_y_FluxBdry_EAST,
     &     min_x_Dirich_NORTH, max_x_Dirich_NORTH,
     &     min_x_Dirich_SOUTH, max_x_Dirich_SOUTH,
     &     min_y_Dirich_WEST, max_y_Dirich_WEST,
     &     min_y_Dirich_EAST, max_y_Dirich_EAST,
     &     min_x_CFBC_NORTH, max_x_CFBC_NORTH,
     &     min_x_CFBC_SOUTH, max_x_CFBC_SOUTH,
     &     min_y_CFBC_WEST, max_y_CFBC_WEST,
     &     min_y_CFBC_EAST, max_y_CFBC_EAST,
     &     flux_bdry_val_SOUTH, flux_bdry_val_NORTH,
     &     flux_bdry_val_WEST, flux_bdry_val_EAST,
     &     STREAMICE_NS_periodic, STREAMICE_EW_periodic

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

      IF ( .NOT.useStreamIce ) THEN
C-    pkg STREAMICE is not used
        _BEGIN_MASTER(myThid)
C-    Track pkg activation status:
         STREAMICEisOn = .FALSE.
C     print a (weak) warning if data.streamice is found
         CALL PACKAGES_UNUSED_MSG( 'useStreamIce', ' ', ' ' )
        _END_MASTER(myThid)
        RETURN
      ENDIF

      _BEGIN_MASTER(myThid)

C This routine has been called by the main model so we set our
C internal flag to indicate we are in business
      STREAMICEisOn = .TRUE.

C--   Default values for STREAMICE

      streamice_density = 917.
      streamice_density_ocean_avg = 1024.
      streamice_density_firn = streamice_density  
      B_glen_isothermal = 9.461e-18   !  Pa (-1/3) a
      n_glen = 3.
      eps_glen_min = 1.0e-12
      eps_u_min = 1.0e-6
      C_basal_fric_const = 31.71 ! Pa (m/a)-1n
      n_basal_friction = 1.
      streamice_vel_update = deltaT ! seconds
      streamice_cg_tol = 1e-6
      streamice_nonlin_tol = 1e-6
      streamice_nonlin_tol_fp = 1.e-14
      streamice_err_norm = 0.
#if (defined (ALLOW_OPENAD)  defined (ALLOW_STREAMICE_OAD_FP))
      streamice_nonlin_tol_adjoint = 1.e-14
#ifdef ALLOW_PETSC
      PETSC_PRECOND_OAD = 'MUMPS'
      STREAMICE_OAD_petsc_reuse =.false.
#endif
#endif
      streamice_max_cg_iter = 2000
      streamice_max_nl_iter = 100
      streamice_maxcgiter_cpl = 0
      streamice_maxnliter_cpl = 0
#ifdef ALLOW_OPENAD
      streamice_smooth_thick_adjoint = 0
#endif
!      streamice_n_sub_regularize = 4
      streamice_CFL_factor = .5
      streamice_adjDump = 0.
      streamice_bg_surf_slope_x = .0
      streamice_bg_surf_slope_y = 0.
      streamice_kx_b_init = 1.
      streamice_ky_b_init = 1.
      streamice_wgt_drift = 0.
      streamice_wgt_tikh = 0.
      streamice_wgt_surf = 0.
      streamice_wgt_vel = 0.
      streamice_wgt_avthick = 0.
      streamice_addl_backstress = 0.0
      streamice_smooth_gl_width = 0.0
      streamice_adot_uniform = 0.0
      streamice_forcing_period = 0
      streamice_firn_correction = 0.
#ifdef STREAMICE_FLOWLINE_BUTTRESS
      streamice_buttr_width = 1000000000.
#endif
      STREAMICE_apply_firn_correction = .false.
      
      STREAMICEthickInit = 'FILE'
      STREAMICEthickFile = ' '
      STREAMICEcalveMaskFile = ' '
      STREAMICEsigcoordInit = 'UNIFORM'
      STREAMICEsigcoordFile = ' '
      STREAMICEbasalTracConfig = 'UNIFORM'
      STREAMICEBdotConfig = ''
      STREAMICEBdotFile = ''
      STREAMICEBdotTimeDepFile = ' '
      STREAMICEbasalTracFile = ' '
      STREAMICEvelOptimFile = ''
      STREAMICEtopogFile = ''
      STREAMICEhmaskFile = ''
      STREAMICEHBCyFile = ''
      STREAMICEHBCxFile = ''
      STREAMICEuNormalStressFile = ''
      STREAMICEvNormalStressFile = ''
      STREAMICEuShearStressFile = ''
      STREAMICEvShearStressFile = ''
      STREAMICEuNormalTimeDepFile = ' '
      STREAMICEvNormalTimeDepFile = ' '
      STREAMICEuShearTimeDepFile = ' '
      STREAMICEvShearTimeDepFile = ' '
      STREAMICEuFluxTimeDepFile = ' '
      STREAMICEvFluxTimeDepFile = ' '

#ifdef ALLOW_STREAMICE_2DTRACER
      STREAMICETrac2DBCxFile = ''
      STREAMICETrac2DBCyFile = ''
      STREAMICETrac2DInitFile = ''
#endif
      STREAMICEuFaceBdryFile = ''
      STREAMICEvFaceBdryFile = ''
      STREAMICEuDirichValsFile = ''
      STREAMICEvDirichValsFile = ''
      STREAMICEuMassFluxFile = ''
      STREAMICEvMassFluxFile = ''
      STREAMICEGlenConstFile = ''
      STREAMICEcostMaskFile = ''
      STREAMICEGlenConstConfig = 'UNIFORM'
#ifdef ALLOW_PETSC
      PETSC_PRECOND_TYPE = 'PCBJACOBI'
      PETSC_SOLVER_TYPE = 'KSPCG'
      streamice_use_petsc = .true.
#endif
      STREAMICE_ADV_SCHEME = ''

!#ifdef ALLOW_STREAMICE_FLUX_CONTROL
!      n_fluxes = 0
!      n_epochs = 0
!      DO iarr=1,n_fluxes_max
!       streamice_ctrl_flux_id(iarr) = 0
!       DO tarr=1,n_epochs_max
!        streamice_ctrl_flux_scaleVel(iarr,tarr) = 0. _d 0
!       ENDDO
!      ENDDO
!#endif

      STREAMICE_tave_mdsio = .TRUE.
      STREAMICE_dump_mdsio = .TRUE.
      STREAMICE_dump_mnc = .FALSE.
      STREAMICE_tave_mnc = .FALSE.
!      STREAMICE_GL_regularize = .FALSE.
      STREAMICE_move_front = .FALSE.
      STREAMICE_calve_to_mask = .FALSE.
!       STREAMICE_geom_file_setup = .FALSE.
!      STREAMICE_construct_matrix = .TRUE.
      STREAMICE_lower_cg_tol = .FALSE.
      STREAMICE_diagnostic_only = .FALSE.
#ifdef STREAMICE_FLOWLINE_BUTTRESS
      useStreamiceFlowlineButtr=.FALSE.
#endif
      STREAMICE_ppm_driving_stress = .FALSE.
      STREAMICE_chkfixedptconvergence = .true.
      STREAMICE_chkresidconvergence = .true.
      STREAMICE_alt_driving_stress = .FALSE.
      STREAMICE_h_ctrl_const_surf = .FALSE.
      STREAMICE_allow_cpl = .false.
!       STREAMICE_hybrid_stress= .FALSE.

      min_x_noflow_NORTH = 0.
      max_x_noflow_NORTH = 0.
      min_x_noflow_SOUTH = 0.
      max_x_noflow_SOUTH = 0.
      min_y_noflow_WEST = 0.
      max_y_noflow_WEST = 0.
      min_y_noflow_EAST = 0.
      max_y_noflow_EAST = 0.
      min_x_noStress_NORTH = 0.
      max_x_noStress_NORTH = 0.
      min_x_noStress_SOUTH = 0.
      max_x_noStress_SOUTH = 0.
      min_y_noStress_WEST = 0.
      max_y_noStress_WEST = 0.
      min_y_noStress_EAST = 0.
      max_y_noStress_EAST = 0.
      min_x_FluxBdry_NORTH = 0.
      max_x_FluxBdry_NORTH = 0.
      min_x_FluxBdry_SOUTH = 0.
      max_x_FluxBdry_SOUTH = 0.
      min_y_FluxBdry_WEST = 0.
      max_y_FluxBdry_WEST = 0.
      min_y_FluxBdry_EAST = 0.
      max_y_FluxBdry_EAST = 0.
      min_x_Dirich_NORTH = 0.
      max_x_Dirich_NORTH = 0.
      min_x_Dirich_SOUTH = 0.
      max_x_Dirich_SOUTH = 0.
      min_y_Dirich_WEST = 0.
      max_y_Dirich_WEST = 0.
      min_y_Dirich_EAST = 0.
      max_y_Dirich_EAST = 0.
      min_y_CFBC_WEST = 0.
      max_y_CFBC_WEST = 0.
      min_y_CFBC_EAST = 0.
      max_y_CFBC_EAST = 0.
      flux_bdry_val_SOUTH = 0.
      flux_bdry_val_NORTH = 0.
      flux_bdry_val_WEST = 0.
      flux_bdry_val_EAST = 0.

      STREAMICE_NS_periodic = .FALSE.
      STREAMICE_EW_periodic = .FALSE.

      WRITE(msgBuf,'(A)') 'STREAMICE_READPARMS: opening data.streamice'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                    SQUEEZE_RIGHT , 1)
      CALL OPEN_COPY_DATA_FILE(
     I                     'data.streamice', 'STREAMICE_READPARMS',
     O                     iUnit,
     I                     myThid )

C     Read parameters from open data file
      READ(UNIT=iUnit,NML=STREAMICE_PARM01)
      WRITE(msgBuf,'(A)')
     &    'STREAMICE_READPARMS: read first param block'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &    SQUEEZE_RIGHT , 1)

      IF (TRIM(STREAMICEthickInit) .eq. "PARAM") THEN
       READ(UNIT=iUnit,NML=STREAMICE_PARM02)
        WRITE(msgBuf,'(A)')
     &    'STREAMICE_READPARMS: read second param block'
       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &    SQUEEZE_RIGHT , 1)
      ENDIF

#ifdef ALLOW_STREAMICE_2DTRACER
      READ(UNIT=iUnit,NML=STREAMICE_PARMTRACER)
      WRITE(msgBuf,'(A)')
     &    'STREAMICE_READPARMS: read tracer param block'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &    SQUEEZE_RIGHT , 1)
#endif

#ifdef ALLOW_PETSC
      READ(UNIT=iUnit,NML=STREAMICE_PARMPETSC)
      WRITE(msgBuf,'(A)')
     &    'STREAMICE_READPARMS: read petsc param block'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &    SQUEEZE_RIGHT , 1)
#endif

#if (defined (ALLOW_OPENAD)  defined (ALLOW_STREAMICE_OAD_FP))
      READ(UNIT=iUnit,NML=STREAMICE_PARMOAD)
      WRITE(msgBuf,'(A)')
     &    'STREAMICE_READPARMS: read oad parm block'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &    SQUEEZE_RIGHT , 1)
#endif

      READ(UNIT=iUnit,NML=STREAMICE_PARM03)
      WRITE(msgBuf,'(A)')
     &    'STREAMICE_READPARMS: read third param block'
      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &    SQUEEZE_RIGHT , 1)
#ifdef SINGLE_DISK_IO
      CLOSE(iUnit)
#else
      CLOSE(iUnit,STATUS='DELETE')
#endif /* SINGLE_DISK_IO */

!#ifdef ALLOW_STREAMICE_FLUX_CONTROL
!
!      CALL OPEN_COPY_DATA_FILE(
!     I                     'data.strmctrlflux', 'STREAMICE_READPARMS',
!     O                     iUnit,
!     I                     myThid )
!
!      READ(UNIT=iUnit,NML=STREAMICE_PARMFLUXCTRL)
!      WRITE(msgBuf,'(A)')
!     &    'STREAMICE_READPARMS: read flux_ctrl param block'
!      CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
!     &    SQUEEZE_RIGHT , 1)
!#ifdef SINGLE_DISK_IO
!      CLOSE(iUnit)
!#else
!      CLOSE(iUnit,STATUS='DELETE')
!#endif /* SINGLE_DISK_IO */
!#endif

      streamice_nstep_velocity = NINT (streamice_vel_update / deltaT)

C-    Set Output type flags :

#ifdef ALLOW_MNC
      IF (useMNC) THEN
        IF ( .NOT.outputTypesInclusive
     &       .AND. STREAMICE_tave_mnc ) STREAMICE_tave_mdsio = .FALSE.
        IF ( .NOT.outputTypesInclusive
     &       .AND. STREAMICE_dump_mnc ) STREAMICE_dump_mdsio = .FALSE.
      ENDIF
#endif

      _END_MASTER(myThid)

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

#endif /* ALLOW_STREAMICE */

      RETURN
      END