C $Header: /u/gcmpack/MITgcm/pkg/gchem/gchem_forcing_sep.F,v 1.45 2017/12/29 19:42:09 jmc Exp $ C $Name: $ #include "GCHEM_OPTIONS.h" #ifdef ALLOW_DIC # include "DIC_OPTIONS.h" #endif #ifdef ALLOW_BLING # include "BLING_OPTIONS.h" #endif #ifdef ALLOW_DARWIN # include "DARWIN_OPTIONS.h" #endif CBOP C !ROUTINE: GCHEM_FORCING_SEP C !INTERFACE: ========================================================== SUBROUTINE GCHEM_FORCING_SEP( myTime, myIter, myThid ) C !DESCRIPTION: C calls subroutine that will update passive tracers values C with a separate timestep. Since GCHEM_FORCING_SEP is now C called before DO_FIELDS_BLOCKING_EXCHANGES, the passive C tracer values in the halo regions are not up to date and C must not be used. C !USES: =============================================================== IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #include "PTRACERS_SIZE.h" #include "PTRACERS_PARAMS.h" #include "PTRACERS_FIELDS.h" #include "GCHEM.h" #ifdef ALLOW_DIC # include "DIC_VARS.h" #endif /* ALLOW_DIC */ #ifdef ALLOW_BLING # include "BLING_VARS.h" #endif /* ALLOW_BLING */ #ifdef ALLOW_DARWIN # include "DARWIN_FLUX.h" # include "DARWIN_SIZE.h" #endif C !INPUT PARAMETERS: =================================================== C myThid :: thread number _RL myTime INTEGER myIter, myThid CEOP #ifdef ALLOW_GCHEM #ifdef GCHEM_SEPARATE_FORCING C!LOCAL VARIABLES: ==================================================== C i,j :: loop indices C bi,bj :: tile indices C k :: vertical level INTEGER bi,bj,iMin,iMax,jMin,jMax c INTEGER i,j PARAMETER( iMin = 1 , iMax = sNx ) PARAMETER( jMin = 1 , jMax = sNy ) #if (defined ALLOW_OBCS) (defined ALLOW_DIAGNOSTICS) INTEGER iTr #endif #ifdef ALLOW_DIAGNOSTICS CHARACTER*8 diagName #endif /* ALLOW_DIAGNOSTICS */ #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_ENTER('GCHEM_FORCING_SEP',myThid) #endif #ifdef ALLOW_DIAGNOSTICS IF ( useDiagnostics ) THEN C-- fill-in tracer diagnostics before any GChem udate DO iTr = 1,gchem_sepFTr_num diagName = ' ' WRITE(diagName,'(A5,A2)') 'GC_Tr', PTRACERS_ioLabel(iTr) CALL DIAGNOSTICS_FILL( pTracer(1-OLx,1-OLy,1,1,1,iTr), diagName, & 0, Nr, 0, 1, 1, myThid ) ENDDO ENDIF #endif /* ALLOW_DIAGNOSTICS */ ccccccccccccccccccccccccc c global calculations c ccccccccccccccccccccccccc #ifdef ALLOW_OLD_VIRTUALFLUX #ifdef ALLOW_DIC # ifdef ALLOW_AUTODIFF IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (1)' else /* ALLOW_AUTODIFF */ IF ( useDIC ) THEN # endif /* ALLOW_AUTODIFF */ c find global surface averages gsm_s = 0. _d 0 gsm_dic = 0. _d 0 gsm_alk = 0. _d 0 CALL GCHEM_SURFMEAN(salt,gsm_s,myThid) CALL GCHEM_SURFMEAN( & pTracer(1-OLx,1-OLy,1,1,1,1), gsm_dic, myThid ) print*,'mean surface dic', gsm_dic,gsm_s CALL GCHEM_SURFMEAN( & pTracer(1-OLx,1-OLy,1,1,1,2), gsm_alk, myThid ) # ifndef ALLOW_AUTODIFF ENDIF # endif /* ALLOW_AUTODIFF */ #endif /* ALLOW_DIC */ #ifdef ALLOW_DARWIN c IF ( useDARWIN ) THEN c find global surface averages gsm_s = 0. _d 0 gsm_dic = 0. _d 0 gsm_alk = 0. _d 0 CALL GCHEM_SURFMEAN(salt,gsm_s,myThid) CALL GCHEM_SURFMEAN( & pTracer(1-OLx,1-OLy,1,1,1,iDIC), gsm_dic, myThid ) print*,'mean surface dic', gsm_dic,gsm_s CALL GCHEM_SURFMEAN( & pTracer(1-OLx,1-OLy,1,1,1,iALK), gsm_alk, myThid ) c ENDIF #endif ccccccccccccccccccccccccccccccccccccccccccc #endif /* ALLOW_OLD_VIRTUALFLUX */ #ifdef ALLOW_DARWIN IF ( useDARWIN ) THEN CALL DARWIN_CONS( myIter, myTime, myThid ) ENDIF #endif ccccccccccccccccccccccccc c chemical forcing c ccccccccccccccccccccccccc C$taf loop = parallel DO bj=myByLo(myThid),myByHi(myThid) C$taf loop = parallel DO bi=myBxLo(myThid),myBxHi(myThid) ccccccccccccccccccccccccccc DIC cccccccccccccccccccccccccccccccc #ifdef ALLOW_DIC # ifdef ALLOW_AUTODIFF IF (.NOT.useDIC) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (2)' else /* ALLOW_AUTODIFF */ IF ( useDIC ) THEN # endif /* ALLOW_AUTODIFF */ #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('DIC_BIOTIC_FORCING',myThid) #endif #ifdef ALLOW_FE CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1), & pTracer(1-OLx,1-OLy,1,bi,bj,2), & pTracer(1-OLx,1-OLy,1,bi,bj,3), & pTracer(1-OLx,1-OLy,1,bi,bj,4), & pTracer(1-OLx,1-OLy,1,bi,bj,5), & pTracer(1-OLx,1-OLy,1,bi,bj,6), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) #else #ifdef ALLOW_O2 CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1), & pTracer(1-OLx,1-OLy,1,bi,bj,2), & pTracer(1-OLx,1-OLy,1,bi,bj,3), & pTracer(1-OLx,1-OLy,1,bi,bj,4), & pTracer(1-OLx,1-OLy,1,bi,bj,5), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) #else CALL DIC_BIOTIC_FORCING( pTracer(1-OLx,1-OLy,1,bi,bj,1), & pTracer(1-OLx,1-OLy,1,bi,bj,2), & pTracer(1-OLx,1-OLy,1,bi,bj,3), & pTracer(1-OLx,1-OLy,1,bi,bj,4), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) #endif #endif # ifndef ALLOW_AUTODIFF ENDIF # endif /* ALLOW_AUTODIFF */ #endif /* ALLOW_DIC */ cccccccccccccccccccccccccc END DIC cccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccc BLING cccccccccccccccccccccccccccccccc #ifdef ALLOW_BLING IF ( useBLING ) THEN CALL BLING_MAIN( pTracer(1-OLx,1-OLy,1,bi,bj,1), & pTracer(1-OLx,1-OLy,1,bi,bj,2), & pTracer(1-OLx,1-OLy,1,bi,bj,3), & pTracer(1-OLx,1-OLy,1,bi,bj,4), & pTracer(1-OLx,1-OLy,1,bi,bj,5), & pTracer(1-OLx,1-OLy,1,bi,bj,6), & pTracer(1-OLx,1-OLy,1,bi,bj,7), & pTracer(1-OLx,1-OLy,1,bi,bj,8), # ifdef ADVECT_PHYTO & pTracer(1-OLx,1-OLy,1,bi,bj,9), # endif & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) ENDIF #endif /* ALLOW_BLING */ cccccccccccccccccccccccccc END BLING cccccccccccccccccccccccccccccccccc #ifdef ALLOW_DARWIN IF ( useDARWIN ) THEN #ifdef NUT_SUPPLY c articficial supply of nutrients #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('DARWIN_NUT_SUPPLY',myThid) #endif CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,1), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,2), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,3), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) CALL DARWIN_NUT_SUPPLY( pTracer(1-OLx,1-OLy,1,bi,bj,4), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) #endif ccccccccccccccc C darwin_forcing operates on bi,bj part only, but needs to get full C array because of last (iPtr) index #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('DARWIN_FORCING',myThid) #endif CALL DARWIN_FORCING( pTracer(1-OLx,1-OLy,1,1,1,1), & bi, bj, iMin, iMax, jMin, jMax, & myIter, myTime, myThid ) ENDIF #endif /* ALLOW_DARWIN */ #ifdef ALLOW_OBCS C-- Apply (again) open boundary conditions for each passive tracer C Note: could skip this 2nd call to OBCS_APPLY if all DIC/DARWIN C updates of ptracers were only done in the interior (i.e. with C tendency multiplied by maskInC) IF ( useOBCS .AND. .NOT.useDIC ) THEN #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('OBCS_APPLY_PTRACER',myThid) #endif DO iTr = 1,gchem_sepFTr_num CALL OBCS_APPLY_PTRACER( I bi, bj, 0, iTr, U pTracer(1-OLx,1-OLy,1,bi,bj,iTr), I myThid ) ENDDO ENDIF #endif /* ALLOW_OBCS */ ENDDO ENDDO #ifdef ALLOW_DARWIN IF ( useDARWIN ) THEN CALL DARWIN_CONS( myIter, myTime, myThid ) #ifdef ALLOW_CARBON CALL DIC_ATMOS( 1, myTime, myIter, myThid ) #endif ENDIF #endif /* ALLOW_DARWIN */ #ifdef ALLOW_DIC # ifdef ALLOW_AUTODIFF IF ( .NOT.useDIC ) STOP 'ABNORMAL END: S/R GCHEM_FORCING_SEP (3)' else /* ALLOW_AUTODIFF */ IF ( useDIC ) THEN # endif /* ALLOW_AUTODIFF */ #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_CALL('DIC_ATMOS',myThid) #endif CALL DIC_ATMOS( myTime, myIter, myThid ) # ifdef COMPONENT_MODULE CALL DIC_STORE_FLUXCO2( myTime, myIter, myThid ) # endif # ifdef ALLOW_COST CALL DIC_COST( myTime, myIter, myThid ) # endif # ifndef ALLOW_AUTODIFF ENDIF # endif /* ALLOW_AUTODIFF */ #endif /* ALLOW_DIC */ #ifdef ALLOW_DEBUG IF (debugMode) CALL DEBUG_LEAVE('GCHEM_FORCING_SEP',myThid) #endif #endif /* GCHEM_SEPARATE_FORCING */ #endif /* ALLOW_GCHEM */ RETURN END