Back to home page

MITgcm

 
 

    


File indexing completed on 2024-02-29 06:10:24 UTC

view on githubraw file Latest commit a4576c7c on 2024-02-28 22:55:11 UTC
6d54cf9ca1 Ed H*0001 #include "GMREDI_OPTIONS.h"
dfc9956354 Jean*0002 #ifdef ALLOW_PTRACERS
                0003 # include "PTRACERS_OPTIONS.h"
                0004 #endif
2a09713997 Patr*0005 
7185da56c9 Jean*0006 CBOP
                0007 C     !ROUTINE: GMREDI_CHECK
                0008 C     !INTERFACE:
2a09713997 Patr*0009       SUBROUTINE GMREDI_CHECK( myThid )
7185da56c9 Jean*0010 
                0011 C     !DESCRIPTION: \bv
                0012 C     *==========================================================*
                0013 C     | SUBROUTINE GMREDI_CHECK
                0014 C     | o Check consistency with model configuration
                0015 C     *==========================================================*
                0016 C     \ev
                0017 
                0018 C     !USES:
2a09713997 Patr*0019       IMPLICIT NONE
                0020 
                0021 C     === Global variables ===
                0022 #include "SIZE.h"
                0023 #include "EEPARAMS.h"
                0024 #include "PARAMS.h"
                0025 #include "GMREDI.h"
725ef7d279 Jean*0026 #ifdef ALLOW_GENERIC_ADVDIFF
dfc9956354 Jean*0027 # include "GAD.h"
                0028 #endif
                0029 #ifdef ALLOW_PTRACERS
                0030 # include "PTRACERS_SIZE.h"
1f86e2e864 Jean*0031 # include "PTRACERS_PARAMS.h"
725ef7d279 Jean*0032 #endif
2a09713997 Patr*0033 
7185da56c9 Jean*0034 C     !INPUT/OUTPUT PARAMETERS:
                0035 C     myThid :: my Thread Id number
2a09713997 Patr*0036       INTEGER myThid
                0037 
7185da56c9 Jean*0038 #ifdef ALLOW_GMREDI
8233d0ceb9 Jean*0039 C     !FUNCTIONS:
                0040       INTEGER ILNBLNK
                0041       EXTERNAL ILNBLNK
                0042 
7185da56c9 Jean*0043 C     !LOCAL VARIABLES:
37549204de Jean*0044 C     msgBuf :: Informational/error message buffer
2a09713997 Patr*0045       CHARACTER*(MAX_LEN_MBUF) msgBuf
8233d0ceb9 Jean*0046       INTEGER iL, errCount
f5509be190 Mart*0047       _RL     tmpVar
7185da56c9 Jean*0048 CEOP
dfc9956354 Jean*0049 #ifdef ALLOW_PTRACERS
                0050       INTEGER iTr
                0051       LOGICAL redFlag
                0052 #endif
2a09713997 Patr*0053 
7185da56c9 Jean*0054       _BEGIN_MASTER(myThid)
e25acdb1f2 Jean*0055       errCount = 0
2a09713997 Patr*0056 
42c525bfb4 Alis*0057        WRITE(msgBuf,'(A)') 'GMREDI_CHECK: #define GMREDI'
                0058        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
7185da56c9 Jean*0059      &                     SQUEEZE_RIGHT , myThid )
42c525bfb4 Alis*0060 
f5509be190 Mart*0061 C- print out some key parameters :
f42e64b3e7 Jean*0062        CALL WRITE_0D_L( GM_AdvForm, INDEX_NONE,
86e2f7bc1f Jean*0063      &  'GM_AdvForm =', '     /* if FALSE => use SkewFlux Form */')
43af9695da Gael*0064        CALL WRITE_0D_L( GM_InMomAsStress, INDEX_NONE,
86e2f7bc1f Jean*0065      &  'GM_InMomAsStress =', ' /* if TRUE => apply as Eddy Stress */')
ed71a1a16f Jean*0066        CALL WRITE_0D_L( GM_AdvSeparate, INDEX_NONE,
7185da56c9 Jean*0067      & 'GM_AdvSeparate =',' /* Calc Bolus & Euler Adv. separately */')
f42e64b3e7 Jean*0068        CALL WRITE_0D_L( GM_ExtraDiag, INDEX_NONE,
86e2f7bc1f Jean*0069      &  'GM_ExtraDiag =','   /* Tensor Extra Diag (line 1&2) non 0 */')
4da4b49499 Jean*0070        CALL WRITE_0D_RL( GM_isopycK, INDEX_NONE, 'GM_isopycK =',
86e2f7bc1f Jean*0071      &  '    /* Background Isopyc. Diffusivity [m^2/s] */')
f5509be190 Mart*0072 c      CALL WRITE_0D_RL( GM_background_K, INDEX_NONE,
                0073 c    &  'GM_background_K =',
                0074 c    &  ' /* Background GM (=Bolus) Diffusivity [m^2/s] */')
                0075        tmpVar = GM_background_K*( oneRL - GM_skewflx )
                0076        CALL WRITE_0D_RL( tmpVar, INDEX_NONE, 'GM_advec*K =',
                0077      &  '    /* Backg. GM-Advec(=Bolus) Diffusivity [m^2/s] */')
