| 1 |
jmc |
1.11 |
C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_check.F,v 1.10 2017/01/11 00:22:48 gforget Exp $ |
| 2 |
jmc |
1.1 |
C $Name: $ |
| 3 |
|
|
|
| 4 |
|
|
#include "DIAG_OPTIONS.h" |
| 5 |
|
|
|
| 6 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
| 7 |
|
|
CBOP 0 |
| 8 |
|
|
C !ROUTINE: DIAGNOSTICS_CHECK |
| 9 |
|
|
|
| 10 |
|
|
C !INTERFACE: |
| 11 |
|
|
SUBROUTINE DIAGNOSTICS_CHECK(myThid) |
| 12 |
|
|
|
| 13 |
|
|
C !DESCRIPTION: |
| 14 |
|
|
C Check option and parameter consistency |
| 15 |
jmc |
1.7 |
|
| 16 |
jmc |
1.1 |
C !USES: |
| 17 |
|
|
IMPLICIT NONE |
| 18 |
|
|
#include "SIZE.h" |
| 19 |
|
|
#include "EEPARAMS.h" |
| 20 |
|
|
#include "PARAMS.h" |
| 21 |
jmc |
1.7 |
#include "GRID.h" |
| 22 |
jmc |
1.1 |
#include "DIAGNOSTICS_SIZE.h" |
| 23 |
|
|
#include "DIAGNOSTICS.h" |
| 24 |
|
|
|
| 25 |
|
|
C !INPUT PARAMETERS: |
| 26 |
|
|
INTEGER myThid |
| 27 |
|
|
CEOP |
| 28 |
|
|
|
| 29 |
|
|
C !LOCAL VARIABLES: |
| 30 |
|
|
CHARACTER*(MAX_LEN_MBUF) msgBuf |
| 31 |
jmc |
1.7 |
INTEGER ld,md,nd |
| 32 |
|
|
INTEGER k,m |
| 33 |
|
|
INTEGER jpoint1, ipoint1, jpoint2, ipoint2 |
| 34 |
|
|
_RL margin |
| 35 |
jmc |
1.1 |
|
| 36 |
|
|
_BEGIN_MASTER(myThid) |
| 37 |
|
|
|
| 38 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
| 39 |
|
|
C Check diagnostics parameter consistency |
| 40 |
|
|
|
| 41 |
jmc |
1.9 |
IF ( useMissingValue .AND. .NOT. diag_mnc ) THEN |
| 42 |
|
|
WRITE(msgBuf,'(2A)') '** WARNING ** DIAGNOSTICS_CHECK: ', |
| 43 |
|
|
& 'ignore "useMissingValue" since "diag_mnc" is off' |
| 44 |
|
|
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, |
| 45 |
|
|
& SQUEEZE_RIGHT , myThid ) |
| 46 |
|
|
ENDIF |
| 47 |
|
|
|
| 48 |
gforget |
1.10 |
IF ( diag_mnc.AND.(diagMdsDir.NE.' ') ) THEN |
| 49 |
|
|
WRITE(msgBuf,'(A,A)') 'S/R DIAGNOSTICS_CHECK: diagMdsDir ', |
| 50 |
|
|
& 'and pkg/mnc cannot be used together' |
| 51 |
|
|
CALL PRINT_ERROR( msgBuf, myThid ) |
| 52 |
|
|
CALL ALL_PROC_DIE( 0 ) |
| 53 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 54 |
|
|
ENDIF |
| 55 |
|
|
|
| 56 |
|
|
IF ( (mdsioLocalDir.NE.' ').AND.(diagMdsDir.NE.' ') ) THEN |
| 57 |
|
|
WRITE(msgBuf,'(A)') |
| 58 |
|
|
& 'S/R DIAGNOSTICS_CHECK: mdsioLocalDir and diagMdsDir cannot be' |
| 59 |
|
|
CALL PRINT_ERROR( msgBuf, myThid ) |
| 60 |
|
|
WRITE(msgBuf,'(A)') |
| 61 |
|
|
& 'S/R DIAGNOSTICS_CHECK: specified at the same time' |
| 62 |
|
|
CALL PRINT_ERROR( msgBuf, myThid ) |
| 63 |
|
|
CALL ALL_PROC_DIE( 0 ) |
| 64 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 65 |
|
|
ENDIF |
| 66 |
|
|
|
| 67 |
jmc |
1.3 |
#ifdef DIAGNOSTICS_HAS_PICKUP |
| 68 |
|
|
IF ( diag_pickup_read ) THEN |
| 69 |
|
|
WRITE(msgBuf,'(2A)') '**CAUTION** (DIAGNOSTICS_CHECK): ', |
| 70 |
|
|
& 'reading diagnostics previous state' |
| 71 |
|
|
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, |
| 72 |
|
|
& SQUEEZE_RIGHT , myThid) |
| 73 |
|
|
WRITE(msgBuf,'(2A)') '**CAUTION** ', |
| 74 |
|
|
& ' from a pickup file can only work if data.diagnostics' |
| 75 |
|
|
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, |
| 76 |
|
|
& SQUEEZE_RIGHT , myThid) |
| 77 |
|
|
WRITE(msgBuf,'(2A)') '**CAUTION** ', |
| 78 |
|
|
& ' is not changed (<= further checking not yet implemented)' |
| 79 |
|
|
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, |
| 80 |
|
|
& SQUEEZE_RIGHT , myThid) |
| 81 |
|
|
ENDIF |
| 82 |
|
|
#else /* undef DIAGNOSTICS_HAS_PICKUP */ |
| 83 |
|
|
C- stop if trying to use part of the code that is not compiled: |
| 84 |
|
|
IF ( diag_pickup_read ) THEN |
| 85 |
|
|
WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_CHECK: ', |
| 86 |
|
|
& 'diag_pickup_read is TRUE ', |
| 87 |
|
|
& 'but DIAGNOSTICS_HAS_PICKUP is "#undef"' |
| 88 |
|
|
CALL PRINT_ERROR( msgBuf , myThid) |
| 89 |
|
|
ENDIF |
| 90 |
|
|
IF ( diag_pickup_write ) THEN |
| 91 |
|
|
WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_CHECK: ', |
| 92 |
|
|
& 'diag_pickup_write is TRUE ', |
| 93 |
|
|
& 'but DIAGNOSTICS_HAS_PICKUP is "#undef"' |
| 94 |
|
|
CALL PRINT_ERROR( msgBuf , myThid) |
| 95 |
|
|
ENDIF |
| 96 |
|
|
IF ( diag_pickup_read .OR. diag_pickup_write ) THEN |
| 97 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 98 |
|
|
ENDIF |
| 99 |
|
|
#endif /* DIAGNOSTICS_HAS_PICKUP */ |
| 100 |
jmc |
1.7 |
|
| 101 |
jmc |
1.1 |
C- File names: |
| 102 |
jmc |
1.7 |
DO ld = 2,nlists |
| 103 |
|
|
DO m = 1,ld-1 |
| 104 |
|
|
IF ( fnames(ld).EQ.fnames(m) ) THEN |
| 105 |
jmc |
1.1 |
WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_CHECK: ', |
| 106 |
|
|
& 'found 2 identical filenames:' |
| 107 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 108 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5,2A)') 'DIAGNOSTICS_CHECK: ', |
| 109 |
jmc |
1.1 |
& '1rst (m=', m, ' ): ', fnames(m) |
| 110 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 111 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5,2A)') 'DIAGNOSTICS_CHECK: ', |
| 112 |
jmc |
1.7 |
& ' 2nd (n=', ld, ' ): ', fnames(ld) |
| 113 |
jmc |
1.1 |
CALL PRINT_ERROR( msgBuf , myThid ) |
| 114 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 115 |
|
|
ENDIF |
| 116 |
|
|
ENDDO |
| 117 |
|
|
ENDDO |
| 118 |
|
|
|
| 119 |
jmc |
1.7 |
DO ld = 2,diagSt_nbLists |
| 120 |
|
|
DO m = 1,ld-1 |
| 121 |
|
|
IF ( diagSt_Fname(ld).EQ.diagSt_Fname(m) ) THEN |
| 122 |
jmc |
1.4 |
WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_CHECK: ', |
| 123 |
|
|
& 'found 2 identical stat_fname:' |
| 124 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 125 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5,2A)') 'DIAGNOSTICS_CHECK: ', |
| 126 |
jmc |
1.4 |
& '1rst (m=', m, ' ): ', diagSt_Fname(m) |
| 127 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 128 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5,2A)') 'DIAGNOSTICS_CHECK: ', |
| 129 |
jmc |
1.7 |
& ' 2nd (n=', ld, ' ): ', diagSt_Fname(ld) |
| 130 |
jmc |
1.4 |
CALL PRINT_ERROR( msgBuf , myThid ) |
| 131 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 132 |
|
|
ENDIF |
| 133 |
|
|
ENDDO |
| 134 |
|
|
ENDDO |
| 135 |
|
|
|
| 136 |
jmc |
1.1 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
| 137 |
|
|
C- Check for field that appears 2 times (or more) with differents frequency: |
| 138 |
jmc |
1.5 |
C disable this checking since now diagnostics pkg can handle this case. |
| 139 |
jmc |
1.1 |
|
| 140 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
| 141 |
|
|
|
| 142 |
jmc |
1.7 |
C-- Vertical Interpolation: check for compatibility: |
| 143 |
|
|
C better to stop here, rather much later, when trying to write output |
| 144 |
|
|
DO ld = 1,nlists |
| 145 |
|
|
IF ( fflags(ld)(2:2).EQ.'P' ) THEN |
| 146 |
|
|
IF ( fluidIsAir ) THEN |
| 147 |
|
|
C- check that interpolated levels are >0 & fall within the domain +/- X % |
| 148 |
|
|
C (needs p>0 for p^kappa ; here take a 10 % margin) |
| 149 |
|
|
margin = rkSign*(rF(Nr+1)-rF(1))*0.1 _d 0 |
| 150 |
|
|
DO k=1,nlevels(ld) |
| 151 |
|
|
IF ( levs(k,ld)-MAX(rF(1),rF(Nr+1)).GT.margin |
| 152 |
|
|
& .OR. levs(k,ld)-MIN(rF(1),rF(Nr+1)).LT.-margin |
| 153 |
|
|
& .OR. levs(k,ld).LE.0. ) THEN |
| 154 |
|
|
|
| 155 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5,2A)') 'DIAGNOSTICS_CHECK: ', |
| 156 |
jmc |
1.7 |
& 'Vertical Interp. for list l=', ld, |
| 157 |
|
|
& ', filename: ', fnames(ld) |
| 158 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 159 |
|
|
WRITE(msgBuf,'(2A,I4,3(A,F16.8))') 'DIAGNOSTICS_CHECK: ', |
| 160 |
|
|
& ' lev(k=', k, ') p=', levs(k,ld), |
| 161 |
|
|
& ' not in the domain:',rF(1),' :',rF(Nr+1) |
| 162 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 163 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 164 |
|
|
ENDIF |
| 165 |
|
|
ENDDO |
| 166 |
|
|
ELSE |
| 167 |
|
|
C- p^kappa interpolation: meaningfull only if Atmosphere & P-coordiante |
| 168 |
|
|
WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_CHECK: ', |
| 169 |
|
|
& 'INTERP_VERT not allowed in this config' |
| 170 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 171 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5,2A)') 'DIAGNOSTICS_CHECK: ', |
| 172 |
jmc |
1.7 |
& ' for list l=', ld, ', filename: ', fnames(ld) |
| 173 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 174 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 175 |
|
|
ENDIF |
| 176 |
|
|
IF (select_rStar.GT.0) THEN |
| 177 |
|
|
C- If nonlinear free surf is active, need averaged pressures |
| 178 |
|
|
DO md = 1,nfields(ld) |
| 179 |
jmc |
1.11 |
nd = ABS(jdiag(md,ld)) |
| 180 |
jmc |
1.7 |
CALL DIAGNOSTICS_GET_POINTERS( 'RSURF ', ld, |
| 181 |
|
|
& jpoint1, ipoint1, myThid ) |
| 182 |
|
|
IF ( useFIZHI .AND. |
| 183 |
|
|
& gdiag(nd)(10:10) .EQ. 'L') THEN |
| 184 |
|
|
CALL DIAGNOSTICS_GET_POINTERS('FIZPRES ', ld, |
| 185 |
|
|
& jpoint2, ipoint2, myThid ) |
| 186 |
|
|
ELSE |
| 187 |
|
|
CALL DIAGNOSTICS_GET_POINTERS('RCENTER ', ld, |
| 188 |
|
|
& jpoint2, ipoint2, myThid ) |
| 189 |
|
|
ENDIF |
| 190 |
|
|
IF ( ipoint1.EQ.0 .OR. ipoint2.EQ.0 ) THEN |
| 191 |
jmc |
1.8 |
WRITE(msgBuf,'(2A,I5)') 'DIAGNOSTICS_CHECK: ', |
| 192 |
jmc |
1.7 |
& 'to interpolate diags from output list:', ld |
| 193 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 194 |
|
|
IF ( ipoint1.EQ.0 .AND. jpoint1.EQ.0 ) THEN |
| 195 |
|
|
WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_CHECK: ', |
| 196 |
|
|
& 'needs to turn ON surface pressure diagnostic "RSURF "' |
| 197 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 198 |
|
|
ELSEIF ( ipoint1.EQ.0 ) THEN |
| 199 |
|
|
WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_CHECK: ', |
| 200 |
|
|
& 'needs surface pressure diagnostic "RSURF " ', |
| 201 |
|
|
& 'with same output time' |
| 202 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 203 |
|
|
ENDIF |
| 204 |
|
|
IF ( ipoint2.EQ.0 .AND. jpoint2.EQ.0 ) THEN |
| 205 |
|
|
WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_CHECK: ', |
| 206 |
|
|
& 'needs to turn ON 3-D pressure diagnostic "RCENTER "' |
| 207 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 208 |
|
|
ELSEIF ( ipoint2.EQ.0 ) THEN |
| 209 |
|
|
WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_CHECK: ', |
| 210 |
|
|
& 'needs 3-D pressure diagnostic "RCENTER " ', |
| 211 |
|
|
& 'with same output time' |
| 212 |
|
|
CALL PRINT_ERROR( msgBuf , myThid ) |
| 213 |
|
|
ENDIF |
| 214 |
|
|
STOP 'ABNORMAL END: S/R DIAGNOSTICS_CHECK' |
| 215 |
|
|
ENDIF |
| 216 |
|
|
ENDDO |
| 217 |
|
|
ENDIF |
| 218 |
|
|
ENDIF |
| 219 |
|
|
ENDDO |
| 220 |
|
|
|
| 221 |
jmc |
1.1 |
_END_MASTER(myThid) |
| 222 |
|
|
|
| 223 |
|
|
RETURN |
| 224 |
|
|
END |