C $Header: /home/ubuntu/mnt/e9_copy/MITgcm_contrib/bling/pkg/bling_main.F,v 1.1 2014/05/23 17:33:43 mmazloff Exp $ C $Name: $ #include "BLING_OPTIONS.h" CBOP subroutine BLING_MAIN( PTR_DIC, PTR_ALK, PTR_NUT, & PTR_DOM, PTR_O2, PTR_FE, & bi, bj, imin, imax, jmin, jmax, & myIter, myTime, myThid) C ========================================================== C | subroutine bling_main C | o updates all the tracers for the effects of air-sea exchange, C | biological production, and remineralization. C ========================================================== implicit none C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "BLING_VARS.h" #include "PTRACERS_SIZE.h" #include "PTRACERS_PARAMS.h" #ifdef ALLOW_EXF # include "EXF_FIELDS.h" #endif #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" #endif C === Routine arguments === C bi,bj :: tile indices C iMin,iMax :: computation domain: 1rst index range C jMin,jMax :: computation domain: 2nd index range C myTime :: current time C myIter :: current timestep C myThid :: thread Id. number INTEGER bi, bj, imin, imax, jmin, jmax _RL myTime INTEGER myIter INTEGER myThid C === Input === C PTR_DIC :: dissolved inorganic carbon C PTR_ALK :: alkalinity C PTR_NUT :: macro-nutrient concentration C PTR_DOM :: dissolved organic matter concentration C PTR_O2 :: oxygen concentration C PTR_FE :: iron concentration _RL PTR_DIC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL PTR_ALK(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL PTR_NUT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL PTR_DOM(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL PTR_O2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL PTR_FE (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) C === Local variables === C i,j,k :: loop indices C G* :: tendency term for the tracers C SURC :: tendency of DIC due to air-sea exchange C SURO :: tendency of O2 due to air-sea exchange C NUT_uptake :: nutrient uptake for biological production C POM_prod :: nutrient converted to particulate C organic matter C DOM_prod :: nutrient converted to dissolved organic C matter C DOM_remin :: DOM remineralization C POM_remin :: POM sinking and instant remineralization C NUT_remin :: Total nutrient remineralization C NUT_recyc :: Fast nutrient recycling C Fe_uptake :: iron converted to particulate organic or C inorganic (colloidal) iron C Fe_remin :: particulate iron converted to total iron C CaCO3_prod :: uptake of carbonate ions for CaCO3 formation C CaCO3_diss :: dissolution of CaCO3 C Car :: carbonate ion biological production C BioUp :: DIC biological production (<0) C Remin :: DIC remineralization C runoff* :: tendency due to river runoff INTEGER i,j,k _RL GDIC(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL GALK(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL GNUT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL GDOM(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL GO2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL GFE (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL SURC(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL SURO(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL NUT_uptake(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL NUT_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL NUT_recyc (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL POM_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL POM_diss (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL POM_prod (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL DOM_prod (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL DOM_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL CaCO3_prod(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL CaCO3_diss(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL Fe_uptake (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL Fe_remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL runoff_dic(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL runoff_alk(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL runoff_nut(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL runoff_dom(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL runoff_o2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL runoff_fe (1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL BioUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL Remin (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) _RL Car (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) CEOP C----------------------------------------------------------- C Initialize local variables DO k=1,Nr DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx GDIC(i,j,k) = 0. _d 0 GALK(i,j,k) = 0. _d 0 GNUT(i,j,k) = 0. _d 0 GDOM(i,j,k) = 0. _d 0 GO2(i,j,k) = 0. _d 0 GFE(i,j,k) = 0. _d 0 NUT_uptake(i,j,k) = 0. _d 0 NUT_remin(i,j,k) = 0. _d 0 NUT_recyc(i,j,k) = 0. _d 0 DOM_remin(i,j,k) = 0. _d 0 POM_remin(i,j,k) = 0. _d 0 DOM_prod(i,j,k) = 0. _d 0 POM_prod(i,j,k) = 0. _d 0 CaCO3_prod(i,j,k) = 0. _d 0 CaCO3_diss(i,j,k) = 0. _d 0 Fe_uptake(i,j,k) = 0. _d 0 Fe_remin(i,j,k) = 0. _d 0 BioUp(i,j,k) = 0. _d 0 Remin(i,j,k) = 0. _d 0 Car(i,j,k) = 0. _d 0 ENDDO ENDDO ENDDO DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx SURC(i,j) = 0. _d 0 SURO(i,j) = 0. _d 0 runoff_dic(i,j) = 0. _d 0 runoff_alk(i,j) = 0. _d 0 runoff_NUT(i,j) = 0. _d 0 runoff_DOM(i,j) = 0. _d 0 runoff_o2(i,j) = 0. _d 0 runoff_fe(i,j) = 0. _d 0 ENDDO ENDDO C----------------------------------------------------------- C carbon and oxygen air-sea interaction CALL BLING_AIRSEAFLUX( I PTR_DIC, PTR_ALK, PTR_NUT, PTR_O2, U SURC, SURO, I bi, bj, imin, imax, jmin, jmax, I myIter, myTime, myThid) C$TAF STORE irr_mem = comlev1, key = ikey_dynamics, kind=isbyte C$TAF STORE irr_inst = comlev1, key = ikey_dynamics, kind=isbyte C$TAF STORE P_sm = comlev1, key = ikey_dynamics, kind=isbyte C$TAF STORE P_lg = comlev1, key = ikey_dynamics, kind=isbyte C----------------------------------------------------------- C biological production of organic matter CALL BLING_PROD( I PTR_NUT, PTR_FE, PTR_DOM, PTR_O2, U NUT_uptake, POM_prod, DOM_prod, U Fe_uptake, CaCO3_prod, I bi, bj, imin, imax, jmin, jmax, I myIter, myTime, myThid) C----------------------------------------------------------- C determine calcite saturation for use in bling_remin CALL BLING_CARBONATE_SYS( I PTR_DIC, PTR_ALK, PTR_NUT, I bi, bj, imin, imax, jmin, jmax, I myIter, myTime, myThid) C----------------------------------------------------------- C flux of NUT, CaCO3, and Fe from remineralization CALL BLING_REMIN( I PTR_O2, PTR_FE, U POM_prod, Fe_uptake, CaCO3_prod, U POM_remin, POM_diss, Fe_remin, CaCO3_diss, I bi, bj, imin, imax, jmin, jmax, I myIter, myTime, myThid) C$TAF STORE P_sm = comlev1, key = ikey_dynamics, kind=isbyte C$TAF STORE P_lg = comlev1, key = ikey_dynamics, kind=isbyte C----------------------------------------------------------- C Calculate river runoff source C Tracers are already diluted by freswater input, P-E+R C This accounts for tracer concentration in river runoff DO j=jmin,jmax DO i=imin,imax #ifdef ALLOW_EXF runoff_dic(i,j) = riverconc_DIC*runoff(i,j,bi,bj) & *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) runoff_alk(i,j) = riverconc_ALK*runoff(i,j,bi,bj) & *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) runoff_nut(i,j) = riverconc_NUT*runoff(i,j,bi,bj) & *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) runoff_dom(i,j) = riverconc_DOM*runoff(i,j,bi,bj) & *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) runoff_o2(i,j) = riverconc_O2 *runoff(i,j,bi,bj) & *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) runoff_fe(i,j) = riverconc_FE *runoff(i,j,bi,bj) & *recip_drF(1)*recip_hFacC(i,j,1,bi,bj) C else it is 0 as initialized #endif ENDDO ENDDO C----------------------------------------------------------- C add all tendencies DO k=1,Nr DO j=jmin,jmax DO i=imin,imax C Dissolved organic matter slow remineralization #ifdef BLING_NO_NEG DOM_remin(i,j,k) = MAX(maskC(i,j,k,bi,bj)*gamma_DOM & *PTR_DOM(i,j,k),0. _d 0) #else DOM_remin(i,j,k) = maskC(i,j,k,bi,bj)*gamma_DOM & *PTR_DOM(i,j,k) #endif C Total nutrient remin, recycling NUT_remin(i,j,k) = POM_remin(i,j,k) + DOM_remin(i,j,k) NUT_recyc(i,j,k) = NUT_uptake(i,j,k) - POM_prod(i,j,k) & - DOM_prod(i,j,k) C Carbon system diagnostics C Change in DIC from primary production, from recycling and C remineralization, change in carbonate ions concentration C from biological activity: BioUp(i,j,k) = -NUT_uptake(i,j,k)*CtoP/NUTfac Remin(i,j,k) = (DOM_remin(i,j,k) + NUT_recyc(i,j,k) & + POM_remin(i,j,k))*CtoP/NUTfac Car(i,j,k) = CaCO3_diss(i,j,k) - CaCO3_prod(i,j,k) C Tendencies GNUT(i,j,k) = -NUT_uptake(i,j,k) + NUT_recyc(i,j,k) & + DOM_remin(i,j,k) + POM_remin(i,j,k) GDOM(i,j,k) = DOM_prod(i,j,k) - DOM_remin(i,j,k) & + POM_diss(i,j,k) GALK(i,j,k) = 2. _d 0*Car(i,j,k) - NtoP/NUTfac*GNUT(i,j,k) GDIC(i,j,k) = BioUp(i,j,k) + Remin(i,j,k) + Car(i,j,k) if ( PTR_O2(i,j,k) .GT. O2_min ) then GO2(i,j,k) = O2toP/NUTfac*GNUT(i,j,k) else GO2(i,j,k) = 0. _d 0 endif GFE(i,j,k) = Fe_remin(i,j,k) - Fe_uptake(i,j,k) ENDDO ENDDO ENDDO C----------------------------------------------------------- C adding surface tendencies due to air-sea exchange C adding surface tendencies due to river runoff C adding aeolian iron source DO j=jmin,jmax DO i=imin,imax GDIC(i,j,1)=GDIC(i,j,1)+runoff_dic(i,j)+SURC(i,j) GALK(i,j,1)=GALK(i,j,1)+runoff_alk(i,j) GNUT(i,j,1)=GNUT(i,j,1)+runoff_nut(i,j) GDOM(i,j,1)=GDOM(i,j,1)+runoff_dom(i,j) GO2(i,j,1) =GO2(i,j,1) +runoff_o2(i,j) +SURO(i,j) GFE(i,j,1) =GFE(i,j,1) +runoff_fe(i,j) & +alpfe*InputFe(i,j,bi,bj)*recip_drF(1) & *recip_hFacC(i,j,1,bi,bj) ENDDO ENDDO C----------------------------------------------------------- C update DO k=1,Nr DO j=jmin,jmax DO i=imin,imax PTR_DIC(i,j,k)= PTR_DIC(i,j,k)+GDIC(i,j,k)*PTRACERS_dTLev(k) PTR_ALK(i,j,k)= PTR_ALK(i,j,k)+GALK(i,j,k)*PTRACERS_dTLev(k) PTR_NUT(i,j,k)= PTR_NUT(i,j,k)+GNUT(i,j,k)*PTRACERS_dTLev(k) PTR_DOM(i,j,k)= PTR_DOM(i,j,k)+GDOM(i,j,k)*PTRACERS_dTLev(k) PTR_O2(i,j,k) = PTR_O2(i,j,k) +GO2(i,j,k) *PTRACERS_dTLev(k) PTR_FE(i,j,k) = PTR_FE(i,j,k) +GFE(i,j,k) *PTRACERS_dTLev(k) ENDDO ENDDO ENDDO C----------------------------------------------------------- #ifdef ALLOW_DIAGNOSTICS IF ( useDiagnostics ) THEN CALL DIAGNOSTICS_FILL(BioUp ,'BLGBIOA ',0,Nr,2,bi,bj,myThid) CALL DIAGNOSTICS_FILL(Remin ,'BLGREMI ',0,Nr,2,bi,bj,myThid) CALL DIAGNOSTICS_FILL(Car ,'BLGCARB ',0,Nr,2,bi,bj,myThid) CALL DIAGNOSTICS_FILL(pH ,'BLGPH3D ',0,Nr,1,bi,bj,myThid) CALL DIAGNOSTICS_FILL(OmegaAr ,'BLGOMAR ',0,Nr,1,bi,bj,myThid) CALL DIAGNOSTICS_FILL(pCO2 ,'BLGPCO2 ',0,1 ,1,bi,bj,myThid) CALL DIAGNOSTICS_FILL(fluxCO2 ,'BLGCFLX ',0,1 ,1,bi,bj,myThid) CALL DIAGNOSTICS_FILL(SURC ,'BLGTFLX ',0,1 ,2,bi,bj,myThid) CALL DIAGNOSTICS_FILL(SURO ,'BLGOFLX ',0,1 ,2,bi,bj,myThid) ENDIF #endif /* ALLOW_DIAGNOSTICS */ RETURN END