C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_check.F,v 1.11 2017/10/19 00:33:27 jmc Exp $ C $Name: $ #include "KPP_OPTIONS.h" SUBROUTINE KPP_CHECK( myThid ) C *==========================================================* C | SUBROUTINE KPP_CHECK C | o Validate basic package setup and inter-package C | dependencies. C *==========================================================* IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "KPP_PARAMS.h" C === Routine arguments === C myThid :: my Thread Id Number INTEGER myThid #ifdef ALLOW_KPP C === Local variables === C msgBuf :: Informational/error message buffer CHARACTER*(MAX_LEN_MBUF) msgBuf _BEGIN_MASTER(myThid) WRITE(msgBuf,'(A)') 'KPP_CHECK: #define ALLOW_KPP' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) C-- Print out KPP parameters: CALL WRITE_0D_RL( kpp_freq, INDEX_NONE, ' kpp_freq =', & ' /* frequency of KPP calculation */') CALL WRITE_0D_L( KPP_ghatUseTotalDiffus, INDEX_NONE, & 'KPP_ghatUseTotalDiffus=', & ' /* non-local term fct of total diffus */') CALL WRITE_0D_L( KPPuseDoubleDiff, INDEX_NONE, & 'KPPuseDoubleDiff =', ' /* include double diffusive contrib */') CALL WRITE_0D_L( LimitHblStable, INDEX_NONE, & 'LimitHblStable =', ' /* limits depth of hbl if stable cond.*/') CALL WRITE_0D_RL( minKPPhbl, INDEX_NONE, ' minKPPhbl =', & ' /* minimum KPPhbl value [m] */') CALL WRITE_0D_RL( epsln, INDEX_NONE, ' epsln =', & ' /* constant [-] */') CALL WRITE_0D_RL( phepsi, INDEX_NONE, ' phepsi =', & ' /* constant [-] */') CALL WRITE_0D_RL( epsilon, INDEX_NONE, ' epsilon =', & ' /* constant [-] */') CALL WRITE_0D_RL( vonk, INDEX_NONE, ' vonk =', & ' /* Von Karmans constant [-] */') CALL WRITE_0D_RL( dB_dz, INDEX_NONE, ' dB_dz =', & ' /* maximum N^2 in mixed layer [s^-2] */') CALL WRITE_0D_RL( conc1, INDEX_NONE, ' conc1 =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( conam, INDEX_NONE, ' conam =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( concm, INDEX_NONE, ' concm =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( conc2, INDEX_NONE, ' conc2 =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( conas, INDEX_NONE, ' conas =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( concs, INDEX_NONE, ' concs =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( conc3, INDEX_NONE, ' conc3 =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( zetam, INDEX_NONE, ' zetam =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( zetas, INDEX_NONE, ' zetas =', & ' /* scalar constant [-] */') CALL WRITE_0D_RL( Ricr, INDEX_NONE, ' Ricr =', & ' /* critical bulk Richardson Number [-] */') CALL WRITE_0D_RL( cekman, INDEX_NONE, ' cekman =', & ' /* coeff for Ekman depth [-] */') CALL WRITE_0D_RL( cmonob, INDEX_NONE, ' cmonob =', & ' /* coeff for Monin-Obukhov depth [-] */') CALL WRITE_0D_RL( concv, INDEX_NONE, ' concv =', & ' /* buoyancy freq ratio [-] */') CALL WRITE_0D_RL( hbf, INDEX_NONE, ' hbf =', & ' /* solar radiation depth ratio [-] */') CALL WRITE_0D_RL( zmin, INDEX_NONE, ' zmin =', & ' /* minimum for zehat in table [m3/s3] */') CALL WRITE_0D_RL( zmax, INDEX_NONE, ' zmax =', & ' /* maximum for zehat in table [m3/s3] */') CALL WRITE_0D_RL( umin, INDEX_NONE, ' umin =', & ' /* minimum for ustar in table [m/s] */') CALL WRITE_0D_RL( umax, INDEX_NONE, ' umax =', & ' /* maximum for ustar in table [m/s] */') CALL WRITE_0D_I( num_v_smooth_Ri, INDEX_NONE, & 'num_v_smooth_Ri =', ' /* number of vertical smoothing */') CALL WRITE_0D_RL( Riinfty, INDEX_NONE, ' Riinfty =', & ' /* shear instability Ri number limit [-] */') CALL WRITE_0D_RL( BVSQcon, INDEX_NONE, ' BVSQcon =', & ' /* Brunt-Vaisala squared (=N^2) [s^-2] */') CALL WRITE_0D_RL( difm0, INDEX_NONE, ' difm0 =', & ' /* max viscosity from shear instab. [m2/s] */') CALL WRITE_0D_RL( difs0, INDEX_NONE, ' difs0 =', & ' /* max diffusiv. from shear instab. [m2/s] */') CALL WRITE_0D_RL( dift0, INDEX_NONE, ' dift0 =', & ' /* max diffusiv. from shear instab. [m2/s] */') CALL WRITE_0D_RL( difmcon, INDEX_NONE, ' difmcon =', & ' /* convective viscosity [m2/s] */') CALL WRITE_0D_RL( difscon, INDEX_NONE, ' difscon =', & ' /* convective diffusiv. [m2/s] */') CALL WRITE_0D_RL( diftcon, INDEX_NONE, ' diftcon =', & ' /* convective diffusiv. [m2/s] */') CALL WRITE_0D_RL( Rrho0, INDEX_NONE, ' Rrho0 =', & ' /* double diffusion density ratio [-] */') CALL WRITE_0D_RL( dsfmax, INDEX_NONE, ' dsfmax =', & ' /* max diffusiv. for salt fingering [m2/s] */') CALL WRITE_0D_RL( cstar, INDEX_NONE, ' cstar =', & ' /* coeff for non-locak transport [-] */') C-- CALL WRITE_0D_L( KPPwriteState, INDEX_NONE, & 'KPPwriteState =', ' /* write KPP fields to file */') CALL WRITE_0D_RL( kpp_dumpFreq, INDEX_NONE, ' kpp_dumpFreq =', & ' /* dump freq of KPP output */') CALL WRITE_0D_RL( kpp_taveFreq, INDEX_NONE, ' kpp_taveFreq =', & ' /* time-averaging freq of KPP output */') C-- Check parameters: C KPP needs convection turned off (will be packaged later) IF (cAdjFreq.NE.0. .OR. & ivdc_kappa.NE.0.) THEN WRITE(msgBuf,'(A)') 'Some form of convection has been enabled' CALL PRINT_ERROR( msgBuf , myThid ) STOP 'ABNORMAL END: S/R KPP_CHECK' ENDIF C KPP needs implicit vertical diffusion and viscosity IF (.NOT.implicitDiffusion ) THEN WRITE(msgBuf,'(A)') 'KPP needs implicitDiffusion to be enabled' CALL PRINT_ERROR( msgBuf , myThid ) STOP 'ABNORMAL END: S/R KPP_CHECK' ENDIF IF ( .NOT.implicitViscosity .AND. momStepping ) THEN WRITE(msgBuf,'(A)') 'KPP needs implicitViscosity to be enabled' CALL PRINT_ERROR( msgBuf , myThid ) STOP 'ABNORMAL END: S/R KPP_CHECK' ENDIF C Shortwave heating should be defined with KPP #ifndef SHORTWAVE_HEATING WRITE(msgBuf,'(A)') 'KPP needs CPP flag SHORTWAVE_HEATING enabled' CALL PRINT_ERROR( msgBuf , myThid ) STOP 'ABNORMAL END: S/R KPP_CHECK' #endif /* SHORTWAVE_HEATING */ C Check that overlap region is adequate. C When horizontal smoothing is turned on, C KPP_CALC computes vertical viscosity and diffusivity for region C (-2:sNx+3,-2:sNy+3) as required by CALC_DIFFUSIVITY and requires C values of uVel, vVel, surfaceForcingU, surfaceForcingV in the C region (-2:sNx+4,-2:sNy+4). C Hence overlap region needs to be set OLx=4, OLy=4. #if defined(KPP_SMOOTH_SHSQ) defined(KPP_SMOOTH_DVSQ) # define KPP_NEEDS_OVERLAP_4 #endif #if defined(KPP_SMOOTH_DBLOC) defined(KPP_SMOOTH_DENS) # define KPP_NEEDS_OVERLAP_4 #endif #ifdef KPP_NEEDS_OVERLAP_4 #ifdef KPP_REACTIVATE_OL4 IF (OLx.LT.4 .OR. OLy.LT.4) THEN WRITE(msgBuf,'(A)') 'KPP horizontal smoothing requires OLx=OLy=4' CALL PRINT_ERROR( msgBuf , myThid ) STOP 'ABNORMAL END: S/R KPP_CHECK' ENDIF #endif #endif #ifdef EXCLUDE_KPP_DOUBLEDIFF IF ( KPPuseDoubleDiff ) THEN WRITE(msgBuf,'(A,A)') 'KPPuseDoubleDiff=.TRUE. requires ', & 'that EXCLUDE_KPP_DOUBLEDIFF is undefined' CALL PRINT_ERROR( msgBuf , myThid ) STOP 'ABNORMAL END: S/R KPP_CHECK' ENDIF #endif /* EXCLUDE_KPP_DOUBLEDIFF */ WRITE(msgBuf,'(A)') ' ' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) _END_MASTER(myThid) #endif /* ALLOW_KPP */ RETURN END