Back to home page

MITgcm

 
 

    


File indexing completed on 2026-01-27 06:08:47 UTC

view on githubraw file Latest commit 0039480a on 2025-12-09 18:37:54 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
0039480ad8 Jean*0178 #ifdef OLD_VISBECK_CALC
                0179 C Was to use old calculation (before 2007/05/24) of Visbeck etal K_GM+Redi
                0180 C (which depends on tapering scheme); got removed late 2025.
                0181 c     IF ( GM_Visbeck_alpha.NE.0. ) THEN
                0182        WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
                0183      &   '#define OLD_VISBECK_CALC not allowed in GMREDI_OPTIONS.h'
                0184        CALL PRINT_ERROR( msgBuf, myThid )
                0185        WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
                0186      &   ' since OLD_VISBECK_CALC code has been removed'
                0187        CALL PRINT_ERROR( msgBuf, myThid )
                0188        errCount = errCount + 1
                0189 c     ENDIF
                0190 #endif
b8a35fd4d2 Jean*0191 
a4576c7cde Juli*0192 #ifdef GM_GEOM_VARIABLE_K
                0193       IF ( GM_useGEOM ) THEN
                0194        CALL WRITE_0D_RL( GEOM_alpha, INDEX_NONE,
                0195      &  'GEOM_alpha      =', ' /* GEOM alpha coeff. [-] */')
                0196        CALL WRITE_0D_RL( GEOM_lmbda, INDEX_NONE,
                0197      &  'GEOM_lmbda      =', ' /* GEOM ene diss rate [/s] */')
                0198        CALL WRITE_0D_RL( GEOM_diffKh_EKE, INDEX_NONE,
                0199      &  'GEOM_diffKh_EKE =', ' /* GEOM Eke diffusion coeff [m2/s] */')
                0200        CALL WRITE_0D_L( GEOM_vert_struc, INDEX_NONE,
                0201      &  'GEOM_vert_struc =', ' /* GEOM vertical structure function */')
                0202        CALL WRITE_0D_RL( GEOM_vert_struc_min, INDEX_NONE,
                0203      &  'GEOM_vert_struc_min =', ' /* vert struc min [-] */')
                0204        CALL WRITE_0D_RL( GEOM_vert_struc_max, INDEX_NONE,
                0205      &  'GEOM_vert_struc_min =', ' /* vert struc min [-] */')
                0206        CALL WRITE_0D_RL( GEOM_minVal_K, INDEX_NONE,
                0207      &  'GEOM_minVal_K   =', ' /* GEOM_K3d lower bound [m2/s] */')
                0208        CALL WRITE_0D_RL( GEOM_maxVal_K, INDEX_NONE,
                0209      &  'GEOM_maxVal_K   =', ' /* GEOM_K3d upper bound [m2/s] */')
                0210        IF (usingPcoords) THEN
                0211         WRITE(msgBuf,'(3A)') 'GMREDI_CHECK:',
                0212      &       ' p-coords not yet implemented with GM_useGEOM'
                0213         CALL PRINT_ERROR( msgBuf, myThid )
                0214         errCount = errCount + 1
                0215        ENDIF
                0216       ENDIF
                0217 #else /* GM_GEOM_VARIABLE_K */
                0218 C     Make sure we are not trying to use something that is unavailable
                0219       IF ( GM_useGEOM ) THEN
                0220        WRITE(msgBuf,'(A)')
                0221      &   ' GMREDI_CHECK: GEOM variables used in data.gmredi'
                0222        CALL PRINT_ERROR( msgBuf, myThid )
                0223        WRITE(msgBuf,'(A)')
                0224      &   ' GMREDI_CHECK: without #define GM_GEOM_VARIABLE_K'
                0225        CALL PRINT_ERROR( msgBuf, myThid )
                0226        errCount = errCount + 1
                0227       ENDIF
                0228 #endif /* GM_GEOM_VARIABLE_K */
                0229 
b8a35fd4d2 Jean*0230 #ifndef GM_BOLUS_ADVEC
                0231 C     Make sure we are not trying to use some arrays that are unavailable