4da4b49499 Jean*0078        CALL WRITE_0D_RL( GM_background_K*GM_skewflx, INDEX_NONE,
86e2f7bc1f Jean*0079      &  'GM_skewflx*K =',
                0080      &  '  /* Background GM_SkewFlx Diffusivity [m^2/s] */')
f5509be190 Mart*0081        CALL WRITE_0D_RL( GM_isoFac_calcK, INDEX_NONE,
                0082      &  'GM_isoFac_calcK =',
                0083      &  ' /* Fraction of dynamic K added to Redi tensor */')
15f5c9e77b Jean*0084        CALL WRITE_0D_RL( GM_Kmin_horiz, INDEX_NONE, 'GM_Kmin_horiz =',
86e2f7bc1f Jean*0085      &  ' /* Minimum Horizontal Diffusivity [m^2/s] */')
4da4b49499 Jean*0086        CALL WRITE_0D_RL( GM_Visbeck_alpha, INDEX_NONE,
86e2f7bc1f Jean*0087      &  'GM_Visbeck_alpha =', ' /* Visbeck alpha coeff. [-] */')
4da4b49499 Jean*0088        CALL WRITE_0D_RL( GM_Small_Number, INDEX_NONE,
86e2f7bc1f Jean*0089      &  'GM_Small_Number =', '  /* epsilon used in slope calc */')
4da4b49499 Jean*0090        CALL WRITE_0D_RL( GM_slopeSqCutoff, INDEX_NONE,
86e2f7bc1f Jean*0091      &  'GM_slopeSqCutoff =', ' /* Slope^2 cut-off value */')
                0092        CALL WRITE_0D_C( GM_taper_scheme, 0, INDEX_NONE,
                0093      &  'GM_taper_scheme =',
                0094      &  '  /* Type of Tapering/Clipping scheme */')
4da4b49499 Jean*0095        CALL WRITE_0D_RL( GM_maxSlope, INDEX_NONE,
86e2f7bc1f Jean*0096      &  'GM_maxSlope =', '  /* Maximum Slope (Tapering/Clipping) */')
4da4b49499 Jean*0097        CALL WRITE_0D_RL( GM_facTrL2dz, INDEX_NONE,
86e2f7bc1f Jean*0098      &  'GM_facTrL2dz =',
                0099      &  ' /* Minimum Trans.Layer Thick. (factor of dz) */')
4da4b49499 Jean*0100        CALL WRITE_0D_RL( GM_facTrL2ML, INDEX_NONE,
86e2f7bc1f Jean*0101      &  'GM_facTrL2ML =',
                0102      &  ' /* Max.Trans.Layer Thick. (factor of MxL Depth)*/')
4da4b49499 Jean*0103        CALL WRITE_0D_RL( GM_maxTransLay, INDEX_NONE,
86e2f7bc1f Jean*0104      &  'GM_maxTransLay =',
                0105      &  ' /* Maximum Transition Layer Thickness [m] */')
d0035fac68 Jean*0106        CALL WRITE_0D_L( GM_UseBVP, INDEX_NONE,
                0107      &  'GM_UseBVP =',
                0108      &  ' /* if TRUE => use bvp a la Ferrari et al. (2010) */')
                0109        CALL WRITE_0D_I( GM_BVP_ModeNumber, INDEX_NONE,
                0110      &  'GM_BVP_ModeNumber =',
                0111      &  ' /* Vertical mode number for BVP wave speed */')
                0112        CALL WRITE_0D_RL( GM_BVP_cMin, INDEX_NONE,
                0113      &  'GM_BVP_cMin =',
                0114      &  ' /* Minimum wave speed for BVP [m/s] */')
