Back to home page

MITgcm

 
 

    


File indexing completed on 2023-02-04 06:09:56 UTC

view on githubraw file Latest commit 2e3e8c33 on 2023-02-03 17:26:01 UTC
52a73f04fb Step*0001 #include "GCHEM_OPTIONS.h"
3f30a61ce1 Davi*0002 #ifdef ALLOW_DIC
0b2b69e236 Jean*0003 # include "DIC_OPTIONS.h"
                0004 #endif
                0005 #ifdef ALLOW_BLING
                0006 # include "BLING_OPTIONS.h"
3f30a61ce1 Davi*0007 #endif
5dae554984 Oliv*0008 #ifdef ALLOW_DARWIN
0b2b69e236 Jean*0009 # include "DARWIN_OPTIONS.h"
5dae554984 Oliv*0010 #endif
                0011 
8120bbf77d Step*0012 CBOP
969f3d7839 Mart*0013 C !ROUTINE: GCHEM_FORCING_SEP
52a73f04fb Step*0014 C !INTERFACE: ==========================================================
e1fb02e8f0 Jean*0015       SUBROUTINE GCHEM_FORCING_SEP( myTime, myIter, myThid )
52a73f04fb Step*0016 
8120bbf77d Step*0017 C !DESCRIPTION:
969f3d7839 Mart*0018 C     calls subroutine that will update passive tracers values
                0019 C     with a separate timestep. Since GCHEM_FORCING_SEP is now
847df67610 Jean*0020 C     called before DO_FIELDS_BLOCKING_EXCHANGES, the passive
                0021 C     tracer values in the halo regions are not up to date and
969f3d7839 Mart*0022 C     must not be used.
8120bbf77d Step*0023 
                0024 C !USES: ===============================================================
52a73f04fb Step*0025       IMPLICIT NONE
                0026 #include "SIZE.h"
                0027 #include "EEPARAMS.h"
                0028 #include "PARAMS.h"
d652e84639 Jean*0029 #include "GRID.h"
                0030 #include "DYNVARS.h"
862edcc91c Jean*0031 #include "PTRACERS_SIZE.h"
d652e84639 Jean*0032 #include "PTRACERS_PARAMS.h"
847df67610 Jean*0033 #include "PTRACERS_FIELDS.h"
5dae554984 Oliv*0034 #include "GCHEM.h"
9217bf430c Step*0035 #ifdef ALLOW_DIC
0b2b69e236 Jean*0036 # include "DIC_VARS.h"
969f3d7839 Mart*0037 #endif /* ALLOW_DIC */
0b2b69e236 Jean*0038 #ifdef ALLOW_BLING
                0039 # include "BLING_VARS.h"
                0040 #endif /* ALLOW_BLING */
312383bc20 Step*0041 #ifdef ALLOW_DARWIN
0b2b69e236 Jean*0042 # include "DARWIN_FLUX.h"
                0043 # include "DARWIN_SIZE.h"
312383bc20 Step*0044 #endif
52a73f04fb Step*0045 
                0046 C !INPUT PARAMETERS: ===================================================
                0047 C  myThid               :: thread number
                0048       _RL myTime
e1fb02e8f0 Jean*0049       INTEGER myIter, myThid
8120bbf77d Step*0050 CEOP
52a73f04fb Step*0051 
                0052 #ifdef ALLOW_GCHEM
bdb0f70f18 Mart*0053 #ifdef GCHEM_SEPARATE_FORCING
52a73f04fb Step*0054 
e1fb02e8f0 Jean*0055 C!LOCAL VARIABLES: ====================================================
                0056 C  i,j                  :: loop indices
                0057 C  bi,bj                :: tile indices
                0058 C  k                    :: vertical level
                0059       INTEGER bi,bj,iMin,iMax,jMin,jMax
                0060 c     INTEGER i,j
5979b35251 Jean*0061       PARAMETER( iMin = 1 , iMax = sNx )
                0062       PARAMETER( jMin = 1 , jMax = sNy )
6967cafe86 Jean*0063 #if (defined ALLOW_OBCS) || (defined ALLOW_DIAGNOSTICS)
d652e84639 Jean*0064       INTEGER iTr
6967cafe86 Jean*0065 #endif
                0066 #ifdef ALLOW_DIAGNOSTICS
d652e84639 Jean*0067       CHARACTER*8 diagName
                0068 #endif /* ALLOW_DIAGNOSTICS */
                0069 
5979b35251 Jean*0070 #ifdef ALLOW_DEBUG
                0071       IF (debugMode) CALL DEBUG_ENTER('GCHEM_FORCING_SEP',myThid)
                0072 #endif
                0073 
d652e84639 Jean*0074 #ifdef ALLOW_DIAGNOSTICS
                0075       IF ( useDiagnostics ) THEN
                0076 C--   fill-in tracer diagnostics before any GChem udate