7185da56c9 Jean*0232       IF ( GM_AdvForm ) THEN
b8a35fd4d2 Jean*0233        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0234      &   'GMREDI_CHECK: GM Advection form used in data.gmredi'
7185da56c9 Jean*0235        CALL PRINT_ERROR( msgBuf, myThid )
b8a35fd4d2 Jean*0236        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0237      &   'GMREDI_CHECK: without #define GM_BOLUS_ADVEC'
7185da56c9 Jean*0238        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0239        errCount = errCount + 1
2a09713997 Patr*0240       ENDIF
b8a35fd4d2 Jean*0241 #endif
2a09713997 Patr*0242 
05118ac017 Jean*0243 #ifdef GM_BATES_K3D
dc60433548 Mich*0244 # ifndef HAVE_LAPACK
05118ac017 Jean*0245 c     IF ( GM_useBatesK3d ) THEN
                0246         WRITE(msgBuf, '(A)')
                0247      &     'Must use CPP option HAVE_LAPACK when using BatesK3d'
                0248         CALL PRINT_ERROR( msgBuf, myThid )
                0249         errCount = errCount + 1
                0250 c     ENDIF
5a6ef5c2b4 Mich*0251 # endif
05118ac017 Jean*0252       IF ( GM_useBatesK3d ) THEN
                0253         CALL WRITE_0D_L( GM_useBatesK3d, INDEX_NONE,
                0254      &   'GM_useBatesK3d =',
                0255      &   ' /* if TRUE => use BatesK3d for GM diffusivity */')
                0256         IF ( GM_Bates_use_constK ) THEN
                0257           CALL WRITE_0D_L( GM_Bates_use_constK, INDEX_NONE,
                0258      &         'GM_Bates_use_constK =',
                0259      &         ' /* if TRUE => Uses a constant K for'//
c8602656d9 Davi*0260      &         ' the eddy transport closure */')
05118ac017 Jean*0261           CALL WRITE_0D_L( GM_Bates_smooth, INDEX_NONE,
                0262      &         'GM_Bates_smooth =',
5a6ef5c2b4 Mich*0263      &         ' /* if TRUE => Expands in terms of baroclinic modes */')
05118ac017 Jean*0264           IF ( GM_Bates_smooth ) THEN
                0265             CALL WRITE_0D_I( GM_Bates_NModes, INDEX_NONE,
                0266      &           'GM_Bates_NModes =',
5a6ef5c2b4 Mich*0267      &           ' /* Number of modes for expansion */')
                0268           ENDIF
                0269         ELSE
05118ac017 Jean*0270           CALL WRITE_0D_I( GM_Bates_NModes, INDEX_NONE,
                0271      &         'GM_Bates_NModes =',
5a6ef5c2b4 Mich*0272      &         ' /* Number of modes for expansion */')
                0273         ENDIF
                0274       ENDIF
                0275 
05118ac017 Jean*0276 C     Make sure that we use BatesK3d with the advective form only.
0d1e4b948d Mich*0277 C     The skew form is not presently supported.
05118ac017 Jean*0278       IF ( GM_useBatesK3d .AND. .NOT.GM_AdvForm ) THEN
                0279         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
                0280      &       'GM_useBatesK3d=.TRUE. but GM_AdvForm=.FALSE.'
0d1e4b948d Mich*0281         CALL PRINT_ERROR( msgBuf, myThid )
                0282         WRITE(msgBuf,'(A)')
05118ac017 Jean*0283      &       'GMREDI_CHECK: To use BatesK3d set GM_AdvForm=.TRUE.'
0d1e4b948d Mich*0284        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0285        errCount = errCount + 1
4e65b6d0de Mich*0286       ENDIF
a67797e4f0 Jean*0287       IF ( GM_useBatesK3d .AND. deepAtmosphere ) THEN
                0288         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useBatesK3d',
                0289      &   ' not yet fixed for deep geometry (deepAtmosphere=T)'
                0290         CALL PRINT_ERROR( msgBuf, myThid )
                0291         errCount = errCount + 1
                0292       ENDIF