050b4366e6 Jean*0115        CALL WRITE_0D_L( GM_useSubMeso, INDEX_NONE,
                0116      &  'GM_useSubMeso =',
                0117      &  ' /* if TRUE => use Sub-Meso param. (B.Fox-Kemper) */')
                0118        CALL WRITE_0D_RL( subMeso_Ceff, INDEX_NONE,
                0119      &  'subMeso_Ceff =',
                0120      &  ' /* efficiency coeff. of Mixed-Layer Eddies [-] */')
                0121        CALL WRITE_0D_RL( subMeso_invTau, INDEX_NONE,
                0122      &  'subMeso_invTau =',
                0123      &  ' /* inverse of Sub-Meso mixing time-scale [/s] */')
                0124        CALL WRITE_0D_RL( subMeso_LfMin, INDEX_NONE,
                0125      &  'subMeso_LfMin =',' /* minimum length-scale "Lf" [m] */')
                0126        CALL WRITE_0D_RS( subMeso_Lmax, INDEX_NONE,
                0127      &  'subMeso_Lmax =',' /* maximum grid-scale length [m] */')
f59d76b0dd Ed D*0128        CALL WRITE_0D_L( GM_useLeithQG, INDEX_NONE,
                0129      &  'GM_useLeithQG =',
                0130      &  ' /* if TRUE => add QG Leith viscosity to GMRedi tensor */')
a4576c7cde Juli*0131        CALL WRITE_0D_L( GM_useGEOM, INDEX_NONE,
                0132      &  'GM_useGEOM =', ' /* using GEOMETRIC */')
b8a35fd4d2 Jean*0133 
                0134 C--  Check parameters:
                0135 
                0136 C-     GM/Redi needs implicit diffusion (will be packaged later)
7185da56c9 Jean*0137       IF ( .NOT.implicitDiffusion ) THEN
b8a35fd4d2 Jean*0138         WRITE(msgBuf,'(A)') 'GM/Redi needs implicitDiffusion=.true.'
7185da56c9 Jean*0139         CALL PRINT_ERROR( msgBuf , myThid )
e25acdb1f2 Jean*0140         errCount = errCount + 1
7185da56c9 Jean*0141       ENDIF
b8a35fd4d2 Jean*0142 
94a8024bbe Jean*0143 #ifndef GM_READ_K3D_REDI
                0144       IF ( GM_K3dRediFile.NE.' ' ) THEN
                0145        WRITE(msgBuf,'(A)')
                0146      &   'GMREDI_CHECK: GM_K3dRediFile is set in data.gmredi'
                0147        CALL PRINT_ERROR( msgBuf, myThid )
                0148        WRITE(msgBuf,'(A)')
                0149      &   'GMREDI_CHECK: without #define GM_READ_K3D_REDI'
                0150        CALL PRINT_ERROR( msgBuf, myThid )
                0151        errCount = errCount + 1
                0152       ENDIF
                0153 #endif
                0154 #ifndef GM_READ_K3D_GM
                0155       IF ( GM_K3dGMFile.NE.' ' ) THEN
                0156        WRITE(msgBuf,'(A)')
                0157      &   'GMREDI_CHECK: GM_K3dGMFile is set in data.gmredi'
                0158        CALL PRINT_ERROR( msgBuf, myThid )
                0159        WRITE(msgBuf,'(A)')
                0160      &   'GMREDI_CHECK: without #define GM_READ_K3D_GM'
                0161        CALL PRINT_ERROR( msgBuf, myThid )
                0162        errCount = errCount + 1
                0163       ENDIF
                0164 #endif
                0165 
b8a35fd4d2 Jean*0166 #ifndef GM_VISBECK_VARIABLE_K
                0167 C     Make sure we are not trying to use something that is unavailable
7185da56c9 Jean*0168       IF ( GM_Visbeck_alpha.NE.0. ) THEN
b8a35fd4d2 Jean*0169        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0170      &   'GMREDI_CHECK: Visbeck variables used in data.gmredi'
7185da56c9 Jean*0171        CALL PRINT_ERROR( msgBuf, myThid )
b8a35fd4d2 Jean*0172        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0173      &   'GMREDI_CHECK: without #define GM_VISBECK_VARIABLE_K'
7185da56c9 Jean*0174        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0175        errCount = errCount + 1
b8a35fd4d2 Jean*0176       ENDIF
                0177 #endif
                0178 
