Back to home page

MITgcm

 
 

    


File indexing completed on 2024-05-11 05:10:13 UTC

view on githubraw file Latest commit 41c4545f on 2024-05-10 15:00:41 UTC
6d54cf9ca1 Ed H*0001 #include "AUTODIFF_OPTIONS.h"
7fd2fa3bc2 Patr*0002 #ifdef ALLOW_OPENAD
                0003 # include "OPENAD_OPTIONS.h"
                0004 #endif
bead363026 Jean*0005 #ifdef ALLOW_CTRL
                0006 # include "CTRL_OPTIONS.h"
                0007 #endif
94a8024bbe Jean*0008 #ifdef ALLOW_GMREDI
                0009 # include "GMREDI_OPTIONS.h"
                0010 #endif
a10c595eb6 Timo*0011 #ifdef ALLOW_GGL90
                0012 # include "GGL90_OPTIONS.h"
                0013 #endif
7b8b86ab99 Timo*0014 #ifdef ALLOW_SHELFICE
                0015 # include "SHELFICE_OPTIONS.h"
                0016 #endif
735a3220ac Jean*0017 #include "AD_CONFIG.h"
2dcaa8b9a5 Patr*0018 
d151781088 Patr*0019 CBOP
898ddfe4b1 Jean*0020 C     !ROUTINE: ADDUMMY_IN_STEPPING
d151781088 Patr*0021 C     !INTERFACE:
898ddfe4b1 Jean*0022       SUBROUTINE ADDUMMY_IN_STEPPING( myTime, myIter, myThid )
d151781088 Patr*0023 
                0024 C     !DESCRIPTION: \bv
                0025 C     *==========================================================*
898ddfe4b1 Jean*0026 C     | SUBROUTINE ADDUMMY_IN_STEPPING                           |
d151781088 Patr*0027 C     *==========================================================*
                0028 C     Extract adjoint variable from TAMC/TAF-generated
                0029 C     adjoint common blocks, contained in adcommon.h
                0030 C     and write fields to file;
                0031 C     Make sure common blocks in adcommon.h are up-to-date
                0032 C     w.r.t. current adjoint code.
                0033 C     *==========================================================*
898ddfe4b1 Jean*0034 C     | SUBROUTINE ADDUMMY_IN_STEPPING                           |
d151781088 Patr*0035 C     *==========================================================*
                0036 C     \ev
                0037 
                0038 C     !USES:
                0039       IMPLICIT NONE
2dcaa8b9a5 Patr*0040 
d151781088 Patr*0041 C     == Global variables ===
7fd2fa3bc2 Patr*0042 #ifdef ALLOW_OPENAD
                0043       use OAD_active
                0044       use OAD_rev
                0045       use OAD_tape
                0046       use OAD_cp
                0047 #endif
2dcaa8b9a5 Patr*0048 #include "SIZE.h"
                0049 #include "EEPARAMS.h"
                0050 #include "PARAMS.h"
d2b824a660 Patr*0051 #ifdef ALLOW_AUTODIFF_MONITOR
a10c595eb6 Timo*0052 # ifdef ALLOW_OPENAD
                0053 C- Note: Since OpenAD uses modules, the ordering of included headers matters
                0054 #  include "DYNVARS.h"
                0055 #  include "FFIELDS.h"
94a8024bbe Jean*0056 #  ifdef ALLOW_GMREDI
                0057 #   include "GMREDI.h"
                0058 #  endif
a10c595eb6 Timo*0059 #  ifdef ALLOW_GGL90
                0060 #   include "GGL90.h"
                0061 #  endif
                0062 # endif /* ALLOW_OPENAD */
                0063 # include "AUTODIFF_PARAMS.h"
816e6857b6 Gael*0064 # include "AUTODIFF.h"
7fd2fa3bc2 Patr*0065 # ifndef ALLOW_OPENAD
                0066 #  include "adcommon.h"
                0067 # endif /* ALLOW_OPENAD */
a5ec81ed49 Timo*0068 # ifdef ALLOW_MNC
                0069 #  include "MNC_PARAMS.h"
                0070 # endif
                0071 # ifdef ALLOW_DIAGNOSTICS
41c4545f8f Jean*0072 #  include "DIAGNOSTICS_P2SHARE.h"
a5ec81ed49 Timo*0073 # endif
7fd2fa3bc2 Patr*0074 #endif /* ALLOW_AUTODIFF_MONITOR */
2dcaa8b9a5 Patr*0075 
d151781088 Patr*0076 C     !INPUT/OUTPUT PARAMETERS:
2dcaa8b9a5 Patr*0077 C     == Routine arguments ==
898ddfe4b1 Jean*0078 C     myTime  :: time counter for this thread
                0079 C     myIter  :: iteration counter for this thread
                0080 C     myThid  :: Thread number for this instance of the routine.
                0081       _RL     myTime
                0082       INTEGER myIter
                0083       INTEGER myThid