4e65b6d0de Mich*0293 
a67797e4f0 Jean*0294 #else /* GM_BATES_K3D */
                0295 C     Make sure we are not trying to use something that is unavailable
                0296       IF ( GM_useBatesK3d ) THEN
                0297        WRITE(msgBuf,'(A)')
                0298      &   'GMREDI_CHECK: GM_useBatesK3d is set to True in data.gmredi'
                0299        CALL PRINT_ERROR( msgBuf, myThid )
                0300        WRITE(msgBuf,'(A)')
                0301      &   'GMREDI_CHECK: without #define GM_BATES_K3D'
                0302        CALL PRINT_ERROR( msgBuf, myThid )
                0303        errCount = errCount + 1
                0304       ENDIF
05118ac017 Jean*0305 #endif /* GM_BATES_K3D */
0d1e4b948d Mich*0306 
b8a35fd4d2 Jean*0307 #ifndef GM_EXTRA_DIAGONAL
                0308 C     Make sure we are not trying to use some arrays that are unavailable
7185da56c9 Jean*0309       IF ( GM_ExtraDiag ) THEN
b8a35fd4d2 Jean*0310        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0311      &   'GMREDI_CHECK: GM_skew_Flux_K & GM_isopycK not equal'
7185da56c9 Jean*0312        CALL PRINT_ERROR( msgBuf, myThid )
b8a35fd4d2 Jean*0313        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0314      &   'GMREDI_CHECK: without #define GM_EXTRA_DIAGONAL'
7185da56c9 Jean*0315        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0316        errCount = errCount + 1
b8a35fd4d2 Jean*0317       ENDIF
2a09713997 Patr*0318 #endif
b8a35fd4d2 Jean*0319 
f6de204bec Jean*0320 #ifndef GM_NON_UNITY_DIAGONAL
                0321       IF ( GM_iso2dFile .NE. ' ' .OR.
                0322      &     GM_iso1dFile .NE. ' ' ) THEN
                0323        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0324      &   'GMREDI_CHECK: needs #define GM_NON_UNITY_DIAGONAL'
f6de204bec Jean*0325        CALL PRINT_ERROR( msgBuf, myThid )
                0326        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0327      &   'GMREDI_CHECK: to use GM_iso2dFile or GM_iso1dFile'
f6de204bec Jean*0328        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0329        errCount = errCount + 1
f6de204bec Jean*0330       ENDIF
f5509be190 Mart*0331       IF ( GM_isoFac_calcK .NE. zeroRL .AND.
                0332      &     ( GM_Visbeck_alpha.NE.zeroRL .OR.
                0333      &       GM_useBatesK3d .OR. GM_useLeithQG ) ) THEN
f59d76b0dd Ed D*0334        WRITE(msgBuf,'(A)')
f5509be190 Mart*0335      &   'GMREDI_CHECK: needs #define GM_NON_UNITY_DIAGONAL'
f59d76b0dd Ed D*0336        CALL PRINT_ERROR( msgBuf, myThid )
f5509be190 Mart*0337        IF ( GM_Visbeck_alpha.NE.zeroRL ) THEN
                0338         WRITE(msgBuf,'(A)')
                0339      &   'GMREDI_CHECK: to use Visbeck computed K'
                0340         CALL PRINT_ERROR( msgBuf, myThid )
                0341        ENDIF
                0342        IF ( GM_useBatesK3d .OR. GM_useLeithQG ) THEN
                0343         WRITE(msgBuf,'(A)')
                0344      &   'GMREDI_CHECK: to use GM_useBatesK3d or GM_useLeithQG'
                0345         CALL PRINT_ERROR( msgBuf, myThid )
                0346        ENDIF
e25acdb1f2 Jean*0347        errCount = errCount + 1
f59d76b0dd Ed D*0348       ENDIF
f5509be190 Mart*0349       IF ( errCount .EQ. 0 ) THEN
                0350         WRITE(msgBuf,'(2A)') '** WARNING ** GMREDI_CHECK: ',
                0351      &       '#undef GM_NON_UNITY_DIAGONAL not recommended'
                0352         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0353      &                      SQUEEZE_RIGHT, myThid )
                0354       ENDIF
