File indexing completed on 2019-08-15 05:10:36 UTC
view on githubraw file Latest commit 6cc227ba on 2019-03-20 19:12:24 UTC
c90c060abd Ed H*0001 #include "DIAG_OPTIONS.h"
0002
e129400813 Jean*0003
0004
0005
721cebbdca Jean*0006
205bd86651 Jean*0007
a0bbeea03c Jean*0008
205bd86651 Jean*0009
e129400813 Jean*0010
0011
3dcfb9510a Jean*0012
e129400813 Jean*0013
313f3157b9 Ed H*0014
0015
337bea277a Jean*0016
448e4f0724 Jean*0017
0018
721cebbdca Jean*0019 SUBROUTINE DIAGNOSTICS_COUNT( diagName,
0020 I biArg, bjArg, myThid )
448e4f0724 Jean*0021
0022
0023
0024
0025
0026
0027 IMPLICIT NONE
0028
0029
0030 #include "EEPARAMS.h"
0031 #include "SIZE.h"
0032 #include "DIAGNOSTICS_SIZE.h"
0033 #include "DIAGNOSTICS.h"
0034
0035
0036
0037
0038
721cebbdca Jean*0039
448e4f0724 Jean*0040
0041
0042
0043
721cebbdca Jean*0044 CHARACTER*8 diagName
448e4f0724 Jean*0045 INTEGER biArg, bjArg
0046 INTEGER myThid
0047
0048
0049
0050
3ae5f90260 Jean*0051 INTEGER m, n
0052 INTEGER bi, bj
955e921fb3 Jean*0053 INTEGER ipt, ndId
448e4f0724 Jean*0054
0055
955e921fb3 Jean*0056 IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
0057 bi = myBxLo(myThid)
0058 bj = myByLo(myThid)
0059 ELSE
0060 bi = MIN(biArg,nSx)
0061 bj = MIN(bjArg,nSy)
0062 ENDIF
0063
3ae5f90260 Jean*0064
0065
721cebbdca Jean*0066 DO n=1,nLists
448e4f0724 Jean*0067 DO m=1,nActive(n)
721cebbdca Jean*0068 IF ( diagName.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
3ae5f90260 Jean*0069 ipt = idiag(m,n)
955e921fb3 Jean*0070 IF (ndiag(ipt,bi,bj).GE.0) THEN
b38beaf3c1 Jean*0071 ndId = ABS(jdiag(m,n))
955e921fb3 Jean*0072 ipt = ipt + pdiag(n,bi,bj)*kdiag(ndId)
3ae5f90260 Jean*0073
0074 IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
0075 DO bj=myByLo(myThid), myByHi(myThid)
0076 DO bi=myBxLo(myThid), myBxHi(myThid)
0077 ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
0078 ENDDO
0079 ENDDO
0080 ELSE
0081 ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
0082 ENDIF
0083
0084 ENDIF
448e4f0724 Jean*0085 ENDIF
0086 ENDDO
0087 ENDDO
0088
3ae5f90260 Jean*0089 RETURN
448e4f0724 Jean*0090 END
0091
0092
0093
0094
721cebbdca Jean*0095
0096
0097
0098 SUBROUTINE DIAGNOSTICS_GET_DIAG(
0099 I kl, undefRL,
0100 O qtmp,
0101 I ndId, mate, ip, im, bi, bj, myThid )
0102
0103
0104
0105
0106
0107 IMPLICIT NONE
0108 #include "EEPARAMS.h"
0109 #include "SIZE.h"
0110 #include "DIAGNOSTICS_SIZE.h"
0111 #include "DIAGNOSTICS.h"
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123 INTEGER kl
0124 _RL undefRL
0125 INTEGER ndId, mate, ip, im
0126 INTEGER bi, bj, myThid
0127
0128
0129
0130 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,*)
0131
0132
0133
0134 _RL factor
0135 INTEGER i, j, ipnt, ipCt
0136 INTEGER k, kd, km, kLev
0137
0138 IF (ndId.GE.1) THEN
0139 kLev = kdiag(ndId)
0140 IF ( kl.GE.1 .AND. kl.LE.kLev ) THEN
0141 kLev = 1
0142 ELSEIF ( kl.NE.0 ) THEN
0143 kLev = 0
0144 ENDIF
0145
0146 DO k = 1,kLev
0147 kd = k
0148 IF ( kl.GE.1 ) kd = kl
0149
0150 IF ( mate.EQ.0 ) THEN
0151
0152
0153 ipnt = ip + kd - 1
0154 factor = FLOAT(ndiag(ip,bi,bj))
0155 IF (ndiag(ip,bi,bj).NE.0) factor = 1. _d 0 / factor
0156
0157 #ifdef ALLOW_FIZHI
0158 DO j = 1,sNy+1
0159 DO i = 1,sNx+1
0160 IF ( qdiag(i,j,ipnt,bi,bj) .LE. undefRL ) THEN
0161 qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)*factor
0162 ELSE
0163 qtmp(i,j,k) = undefRL
0164 ENDIF
0165 ENDDO
0166 ENDDO
0167 #else /* ALLOW_FIZHI */
0168 DO j = 1,sNy+1
0169 DO i = 1,sNx+1
0170 qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)*factor
0171 ENDDO
0172 ENDDO
0173 #endif /* ALLOW_FIZHI */
0174
0175 ELSE
0176
0177
0178 ipnt = ip + kd - 1
0179 km = MIN(kd,kdiag(mate))
0180 ipCt = im + km - 1
0181 DO j = 1,sNy+1
0182 DO i = 1,sNx+1
0183 IF ( qdiag(i,j,ipCt,bi,bj) .NE. 0. ) THEN
0184 qtmp(i,j,k) = qdiag(i,j,ipnt,bi,bj)
0185 & / qdiag(i,j,ipCt,bi,bj)
0186 ELSE
0187 qtmp(i,j,k) = undefRL
0188 ENDIF
0189 ENDDO
0190 ENDDO
0191
0192 ENDIF
0193 ENDDO
0194 ENDIF
0195
0196 RETURN
0197 END
0198
0199
0200
0201
205bd86651 Jean*0202
0203
0204 SUBROUTINE DIAGNOSTICS_GET_POINTERS(
0205 I diagName, listId,
0206 O ndId, ip,
0207 I myThid )
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 IMPLICIT NONE
0226 #include "EEPARAMS.h"
0227 #include "SIZE.h"
0228 #include "DIAGNOSTICS_SIZE.h"
0229 #include "DIAGNOSTICS.h"
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239 CHARACTER*8 diagName
0240 INTEGER listId
0241 INTEGER ndId, ip
0242 INTEGER myThid
0243
0244
0245
0246 INTEGER n,m
0247
0248 ip = 0
0249 ndId = 0
0250
0251 IF ( listId.LE.0 ) THEN
0252
0253
0254
721cebbdca Jean*0255 DO n=1,nLists
205bd86651 Jean*0256 DO m=1,nActive(n)
0257 IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
0258 & .AND. idiag(m,n).NE.0 ) THEN
0259 ip = ABS(idiag(m,n))
b38beaf3c1 Jean*0260 ndId = ABS(jdiag(m,n))
205bd86651 Jean*0261 ENDIF
0262 ENDDO
0263 ENDDO
0264
721cebbdca Jean*0265 ELSEIF ( listId.LE.nLists ) THEN
205bd86651 Jean*0266
0267
0268
721cebbdca Jean*0269 DO n=1,nLists
205bd86651 Jean*0270 IF ( ip.EQ.0
0271 & .AND. freq(n) .EQ. freq(listId)
0272 & .AND. phase(n).EQ.phase(listId)
0273 & .AND. averageFreq(n) .EQ.averageFreq(listId)
0274 & .AND. averagePhase(n).EQ.averagePhase(listId)
0275 & .AND. averageCycle(n).EQ.averageCycle(listId)
0276 & ) THEN
0277 DO m=1,nActive(n)
0278 IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
0279 & .AND. idiag(m,n).NE.0 ) THEN
0280 ip = ABS(idiag(m,n))
b38beaf3c1 Jean*0281 ndId = ABS(jdiag(m,n))
205bd86651 Jean*0282 ENDIF
0283 ENDDO
0284 ELSEIF ( ip.EQ.0 ) THEN
0285 DO m=1,nActive(n)
0286 IF ( ip.EQ.0 .AND. diagName.EQ.flds(m,n)
0287 & .AND. idiag(m,n).NE.0 ) THEN
b38beaf3c1 Jean*0288 ndId = ABS(jdiag(m,n))
205bd86651 Jean*0289 ENDIF
0290 ENDDO
0291 ENDIF
0292 ENDDO
0293
0294 ELSE
0295 STOP 'DIAGNOSTICS_GET_POINTERS: invalid listId number'
0296 ENDIF
0297
0298 RETURN
0299 END
0300
0301
0302
0303
a0bbeea03c Jean*0304
0305
0306
0307 SUBROUTINE DIAGNOSTICS_SETKLEV(
0308 I diagName, nLevDiag, myThid )
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320 IMPLICIT NONE
0321 #include "EEPARAMS.h"
0322 #include "SIZE.h"
0323 #include "DIAGNOSTICS_SIZE.h"
0324 #include "DIAGNOSTICS.h"
0325
0326
0327
0328
0329
0330 CHARACTER*8 diagName
0331 INTEGER nLevDiag
0332 INTEGER myThid
0333
0334
0335
0336 CHARACTER*(MAX_LEN_MBUF) msgBuf
0337 INTEGER n, ndId
0338
0339
0340
70be99e003 Jean*0341 _BEGIN_MASTER( myThid)
0342
a0bbeea03c Jean*0343
0344
8a1f6fb317 Jean*0345 IF ( diag_pkgStatus.NE.ready2setDiags ) THEN
0346 CALL DIAGNOSTICS_STATUS_ERROR( 'DIAGNOSTICS_SETKLEV',
0347 & ' ', diagName, ready2setDiags, myThid )
a0bbeea03c Jean*0348 ENDIF
0349
0350
0351 ndId = 0
0352 DO n = 1,ndiagt
0353 IF ( diagName.EQ.cdiag(n) ) THEN
0354 ndId = n
0355 ENDIF
0356 ENDDO
0357 IF ( ndId.EQ.0 ) THEN
0358 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SETKLEV: ',
0359 & 'diagName="', diagName, '" not known.'
0360 CALL PRINT_ERROR( msgBuf, myThid )
0361 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SETKLEV'
0362 ENDIF
0363
0364
0365 IF ( kdiag(ndId).EQ.0
0366 & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
0367 kdiag(ndId) = nLevDiag
0368 ELSEIF ( kdiag(ndId).EQ.nLevDiag
0369 & .AND. gdiag(ndId)(10:10).EQ.'X' ) THEN
0370
0371 WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
0372 & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
0373 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0374 & SQUEEZE_RIGHT , myThid )
0375 WRITE(msgBuf,'(2A,I5,A)')'** WARNING ** DIAGNOSTICS_SETKLEV:',
0376 & ' level Nb (=', kdiag(ndId), ') already set.'
0377 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0378 & SQUEEZE_RIGHT , myThid )
0379 ELSEIF ( gdiag(ndId)(10:10).EQ.'X' ) THEN
0380
0381 WRITE(msgBuf,'(4A,I5)') 'DIAGNOSTICS_SETKLEV: ',
0382 & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
0383 CALL PRINT_ERROR( msgBuf, myThid )
0384 WRITE(msgBuf,'(2A,I5,3A)') 'DIAGNOSTICS_SETKLEV: ',
0385 & 'level Nb already set to', kdiag(ndId), ' => STOP'
0386 CALL PRINT_ERROR( msgBuf, myThid )
0387 ELSE
0388
0389 WRITE(msgBuf,'(4A,I5)') '** WARNING ** DIAGNOSTICS_SETKLEV: ',
0390 & 'diagName="', diagName, '" , nLevDiag=', nLevDiag
0391 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0392 & SQUEEZE_RIGHT , myThid )
0393 WRITE(msgBuf,'(2A,I5,3A)') '** WARNING ** will set level Nb',
0394 & ' from diagCode(ndId=', ndId, ')="', gdiag(ndId)(1:10), '"'
0395 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0396 & SQUEEZE_RIGHT , myThid )
0397 WRITE(msgBuf,'(4A)') '** WARNING ** DIAGNOSTICS_SETKLEV',
0398 & '("', diagName, '") <== Ignore this call.'
0399 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0400 & SQUEEZE_RIGHT , myThid )
0401 ENDIF
0402
70be99e003 Jean*0403 _END_MASTER( myThid)
0404
a0bbeea03c Jean*0405 RETURN
0406 END
0407
0408
0409
0410
205bd86651 Jean*0411
0412
0413
0414 INTEGER FUNCTION DIAGS_GET_PARMS_I(
0415 I parName, myThid )
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425 IMPLICIT NONE
0426 #include "EEPARAMS.h"
0427 #include "SIZE.h"
0428 #include "DIAGNOSTICS_SIZE.h"
0429 #include "DIAGNOSTICS.h"
0430
0431
0432
0433
0434 CHARACTER*(*) parName
0435 INTEGER myThid
0436
0437
0438
0439 CHARACTER*(MAX_LEN_MBUF) msgBuf
0440 INTEGER n
0441
0442
0443
0444 n = LEN(parName)
0445
0446
0447
0448 IF ( parName.EQ.'LAST_DIAG_ID' ) THEN
0449 DIAGS_GET_PARMS_I = ndiagt
0450 ELSE
0451 WRITE(msgBuf,'(4A)') 'DIAGS_GET_PARMS_I: ',
0452 & ' parName="', parName, '" not known.'
0453 CALL PRINT_ERROR( msgBuf, myThid )
0454 STOP 'ABNORMAL END: S/R DIAGS_GET_PARMS_I'
0455 ENDIF
0456
0457 RETURN
0458 END
0459
0460
0461
0462
db26b4dd29 Jean*0463
0464
0465
3ae5f90260 Jean*0466 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
db26b4dd29 Jean*0467 I diagUnitsInPieces, myThid )
0468
0469
0470
0471
3ae5f90260 Jean*0472
db26b4dd29 Jean*0473
0474
0475
0476
0477 IMPLICIT NONE
0478 #include "EEPARAMS.h"
0479
0480
3ae5f90260 Jean*0481
db26b4dd29 Jean*0482
0483
0484 CHARACTER*(*) diagUnitsInPieces
0485 INTEGER myThid
0486
0487
0488
0489 CHARACTER*(MAX_LEN_MBUF) msgBuf
869e534853 Jean*0490 INTEGER i,j,n,nbc
db26b4dd29 Jean*0491
a0bbeea03c Jean*0492 DIAGS_MK_UNITS = ' '
db26b4dd29 Jean*0493 n = LEN(diagUnitsInPieces)
3ae5f90260 Jean*0494
db26b4dd29 Jean*0495 j = 0
0496 DO i=1,n
0497 IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
0498 j = j+1
0499 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
0500 ENDIF
0501 ENDDO
869e534853 Jean*0502 nbc = j
0503
0504 IF ( nbc.GT.16 ) THEN
0505
0506 DIAGS_MK_UNITS = ' '
0507 j = 0
0508 DO i=1,n
0509 IF ( diagUnitsInPieces(i:i) .NE. ' ' ) THEN
0510 IF ( j.GE.1 .AND. nbc.GT.16 .AND.
0511 & diagUnitsInPieces(i:i).EQ.'^' ) THEN
0512 IF ( diagUnitsInPieces(i-1:i-1).EQ.'m' ) THEN
0513 nbc = nbc - 1
0514 ELSE
0515 j = j+1
0516 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
0517 ENDIF
0518 ELSE
0519 j = j+1
0520 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
0521 ENDIF
0522 ENDIF
0523 ENDDO
0524 ENDIF
db26b4dd29 Jean*0525
0526 IF ( j.GT.16 ) THEN
a0bbeea03c Jean*0527 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
db26b4dd29 Jean*0528 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
0529 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0530 & SQUEEZE_RIGHT , myThid)
a0bbeea03c Jean*0531 WRITE(msgBuf,'(3A)') '** WARNING ** ',
db26b4dd29 Jean*0532 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
0533 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0534 & SQUEEZE_RIGHT , myThid)
0535 ENDIF
0536
0537 RETURN
0538 END
2b8fe1e3ff Jean*0539
0540
0541
0542
0543
0544
0545
0546 CHARACTER*80 FUNCTION DIAGS_MK_TITLE(
0547 I diagTitleInPieces, myThid )
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557 IMPLICIT NONE
0558 #include "EEPARAMS.h"
0559
0560
0561
0562
0563
0564 CHARACTER*(*) diagTitleInPieces
0565 INTEGER myThid
0566
0567
0568
0569 CHARACTER*(MAX_LEN_MBUF) msgBuf
0570 LOGICAL flag
0571 INTEGER i,j,n
0572
85e5c644de Andr*0573
2b8fe1e3ff Jean*0574
0575 DIAGS_MK_TITLE = ' '
0576 & //' '
0577 n = LEN(diagTitleInPieces)
0578
0579 j = 0
0580 flag = .FALSE.
0581 DO i=1,n
0582 IF (diagTitleInPieces(i:i) .NE. ' ' ) THEN
0583 IF ( flag ) THEN
0584 j = j+1
0585 IF (j.LE.80) DIAGS_MK_TITLE(j:j) = ' '
0586 ENDIF
0587 j = j+1
0588 IF ( j.LE.80 ) DIAGS_MK_TITLE(j:j) = diagTitleInPieces(i:i)
0589 flag = .FALSE.
0590 ELSE
0591 flag = j.GE.1
0592 ENDIF
0593 ENDDO
0594
0595 IF ( j.GT.80 ) THEN
a0bbeea03c Jean*0596 WRITE(msgBuf,'(2A,I4,A)') '** WARNING ** ',
2b8fe1e3ff Jean*0597 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
0598 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0599 & SQUEEZE_RIGHT , myThid)
a0bbeea03c Jean*0600 WRITE(msgBuf,'(3A)') '** WARNING ** ',
2b8fe1e3ff Jean*0601 & 'DIAGS_MK_TITLE: input=', diagTitleInPieces
0602 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0603 & SQUEEZE_RIGHT , myThid)
0604 ENDIF
0605
0606 RETURN
0607 END
3dcfb9510a Jean*0608
0609
0610
0611
0612
0613
0614
0615 CHARACTER*8 FUNCTION DIAGS_RENAMED(
0616 I diagName, myThid )
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626 IMPLICIT NONE
0627 #include "EEPARAMS.h"
0628 #include "SIZE.h"
0629 #include "PARAMS.h"
0630 #include "DIAGNOSTICS_SIZE.h"
0631 #include "DIAGNOSTICS.h"
0632
0633
0634
0635
0636 CHARACTER*8 diagName
0637 INTEGER myThid
0638
0639
0640
0641 CHARACTER*8 newName
0642 CHARACTER*(MAX_LEN_MBUF) msgBuf
0643
0644
0645
0646 newName = blkName
0647
0648 IF ( useSEAICE ) THEN
0649 IF ( diagName .EQ. 'SIfu ' ) newName = 'oceTAUX '
0650 IF ( diagName .EQ. 'SIfv ' ) newName = 'oceTAUY '
0651 IF ( diagName .EQ. 'SIuwind ' ) newName = 'EXFuwind'
0652 IF ( diagName .EQ. 'SIvwind ' ) newName = 'EXFvwind'
7c20314e9e Mart*0653 IF ( diagName .EQ. 'SIsigI ' ) newName = 'SIsig1 '
0654 IF ( diagName .EQ. 'SIsigII ' ) newName = 'SIsig2 '
3dcfb9510a Jean*0655 ENDIF
6cc227ba22 Jean*0656 IF ( diagName .EQ. 'Um_dPHdx' ) newName = 'Um_dPhiX'
0657 IF ( diagName .EQ. 'Vm_dPHdy' ) newName = 'Vm_dPhiY'
3dcfb9510a Jean*0658
0659 IF ( newName.EQ.blkName ) THEN
0660 DIAGS_RENAMED = diagName
0661 ELSE
0662 DIAGS_RENAMED = newName
0663 WRITE(msgBuf,'(6A)') '** WARNING ** (DIAGS_RENAMED):',
0664 & ' diagnostics "', diagName, '" replaced by "', newName, '"'
0665 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
0666 & SQUEEZE_RIGHT , myThid )
0667 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0668 & SQUEEZE_RIGHT , myThid )
0669 ENDIF
0670
0671 RETURN
0672 END