3c00322f26 Jean*0077        DO iTr = 1,gchem_sepFTr_num
d652e84639 Jean*0078         diagName = '        '
                0079         WRITE(diagName,'(A5,A2)') 'GC_Tr', PTRACERS_ioLabel(iTr)
                0080         CALL DIAGNOSTICS_FILL( pTracer(1-OLx,1-OLy,1,1,1,iTr), diagName,
                0081      &                         0, Nr, 0, 1, 1, myThid )
                0082        ENDDO
                0083       ENDIF
                0084 #endif /* ALLOW_DIAGNOSTICS */
e1fb02e8f0 Jean*0085 
52a73f04fb Step*0086 ccccccccccccccccccccccccc
                0087 c global calculations   c
                0088 ccccccccccccccccccccccccc
04d6738595 Davi*0089 #ifdef ALLOW_OLD_VIRTUALFLUX
312383bc20 Step*0090 #ifdef ALLOW_DIC
e3c76005ea Jean*0091 # ifdef ALLOW_AUTODIFF
3de72b607c Jean*0092       IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (1)'
e3c76005ea Jean*0093 # else /* ALLOW_AUTODIFF */
                0094       IF ( useDIC ) THEN
                0095 # endif /* ALLOW_AUTODIFF */
52a73f04fb Step*0096 c find global surface averages
71ebe3095c Davi*0097        gsm_s = 0. _d 0
                0098        gsm_dic = 0. _d 0
                0099        gsm_alk = 0. _d 0
7f498da5b5 Oliv*0100        CALL GCHEM_SURFMEAN(salt,gsm_s,myThid)
                0101        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0102      &             pTracer(1-OLx,1-OLy,1,1,1,1), gsm_dic, myThid )
7f498da5b5 Oliv*0103        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0104      &             pTracer(1-OLx,1-OLy,1,1,1,2), gsm_alk, myThid )
e3c76005ea Jean*0105 # ifndef ALLOW_AUTODIFF
                0106       ENDIF
                0107 # endif /* ALLOW_AUTODIFF */
6967cafe86 Jean*0108 #endif /* ALLOW_DIC */
312383bc20 Step*0109 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0110 c     IF ( useDARWIN ) THEN
312383bc20 Step*0111 c find global surface averages
                0112        gsm_s = 0. _d 0
                0113        gsm_dic = 0. _d 0
                0114        gsm_alk = 0. _d 0
7f498da5b5 Oliv*0115        CALL GCHEM_SURFMEAN(salt,gsm_s,myThid)
                0116        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0117      &             pTracer(1-OLx,1-OLy,1,1,1,iDIC), gsm_dic, myThid )
7f498da5b5 Oliv*0118        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0119      &             pTracer(1-OLx,1-OLy,1,1,1,iALK), gsm_alk, myThid )
6967cafe86 Jean*0120 c     ENDIF
312383bc20 Step*0121 #endif
52a73f04fb Step*0122 ccccccccccccccccccccccccccccccccccccccccccc
f54a5bbe52 Jean*0123 #endif /* ALLOW_OLD_VIRTUALFLUX */
52a73f04fb Step*0124 
3f64833ab3 Oliv*0125 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0126       IF ( useDARWIN ) THEN
                0127         CALL DARWIN_CONS( myIter, myTime, myThid )
                0128       ENDIF
3f64833ab3 Oliv*0129 #endif
52a73f04fb Step*0130 
                0131 ccccccccccccccccccccccccc
                0132 c chemical forcing      c
                0133 ccccccccccccccccccccccccc
f4faabd05a Step*0134 C$taf loop = parallel
6967cafe86 Jean*0135       DO bj=myByLo(myThid),myByHi(myThid)
f4faabd05a Step*0136 C$taf loop = parallel
6967cafe86 Jean*0137        DO bi=myBxLo(myThid),myBxHi(myThid)
52a73f04fb Step*0138 
                0139 ccccccccccccccccccccccccccc DIC cccccccccccccccccccccccccccccccc
fd9adddc17 Step*0140 #ifdef ALLOW_DIC
e3c76005ea Jean*0141 # ifdef ALLOW_AUTODIFF
3de72b607c Jean*0142         IF (.NOT.useDIC) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (2)'
e3c76005ea Jean*0143 # else /* ALLOW_AUTODIFF */
                0144         IF ( useDIC ) THEN
                0145 # endif /* ALLOW_AUTODIFF */
5979b35251 Jean*0146 #ifdef ALLOW_DEBUG
                0147           IF (debugMode) CALL DEBUG_CALL('DIC_BIOTIC_FORCING',myThid)
                0148 #endif