a4576c7cde Juli*0179 #ifdef GM_GEOM_VARIABLE_K
                0180       IF ( GM_useGEOM ) THEN
                0181        CALL WRITE_0D_RL( GEOM_alpha, INDEX_NONE,
                0182      &  'GEOM_alpha      =', ' /* GEOM alpha coeff. [-] */')
                0183        CALL WRITE_0D_RL( GEOM_lmbda, INDEX_NONE,
                0184      &  'GEOM_lmbda      =', ' /* GEOM ene diss rate [/s] */')
                0185        CALL WRITE_0D_RL( GEOM_diffKh_EKE, INDEX_NONE,
                0186      &  'GEOM_diffKh_EKE =', ' /* GEOM Eke diffusion coeff [m2/s] */')
                0187        CALL WRITE_0D_L( GEOM_vert_struc, INDEX_NONE,
                0188      &  'GEOM_vert_struc =', ' /* GEOM vertical structure function */')
                0189        CALL WRITE_0D_RL( GEOM_vert_struc_min, INDEX_NONE,
                0190      &  'GEOM_vert_struc_min =', ' /* vert struc min [-] */')
                0191        CALL WRITE_0D_RL( GEOM_vert_struc_max, INDEX_NONE,
                0192      &  'GEOM_vert_struc_min =', ' /* vert struc min [-] */')
                0193        CALL WRITE_0D_RL( GEOM_minVal_K, INDEX_NONE,
                0194      &  'GEOM_minVal_K   =', ' /* GEOM_K3d lower bound [m2/s] */')
                0195        CALL WRITE_0D_RL( GEOM_maxVal_K, INDEX_NONE,
                0196      &  'GEOM_maxVal_K   =', ' /* GEOM_K3d upper bound [m2/s] */')
                0197        IF (usingPcoords) THEN
                0198         WRITE(msgBuf,'(3A)') 'GMREDI_CHECK:',
                0199      &       ' p-coords not yet implemented with GM_useGEOM'
                0200         CALL PRINT_ERROR( msgBuf, myThid )
                0201         errCount = errCount + 1
                0202        ENDIF
                0203       ENDIF
                0204 #else /* GM_GEOM_VARIABLE_K */
                0205 C     Make sure we are not trying to use something that is unavailable
                0206       IF ( GM_useGEOM ) THEN
                0207        WRITE(msgBuf,'(A)')
                0208      &   ' GMREDI_CHECK: GEOM variables used in data.gmredi'
                0209        CALL PRINT_ERROR( msgBuf, myThid )
                0210        WRITE(msgBuf,'(A)')
                0211      &   ' GMREDI_CHECK: without #define GM_GEOM_VARIABLE_K'
                0212        CALL PRINT_ERROR( msgBuf, myThid )
                0213        errCount = errCount + 1
                0214       ENDIF
                0215 #endif /* GM_GEOM_VARIABLE_K */
                0216 
b8a35fd4d2 Jean*0217 #ifndef GM_BOLUS_ADVEC
                0218 C     Make sure we are not trying to use some arrays that are unavailable
7185da56c9 Jean*0219       IF ( GM_AdvForm ) THEN
b8a35fd4d2 Jean*0220        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0221      &   'GMREDI_CHECK: GM Advection form used in data.gmredi'
7185da56c9 Jean*0222        CALL PRINT_ERROR( msgBuf, myThid )
b8a35fd4d2 Jean*0223        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0224      &   'GMREDI_CHECK: without #define GM_BOLUS_ADVEC'
7185da56c9 Jean*0225        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0226        errCount = errCount + 1
2a09713997 Patr*0227       ENDIF
b8a35fd4d2 Jean*0228 #endif
2a09713997 Patr*0229 
05118ac017 Jean*0230 #ifdef GM_BATES_K3D
dc60433548 Mich*0231 # ifndef HAVE_LAPACK
05118ac017 Jean*0232 c     IF ( GM_useBatesK3d ) THEN
                0233         WRITE(msgBuf, '(A)')
                0234      &     'Must use CPP option HAVE_LAPACK when using BatesK3d'
                0235         CALL PRINT_ERROR( msgBuf, myThid )
                0236         errCount = errCount + 1
                0237 c     ENDIF
5a6ef5c2b4 Mich*0238 # endif
05118ac017 Jean*0239       IF ( GM_useBatesK3d ) THEN
                0240         CALL WRITE_0D_L( GM_useBatesK3d, INDEX_NONE,
                0241      &   'GM_useBatesK3d =',
                0242      &   ' /* if TRUE => use BatesK3d for GM diffusivity */')
                0243         IF ( GM_Bates_use_constK ) THEN
                0244           CALL WRITE_0D_L( GM_Bates_use_constK, INDEX_NONE,
                0245      &         'GM_Bates_use_constK =',
                0246      &         ' /* if TRUE => Uses a constant K for'//
c8602656d9 Davi*0247      &         ' the eddy transport closure */')
05118ac017 Jean*0248           CALL WRITE_0D_L( GM_Bates_smooth, INDEX_NONE,
                0249      &         'GM_Bates_smooth =',
5a6ef5c2b4 Mich*0250      &         ' /* if TRUE => Expands in terms of baroclinic modes */')
05118ac017 Jean*0251           IF ( GM_Bates_smooth ) THEN
                0252             CALL WRITE_0D_I( GM_Bates_NModes, INDEX_NONE,
                0253      &           'GM_Bates_NModes =',
5a6ef5c2b4 Mich*0254      &           ' /* Number of modes for expansion */')
                0255           ENDIF
                0256         ELSE
