File indexing completed on 2018-03-02 18:39:03 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
09ceb40cd6 Jean*0001 #include "DIAG_OPTIONS.h"
0002
0003
0004
0005
3ae5f90260 Jean*0006 SUBROUTINE DIAGNOSTICS_SETDIAG(
09ceb40cd6 Jean*0007 O mate,
3ae5f90260 Jean*0008 U ndiagmx,
0009 I mId, listId, ndId, myThid )
09ceb40cd6 Jean*0010
0011
0012
0013
3ae5f90260 Jean*0014
09ceb40cd6 Jean*0015
0016
0017
0018
0019
0020
0021 IMPLICIT NONE
0022
0023
0024 #include "EEPARAMS.h"
0025 #include "SIZE.h"
0026 #include "DIAGNOSTICS_SIZE.h"
0027 #include "DIAGNOSTICS.h"
0028
0029
0030
3ae5f90260 Jean*0031
0032
0033
0034
0035
0036
09ceb40cd6 Jean*0037 INTEGER mate
0038 INTEGER ndiagmx
3ae5f90260 Jean*0039 INTEGER mId, listId, ndId
09ceb40cd6 Jean*0040 INTEGER myThid
0041
0042
0043
0044
0045 INTEGER stdUnit, errUnit
fd31448e60 Jean*0046 INTEGER nn, k, l, no_hFac
0047 LOGICAL diagIsPP, flagD, flagP, flagM, use_hFac
09ceb40cd6 Jean*0048
931cda44c0 Jean*0049 CHARACTER*10 gcode
b69fcb6385 Jean*0050 CHARACTER*12 tmpMsg
09ceb40cd6 Jean*0051 CHARACTER*(MAX_LEN_MBUF) msgBuf
0052
0053
931cda44c0 Jean*0054
09ceb40cd6 Jean*0055
0056
0057 stdUnit = standardMessageUnit
0058 errUnit = errorMessageUnit
0059
e2b0f3f4e8 Jean*0060
0061 diagIsPP = gdiag(ndId)(5:5).EQ.'P'
0062
fd31448e60 Jean*0063
0064 no_hFac = 1
0065 IF ( fflags(listId)(3:3).EQ.'h' ) THEN
0066 gcode = gdiag(ndId)(1:10)
0067 use_hFac = ( gcode(2:2).EQ.'U' .OR. gcode(2:2).EQ.'V'
0068 & .OR. gcode(2:2).EQ.'M' )
0069 use_hFac = use_hFac .AND. gcode(9:10).EQ.'MR'
0070 & .AND. gcode(3:3).EQ.'R'
0071 & .AND. gcode(5:5).EQ.' '
0072 IF ( use_hFac ) no_hFac = -1
0073 ENDIF
0074
e2b0f3f4e8 Jean*0075
0076
0077
0078 flagD = .TRUE.
0079 flagP = .TRUE.
0080 nn = ndId
0081 DO WHILE ( flagP )
0082 DO l=1,listId
0083 IF (flagD .AND. freq(l) .EQ. freq(listId)
0084 & .AND. phase(l).EQ.phase(listId)
0085 & .AND. averageFreq(l) .EQ.averageFreq(listId)
0086 & .AND. averagePhase(l).EQ.averagePhase(listId)
0087 & .AND. averageCycle(l).EQ.averageCycle(listId) ) THEN
0088 DO k=1,MIN(nActive(l),numperList)
fd31448e60 Jean*0089 IF ( flagD .AND. no_hFac*jdiag(k,l).GT.0 ) THEN
0090 IF ( cdiag(nn).EQ.cdiag(ABS(jdiag(k,l))) ) THEN
3ae5f90260 Jean*0091
e2b0f3f4e8 Jean*0092 flagD = .FALSE.
0093 idiag(mId,listId) = -ABS(idiag(k,l))
0094 mdiag(mId,listId) = mdiag(k,l)
0095 ENDIF
0096 ENDIF
0097 ENDDO
3ae5f90260 Jean*0098 ENDIF
0099 ENDDO
e2b0f3f4e8 Jean*0100 flagP = flagD .AND. gdiag(nn)(5:5).EQ.'P'
0101 IF ( flagP ) nn = hdiag(nn)
3ae5f90260 Jean*0102 ENDDO
fd31448e60 Jean*0103 jdiag(mId,listId) = no_hFac*ndId
3ae5f90260 Jean*0104
e2b0f3f4e8 Jean*0105
3ae5f90260 Jean*0106
e2b0f3f4e8 Jean*0107 IF ( diagIsPP ) THEN
0108 WRITE(msgBuf,'(2(A,I6,1X,A))')
0109 & 'SETDIAG: Diag #', ndId, cdiag(ndId),
0110 & ' processed from Diag #',nn,cdiag(nn)
0111 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
0112 ENDIF
0113 gcode = gdiag(nn)(1:10)
0114 IF ( flagD ) THEN
0115 IF ( diagIsPP ) THEN
6d9af5b863 Jean*0116
0117
0118 idiag(mId,listId) = -(ndiagmx+1)
e2b0f3f4e8 Jean*0119
0120 k = nActive(listId) + 1
0121 IF ( k.LE.numperList ) THEN
0122 jdiag(k,listId) = nn
0123 idiag(k,listId) = ndiagmx + 1
0124 flds (k,listId) = cdiag(nn)
0125 ENDIF
0126 nActive(listId) = k
6d9af5b863 Jean*0127 ELSE
0128 idiag(mId,listId) = ndiagmx + 1
e2b0f3f4e8 Jean*0129 ENDIF
0130 ndiagmx = ndiagmx + kdiag(nn)*averageCycle(listId)
931cda44c0 Jean*0131 IF ( ndiagmx.GT.numDiags ) THEN
0132 WRITE(msgBuf,'(A,I6,1X,A)')
e2b0f3f4e8 Jean*0133 & 'SETDIAG: Not enough space for Diagnostic #',nn,cdiag(nn)
09ceb40cd6 Jean*0134 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
0135 ELSE
931cda44c0 Jean*0136 WRITE(msgBuf,'(A,2(I3,A),I6,1X,A)') 'SETDIAG: Allocate',
e2b0f3f4e8 Jean*0137 & kdiag(nn), ' x', averageCycle(listId),
0138 & ' Levels for Diagnostic #', nn, cdiag(nn)
09ceb40cd6 Jean*0139 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
0140 ENDIF
0141 ELSE
b69fcb6385 Jean*0142 tmpMsg = ' Diagnostic '
0143 WRITE(msgBuf,'(3A,I6,1X,2A)') '- NOTE - SETDIAG: ',tmpMsg,
0144 & ' #', nn, cdiag(nn), ' is already set'
324746cc27 Jean*0145 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
09ceb40cd6 Jean*0146 ENDIF
0147
e2b0f3f4e8 Jean*0148
324746cc27 Jean*0149
e2b0f3f4e8 Jean*0150
09ceb40cd6 Jean*0151 mate = 0
e2b0f3f4e8 Jean*0152
0153
b69fcb6385 Jean*0154 tmpMsg = ' Vector-mate'
e2b0f3f4e8 Jean*0155 IF ( diagIsPP .AND. gcode(5:5).NE.'P' .AND.
0156 & (gcode(1:1).EQ.'U' .OR. gcode(1:1).EQ.'V') ) mate = hdiag(nn)
0157
931cda44c0 Jean*0158 IF ( gcode(5:5).EQ.'C') THEN
e2b0f3f4e8 Jean*0159 mate = hdiag(nn)
b69fcb6385 Jean*0160 tmpMsg = 'Counter-mate'
e2b0f3f4e8 Jean*0161 ENDIF
09ceb40cd6 Jean*0162
e2b0f3f4e8 Jean*0163 IF ( mate.GT.0 ) THEN
3ae5f90260 Jean*0164
e2b0f3f4e8 Jean*0165 flagM = .TRUE.
3ae5f90260 Jean*0166 DO l=1,listId
e2b0f3f4e8 Jean*0167 IF (flagM .AND. freq(l) .EQ.freq(listId)
0168 & .AND. phase(l).EQ.phase(listId)
0169 & .AND. averageFreq(l) .EQ.averageFreq(listId)
0170 & .AND. averagePhase(l).EQ.averagePhase(listId)
0171 & .AND. averageCycle(l).EQ.averageCycle(listId) ) THEN
0172 DO k=1,MIN(nActive(l),numperList)
0173 IF (flagM .AND. jdiag(k,l).GT.0) THEN
3ae5f90260 Jean*0174 IF (cdiag(mate).EQ.cdiag(jdiag(k,l)) ) THEN
0175
e2b0f3f4e8 Jean*0176 flagM = .FALSE.
3ae5f90260 Jean*0177 mdiag(mId,listId) = ABS(idiag(k,l))
0178 ENDIF
0179 ENDIF
0180 ENDDO
0181 ENDIF
0182 ENDDO
0183
e2b0f3f4e8 Jean*0184
0185 IF ( flagM ) THEN
666b944083 Jean*0186 mdiag(mId,listId) = ndiagmx + 1
e2b0f3f4e8 Jean*0187 k = nActive(listId) + 1
0188 IF ( k.LE.numperList ) THEN
0189
0190 jdiag(k,listId) = mate
0191 idiag(k,listId) = ndiagmx + 1
0192 flds (k,listId) = cdiag(mate)
0193 ENDIF
0194 nActive(listId) = k
666b944083 Jean*0195 ndiagmx = ndiagmx + kdiag(mate)*averageCycle(listId)
931cda44c0 Jean*0196 IF ( ndiagmx.GT.numDiags ) THEN
e2b0f3f4e8 Jean*0197 WRITE(msgBuf,'(3A,I6,1X,A)')
0198 & 'SETDIAG: Not enough space for ',tmpMsg,' #',
3ae5f90260 Jean*0199 & mate, cdiag(mate)
09ceb40cd6 Jean*0200 CALL PRINT_MESSAGE(msgBuf, errUnit, SQUEEZE_RIGHT, myThid)
0201 ELSE
931cda44c0 Jean*0202 WRITE(msgBuf,'(A,2(I3,A),I6,1X,A)') 'SETDIAG: Allocate',
666b944083 Jean*0203 & kdiag(mate), ' x', averageCycle(listId),
e2b0f3f4e8 Jean*0204 & ' Levels for Mate Diag. #', mate, cdiag(mate)
09ceb40cd6 Jean*0205 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
0206 ENDIF
0207 ELSE
e2b0f3f4e8 Jean*0208 WRITE(msgBuf,'(3A,I6,1X,2A)') '- NOTE - SETDIAG: ',tmpMsg,
0209 & ' #', mate, cdiag(mate), ' is already set'
09ceb40cd6 Jean*0210 CALL PRINT_MESSAGE(msgBuf, stdUnit, SQUEEZE_RIGHT, myThid)
0211 ENDIF
0212 ENDIF
0213
0214
0215 RETURN
0216 END