52a73f04fb Step*0149 #ifdef ALLOW_FE
e1fb02e8f0 Jean*0150           CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0151      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0152      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0153      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0154      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0155      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
8a77e77698 Jean*0156      &                          bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0157      &                          myTime, myIter, myThid )
52a73f04fb Step*0158 #else
25bac1e456 Step*0159 #ifdef ALLOW_O2
8a77e77698 Jean*0160           CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1),
e1fb02e8f0 Jean*0161      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0162      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0163      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0164      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
8a77e77698 Jean*0165      &                          bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0166      &                          myTime, myIter, myThid )
25bac1e456 Step*0167 #else
8a77e77698 Jean*0168           CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1),
e1fb02e8f0 Jean*0169      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0170      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0171      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
8a77e77698 Jean*0172      &                          bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0173      &                          myTime, myIter, myThid )
25bac1e456 Step*0174 #endif
52a73f04fb Step*0175 #endif
e3c76005ea Jean*0176 # ifndef ALLOW_AUTODIFF
                0177         ENDIF
                0178 # endif /* ALLOW_AUTODIFF */
6967cafe86 Jean*0179 #endif /* ALLOW_DIC */
52a73f04fb Step*0180 cccccccccccccccccccccccccc END DIC cccccccccccccccccccccccccccccccccc
6967cafe86 Jean*0181 
0b2b69e236 Jean*0182 ccccccccccccccccccccccccccc BLING cccccccccccccccccccccccccccccccc
                0183 #ifdef ALLOW_BLING
39016d5e45 Matt*0184         IF ( useBLING ) THEN
a284455135 Matt*0185 # ifndef USE_BLING_V1
e0f9a7ba0b Matt*0186 #  ifdef USE_SIBLING
0b2b69e236 Jean*0187           CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0188      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0189      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0190      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0191      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0192      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
                0193      &                          pTracer(1-OLx,1-OLy,1,bi,bj,7),
                0194      &                          pTracer(1-OLx,1-OLy,1,bi,bj,8),
                0195      &                          pTracer(1-OLx,1-OLy,1,bi,bj,9),
e0f9a7ba0b Matt*0196 #   ifdef ADVECT_PHYTO
                0197      &                          pTracer(1-OLx,1-OLy,1,bi,bj,10),
                0198 #   endif
0b2b69e236 Jean*0199      &                          bi, bj, iMin, iMax, jMin, jMax,
e0f9a7ba0b Matt*0200      &                          myTime, myIter, myThid )
                0201 #  else /* USE_SIBLING */
                0202           CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0203      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0204      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0205      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0206      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0207      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
                0208      &                          pTracer(1-OLx,1-OLy,1,bi,bj,7),
                0209      &                          pTracer(1-OLx,1-OLy,1,bi,bj,8),
                0210 #   ifdef ADVECT_PHYTO
                0211      &                          pTracer(1-OLx,1-OLy,1,bi,bj,9),
                0212 #   endif
                0213      &                          bi, bj, iMin, iMax, jMin, jMax,
                0214      &                          myTime, myIter, myThid )
                0215 #  endif /* USE_SIBLING */
                0216 # else /* USE_BLING_v1 */
                0217           CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0218      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0219      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0220      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0221      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0222      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
                0223 #  ifdef ADVECT_PHYTO
                0224      &                          pTracer(1-OLx,1-OLy,1,bi,bj,7),
                0225 #  endif
                0226      &                          bi, bj, iMin, iMax, jMin, jMax,
                0227      &                          myTime, myIter, myThid )
                0228 # endif /* USE_BLING_v1 */
39016d5e45 Matt*0229         ENDIF
0b2b69e236 Jean*0230 #endif /* ALLOW_BLING */
                0231 cccccccccccccccccccccccccc END BLING cccccccccccccccccccccccccccccccccc
                0232 
5dae554984 Oliv*0233 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0234         IF ( useDARWIN ) THEN
5dae554984 Oliv*0235 #ifdef NUT_SUPPLY
                0236 c articficial supply of nutrients
5979b35251 Jean*0237 #ifdef ALLOW_DEBUG
                0238           IF (debugMode) CALL DEBUG_CALL('DARWIN_NUT_SUPPLY',myThid)
                0239 #endif
e1fb02e8f0 Jean*0240           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,1),
8a77e77698 Jean*0241      &                          bi, bj, iMin, iMax, jMin, jMax,
                0242      &                          myIter, myTime, myThid )
e1fb02e8f0 Jean*0243           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,2),
8a77e77698 Jean*0244      &                          bi, bj, iMin, iMax, jMin, jMax,
                0245      &                          myIter, myTime, myThid )
e1fb02e8f0 Jean*0246           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,3),
8a77e77698 Jean*0247      &                          bi, bj, iMin, iMax, jMin, jMax,
                0248      &                          myIter, myTime, myThid )