05118ac017 Jean*0257           CALL WRITE_0D_I( GM_Bates_NModes, INDEX_NONE,
                0258      &         'GM_Bates_NModes =',
5a6ef5c2b4 Mich*0259      &         ' /* Number of modes for expansion */')
                0260         ENDIF
                0261       ENDIF
                0262 
05118ac017 Jean*0263 C     Make sure that we use BatesK3d with the advective form only.
0d1e4b948d Mich*0264 C     The skew form is not presently supported.
05118ac017 Jean*0265       IF ( GM_useBatesK3d .AND. .NOT.GM_AdvForm ) THEN
                0266         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
                0267      &       'GM_useBatesK3d=.TRUE. but GM_AdvForm=.FALSE.'
0d1e4b948d Mich*0268         CALL PRINT_ERROR( msgBuf, myThid )
                0269         WRITE(msgBuf,'(A)')
05118ac017 Jean*0270      &       'GMREDI_CHECK: To use BatesK3d set GM_AdvForm=.TRUE.'
0d1e4b948d Mich*0271        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0272        errCount = errCount + 1
4e65b6d0de Mich*0273       ENDIF
a67797e4f0 Jean*0274       IF ( GM_useBatesK3d .AND. deepAtmosphere ) THEN
                0275         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useBatesK3d',
                0276      &   ' not yet fixed for deep geometry (deepAtmosphere=T)'
                0277         CALL PRINT_ERROR( msgBuf, myThid )
                0278         errCount = errCount + 1
                0279       ENDIF
4e65b6d0de Mich*0280 
a67797e4f0 Jean*0281 #else /* GM_BATES_K3D */
                0282 C     Make sure we are not trying to use something that is unavailable
                0283       IF ( GM_useBatesK3d ) THEN
                0284        WRITE(msgBuf,'(A)')
                0285      &   'GMREDI_CHECK: GM_useBatesK3d is set to True in data.gmredi'
                0286        CALL PRINT_ERROR( msgBuf, myThid )
                0287        WRITE(msgBuf,'(A)')
                0288      &   'GMREDI_CHECK: without #define GM_BATES_K3D'
                0289        CALL PRINT_ERROR( msgBuf, myThid )
                0290        errCount = errCount + 1
                0291       ENDIF
05118ac017 Jean*0292 #endif /* GM_BATES_K3D */
0d1e4b948d Mich*0293 
b8a35fd4d2 Jean*0294 #ifndef GM_EXTRA_DIAGONAL
                0295 C     Make sure we are not trying to use some arrays that are unavailable
7185da56c9 Jean*0296       IF ( GM_ExtraDiag ) THEN
b8a35fd4d2 Jean*0297        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0298      &   'GMREDI_CHECK: GM_skew_Flux_K & GM_isopycK not equal'
7185da56c9 Jean*0299        CALL PRINT_ERROR( msgBuf, myThid )
b8a35fd4d2 Jean*0300        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0301      &   'GMREDI_CHECK: without #define GM_EXTRA_DIAGONAL'
7185da56c9 Jean*0302        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0303        errCount = errCount + 1
b8a35fd4d2 Jean*0304       ENDIF
2a09713997 Patr*0305 #endif
b8a35fd4d2 Jean*0306 
f6de204bec Jean*0307 #ifndef GM_NON_UNITY_DIAGONAL
                0308       IF ( GM_iso2dFile .NE. ' ' .OR.
                0309      &     GM_iso1dFile .NE. ' ' ) THEN
                0310        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0311      &   'GMREDI_CHECK: needs #define GM_NON_UNITY_DIAGONAL'
f6de204bec Jean*0312        CALL PRINT_ERROR( msgBuf, myThid )
                0313        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0314      &   'GMREDI_CHECK: to use GM_iso2dFile or GM_iso1dFile'