f59d76b0dd Ed D*0355 #endif
                0356 
                0357 #ifndef ALLOW_GM_LEITH_QG
                0358       IF ( GM_useLeithQG ) THEN
                0359        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0360      &   'GMREDI_CHECK: GM_useLeithQG used in data.gmredi without'
f59d76b0dd Ed D*0361        CALL PRINT_ERROR( msgBuf, myThid )
                0362        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0363      &   'GMREDI_CHECK: #define ALLOW_GM_LEITH_QG'
f59d76b0dd Ed D*0364        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0365        errCount = errCount + 1
f59d76b0dd Ed D*0366       ENDIF
f6de204bec Jean*0367 #endif
e25acdb1f2 Jean*0368       IF ( GM_useLeithQG .AND. .NOT.momStepping ) THEN
                0369         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
                0370      &   'cannot use GM_useLeithQG with "momStepping= FALSE"'
                0371         CALL PRINT_ERROR( msgBuf, myThid )
                0372         errCount = errCount + 1
                0373       ENDIF
f6de204bec Jean*0374 
050b4366e6 Jean*0375 #ifdef GM_EXCLUDE_SUBMESO
                0376       IF ( GM_useSubMeso ) THEN
e25acdb1f2 Jean*0377         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
050b4366e6 Jean*0378      &   'cannot use Sub-Meso (GM_useSubMeso=T)'
                0379         CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0380         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
050b4366e6 Jean*0381      &   'when compiled with #define GM_EXCLUDE_SUBMESO'
                0382         CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0383         errCount = errCount + 1
050b4366e6 Jean*0384       ENDIF
                0385 #endif /* GM_EXCLUDE_SUBMESO */
                0386 
                0387       IF ( GM_useSubMeso .AND. .NOT.GM_AdvForm ) THEN
e25acdb1f2 Jean*0388         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: ',
050b4366e6 Jean*0389      &   'Sub-Meso only implemented within GM_AdvForm'
                0390         CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0391         errCount = errCount + 1
050b4366e6 Jean*0392       ENDIF
                0393 
879138fdca Jean*0394       IF ( GM_InMomAsStress ) THEN
441caf5dcc Jean*0395 #ifdef ALLOW_EDDYPSI
05118ac017 Jean*0396         IF ( .NOT.GM_useBatesK3d ) THEN
                0397           WRITE(msgBuf,'(3A)') 'GMREDI_CHECK: ',
                0398      &         'Using GM_InMomAsStress and not GM_useBatesK3d. ',
                0399      &         'GM_InMomAsStress=T has only been tested with BatesK3d'
                0400           CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0401      &                        SQUEEZE_RIGHT, myThid )
5853335f7f Mich*0402         ENDIF
879138fdca Jean*0403 #else /* ALLOW_EDDYPSI */
                0404        WRITE(msgBuf,'(2A)')
e25acdb1f2 Jean*0405      &  'GMREDI_CHECK: need to define ALLOW_EDDYPSI in CPP_OPTIONS.h',
879138fdca Jean*0406      &  ' to use GM_InMomAsStress'
                0407        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0408        errCount = errCount + 1
879138fdca Jean*0409 #endif /* ALLOW_EDDYPSI */
                0410       ENDIF
                0411       IF ( GM_InMomAsStress .AND. .NOT.GM_AdvForm ) THEN
                0412        WRITE(msgBuf,'(A)')
