Back to home page

MITgcm

 
 

    


File indexing completed on 2018-03-02 18:41:33 UTC

view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
d8d1486ca1 Jean*0001 #include "KL10_OPTIONS.h"
                0002 
                0003 CBOP
                0004 C     !ROUTINE: KL10_OUTPUT
                0005 C     !INTERFACE:
                0006       SUBROUTINE KL10_OUTPUT( myTime, myIter, myThid )
                0007 
                0008 C     !DESCRIPTION: \bv
                0009 C     *==========================================================*
                0010 C     | SUBROUTINE KL10_OUTPUT
                0011 C     | o Do KL10 diagnostic output.
                0012 C     *==========================================================
                0013 C     | The following CPP flag (MULTIPLE_RECORD_KL10_STATE_FILES) is
                0014 C     | #define/#undefed here since it is specific to this routine
                0015 C     | and very user-preference specific.
                0016 C     |
                0017 C     | If #undefed (default) the state files are written as in all versions
                0018 C     | prior to checkpoint32, where a file is created per variable, per time
                0019 C     | and per tile. This *has* to be the default because most users use this
                0020 C     | mode and all utilities and scripts (diagnostic) assume this form.
                0021 C     | It is also robust, as explained below.
                0022 C     |
                0023 C     | If #defined, subsequent snap-shots are written as records in the
                0024 C     | same file (no iteration number in filenames).
                0025 C     | Advantages: - fewer files
                0026 C     |       - for small problems, is easy to copy the output around
                0027 C     | Disadvantages:
                0028 C     |       - breaks a lot of diagnostic scripts
                0029 C     |       - for large or long problems this creates huge files
                0030 C     |       - is an unexpected, unsolicited change in behaviour which came
                0031 C     |         as a surprise (in c32) and inconvenience to several users
                0032 C     |       - can not accomodate changing the frequency of output
                0033 C     |         after a pickup (this is trivial in previous method
                0034 C     |         but needs new code and parameters in this new method)
                0035 C     *==========================================================*
                0036 C     \ev
                0037 
                0038 C     !USES:
                0039       IMPLICIT NONE
                0040 C     === Global variables ===
                0041 #include "SIZE.h"
                0042 #include "EEPARAMS.h"
                0043 #include "PARAMS.h"
                0044 #include "KL10.h"
                0045 #include "KL10_TAVE.h"
                0046 
                0047 C     !INPUT/OUTPUT PARAMETERS:
                0048 C     == Routine arguments ==
                0049 C     myTime :: my time in simulation ( s )
                0050 C     myIter :: my Iteration number
                0051 C     myThid :: my Thread Id number
                0052       _RL     myTime
                0053       INTEGER myIter
                0054       INTEGER myThid
                0055 
                0056 #ifdef ALLOW_KL10
                0057 
                0058 C     !FUNCTIONS:
                0059       LOGICAL  DIFFERENT_MULTIPLE
                0060       EXTERNAL DIFFERENT_MULTIPLE
                0061 
                0062 C     !LOCAL VARIABLES:
                0063 C     == Local variables ==
df5a9764ba Jean*0064       CHARACTER*(10) suff
d8d1486ca1 Jean*0065 #ifdef ALLOW_TIMEAVE
                0066       INTEGER bi, bj
                0067       _RL DDTT
                0068 #endif
                0069 CEOP
                0070 
                0071 C JMK TODO: average KLdiffAr as well as KLviscAr.  Though they are
                0072 C never different, but some folks may complain.
                0073 
                0074 C----------------------------------------------------------------
                0075 C     Dump snapshot of KL variables.
                0076 C----------------------------------------------------------------
                0077 
                0078       IF ( myIter.NE.nIter0 .AND.
                0079      &     DIFFERENT_MULTIPLE( KLdumpFreq, myTime, deltaTClock )
                0080      &   ) THEN
                0081 
                0082        IF (KLwriteState) THEN
                0083 C       Write each snap-shot as a new file
df5a9764ba Jean*0084         IF ( rwSuffixType.EQ.0 ) THEN
                0085           WRITE(suff,'(I10.10)') myIter
                0086         ELSE
                0087           CALL RW_GET_SUFFIX( suff, myTime, myIter, myThid )
                0088         ENDIF
