Back to home page

darwin3

 
 

    


File indexing completed on 2024-12-17 18:35:39 UTC

view on githubraw file Latest commit 68e980b1 on 2023-02-08 16:27:53 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_SIZE.h"
bb66933431 Oliv*0043 # include "DARWIN_INDICES.h"
                0044 # include "DARWIN_FLUX.h"
312383bc20 Step*0045 #endif
52a73f04fb Step*0046 
                0047 C !INPUT PARAMETERS: ===================================================
                0048 C  myThid               :: thread number
                0049       _RL myTime
e1fb02e8f0 Jean*0050       INTEGER myIter, myThid
8120bbf77d Step*0051 CEOP
52a73f04fb Step*0052 
                0053 #ifdef ALLOW_GCHEM
bdb0f70f18 Mart*0054 #ifdef GCHEM_SEPARATE_FORCING
52a73f04fb Step*0055 
e1fb02e8f0 Jean*0056 C!LOCAL VARIABLES: ====================================================
                0057 C  i,j                  :: loop indices
                0058 C  bi,bj                :: tile indices
                0059 C  k                    :: vertical level
                0060       INTEGER bi,bj,iMin,iMax,jMin,jMax
                0061 c     INTEGER i,j
5979b35251 Jean*0062       PARAMETER( iMin = 1 , iMax = sNx )
                0063       PARAMETER( jMin = 1 , jMax = sNy )
6967cafe86 Jean*0064 #if (defined ALLOW_OBCS) || (defined ALLOW_DIAGNOSTICS)
d652e84639 Jean*0065       INTEGER iTr
6967cafe86 Jean*0066 #endif
                0067 #ifdef ALLOW_DIAGNOSTICS
d652e84639 Jean*0068       CHARACTER*8 diagName
                0069 #endif /* ALLOW_DIAGNOSTICS */
                0070 
5979b35251 Jean*0071 #ifdef ALLOW_DEBUG
                0072       IF (debugMode) CALL DEBUG_ENTER('GCHEM_FORCING_SEP',myThid)
                0073 #endif
                0074 
d652e84639 Jean*0075 #ifdef ALLOW_DIAGNOSTICS
                0076       IF ( useDiagnostics ) THEN
                0077 C--   fill-in tracer diagnostics before any GChem udate
3c00322f26 Jean*0078        DO iTr = 1,gchem_sepFTr_num
d652e84639 Jean*0079         diagName = '        '
                0080         WRITE(diagName,'(A5,A2)') 'GC_Tr', PTRACERS_ioLabel(iTr)
                0081         CALL DIAGNOSTICS_FILL( pTracer(1-OLx,1-OLy,1,1,1,iTr), diagName,
                0082      &                         0, Nr, 0, 1, 1, myThid )
                0083        ENDDO
                0084       ENDIF
                0085 #endif /* ALLOW_DIAGNOSTICS */
e1fb02e8f0 Jean*0086 
52a73f04fb Step*0087 ccccccccccccccccccccccccc
                0088 c global calculations   c
                0089 ccccccccccccccccccccccccc
bb66933431 Oliv*0090 #ifdef ALLOW_DARWIN
                0091       IF ( useDARWIN ) THEN
                0092         CALL DARWIN_CONSERVE_SURFACE( myTime, myIter, myThid )
9a7312b062 Oliv*0093         CALL DARWIN_CONS( 1, myTime, myIter, myThid )
5e411acc9e Oliv*0094         CALL DARWIN_CONS_RESET( myThid )
bb66933431 Oliv*0095       ENDIF
                0096 #endif
                0097 
04d6738595 Davi*0098 #ifdef ALLOW_OLD_VIRTUALFLUX
312383bc20 Step*0099 #ifdef ALLOW_DIC
e3c76005ea Jean*0100 # ifdef ALLOW_AUTODIFF
3de72b607c Jean*0101       IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (1)'
e3c76005ea Jean*0102 # else /* ALLOW_AUTODIFF */
                0103       IF ( useDIC ) THEN
                0104 # endif /* ALLOW_AUTODIFF */
52a73f04fb Step*0105 c find global surface averages
71ebe3095c Davi*0106        gsm_s = 0. _d 0
                0107        gsm_dic = 0. _d 0
                0108        gsm_alk = 0. _d 0
7f498da5b5 Oliv*0109        CALL GCHEM_SURFMEAN(salt,gsm_s,myThid)
                0110        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0111      &             pTracer(1-OLx,1-OLy,1,1,1,1), gsm_dic, myThid )