e25acdb1f2 Jean*0413      &   'GMREDI_CHECK: need GM_AdvForm=T to use GM_InMomAsStress'
879138fdca Jean*0414        CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0415        errCount = errCount + 1
879138fdca Jean*0416       ENDIF
441caf5dcc Jean*0417 
5b172de0d2 Jean*0418       IF ( usingPcoords ) THEN
                0419 C-    Some GM pieces of code have not been fixed to work in Pressure-coordinates
                0420        IF ( GM_taper_scheme.EQ.'fm07' .OR.
                0421      &      GM_taper_scheme.EQ.'stableGmAdjTap' ) THEN
                0422         iL = ILNBLNK(GM_taper_scheme)
                0423         WRITE(msgBuf,'(3A)') 'GMREDI_CHECK: GM_taper_scheme "',
                0424      &   GM_taper_scheme(1:iL), '" not yet fixed for P-Coordinate'
                0425         CALL PRINT_ERROR( msgBuf, myThid )
                0426         errCount = errCount + 1
                0427        ENDIF
                0428        IF ( GM_useBVP ) THEN
                0429         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useBVP',
                0430      &    ' code not yet fixed for P-Coordinate'
                0431         CALL PRINT_ERROR( msgBuf, myThid )
                0432         errCount = errCount + 1
                0433        ENDIF
                0434        IF ( GM_Visbeck_alpha.NE.zeroRL ) THEN
                0435         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: Visbeck',
                0436      &    'scheme not yet fixed for P-Coordinate'
                0437         CALL PRINT_ERROR( msgBuf, myThid )
                0438         errCount = errCount + 1
                0439        ENDIF
                0440        IF ( GM_useBatesK3d ) THEN
                0441         WRITE(msgBuf,'(2A,I3)') '** WARNING ** GMREDI_CHECK: ',
                0442      &    'GM_useBatesK3d potentially unsafe with P-Coordinate'
                0443         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0444      &                      SQUEEZE_RIGHT, myThid )
                0445        ENDIF
                0446        IF ( GM_useLeithQG ) THEN
                0447         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useLeithQG',
                0448      &    ' code not yet fixed for P-Coordinate'
                0449         CALL PRINT_ERROR( msgBuf, myThid )
                0450         errCount = errCount + 1
                0451        ENDIF
                0452        IF ( GM_useSubMeso ) THEN
                0453         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useSubMeso',
                0454      &   ' not yet fixed for P-Coordinate'
                0455         CALL PRINT_ERROR( msgBuf, myThid )
                0456         errCount = errCount + 1
                0457        ENDIF
                0458       ENDIF
                0459 
8233d0ceb9 Jean*0460       IF ( useShelfIce .OR. topoFile.NE.' ' ) THEN
                0461 C-    Some GM options are likely to not work when some dry grid cells are found
                0462 C     near the top (e.g., under ice-shelf). This might change as more pieces of
                0463 C     code get fixed (e.g., once Mixed-Layer depth is fixed) but for now safer
                0464 C     to just stop here if it is the case.
                0465        IF ( GM_taper_scheme.EQ.'ldd97' .OR.
                0466      &      GM_taper_scheme.EQ.'fm07' ) THEN
                0467         iL = ILNBLNK(GM_taper_scheme)
                0468         WRITE(msgBuf,'(3A)') 'GMREDI_CHECK: GM_taper_scheme "',
                0469      &   GM_taper_scheme(1:iL), '" not yet fixed for dry cell @ top'
                0470         CALL PRINT_ERROR( msgBuf, myThid )
                0471         errCount = errCount + 1
                0472        ENDIF
                0473        IF ( GM_useSubMeso ) THEN
                0474         WRITE(msgBuf,'(2A)') 'GMREDI_CHECK: GM_useSubMeso',
                0475      &   ' not yet fixed for dry cell @ top'
                0476         CALL PRINT_ERROR( msgBuf, myThid )
                0477         errCount = errCount + 1
                0478        ENDIF
                0479        IF ( GM_useBatesK3d ) THEN
                0480         WRITE(msgBuf,'(2A,I3)') '** WARNING ** GMREDI_CHECK: ',
                0481      &    'GM_useBatesK3d potentially unsafe with dry cell @ top'
                0482         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0483      &                      SQUEEZE_RIGHT, myThid )
                0484        ENDIF
                0485        IF ( GM_Visbeck_alpha.NE.zeroRL ) THEN
                0486         WRITE(msgBuf,'(2A,I3)') '** Warning ** GMREDI_CHECK: ',
                0487      &    'Visbeck scheme not fully tested with dry cell @ top'
                0488         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0489      &                      SQUEEZE_RIGHT, myThid )
                0490        ENDIF
                0491        IF ( GM_useLeithQG ) THEN
                0492         WRITE(msgBuf,'(2A,I3)') '** Warning ** GMREDI_CHECK: ',
                0493      &    'GM_useLeithQG not fully tested with dry cell @ top'
                0494         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0495      &                      SQUEEZE_RIGHT, myThid )
                0496        ENDIF
                0497 C-    end special check for dry cell @ top
                0498       ENDIF
                0499 