f6de204bec Jean*0315        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0316        errCount = errCount + 1
f6de204bec Jean*0317       ENDIF
f5509be190 Mart*0318       IF ( GM_isoFac_calcK .NE. zeroRL .AND.
                0319      &     ( GM_Visbeck_alpha.NE.zeroRL .OR.
                0320      &       GM_useBatesK3d .OR. GM_useLeithQG ) ) THEN
f59d76b0dd Ed D*0321        WRITE(msgBuf,'(A)')
f5509be190 Mart*0322      &   'GMREDI_CHECK: needs #define GM_NON_UNITY_DIAGONAL'
f59d76b0dd Ed D*0323        CALL PRINT_ERROR( msgBuf, myThid )
f5509be190 Mart*0324        IF ( GM_Visbeck_alpha.NE.zeroRL ) THEN
                0325         WRITE(msgBuf,'(A)')
                0326      &   'GMREDI_CHECK: to use Visbeck computed K'
                0327         CALL PRINT_ERROR( msgBuf, myThid )
                0328        ENDIF
                0329        IF ( GM_useBatesK3d .OR. GM_useLeithQG ) THEN
                0330         WRITE(msgBuf,'(A)')
                0331      &   'GMREDI_CHECK: to use GM_useBatesK3d or GM_useLeithQG'
                0332         CALL PRINT_ERROR( msgBuf, myThid )
                0333        ENDIF
e25acdb1f2 Jean*0334        errCount = errCount + 1
f59d76b0dd Ed D*0335       ENDIF
f5509be190 Mart*0336       IF ( errCount .EQ. 0 ) THEN
                0337         WRITE(msgBuf,'(2A)') '** WARNING ** GMREDI_CHECK: ',
                0338      &       '#undef GM_NON_UNITY_DIAGONAL not recommended'
                0339         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0340      &                      SQUEEZE_RIGHT, myThid )
                0341       ENDIF
f59d76b0dd Ed D*0342 #endif
                0343 
                0344 #ifndef ALLOW_GM_LEITH_QG
                0345       IF ( GM_useLeithQG ) THEN
                0346        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0347      &   'GMREDI_CHECK: GM_useLeithQG used in data.gmredi without'
f59d76b0dd Ed D*0348        CALL PRINT_ERROR( msgBuf, myThid )
                0349        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0350      &   'GMREDI_CHECK: #define ALLOW_GM_LEITH_QG'
f59d76b0dd Ed D*0351        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0352        errCount = errCount + 1
f59d76b0dd Ed D*0353       ENDIF
f6de204bec Jean*0354 #endif
e25acdb1f2 Jean*0355       IF ( GM_useLeithQG .AND. .NOT.momStepping ) THEN
                0356         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
                0357      &   'cannot use GM_useLeithQG with "momStepping= FALSE"'
                0358         CALL PRINT_ERROR( msgBuf, myThid )
                0359         errCount = errCount + 1
                0360       ENDIF
f6de204bec Jean*0361 
050b4366e6 Jean*0362 #ifdef GM_EXCLUDE_SUBMESO
                0363       IF ( GM_useSubMeso ) THEN
e25acdb1f2 Jean*0364         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
050b4366e6 Jean*0365      &   'cannot use Sub-Meso (GM_useSubMeso=T)'
                0366         CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0367         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
050b4366e6 Jean*0368      &   'when compiled with #define GM_EXCLUDE_SUBMESO'
                0369         CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0370         errCount = errCount + 1
050b4366e6 Jean*0371       ENDIF
                0372 #endif /* GM_EXCLUDE_SUBMESO */
                0373 
                0374       IF ( GM_useSubMeso .AND. .NOT.GM_AdvForm ) THEN
e25acdb1f2 Jean*0375         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
050b4366e6 Jean*0376      &   'Sub-Meso only implemented within GM_AdvForm'
                0377         CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0378         errCount = errCount + 1
050b4366e6 Jean*0379       ENDIF
                0380 
879138fdca Jean*0381       IF ( GM_InMomAsStress ) THEN
441caf5dcc Jean*0382 #ifdef ALLOW_EDDYPSI
05118ac017 Jean*0383         IF ( .NOT.GM_useBatesK3d ) THEN
                0384           WRITE(msgBuf,'(3A)') 'GMREDI_CHECK: ',
                0385      &         'Using GM_InMomAsStress and not GM_useBatesK3d. ',
                0386      &         'GM_InMomAsStress=T has only been tested with BatesK3d'
                0387           CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0388      &                        SQUEEZE_RIGHT, myThid )
5853335f7f Mich*0389         ENDIF
879138fdca Jean*0390 #else /* ALLOW_EDDYPSI */
                0391        WRITE(msgBuf,'(2A)')