7f498da5b5 Oliv*0112        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0113      &             pTracer(1-OLx,1-OLy,1,1,1,2), gsm_alk, myThid )
e3c76005ea Jean*0114 # ifndef ALLOW_AUTODIFF
                0115       ENDIF
                0116 # endif /* ALLOW_AUTODIFF */
6967cafe86 Jean*0117 #endif /* ALLOW_DIC */
312383bc20 Step*0118 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0119 c     IF ( useDARWIN ) THEN
312383bc20 Step*0120 c find global surface averages
                0121        gsm_s = 0. _d 0
                0122        gsm_dic = 0. _d 0
                0123        gsm_alk = 0. _d 0
7f498da5b5 Oliv*0124        CALL GCHEM_SURFMEAN(salt,gsm_s,myThid)
                0125        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0126      &             pTracer(1-OLx,1-OLy,1,1,1,iDIC), gsm_dic, myThid )
7f498da5b5 Oliv*0127        CALL GCHEM_SURFMEAN(
35050126c6 Oliv*0128      &             pTracer(1-OLx,1-OLy,1,1,1,iALK), gsm_alk, myThid )
6967cafe86 Jean*0129 c     ENDIF
312383bc20 Step*0130 #endif
52a73f04fb Step*0131 ccccccccccccccccccccccccccccccccccccccccccc
f54a5bbe52 Jean*0132 #endif /* ALLOW_OLD_VIRTUALFLUX */
52a73f04fb Step*0133 
                0134 ccccccccccccccccccccccccc
                0135 c chemical forcing      c
                0136 ccccccccccccccccccccccccc
f4faabd05a Step*0137 C$taf loop = parallel
6967cafe86 Jean*0138       DO bj=myByLo(myThid),myByHi(myThid)
f4faabd05a Step*0139 C$taf loop = parallel
6967cafe86 Jean*0140        DO bi=myBxLo(myThid),myBxHi(myThid)
52a73f04fb Step*0141 
                0142 ccccccccccccccccccccccccccc DIC cccccccccccccccccccccccccccccccc
fd9adddc17 Step*0143 #ifdef ALLOW_DIC
e3c76005ea Jean*0144 # ifdef ALLOW_AUTODIFF
3de72b607c Jean*0145         IF (.NOT.useDIC) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (2)'
e3c76005ea Jean*0146 # else /* ALLOW_AUTODIFF */
                0147         IF ( useDIC ) THEN
                0148 # endif /* ALLOW_AUTODIFF */
5979b35251 Jean*0149 #ifdef ALLOW_DEBUG
                0150           IF (debugMode) CALL DEBUG_CALL('DIC_BIOTIC_FORCING',myThid)
                0151 #endif
52a73f04fb Step*0152 #ifdef ALLOW_FE
e1fb02e8f0 Jean*0153           CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0154      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0155      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0156      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0157      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0158      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
8a77e77698 Jean*0159      &                          bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0160      &                          myTime, myIter, myThid )
52a73f04fb Step*0161 #else
25bac1e456 Step*0162 #ifdef ALLOW_O2
8a77e77698 Jean*0163           CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1),
e1fb02e8f0 Jean*0164      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0165      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0166      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0167      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
8a77e77698 Jean*0168      &                          bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0169      &                          myTime, myIter, myThid )
25bac1e456 Step*0170 #else
8a77e77698 Jean*0171           CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1),
e1fb02e8f0 Jean*0172      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0173      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0174      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
8a77e77698 Jean*0175      &                          bi, bj, iMin, iMax, jMin, jMax,
2e3e8c330d Jona*0176      &                          myTime, myIter, myThid )
25bac1e456 Step*0177 #endif
52a73f04fb Step*0178 #endif
e3c76005ea Jean*0179 # ifndef ALLOW_AUTODIFF
                0180         ENDIF
                0181 # endif /* ALLOW_AUTODIFF */
6967cafe86 Jean*0182 #endif /* ALLOW_DIC */
52a73f04fb Step*0183 cccccccccccccccccccccccccc END DIC cccccccccccccccccccccccccccccccccc
6967cafe86 Jean*0184 
0b2b69e236 Jean*0185 ccccccccccccccccccccccccccc BLING cccccccccccccccccccccccccccccccc
                0186 #ifdef ALLOW_BLING