e1fb02e8f0 Jean*0249           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,4),
8a77e77698 Jean*0250      &                          bi, bj, iMin, iMax, jMin, jMax,
                0251      &                          myIter, myTime, myThid )
5dae554984 Oliv*0252 #endif
                0253 ccccccccccccccc
                0254 C darwin_forcing operates on bi,bj part only, but needs to get full
                0255 C array because of last (iPtr) index
5979b35251 Jean*0256 #ifdef ALLOW_DEBUG
                0257           IF (debugMode) CALL DEBUG_CALL('DARWIN_FORCING',myThid)
                0258 #endif
e1fb02e8f0 Jean*0259           CALL DARWIN_FORCING(  pTracer(1-OLx,1-OLy,1,1,1,1),
8a77e77698 Jean*0260      &                          bi, bj, iMin, iMax, jMin, jMax,
                0261      &                          myIter, myTime, myThid )
6967cafe86 Jean*0262         ENDIF
3f64833ab3 Oliv*0263 #endif /* ALLOW_DARWIN */
3a785bc7ce Step*0264 
6967cafe86 Jean*0265 #ifdef ALLOW_OBCS
                0266 C--   Apply (again) open boundary conditions for each passive tracer
                0267 C Note: could skip this 2nd call to OBCS_APPLY if all DIC/DARWIN
                0268 C       updates of ptracers were only done in the interior (i.e. with
                0269 C       tendency multiplied by maskInC)
8a77e77698 Jean*0270         IF ( useOBCS .AND. .NOT.useDIC ) THEN
5979b35251 Jean*0271 #ifdef ALLOW_DEBUG
                0272           IF (debugMode) CALL DEBUG_CALL('OBCS_APPLY_PTRACER',myThid)
                0273 #endif
3c00322f26 Jean*0274           DO iTr = 1,gchem_sepFTr_num
6967cafe86 Jean*0275             CALL OBCS_APPLY_PTRACER(
                0276      I                bi, bj, 0, iTr,
                0277      U                pTracer(1-OLx,1-OLy,1,bi,bj,iTr),
                0278      I                myThid )
                0279           ENDDO
                0280         ENDIF
                0281 #endif /* ALLOW_OBCS */
                0282 
52a73f04fb Step*0283        ENDDO
6967cafe86 Jean*0284       ENDDO
52a73f04fb Step*0285 
3f64833ab3 Oliv*0286 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0287       IF ( useDARWIN ) THEN
e1fb02e8f0 Jean*0288          CALL DARWIN_CONS( myIter, myTime, myThid )
3f64833ab3 Oliv*0289 #ifdef ALLOW_CARBON
                0290          CALL DIC_ATMOS( 1, myTime, myIter, myThid )
                0291 #endif
6967cafe86 Jean*0292       ENDIF
3f64833ab3 Oliv*0293 #endif /* ALLOW_DARWIN */
                0294 
3771641ead Step*0295 #ifdef ALLOW_DIC
3de72b607c Jean*0296 # ifdef ALLOW_AUTODIFF
                0297       IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (3)'
                0298 # else /* ALLOW_AUTODIFF */
6967cafe86 Jean*0299       IF ( useDIC ) THEN
3de72b607c Jean*0300 # endif /* ALLOW_AUTODIFF */
5979b35251 Jean*0301 #ifdef ALLOW_DEBUG
                0302        IF (debugMode) CALL DEBUG_CALL('DIC_ATMOS',myThid)
                0303 #endif
3de72b607c Jean*0304        CALL DIC_ATMOS( myTime, myIter, myThid )
6967cafe86 Jean*0305 # ifdef COMPONENT_MODULE
cdaaeac08c Davi*0306        CALL DIC_STORE_FLUXCO2( myTime, myIter, myThid )
6967cafe86 Jean*0307 # endif
                0308 # ifdef ALLOW_COST
21a58cf9c9 Patr*0309        CALL DIC_COST( myTime, myIter, myThid )
6967cafe86 Jean*0310 # endif
3de72b607c Jean*0311 # ifndef ALLOW_AUTODIFF
6967cafe86 Jean*0312       ENDIF
3de72b607c Jean*0313 # endif /* ALLOW_AUTODIFF */
e5e08e2882 Jean*0314 #endif /* ALLOW_DIC */
21a58cf9c9 Patr*0315 
5979b35251 Jean*0316 #ifdef ALLOW_DEBUG
                0317       IF (debugMode) CALL DEBUG_LEAVE('GCHEM_FORCING_SEP',myThid)
                0318 #endif
                0319 
bdb0f70f18 Mart*0320 #endif /* GCHEM_SEPARATE_FORCING */
52a73f04fb Step*0321 #endif /* ALLOW_GCHEM */
                0322 
                0323       RETURN
                0324       END