e25acdb1f2 Jean*0392      &  'GMREDI_CHECK: need to define ALLOW_EDDYPSI in CPP_OPTIONS.h',
879138fdca Jean*0393      &  ' to use GM_InMomAsStress'
                0394        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0395        errCount = errCount + 1
879138fdca Jean*0396 #endif /* ALLOW_EDDYPSI */
                0397       ENDIF
                0398       IF ( GM_InMomAsStress .AND. .NOT.GM_AdvForm ) THEN
                0399        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0400      &   'GMREDI_CHECK: need GM_AdvForm=T to use GM_InMomAsStress'
879138fdca Jean*0401        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0402        errCount = errCount + 1
879138fdca Jean*0403       ENDIF
441caf5dcc Jean*0404 
5b172de0d2 Jean*0405       IF ( usingPcoords ) THEN
                0406 C-    Some GM pieces of code have not been fixed to work in Pressure-coordinates
                0407        IF ( GM_taper_scheme.EQ.'fm07' .OR.
                0408      &      GM_taper_scheme.EQ.'stableGmAdjTap' ) THEN
                0409         iL = ILNBLNK(GM_taper_scheme)
                0410         WRITE(msgBuf,'(3A)') 'GMREDI_CHECK: GM_taper_scheme "',
                0411      &   GM_taper_scheme(1:iL), '" not yet fixed for P-Coordinate'
                0412         CALL PRINT_ERROR( msgBuf, myThid )
                0413         errCount = errCount + 1
                0414        ENDIF
                0415        IF ( GM_useBVP ) THEN
                0416         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useBVP',
                0417      &    ' code not yet fixed for P-Coordinate'
                0418         CALL PRINT_ERROR( msgBuf, myThid )
                0419         errCount = errCount + 1
                0420        ENDIF
                0421        IF ( GM_Visbeck_alpha.NE.zeroRL ) THEN
                0422         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: Visbeck',
                0423      &    'scheme not yet fixed for P-Coordinate'
                0424         CALL PRINT_ERROR( msgBuf, myThid )
                0425         errCount = errCount + 1
                0426        ENDIF
                0427        IF ( GM_useBatesK3d ) THEN
                0428         WRITE(msgBuf,'(2A,I3)') '** WARNING ** GMREDI_CHECK: ',
                0429      &    'GM_useBatesK3d potentially unsafe with P-Coordinate'
                0430         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0431      &                      SQUEEZE_RIGHT, myThid )
                0432        ENDIF
                0433        IF ( GM_useLeithQG ) THEN
                0434         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useLeithQG',
                0435      &    ' code not yet fixed for P-Coordinate'
                0436         CALL PRINT_ERROR( msgBuf, myThid )
                0437         errCount = errCount + 1
                0438        ENDIF
                0439        IF ( GM_useSubMeso ) THEN
                0440         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useSubMeso',
                0441      &   ' not yet fixed for P-Coordinate'
                0442         CALL PRINT_ERROR( msgBuf, myThid )
                0443         errCount = errCount + 1
                0444        ENDIF
                0445       ENDIF
                0446 
8233d0ceb9 Jean*0447       IF ( useShelfIce .OR. topoFile.NE.' ' ) THEN
                0448 C-    Some GM options are likely to not work when some dry grid cells are found
                0449 C     near the top (e.g., under ice-shelf). This might change as more pieces of
                0450 C     code get fixed (e.g., once Mixed-Layer depth is fixed) but for now safer
                0451 C     to just stop here if it is the case.
                0452        IF ( GM_taper_scheme.EQ.'ldd97' .OR.
                0453      &      GM_taper_scheme.EQ.'fm07' ) THEN
                0454         iL = ILNBLNK(GM_taper_scheme)
                0455         WRITE(msgBuf,'(3A)') 'GMREDI_CHECK: GM_taper_scheme "',
                0456      &   GM_taper_scheme(1:iL), '" not yet fixed for dry cell @ top'
                0457         CALL PRINT_ERROR( msgBuf, myThid )
                0458         errCount = errCount + 1
                0459        ENDIF
                0460        IF ( GM_useSubMeso ) THEN
                0461         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useSubMeso',
                0462      &   ' not yet fixed for dry cell @ top'
                0463         CALL PRINT_ERROR( msgBuf, myThid )
                0464         errCount = errCount + 1
                0465        ENDIF
                0466        IF ( GM_useBatesK3d ) THEN
                0467         WRITE(msgBuf,'(2A,I3)') '** WARNING ** GMREDI_CHECK: ',
                0468      &    'GM_useBatesK3d potentially unsafe with dry cell @ top'
                0469         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0470      &                      SQUEEZE_RIGHT, myThid )
                0471        ENDIF
                0472        IF ( GM_Visbeck_alpha.NE.zeroRL ) THEN
                0473         WRITE(msgBuf,'(2A,I3)') '** Warning ** GMREDI_CHECK: ',
                0474      &    'Visbeck scheme not fully tested with dry cell @ top'
                0475         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0476      &                      SQUEEZE_RIGHT, myThid )
                0477        ENDIF
                0478        IF ( GM_useLeithQG ) THEN
                0479         WRITE(msgBuf,'(2A,I3)') '** Warning ** GMREDI_CHECK: ',
                0480      &    'GM_useLeithQG not fully tested with dry cell @ top'
                0481         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0482      &                      SQUEEZE_RIGHT, myThid )
                0483        ENDIF
                0484 C-    end special check for dry cell @ top
                0485       ENDIF
                0486 