39016d5e45 Matt*0187         IF ( useBLING ) THEN
a284455135 Matt*0188 # ifndef USE_BLING_V1
e0f9a7ba0b Matt*0189 #  ifdef USE_SIBLING
0b2b69e236 Jean*0190           CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0191      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0192      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0193      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0194      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0195      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
                0196      &                          pTracer(1-OLx,1-OLy,1,bi,bj,7),
                0197      &                          pTracer(1-OLx,1-OLy,1,bi,bj,8),
                0198      &                          pTracer(1-OLx,1-OLy,1,bi,bj,9),
e0f9a7ba0b Matt*0199 #   ifdef ADVECT_PHYTO
                0200      &                          pTracer(1-OLx,1-OLy,1,bi,bj,10),
                0201 #   endif
0b2b69e236 Jean*0202      &                          bi, bj, iMin, iMax, jMin, jMax,
e0f9a7ba0b Matt*0203      &                          myTime, myIter, myThid )
                0204 #  else /* USE_SIBLING */
                0205           CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0206      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0207      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0208      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0209      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0210      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
                0211      &                          pTracer(1-OLx,1-OLy,1,bi,bj,7),
                0212      &                          pTracer(1-OLx,1-OLy,1,bi,bj,8),
                0213 #   ifdef ADVECT_PHYTO
                0214      &                          pTracer(1-OLx,1-OLy,1,bi,bj,9),
                0215 #   endif
                0216      &                          bi, bj, iMin, iMax, jMin, jMax,
                0217      &                          myTime, myIter, myThid )
                0218 #  endif /* USE_SIBLING */
                0219 # else /* USE_BLING_v1 */
                0220           CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1),
                0221      &                          pTracer(1-OLx,1-OLy,1,bi,bj,2),
                0222      &                          pTracer(1-OLx,1-OLy,1,bi,bj,3),
                0223      &                          pTracer(1-OLx,1-OLy,1,bi,bj,4),
                0224      &                          pTracer(1-OLx,1-OLy,1,bi,bj,5),
                0225      &                          pTracer(1-OLx,1-OLy,1,bi,bj,6),
                0226 #  ifdef ADVECT_PHYTO
                0227      &                          pTracer(1-OLx,1-OLy,1,bi,bj,7),
                0228 #  endif
                0229      &                          bi, bj, iMin, iMax, jMin, jMax,
                0230      &                          myTime, myIter, myThid )
                0231 # endif /* USE_BLING_v1 */
39016d5e45 Matt*0232         ENDIF
0b2b69e236 Jean*0233 #endif /* ALLOW_BLING */
                0234 cccccccccccccccccccccccccc END BLING cccccccccccccccccccccccccccccccccc
                0235 
bb66933431 Oliv*0236 cccccccccccccccccccccccccc DARWIN ccccccccccccccccccccccccccccccccccccc
5dae554984 Oliv*0237 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0238         IF ( useDARWIN ) THEN
5dae554984 Oliv*0239 #ifdef NUT_SUPPLY
                0240 c articficial supply of nutrients
5979b35251 Jean*0241 #ifdef ALLOW_DEBUG
                0242           IF (debugMode) CALL DEBUG_CALL('DARWIN_NUT_SUPPLY',myThid)
                0243 #endif
bb66933431 Oliv*0244           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,iPO4),
8a77e77698 Jean*0245      &                          bi, bj, iMin, iMax, jMin, jMax,
                0246      &                          myIter, myTime, myThid )
bb66933431 Oliv*0247           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,iNO3),
8a77e77698 Jean*0248      &                          bi, bj, iMin, iMax, jMin, jMax,
                0249      &                          myIter, myTime, myThid )
bb66933431 Oliv*0250           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,iFeT),
8a77e77698 Jean*0251      &                          bi, bj, iMin, iMax, jMin, jMax,
                0252      &                          myIter, myTime, myThid )
bb66933431 Oliv*0253           CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,iSiO2),
8a77e77698 Jean*0254      &                          bi, bj, iMin, iMax, jMin, jMax,
                0255      &                          myIter, myTime, myThid )
5dae554984 Oliv*0256 #endif
                0257 ccccccccccccccc
                0258 C darwin_forcing operates on bi,bj part only, but needs to get full
                0259 C array because of last (iPtr) index
5979b35251 Jean*0260 #ifdef ALLOW_DEBUG
                0261           IF (debugMode) CALL DEBUG_CALL('DARWIN_FORCING',myThid)
                0262 #endif