d8d1486ca1 Jean*0089         CALL WRITE_FLD_XYZ_RL('KLviscAr.',suff,KLviscAr,
                0090      &       myIter,myThid)
                0091         CALL WRITE_FLD_XYZ_RL('KLeps.',suff,KLeps,
                0092      &       myIter,myThid)
                0093        ENDIF
                0094 
                0095       ENDIF
                0096 
                0097 C----------------------------------------------------------------
                0098 C     Do KL time averaging.
                0099 C----------------------------------------------------------------
                0100 
                0101 #ifdef ALLOW_TIMEAVE
                0102       IF ( KLtaveFreq.GT.0. _d 0 ) THEN
                0103 
                0104        IF ( myIter.EQ.nIter0 ) THEN
                0105 C     Initialize averages to zero
                0106         DO bj = myByLo(myThid), myByHi(myThid)
                0107          DO bi = myBxLo(myThid), myBxHi(myThid)
                0108           CALL TIMEAVE_RESET( KLviscArtave, Nr, bi, bj, myThid )
                0109           CALL TIMEAVE_RESET( KLdiffKrtave, Nr, bi, bj, myThid )
                0110           KL_timeAve(bi,bj) = 0.
                0111          ENDDO
                0112         ENDDO
                0113 
                0114        ELSE
                0115 C     Cumulate KL fields (for Time Average)
                0116         DDTT=deltaTClock
                0117         DO bj = myByLo(myThid), myByHi(myThid)
                0118          DO bi = myBxLo(myThid), myBxHi(myThid)
                0119           CALL TIMEAVE_CUMULATE( KLviscArtave, KLviscAr,
                0120      &                           Nr, DDTT, bi, bj, myThid )
                0121           CALL TIMEAVE_CUMULATE( KLdiffKrtave, KLeps,
                0122      &                           Nr, DDTT, bi, bj, myThid )
                0123 C     Keep record of how much time has been integrated over
                0124           KL_timeAve(bi,bj) = KL_timeAve(bi,bj)+DDTT
                0125          ENDDO
                0126         ENDDO
                0127        ENDIF
                0128 
                0129 C     Dump files and restart average computation if needed
                0130        IF ( myIter.NE.nIter0 .AND.
                0131      &      DIFFERENT_MULTIPLE( KLtaveFreq, myTime, deltaTClock )
                0132      &    ) THEN
                0133 
                0134 C     Normalize by integrated time
                0135         DO bj = myByLo(myThid), myByHi(myThid)
                0136          DO bi = myBxLo(myThid), myBxHi(myThid)
                0137           CALL TIMEAVE_NORMALIZE( KLviscArtave,
                0138      &                            KL_timeAve, Nr, bi, bj, myThid )
                0139           CALL TIMEAVE_NORMALIZE( KLdiffKrtave,
                0140      &                            KL_timeAve, Nr, bi, bj, myThid )
                0141          ENDDO
                0142         ENDDO
                0143 
                0144 C     Write each snap-shot as a new file
df5a9764ba Jean*0145         IF ( rwSuffixType.EQ.0 ) THEN
                0146           WRITE(suff,'(I10.10)') myIter
                0147         ELSE
                0148           CALL RW_GET_SUFFIX( suff, myTime, myIter, myThid )
                0149         ENDIF
d8d1486ca1 Jean*0150         CALL WRITE_FLD_XYZ_RL( 'KLviscAr-T.', suff,
                0151      &                          KLviscArTave, myIter, myThid )
                0152         CALL WRITE_FLD_XYZ_RL( 'KLeps-T.', suff,
                0153      &                          KLdiffKrTave, myIter, myThid )
                0154 
                0155 C     Reset averages to zero
                0156         DO bj = myByLo(myThid), myByHi(myThid)
                0157          DO bi = myBxLo(myThid), myBxHi(myThid)
                0158           CALL TIMEAVE_RESET( KLviscArtave, Nr, bi, bj, myThid )
                0159           CALL TIMEAVE_RESET( KLdiffKrtave, Nr, bi, bj, myThid )
                0160           KL_timeAve(bi,bj) = 0.
                0161          ENDDO
                0162         ENDDO
                0163 
                0164 C-    end dump-files block
                0165        ENDIF
                0166 
                0167 C-    end if KLtaveFreq > 0
                0168       ENDIF
                0169 #endif /* ALLOW_TIMEAVE */
                0170 
                0171 #ifdef ALLOW_DIAGNOSTICS
                0172       IF ( useDiagnostics .AND. myIter.NE.nIter0 ) THEN
                0173        CALL DIAGNOSTICS_FILL(KLviscAr,'KLviscAr',0,Nr,0,1,1,myThid)
                0174        CALL DIAGNOSTICS_FILL(KLdiffKr,'KLdiffKr',0,Nr,0,1,1,myThid)
                0175        CALL DIAGNOSTICS_FILL(KLeps,   'KLeps   ',0,Nr,0,1,1,myThid)
                0176       ENDIF
                0177 #endif /* ALLOW_DIAGNOSTICS */
                0178 
                0179 #endif /* ALLOW_KL10 */
                0180 
                0181       RETURN
                0182       END