dfc9956354 Jean*0487 #ifdef ALLOW_PTRACERS
                0488       IF ( GM_AdvForm .AND. .NOT.GM_AdvSeparate
                0489      &       .AND. usePTRACERS ) THEN
                0490         redFlag = .FALSE.
                0491         DO iTr=1,PTRACERS_numInUse
                0492          IF ( .NOT.PTRACERS_useGMRedi(iTr) ) THEN
                0493           redFlag = .TRUE.
e25acdb1f2 Jean*0494           WRITE(msgBuf,'(2A,I3,A,L5)') 'GMREDI_CHECK:',
dfc9956354 Jean*0495      &     ' pTracers_useGMRedi(',iTr,' )=', PTRACERS_useGMRedi(iTr)
                0496           CALL PRINT_ERROR( msgBuf, myThid )
                0497          ENDIF
                0498         ENDDO
                0499         IF ( redFlag ) THEN
e25acdb1f2 Jean*0500           WRITE(msgBuf,'(2A)') 'GMREDI_CHECK:',
dfc9956354 Jean*0501      &     ' but GM Advective Form applies to all tracers !'
                0502           CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0503           errCount = errCount + 1
dfc9956354 Jean*0504         ENDIF
                0505       ENDIF
                0506 #endif /* ALLOW_PTRACERS */
                0507 
725ef7d279 Jean*0508 #ifdef ALLOW_GENERIC_ADVDIFF
c1c6d46ee2 Jean*0509 C     Check size of overlap region
b8a35fd4d2 Jean*0510       IF ( GM_AdvForm .AND. .NOT.GM_AdvSeparate
c1c6d46ee2 Jean*0511      &       .AND. GM_Visbeck_alpha.NE.0.
37549204de Jean*0512      &       .AND. useMultiDimAdvec ) THEN
c1c6d46ee2 Jean*0513 C       Visbeck variable K requires 1 more row/column in the overlap:
e25acdb1f2 Jean*0514 C       might need to increase OLx,OLy from 2 to 3 if GM advective
c1c6d46ee2 Jean*0515 C       form & multi-dim advection are used. This happens when:
                0516 C       a) using a 5 points stencil advection scheme ; or
                0517 C       b) using a 3 points stencil advection scheme on CS-grid
37549204de Jean*0518         GAD_OlMinSize(2) = MAX( GAD_OlMinSize(2), 1)
                0519         WRITE(msgBuf,'(A,9I3)')
                0520      &      'GMREDI_CHECK: GAD_OlMinSize=', GAD_OlMinSize
                0521         CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0522      &                      SQUEEZE_RIGHT , myThid )
b8a35fd4d2 Jean*0523       ENDIF
725ef7d279 Jean*0524 #endif /* ALLOW_GENERIC_ADVDIFF */
b8a35fd4d2 Jean*0525 
e25acdb1f2 Jean*0526       IF ( errCount.GE.1 ) THEN
                0527         WRITE(msgBuf,'(A,I3,A)')
                0528      &       'GMREDI_CHECK: detected', errCount,' fatal error(s)'
                0529         CALL PRINT_ERROR( msgBuf, myThid )
                0530         CALL ALL_PROC_DIE( 0 )
                0531         STOP 'ABNORMAL END: S/R GMREDI_CHECK'
                0532       ENDIF
b8a35fd4d2 Jean*0533       _END_MASTER(myThid)
                0534 
                0535 #endif /* ALLOW_GMREDI */
42c525bfb4 Alis*0536       RETURN
                0537       END