bb66933431 Oliv*0263           CALL TIMER_START('DARWIN_FORCING [GCHEM_FORCING_SEP]',myThid)
e1fb02e8f0 Jean*0264           CALL DARWIN_FORCING(  pTracer(1-OLx,1-OLy,1,1,1,1),
8a77e77698 Jean*0265      &                          bi, bj, iMin, iMax, jMin, jMax,
                0266      &                          myIter, myTime, myThid )
bb66933431 Oliv*0267           CALL TIMER_STOP ('DARWIN_FORCING [GCHEM_FORCING_SEP]',myThid)
6967cafe86 Jean*0268         ENDIF
3f64833ab3 Oliv*0269 #endif /* ALLOW_DARWIN */
bb66933431 Oliv*0270 cccccccccccccccccccccccccc END DARWIN ccccccccccccccccccccccccccccccccc
3a785bc7ce Step*0271 
6967cafe86 Jean*0272 #ifdef ALLOW_OBCS
                0273 C--   Apply (again) open boundary conditions for each passive tracer
                0274 C Note: could skip this 2nd call to OBCS_APPLY if all DIC/DARWIN
                0275 C       updates of ptracers were only done in the interior (i.e. with
                0276 C       tendency multiplied by maskInC)
8a77e77698 Jean*0277         IF ( useOBCS .AND. .NOT.useDIC ) THEN
5979b35251 Jean*0278 #ifdef ALLOW_DEBUG
                0279           IF (debugMode) CALL DEBUG_CALL('OBCS_APPLY_PTRACER',myThid)
                0280 #endif
3c00322f26 Jean*0281           DO iTr = 1,gchem_sepFTr_num
6967cafe86 Jean*0282             CALL OBCS_APPLY_PTRACER(
                0283      I                bi, bj, 0, iTr,
                0284      U                pTracer(1-OLx,1-OLy,1,bi,bj,iTr),
                0285      I                myThid )
                0286           ENDDO
                0287         ENDIF
                0288 #endif /* ALLOW_OBCS */
                0289 
bb66933431 Oliv*0290 C--   end bi,bj loops.
52a73f04fb Step*0291        ENDDO
6967cafe86 Jean*0292       ENDDO
52a73f04fb Step*0293 
3f64833ab3 Oliv*0294 #ifdef ALLOW_DARWIN
6967cafe86 Jean*0295       IF ( useDARWIN ) THEN
9a7312b062 Oliv*0296          CALL DARWIN_CONS( 2, myTime, myIter, myThid )
bb66933431 Oliv*0297          CALL DARWIN_ATMOS( myTime, myIter, myThid )
6967cafe86 Jean*0298       ENDIF
3f64833ab3 Oliv*0299 #endif /* ALLOW_DARWIN */
                0300 
3771641ead Step*0301 #ifdef ALLOW_DIC
3de72b607c Jean*0302 # ifdef ALLOW_AUTODIFF
                0303       IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (3)'
                0304 # else /* ALLOW_AUTODIFF */
6967cafe86 Jean*0305       IF ( useDIC ) THEN
3de72b607c Jean*0306 # endif /* ALLOW_AUTODIFF */
5979b35251 Jean*0307 #ifdef ALLOW_DEBUG
                0308        IF (debugMode) CALL DEBUG_CALL('DIC_ATMOS',myThid)
                0309 #endif
3de72b607c Jean*0310        CALL DIC_ATMOS( myTime, myIter, myThid )
6967cafe86 Jean*0311 # ifdef COMPONENT_MODULE
cdaaeac08c Davi*0312        CALL DIC_STORE_FLUXCO2( myTime, myIter, myThid )
6967cafe86 Jean*0313 # endif
                0314 # ifdef ALLOW_COST
21a58cf9c9 Patr*0315        CALL DIC_COST( myTime, myIter, myThid )
6967cafe86 Jean*0316 # endif
3de72b607c Jean*0317 # ifndef ALLOW_AUTODIFF
6967cafe86 Jean*0318       ENDIF
3de72b607c Jean*0319 # endif /* ALLOW_AUTODIFF */
e5e08e2882 Jean*0320 #endif /* ALLOW_DIC */
21a58cf9c9 Patr*0321 
5979b35251 Jean*0322 #ifdef ALLOW_DEBUG
                0323       IF (debugMode) CALL DEBUG_LEAVE('GCHEM_FORCING_SEP',myThid)
                0324 #endif
                0325 
bdb0f70f18 Mart*0326 #endif /* GCHEM_SEPARATE_FORCING */
52a73f04fb Step*0327 #endif /* ALLOW_GCHEM */
                0328 
                0329       RETURN
                0330       END