d151781088 Patr*0084 
698b67672f Patr*0085 #if (defined (ALLOW_ADJOINT_RUN) || defined (ALLOW_ADMTLM))
d2b824a660 Patr*0086 #ifdef ALLOW_AUTODIFF_MONITOR
                0087 
898ddfe4b1 Jean*0088 C     !FUNCTIONS:
                0089       LOGICAL  DIFFERENT_MULTIPLE
                0090       EXTERNAL DIFFERENT_MULTIPLE
                0091 
d151781088 Patr*0092 C     !LOCAL VARIABLES:
a10c595eb6 Timo*0093 C     == local variables ==
898ddfe4b1 Jean*0094 C     suff    :: Hold suffix part of a filename
                0095 C     msgBuf  :: Error message buffer
a10c595eb6 Timo*0096 c     CHARACTER*(10) suff
a5ec81ed49 Timo*0097 c     CHARACTER*(MAX_LEN_MBUF) msgBuf
a10c595eb6 Timo*0098 #ifdef ALLOW_MNC
898ddfe4b1 Jean*0099       _RL var2Du(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0100       _RL var2Dv(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
                0101       _RL var3Du(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
                0102       _RL var3Dv(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
a10c595eb6 Timo*0103 #endif
898ddfe4b1 Jean*0104       _RS dumRS(1)
                0105       _RL dumRL(1)
a5ec81ed49 Timo*0106       LOGICAL doExch
a10c595eb6 Timo*0107       LOGICAL doDump
d151781088 Patr*0108 CEOP
                0109 
a10c595eb6 Timo*0110 C--- Do dump?
                0111       doDump = DIFFERENT_MULTIPLE( adjDumpFreq, myTime, deltaTClock )
                0112 
a5ec81ed49 Timo*0113 C--- Test for adexch based on dumpAdVarExch flag
a10c595eb6 Timo*0114       doExch = doDump
a5ec81ed49 Timo*0115 #ifdef ALLOW_DIAGNOSTICS
a10c595eb6 Timo*0116       doExch = doDump .OR. useDiag4AdjOutp
a5ec81ed49 Timo*0117 #endif
                0118       doExch = doExch .AND. ( dumpAdVarExch.EQ.1 )
816e6857b6 Gael*0119 
a5ec81ed49 Timo*0120 C--- If necessary, do the exchanges
                0121       IF ( doExch ) THEN
bead363026 Jean*0122 #ifdef ALLOW_OPENAD
                0123 C--   need to all the correct OpenAD EXCH S/R ; left empty for now
                0124 #else /* ALLOW_OPENAD */
                0125 
0a92c8c20d Patr*0126 #ifdef AUTODIFF_TAMC_COMPATIBILITY
a5ec81ed49 Timo*0127         call adexch_xyz_rl( myThid,adTheta)
                0128         call adexch_xyz_rl( myThid,adSalt)
                0129         call adexch_xyz_rl( myThid,adwVel )
                0130         call adexch_uv_xyz_rl(  .true. ,myThid,aduVel,advVel )
                0131 
                0132         call adexch_uv_xy_rs( .true., myThid, adfu, adfv )
                0133         call adexch_xy_rs( myThid,adqnet )
                0134         call adexch_xy_rs( myThid,adempmr )
0a92c8c20d Patr*0135 # ifdef ALLOW_EDDYPSI_CONTROL
a5ec81ed49 Timo*0136         call adexch_uv_xyz_rs(  .true. ,myThid,adeddypsix,adeddypsiy )
0a92c8c20d Patr*0137 # endif
                0138 # ifdef ALLOW_DIFFKR_CONTROL
a5ec81ed49 Timo*0139         call adexch_xyz_rl( myThid,addiffkr )
0a92c8c20d Patr*0140 # endif
                0141 # ifdef ALLOW_KAPGM_CONTROL
94a8024bbe Jean*0142         call adexch_xyz_rl( myThid, adKapGM )
0a92c8c20d Patr*0143 # endif
                0144 # ifdef ALLOW_KAPREDI_CONTROL
94a8024bbe Jean*0145         call adexch_xyz_rl( myThid, adKapRedi )
0a92c8c20d Patr*0146 # endif
85fd6a387e An T*0147 # ifdef ALLOW_BOTTOMDRAG_CONTROL
a5ec81ed49 Timo*0148         call adexch_xy_rl( myThid,adbottomdragfld)
0a92c8c20d Patr*0149 # endif
                0150 # else /* ndfef AUTODIFF_TAMC_COMPATIBILITY */
898ddfe4b1 Jean*0151 
d31dc5d323 Jean*0152 #  ifndef ALLOW_BULK_OFFLINE
a5ec81ed49 Timo*0153         CALL ADEXCH_3D_RL( adTheta,Nr, myThid )
                0154         CALL ADEXCH_3D_RL( adSalt, Nr, myThid )
                0155         CALL ADEXCH_3D_RL( adwVel, Nr, myThid )
                0156         CALL ADEXCH_UV_3D_RL( aduVel,advVel, .TRUE., Nr, myThid )
898ddfe4b1 Jean*0157 #  endif
3c775cbf98 Mart*0158 C     There are rare cases when adexch_uv_xy_rs and adexch_xy_rs are not
                0159 C     generated by TAF and then the following lines will lead to an
                0160 C     error in the link step, for example, when there are no 2D forcing
                0161 C     fields controls. We should have a cpp flag for that that is
                0162 C     automatically defined if any 2D forcing controls are defined. As a
                0163 C     hack we use an excluding cpp-flag that needs to be defined if this
                0164 C     problem occurs
                0165 #ifndef AUTODIFF_EXCLUDE_ADEXCH_RS
a5ec81ed49 Timo*0166         CALL ADEXCH_UV_XY_RS( adFu, adFv, .TRUE., myThid )
                0167         CALL ADEXCH_XY_RS( adQnet, myThid )
                0168         CALL ADEXCH_XY_RS( adEmPmR, myThid )
3c775cbf98 Mart*0169 #endif
0a92c8c20d Patr*0170 # ifdef ALLOW_EDDYPSI_CONTROL
a5ec81ed49 Timo*0171         CALL ADEXCH_UV_XYZ_RS( adEddyPsiX, adEddyPsiY, .TRUE., myThid )
0a92c8c20d Patr*0172 # endif
                0173 # ifdef ALLOW_DIFFKR_CONTROL
a5ec81ed49 Timo*0174         CALL ADEXCH_3D_RL( adDiffKr, Nr, myThid )
0a92c8c20d Patr*0175 # endif
                0176 # ifdef ALLOW_KAPGM_CONTROL
a5ec81ed49 Timo*0177         CALL ADEXCH_3D_RL( adKapGM, Nr, myThid )
0a92c8c20d Patr*0178 # endif
                0179 # ifdef ALLOW_KAPREDI_CONTROL
a5ec81ed49 Timo*0180         CALL ADEXCH_3D_RL( adKapRedi, Nr, myThid )
0a92c8c20d Patr*0181 # endif
85fd6a387e An T*0182 # ifdef ALLOW_BOTTOMDRAG_CONTROL
a5ec81ed49 Timo*0183         CALL ADEXCH_3D_RL( adBottomDragFld, 1 , myThid )
0a92c8c20d Patr*0184 # endif
7b8b86ab99 Timo*0185 # ifdef ALLOW_SHELFICE
                0186 #  ifndef SHI_ALLOW_GAMMAFRICT
                0187         CALL ADEXCH_XY_RL( adshiTransCoeffT, myThid )
                0188         CALL ADEXCH_XY_RL( adshiTransCoeffS, myThid )
                0189 #  else
                0190         CALL ADEXCH_XY_RL( adshiCDragFld, myThid )
                0191 #  endif
                0192 # endif
898ddfe4b1 Jean*0193 
0a92c8c20d Patr*0194 #endif /* AUTODIFF_TAMC_COMPATIBILITY */
bead363026 Jean*0195 #endif /* ALLOW_OPENAD */
a5ec81ed49 Timo*0196       ENDIF
                0197 
a10c595eb6 Timo*0198 C=======================================================================
                0199 C--  Dump AD-variable to binary files and fill diagnostics
                0200 C=======================================================================
                0201       IF ( doDump ) THEN
                0202 C     Increment ad dump record number (used only if dumpAdByRec is true)
                0203         dumpAdRecMn = dumpAdRecMn + 1
                0204         CALL TIMER_START('I/O (WRITE)        [ADJOINT LOOP]', myThid )
                0205       ENDIF
                0206 
                0207 #ifndef ALLOW_OPENAD
                0208 C========================
                0209 C--  TAF AD-variables:
                0210 C========================
a5ec81ed49 Timo*0211 C-----------------------------------------------------------------------
a10c595eb6 Timo*0212 C--- State variables
a5ec81ed49 Timo*0213 C-----------------------------------------------------------------------
a10c595eb6 Timo*0214       CALL DUMP_ADJ_XYZ(dumRS, adTheta, 'ADJtheta', 'ADJtheta.',
                0215      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
a5ec81ed49 Timo*0216 
a10c595eb6 Timo*0217       CALL DUMP_ADJ_XYZ(dumRS, adSalt, 'ADJsalt ', 'ADJsalt.',
                0218      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
a5ec81ed49 Timo*0219 
a10c595eb6 Timo*0220       CALL DUMP_ADJ_XYZ(dumRS, adWvel, 'ADJwvel ', 'ADJwvel.',
                0221      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
a5ec81ed49 Timo*0222 
a10c595eb6 Timo*0223       CALL DUMP_ADJ_XYZ_UV(
                0224      &     dumRS, adUvel, 'ADJuvel ', 'ADJuvel.',
                0225      &     dumRS, adVvel, 'ADJvvel ', 'ADJvvel.',
                0226      &     34, doDump, dumpAdRecMn, myTime, myIter,myThid)
a5ec81ed49 Timo*0227 
a10c595eb6 Timo*0228 C-----------------------------------------------------------------------
                0229 C--- Surface Forcing
                0230 C-----------------------------------------------------------------------
                0231       IF ( .NOT. useSEAICE .AND. .NOT. useEXF ) THEN
                0232        CALL DUMP_ADJ_XY_UV(
                0233      &      adFu, dumRL, 'ADJtaux ', 'ADJtaux.',
                0234      &      adFv, dumRL, 'ADJtauy ', 'ADJtauy.',
                0235      &      33, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0236         CALL DUMP_ADJ_XY(adQnet, dumRL, 'ADJqnet ', 'ADJqnet.',
                0237      &                   11, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0238         CALL DUMP_ADJ_XY(adEmPmR, dumRL, 'ADJempmr', 'ADJempr.',
                0239      &                   11, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0240 
                0241 # ifdef SHORTWAVE_HEATING
                0242         CALL DUMP_ADJ_XY(adQsw, dumRL, 'ADJqsw  ', 'ADJqsw.',
                0243      &                   11, doDump, dumpAdRecMn, myTime, myIter,myThid)
a5ec81ed49 Timo*0244 # endif
                0245       ENDIF
                0246 
                0247 C-----------------------------------------------------------------------
a10c595eb6 Timo*0248 C---Various packages and parameters
                0249 C-----------------------------------------------------------------------
                0250 # ifdef ALLOW_BOTTOMDRAG_CONTROL
                0251       CALL DUMP_ADJ_XY(dumRS, adBottomDragFld,
                0252      &                 'ADJbtdrg','ADJbottomdrag.',
                0253      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0254 # endif
                0255 # ifdef ALLOW_GGL90
                0256       CALL DUMP_ADJ_XYZ(dumRS, adGGL90TKE, 'ADJtke90', 'ADJggl90tke.',
                0257      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0258 # endif
                0259 # ifdef ALLOW_DIFFKR_CONTROL
                0260       CALL DUMP_ADJ_XYZ(dumRS, adDiffKr, 'ADJdifkr', 'ADJdiffkr.',
                0261      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0262 # endif
                0263 # ifdef ALLOW_KAPGM_CONTROL
                0264       CALL DUMP_ADJ_XYZ(dumRS, adKapGM, 'ADJkapgm', 'ADJkapgm.',
                0265      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0266 # endif
                0267 # ifdef ALLOW_KAPREDI_CONTROL
                0268       CALL DUMP_ADJ_XYZ(dumRS, adKapRedi, 'ADJkapre', 'ADJkapredi.',
                0269      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0270 # endif
a5ec81ed49 Timo*0271 
a10c595eb6 Timo*0272 # ifdef ALLOW_EDDYPSI_CONTROL
                0273       CALL DUMP_ADJ_XYZ_UV(
                0274      &     adEddyPsiX,dumRL,'ADJepsix','ADJeddipsix.',
                0275      &     adEddyPsiY,dumRL,'ADJepsiy','ADJeddipsiy.',
aecc8b0f47 Mart*0276      &     33, doDump, dumpAdRecMn, myTime, myIter, myThid)
a10c595eb6 Timo*0277 # endif
7b8b86ab99 Timo*0278 # ifdef ALLOW_SHELFICE
                0279 #  ifndef SHI_ALLOW_GAMMAFRICT
                0280       CALL DUMP_ADJ_XY(dumRS, adshiTransCoeffT,
                0281      &                 'ADJshict','ADJshict.',
                0282      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0283       CALL DUMP_ADJ_XY(dumRS, adshiTransCoeffS,
85c224e862 Ou W*0284      &                 'ADJshics','ADJshics.',
7b8b86ab99 Timo*0285      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0286 #  else
                0287       CALL DUMP_ADJ_XY(dumRS, adshiCDragFld,
                0288      &                 'ADJshicd','ADJshicd.',
                0289      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0290 #  endif
                0291 # endif
2dcaa8b9a5 Patr*0292 
aecc8b0f47 Mart*0293 # ifdef ALLOW_DEPTH_CONTROL
                0294       CALL DUMP_ADJ_XYZ(
                0295      &     adhfacc,dumRL,'ADJhFacC','ADJhFacC.',
                0296      &     11, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0297       CALL DUMP_ADJ_XYZ_UV(
                0298      &     adhfacw,dumRL,'ADJhFacW','ADJhFacW.',
                0299      &     adhfacs,dumRL,'ADJhFacS','ADJhFacS.',
                0300      &     33, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0301       CALL DUMP_ADJ_XYZ(
                0302      &     adrecip_hfacc,dumRL,'ADJrhFcC','ADJrecip_hFacC.',
                0303      &     11, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0304       CALL DUMP_ADJ_XYZ_UV(
                0305      &     adrecip_hfacw,dumRL,'ADJrhFcW','ADJrecip_hFacW.',
                0306      &     adrecip_hfacs,dumRL,'ADJrhFcS','ADJrecip_hFacS.',
                0307      &     33, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0308 # endif /* ALLOW_DEPTH_CONTROL */
                0309 
a10c595eb6 Timo*0310 #else /* ALLOW_OPENAD */
                0311 C========================
                0312 C--  OpenAD AD-variable:
                0313 C========================
7fd2fa3bc2 Patr*0314 C-----------------------------------------------------------------------
a10c595eb6 Timo*0315 C--- State variables
7fd2fa3bc2 Patr*0316 C-----------------------------------------------------------------------
a10c595eb6 Timo*0317       CALL DUMP_ADJ_XYZ(dumRS, theta%d, 'ADJtheta', 'ADJtheta.',
                0318      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
7fd2fa3bc2 Patr*0319 
a10c595eb6 Timo*0320       CALL DUMP_ADJ_XYZ(dumRS, salt%d, 'ADJsalt ', 'ADJsalt.',
                0321      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
2dcaa8b9a5 Patr*0322 
a10c595eb6 Timo*0323       CALL DUMP_ADJ_XYZ(dumRS, wvel%d, 'ADJwvel ', 'ADJwvel.',
                0324      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
816e6857b6 Gael*0325 
a10c595eb6 Timo*0326       CALL DUMP_ADJ_XYZ_UV(
                0327      &     dumRS, uvel%d, 'ADJuvel ', 'ADJuvel.',
                0328      &     dumRS, vvel%d, 'ADJvvel ', 'ADJvvel.',
                0329      &     34, doDump, dumpAdRecMn, myTime, myIter,myThid)
497a20ca68 Patr*0330 
7fd2fa3bc2 Patr*0331 C-----------------------------------------------------------------------
a10c595eb6 Timo*0332 C--- Surface Forcing
7fd2fa3bc2 Patr*0333 C-----------------------------------------------------------------------
a10c595eb6 Timo*0334       IF ( .NOT. useSEAICE .AND. .NOT. useEXF ) THEN
                0335        CALL DUMP_ADJ_XY_UV(
                0336      &      Fu%d, dumRL, 'ADJtaux ', 'ADJtaux.',
                0337      &      Fv%d, dumRL, 'ADJtauy ', 'ADJtauy.',
                0338      &      33, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0339         CALL DUMP_ADJ_XY(Qnet%d, dumRL, 'ADJqnet ', 'ADJqnet.',
                0340      &                   11, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0341         CALL DUMP_ADJ_XY(EmPmR%d, dumRL, 'ADJempmr', 'ADJempr.',
                0342      &                   11, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0343 
                0344 # ifdef SHORTWAVE_HEATING
                0345 C     Commented out since only works when Qsw is active
                0346 c       CALL DUMP_ADJ_XY(Qsw%d, dumRL, 'ADJqsw  ', 'ADJqsw.',
                0347 c    &                   11, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0348 # endif
                0349       ENDIF
7fd2fa3bc2 Patr*0350 
                0351 C-----------------------------------------------------------------------
a10c595eb6 Timo*0352 C---Various packages and parameters
7fd2fa3bc2 Patr*0353 C-----------------------------------------------------------------------
a10c595eb6 Timo*0354 # ifdef ALLOW_BOTTOMDRAG_CONTROL
                0355       CALL DUMP_ADJ_XY(dumRS, BottomDragFld%d,
                0356      &                 'ADJbtdrg','ADJbottomdrag.',
                0357      &                 11, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0358 # endif
                0359 # ifdef ALLOW_GGL90
                0360       CALL DUMP_ADJ_XYZ(dumRS, GGL90TKE%d, 'ADJtke90', 'ADJggl90tke.',
                0361      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0362 # endif
                0363 # ifdef ALLOW_DIFFKR_CONTROL
                0364       CALL DUMP_ADJ_XYZ(dumRS, DiffKr%d, 'ADJdifkr', 'ADJdiffkr.',
                0365      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0366 # endif
94a8024bbe Jean*0367 # if ( defined ALLOW_KAPGM_CONTROL && defined GM_READ_K3D_GM )
                0368       CALL DUMP_ADJ_XYZ(dumRS, GM_inpK3dGM%d, 'ADJkapgm', 'ADJkapgm.',
a10c595eb6 Timo*0369      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0370 # endif
94a8024bbe Jean*0371 # if ( defined ALLOW_KAPREDI_CONTROL && defined GM_READ_K3D_REDI )
                0372       CALL DUMP_ADJ_XYZ(dumRS, GM_inpK3dRedi%d, 'ADJkapre',
                0373      &                  'ADJkapredi.',
a10c595eb6 Timo*0374      &                  12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0375 # endif
7fd2fa3bc2 Patr*0376 
a10c595eb6 Timo*0377 # ifdef ALLOW_EDDYPSI_CONTROL
                0378       CALL DUMP_ADJ_XYZ_UV(
                0379      &     EddyPsiX%d,dumRL,'ADJepsix','ADJeddipsix.',
                0380      &     EddyPsiY%d,dumRL,'ADJepsiy','ADJeddipsiy.',
                0381      &     33, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0382 # endif
7b8b86ab99 Timo*0383 # ifdef ALLOW_SHELFICE
                0384 #  ifndef SHI_ALLOW_GAMMAFRICT
                0385       CALL DUMP_ADJ_XY(dumRS, shiTransCoeffT%d,
                0386      &                 'ADJshict','ADJshict.',
                0387      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0388       CALL DUMP_ADJ_XY(dumRS, shiTransCoeffS%d,
85c224e862 Ou W*0389      &                 'ADJshics','ADJshics.',
7b8b86ab99 Timo*0390      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0391 #  else
                0392       CALL DUMP_ADJ_XY(dumRS, shiCDragFld%d,
                0393      &                 'ADJshicd','ADJshicd.',
                0394      &                 12, doDump, dumpAdRecMn, myTime, myIter,myThid)
                0395 #  endif
                0396 # endif
aecc8b0f47 Mart*0397 
                0398 # ifdef ALLOW_DEPTH_CONTROL
                0399       CALL DUMP_ADJ_XYZ(
                0400      &     hFacC%d,dumRL,'ADJhFacC','ADJhFacC.',
                0401      &     11, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0402       CALL DUMP_ADJ_XYZ_UV(
                0403      &     hFacW%d,dumRL,'ADJhFacW','ADJhFacW.',
                0404      &     hFacS%d,dumRL,'ADJhFacS','ADJhFacS.',
                0405      &     33, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0406       CALL DUMP_ADJ_XYZ(
                0407      &     recip_hFacC%d,dumRL,'ADJrhFcC','ADJrecip_hFacC.',
                0408      &     11, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0409       CALL DUMP_ADJ_XYZ_UV(
                0410      &     recip_hFacW%d,dumRL,'ADJrhFcW','ADJrecip_hFacW.',
                0411      &     recip_hFacS%d,dumRL,'ADJrhFcS','ADJrecip_hFacS.',
                0412      &     33, doDump, dumpAdRecMn, myTime, myIter, myThid)
                0413 # endif /* ALLOW_DEPTH_CONTROL */
                0414 
a10c595eb6 Timo*0415 #endif /* ALLOW_OPENAD */
7fd2fa3bc2 Patr*0416 
a10c595eb6 Timo*0417 C=======================================================================
                0418 C--  Dump TAF AD-variable to NetCdF files
                0419 C=======================================================================
                0420       IF ( doDump ) THEN
7fd2fa3bc2 Patr*0421 #ifndef ALLOW_OPENAD
6bd3b6b067 Patr*0422 #ifdef ALLOW_MNC
                0423         IF (useMNC .AND. autodiff_mnc) THEN
aa753c2639 Mart*0424          CALL MNC_CW_SET_UDIM('adstate', -1, myThid)
                0425          CALL MNC_CW_RL_W_S('D','adstate',0,0,'T',myTime,myThid)
                0426          CALL MNC_CW_SET_UDIM('adstate', 0, myThid)
                0427          CALL MNC_CW_I_W_S('I','adstate',0,0,'iter',myIter,myThid)
                0428          CALL MNC_CW_RL_W_S('D','adstate',0,0,'model_time',myTime,
                0429      &        myThid)
                0430 
                0431          IF ( dumpAdVarExch.EQ.2 ) THEN
                0432           CALL COPY_AD_UV_OUTP( dumRS, dumRS, aduVel, advVel,
                0433      &                          var3Du, var3Dv, Nr, 34, myThid )
                0434           CALL MNC_CW_RL_W('D','adstate',0,0,'adU', var3Du, myThid)
                0435           CALL MNC_CW_RL_W('D','adstate',0,0,'adV', var3Dv, myThid)
                0436           CALL COPY_ADVAR_OUTP( dumRS, adTheta,var3Du, Nr, 12, myThid )
                0437           CALL MNC_CW_RL_W('D','adstate',0,0,'adT', var3Du, myThid)
                0438           CALL COPY_ADVAR_OUTP( dumRS, adSalt,var3Du, Nr, 12, myThid )
                0439           CALL MNC_CW_RL_W('D','adstate',0,0,'adS', var3Du, myThid)
                0440           CALL COPY_ADVAR_OUTP( dumRS, adwVel, var3Du, Nr, 12, myThid )
                0441           CALL MNC_CW_RL_W('D','adstate',0,0,'adW', var3Du, myThid)
898ddfe4b1 Jean*0442 
aa753c2639 Mart*0443           CALL COPY_ADVAR_OUTP( adQnet, dumRL, var2Du, 1, 11, myThid )
5b0f0973d0 Jean*0444           CALL MNC_CW_RL_W('D','adstate',0,0,'adQnet', var2Du, myThid)
aa753c2639 Mart*0445           CALL COPY_ADVAR_OUTP( adEmPmR,dumRL, var2Du, 1, 11, myThid )
5b0f0973d0 Jean*0446           CALL MNC_CW_RL_W('D','adstate',0,0,'adEmpmr', var2Du, myThid)
aa753c2639 Mart*0447           CALL COPY_AD_UV_OUTP( adFu, adFv, dumRL, dumRL,
                0448      &                          var2Du, var2Dv, 1, 33, myThid )
5b0f0973d0 Jean*0449           CALL MNC_CW_RL_W('D','adstate',0,0,'adFu', var2Du, myThid)
                0450           CALL MNC_CW_RL_W('D','adstate',0,0,'adFv', var2Dv, myThid)
aa753c2639 Mart*0451 
85fd6a387e An T*0452 #ifdef ALLOW_BOTTOMDRAG_CONTROL
aa753c2639 Mart*0453           CALL COPY_ADVAR_OUTP( dumRS, adBottomDragFld,
                0454      &                                        var2Du, 1, 12, myThid )
                0455           CALL MNC_CW_RL_W('D','adstate',0,0,
                0456      &                     'adBottomDrag', var2Du, myThid)
                0457 #endif
                0458 #ifdef ALLOW_DIFFKR_CONTROL
                0459           CALL COPY_ADVAR_OUTP( dumRS, adDiffKr,var3Du, Nr, 12,myThid )
                0460           CALL MNC_CW_RL_W('D','adstate',0,0,
                0461      &                     'adDiffkr', var3Du, myThid)
                0462 #endif
                0463 #ifdef ALLOW_KAPGM_CONTROL
                0464           CALL COPY_ADVAR_OUTP( dumRS, adKapGM, var3Du, Nr, 12,myThid )
                0465           CALL MNC_CW_RL_W('D','adstate',0,0,
                0466      &                     'adkapgm', var3Du, myThid)
                0467 #endif
                0468 #ifdef ALLOW_KAPREDI_CONTROL
                0469           CALL COPY_ADVAR_OUTP( dumRS,adKapRedi,var3Du, Nr, 12,myThid )
                0470           CALL MNC_CW_RL_W('D','adstate',0,0,
                0471      &                     'adkapredi', var3Du, myThid)
                0472 #endif
                0473          ELSE
                0474 C     dumpAdVarExch.NE.2
6bd3b6b067 Patr*0475           CALL MNC_CW_RL_W('D','adstate',0,0,'adU', aduVel, myThid)
                0476           CALL MNC_CW_RL_W('D','adstate',0,0,'adV', advVel, myThid)
a5ec81ed49 Timo*0477           CALL MNC_CW_RL_W('D','adstate',0,0,'adT', adTheta, myThid)
                0478           CALL MNC_CW_RL_W('D','adstate',0,0,'adS', adSalt, myThid)
6bd3b6b067 Patr*0479           CALL MNC_CW_RL_W('D','adstate',0,0,'adW', adwVel, myThid)
8f0b59c61c Patr*0480 
954561c446 Jean*0481           CALL MNC_CW_RS_W('D','adstate',0,0,'adQnet', adQnet, myThid)
f4b7d73d77 Jean*0482           CALL MNC_CW_RS_W('D','adstate',0,0,'adEmpmr',adEmpmr, myThid)
954561c446 Jean*0483           CALL MNC_CW_RS_W('D','adstate',0,0,'adFu', adfu, myThid)
                0484           CALL MNC_CW_RS_W('D','adstate',0,0,'adFv', adfv, myThid)
77c6107d5a Patr*0485 
85fd6a387e An T*0486 #ifdef ALLOW_BOTTOMDRAG_CONTROL
954561c446 Jean*0487           CALL MNC_CW_RL_W('D','adstate',0,0,
                0488      &                     'adBottomDrag', adbottomdragfld, myThid)
98e4a16c0b Mart*0489 #endif
dd9d2cc2bf Patr*0490 #ifdef ALLOW_DIFFKR_CONTROL
                0491           CALL MNC_CW_RL_W('D','adstate',0,0,
954561c446 Jean*0492      &                     'adDiffkr', addiffkr, myThid)
dd9d2cc2bf Patr*0493 #endif
5116830959 Patr*0494 #ifdef ALLOW_KAPGM_CONTROL
                0495           CALL MNC_CW_RL_W('D','adstate',0,0,
94a8024bbe Jean*0496      &                     'adkapgm', adKapGM, myThid)
5116830959 Patr*0497 #endif
7e2482cabc Gael*0498 #ifdef ALLOW_KAPREDI_CONTROL
                0499           CALL MNC_CW_RL_W('D','adstate',0,0,
94a8024bbe Jean*0500      &                     'adkapredi', adKapRedi, myThid)
7e2482cabc Gael*0501 #endif
7b8b86ab99 Timo*0502 #ifdef ALLOW_SHELFICE
                0503 # ifndef SHI_ALLOW_GAMMAFRICT
                0504           CALL MNC_CW_RL_W('D','adstate',0,0,
                0505      &                     'adshict', adshiTransCoeffT, myThid)
                0506           CALL MNC_CW_RL_W('D','adstate',0,0,
                0507      &                     'adshics', adshiTransCoeffS, myThid)
                0508 # else
                0509           CALL MNC_CW_RL_W('D','adstate',0,0,
                0510      &                     'adshicd', adshiCDragFld, myThid)
                0511 # endif
                0512 #endif
aa753c2639 Mart*0513          ENDIF
                0514 C     endif mnc
6bd3b6b067 Patr*0515         ENDIF
                0516 #endif /* ALLOW_MNC */
7fd2fa3bc2 Patr*0517 #endif /* ALLOW_OPENAD */
6bd3b6b067 Patr*0518 
a10c595eb6 Timo*0519         CALL TIMER_STOP( 'I/O (WRITE)        [ADJOINT LOOP]', myThid )
898ddfe4b1 Jean*0520 
a10c595eb6 Timo*0521       ENDIF
                0522 
                0523 C=======================================================================
                0524 C--  Output AD-variable & fill Diagnostics with pkg specific interface
                0525 C=======================================================================
898ddfe4b1 Jean*0526 #ifdef ALLOW_SEAICE
                0527         IF ( useSEAICE )
                0528      &   CALL SEAICE_AD_DUMP( myTime, myIter, myThid )
                0529 #endif
ec48404f58 Patr*0530 
898ddfe4b1 Jean*0531 #ifdef ALLOW_PTRACERS
                0532         IF ( usePTRACERS )
                0533      &   CALL PTRACERS_AD_DUMP( myTime, myIter, myThid )
                0534 #endif
                0535 
d2b824a660 Patr*0536 #endif /* ALLOW_AUTODIFF_MONITOR */
ea0f79f160 Patr*0537 #endif /* ALLOW_ADJOINT_RUN */
d2b824a660 Patr*0538 
d31dc5d323 Jean*0539       RETURN
                0540       END