dfc9956354 Jean*0500 #ifdef ALLOW_PTRACERS
                0501       IF ( GM_AdvForm .AND. .NOT.GM_AdvSeparate
                0502      &       .AND. usePTRACERS ) THEN
                0503         redFlag = .FALSE.
                0504         DO iTr=1,PTRACERS_numInUse
                0505          IF ( .NOT.PTRACERS_useGMRedi(iTr) ) THEN
                0506           redFlag = .TRUE.
e25acdb1f2 Jean*0507           WRITE(msgBuf,'(2A,I3,A,L5)') 'GMREDI_CHECK:',
dfc9956354 Jean*0508      &     ' pTracers_useGMRedi(',iTr,' )=', PTRACERS_useGMRedi(iTr)
                0509           CALL PRINT_ERROR( msgBuf, myThid )
                0510          ENDIF
                0511         ENDDO
                0512         IF ( redFlag ) THEN
e25acdb1f2 Jean*0513           WRITE(msgBuf,'(2A)') 'GMREDI_CHECK:',
dfc9956354 Jean*0514      &     ' but GM Advective Form applies to all tracers !'
                0515           CALL PRINT_ERROR( msgBuf, myThid )
e25acdb1f2 Jean*0516           errCount = errCount + 1
dfc9956354 Jean*0517         ENDIF
                0518       ENDIF
                0519 #endif /* ALLOW_PTRACERS */
                0520 
725ef7d279 Jean*0521 #ifdef ALLOW_GENERIC_ADVDIFF
c1c6d46ee2 Jean*0522 C     Check size of overlap region
b8a35fd4d2 Jean*0523       IF ( GM_AdvForm .AND. .NOT.GM_AdvSeparate
c1c6d46ee2 Jean*0524      &       .AND. GM_Visbeck_alpha.NE.0.
37549204de Jean*0525      &       .AND. useMultiDimAdvec ) THEN
c1c6d46ee2 Jean*0526 C       Visbeck variable K requires 1 more row/column in the overlap:
e25acdb1f2 Jean*0527 C       might need to increase OLx,OLy from 2 to 3 if GM advective
c1c6d46ee2 Jean*0528 C       form & multi-dim advection are used. This happens when:
                0529 C       a) using a 5 points stencil advection scheme ; or
                0530 C       b) using a 3 points stencil advection scheme on CS-grid
37549204de Jean*0531         GAD_OlMinSize(2) = MAX( GAD_OlMinSize(2), 1)
                0532         WRITE(msgBuf,'(A,9I3)')
                0533      &      'GMREDI_CHECK: GAD_OlMinSize=', GAD_OlMinSize
                0534         CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0535      &                      SQUEEZE_RIGHT , myThid )
b8a35fd4d2 Jean*0536       ENDIF
725ef7d279 Jean*0537 #endif /* ALLOW_GENERIC_ADVDIFF */
b8a35fd4d2 Jean*0538 
e25acdb1f2 Jean*0539       IF ( errCount.GE.1 ) THEN
                0540         WRITE(msgBuf,'(A,I3,A)')
                0541      &       'GMREDI_CHECK: detected', errCount,' fatal error(s)'
                0542         CALL PRINT_ERROR( msgBuf, myThid )
                0543         CALL ALL_PROC_DIE( 0 )
                0544         STOP 'ABNORMAL END: S/R GMREDI_CHECK'
                0545       ENDIF
b8a35fd4d2 Jean*0546       _END_MASTER(myThid)
                0547 
                0548 #endif /* ALLOW_GMREDI */
42c525bfb4 Alis*0549       RETURN
                0550       END