Scientific Investigations Report 2013–5016
Appendix B. CE-QUAL-W2 pH and Alkalinity Code ChangesThe most important code changes made to the CE-QUAL-W2 pH and alkalinity routines are included in this section. For a definitive list of all changes, those who are interested should compare the new and old source files electronically. The enhanced pH buffering routines and the nonconservative alkalinity algorithms can be turned on or off by the user through two new global input parameters in the control file on the MISCELL card; that modified card is shown below: MISCELL NDAY PHBUFC NCALKC 100 ON ON The PHBUFC variable (ON/OFF) controls the use of the enhanced pH buffering routines; the NCALKC variable (ON/OFF) controls the use of the nonconservative alkalinity algorithms. If the enhanced pH buffering routines are turned on, then the model will read a new input file named “ph_buffering.npt” that takes the following form: Enhanced pH Buffering Input File for CE-QUAL-W2 BUFTYPE NH4BUFC PO4BUFC OMBUFC ON ON ON OM TYPE OMTYPE NAG POMBUFC DIST 2 OFF DENSITY SDEN SDEN SDEN SDEN SDEN SDEN SDEN SDEN SDEN 0.14 0.10 pK VALS PK PK PK PK PK PK PK PK PK 4.5 9.6 STD DEV PKSD PDSD PDSD PDSD PDSD PDSD PDSD PDSD PDSD 1.2 1.0 -------------------------------------------------------------------------------- Input Variables: NH4BUFC ON/OFF, specifies whether ammonia/ammonium is included in pH buffering PO4BUFC ON/OFF, specifies whether phosphoric acid is included in pH buffering OMBUFC ON/OFF, specifies whether organic matter is included in pH buffering OMTYPE DIST or MONO where DIST specifies one or more Gaussian distributions of pKa values, or MONO specifies a collection of discrete pKa values NAG the number of acid/base groups to model, either as the means of Gaussian distributions of pKa values or as discrete monoprotic acids POMBUFC ON/OFF, specifies whether POM is included in OM buffering where ON indicates that OM buffering includes both DOM and POM OFF indicates that OM buffering includes only DOM SDEN site density, in moles of acid/base sites per mole of carbon in OM PK the pKa values (negative log10 of the acid dissociation constant), specified either as the mean of a distribution or a discrete value PKSD the standard deviation for a Gaussian distribution of pKa values (ignored when specifying an OMTYPE of MONO) When the model is run with the enhanced pH buffering capability turned on, the code will generate a new output file named “ph_buffering.opt” based on the new inputs from the ph_buffering.npt file. The object is to echo some of the inputs and provide the user with information on the distribution of site densities and pKa values for the organic matter acids. The following is the output that corresponds to the input file shown above: Enhanced pH buffering output file Ammonia buffering: ON Phosphate buffering: ON OM buffering: ON POM buffering: OFF OM buffer type: DIST Inputs: Group Site density pKa std.dev. 1 0.1400 4.500 1.200 2 0.1000 9.600 1.000 Modeled: Group Site density pKa 1 0.0001 0.500 2 0.0003 1.000 3 0.0010 1.500 4 0.0027 2.000 5 0.0058 2.500 6 0.0107 3.000 7 0.0164 3.500 8 0.0213 4.000 9 0.0233 4.500 10 0.0213 5.000 11 0.0165 5.500 12 0.0107 6.000 13 0.0060 6.500 14 0.0033 7.000 15 0.0032 7.500 16 0.0059 8.000 17 0.0110 8.500 18 0.0167 9.000 19 0.0199 9.500 20 0.0184 10.000 21 0.0133 10.500 22 0.0075 11.000 23 0.0033 11.500 24 0.0011 12.000 25 0.0003 12.500 26 0.0001 13.000 27 0.0000 13.500 The “ph_buffering.npt” input file is read by using new code in the input.f90 source file, including the following: ! Initialize variables for enhanced pH buffering ! entire section ! SR 01/01/12 IF (CONSTITUENTS .AND. PHBUFC == ’ ON’) THEN OPEN (298,FILE=’ph_buffering.npt’,STATUS=’OLD’) READ (298,’(///8X,3A8)’) NH4BUFC, PO4BUFC, OMBUFC READ (298,’(//8X,A8,I8,A8)’) OMTYPE, NAGI, POMBUFC ALLOCATE (SDENI(NAGI),PKI(NAGI),PKSD(NAGI)) READ (298,’(//(:8X,9F8.0))’) (SDENI(J), J=1,NAGI) READ (298,’(//(:8X,9F8.0))’) (PKI(J), J=1,NAGI) READ (298,’(//(:8X,9F8.0))’) (PKSD(J), J=1,NAGI) CLOSE (298) AMMONIA_BUFFERING = NH4BUFC == ’ ON’ PHOSPHATE_BUFFERING = PO4BUFC == ’ ON’ OM_BUFFERING = OMBUFC == ’ ON’ POM_BUFFERING = POMBUFC == ’ ON’ .AND. OM_BUFFERING IF (OM_BUFFERING) THEN SDENI = ABS(SDENI) IF (OMTYPE == ’ DIST’) THEN IF (ANY(PKSD <= 0)) THEN WARNING_OPEN = .TRUE. WRITE (WRN,’(A)’) ’WARNING -- PKSD inputs in the ph_buffering.npt file must be greater than zero.’ WRITE (WRN,’(A/)’) ’Please fix your inputs. For now, PKSD values of zero will be set to 1.’ END IF DO JA=1,NAGI IF (PKSD(JA) <= 0) PKSD(JA) = 1.0 END DO NAG = 27 ALLOCATE (SDEN(NAG),PK(NAG),FRACT(NAG)) SDEN = 0.0 DO J=1,NAG PK(J) = 0.5*J END DO DO JA=1,NAGI SUM = 0.0 DO J=1,NAG FRACT(J) = EXP(-0.5*(((PK(J)-PKI(JA))/PKSD(JA))**2)) SUM = SUM+FRACT(J) END DO DO J=1,NAG SDEN(J) = SDEN(J)+SDENI(JA)*FRACT(J)/SUM END DO END DO ELSE ALLOCATE (SDEN(NAGI),PK(NAGI)) NAG = NAGI SDEN = SDENI PK = PKI OMTYPE = ’ MONO’ END IF END IF OPEN (299,FILE=’ph_buffering.opt’,STATUS=’UNKNOWN’) WRITE (299,’(A/)’) ’Enhanced pH buffering output file’ WRITE (299,’(2A)’) ’Ammonia buffering: ’, ADJUSTL(TRIM(NH4BUFC)) WRITE (299,’(2A)’) ’Phosphate buffering: ’, ADJUSTL(TRIM(PO4BUFC)) WRITE (299,’(2A)’) ’OM buffering: ’, ADJUSTL(TRIM(OMBUFC)) IF (OM_BUFFERING) THEN WRITE (299,’(2A)’) ’POM buffering: ’, ADJUSTL(TRIM(POMBUFC)) WRITE (299,’(2A)’) ’OM buffer type: ’, ADJUSTL(TRIM(OMTYPE)) WRITE (299,’(/A/A)’) ’Inputs:’,’Group Site density pKa std.dev.’ DO JA=1,NAGI IF (OMTYPE == ’ DIST’) THEN WRITE (299,’(1X,I3,5X,F8.4,4X,F6.3,3X,F6.3)’) JA, SDENI(JA), PKI(JA), PKSD(JA) ELSE WRITE (299,’(1X,I3,5X,F8.4,4X,F6.3,3X,A)’) JA, SDENI(JA), PKI(JA), ’ N/A’ END IF END DO WRITE (299,’(/A/A)’) ’Modeled:’,’Group Site density pKa’ DO JA=1,NAG WRITE (299,’(1X,I3,5X,F8.4,4X,F6.3)’) JA, SDEN(JA), PK(JA) END DO END IF CLOSE (299) ELSE AMMONIA_BUFFERING = .FALSE. PHOSPHATE_BUFFERING = .FALSE. OM_BUFFERING = .FALSE. POM_BUFFERING = .FALSE. END IF In the water-quality.f90 source file, the PH_CO2 subroutine was modified to include the optional buffering by ammonia, phosphoric acid, and organic matter. The modified code is: ENTRY PH_CO2 ! Enhancements added for buffering by ammonia, phosphate, and OM ! SR 01/01/12 ! pH and carbonate species DO I=IU,ID DO K=KT,KB(I) T1K = T1(K,I)+273.15 CART = TIC(K,I)/12011. ! SR 01/01/12 ALKT = ALK(K,I)/50044. ! SR 01/01/12 AMMT = NH4(K,I)/14006.74 ! SR 01/01/12 PHOST = PO4(K,I)/30973.762 ! SR 01/01/12 OMCT = (LDOM(K,I)+RDOM(K,I))*ORGC(JW)/12011. ! moles carbon per liter from DOM ! SR 01/01/12 IF (POM_BUFFERING) OMCT = OMCT + (LPOM(K,I)+RPOM(K,I))*ORGC(JW)/12011. ! SR 01/01/12 !**** Ionic strength IF (FRESH_WATER(JW)) S2 = 2.5E-05*TDS(K,I) IF (SALT_WATER(JW)) S2 = 1.47E-3+1.9885E-2*TDS(K,I)+3.8E-5*TDS(K,I)*TDS(K,I) !**** Debye-Huckel terms and activity coefficients SQRS2 = SQRT(S2) DH1 = -0.5085*SQRS2/(1.0+1.3124*SQRS2)+4.745694E-03+4.160762E-02*S2-9.284843E-03*S2*S2 DH2 = -2.0340*SQRS2/(1.0+1.4765*SQRS2)+1.205665E-02+9.715745E-02*S2-2.067746E-02*S2*S2 DH3 = -4.5765*SQRS2/(1.0+1.3124*SQRS2) ! extended Debye-Huckel for PO4 ! SR 01/01/12 DHH = -0.5085*SQRS2/(1.0+2.9529*SQRS2) ! extended Debye-Huckel for H+ ion ! SR 01/01/12 H2CO3T = 10.0**(0.0755*S2) HCO3T = 10.0**DH1 CO3T = 10.0**DH2 PO4T = 10.0**DH3 ! SR 01/01/12 HT = 10.0**DHH ! activity coefficient for H+ ! SR 01/01/12 HPO4T = CO3T ! tabled values similar to those for carbonate ! SR 01/01/12 OHT = HCO3T ! tabled values similar to those for bicarbonate ! SR 01/01/12 H2PO4T = HCO3T ! tabled values similar to those for bicarbonate ! SR 01/01/12 NH4T = HCO3T ! tabled values similar to those for bicarbonate ! SR 01/01/12 NH3T = H2CO3T ! neutral species, set coefficient to same as that for carbonic acid ! SR 01/01/12 H3PO4T = H2CO3T ! neutral species, set coefficient to same as that for carbonic acid ! SR 01/01/12 !**** Temperature adjustment KW = 10.0**(-283.971 -0.05069842*T1K +13323.0/T1K +102.24447*LOG10(T1K) -1119669.0/(T1K*T1K))/OHT K1 = 10.0**(-356.3094 -0.06091964*T1K +21834.37/T1K +126.8339 *LOG10(T1K) -1684915 /(T1K*T1K))*H2CO3T/HCO3T K2 = 10.0**(-107.8871 -0.03252849*T1K + 5151.79/T1K + 38.92561*LOG10(T1K) - 563713.9/(T1K*T1K))*HCO3T/CO3T KAMM = 10.0**(-0.09018 -2729.92/T1K)*NH4T/NH3T ! SR 01/01/12 KP1 = 10.0**(4.5535 -0.013486*T1K -799.31/T1K)*H3PO4T/H2PO4T ! Bates (1951) ! SR 01/21/12 KP2 = 10.0**(5.3541 -0.019840*T1K -1979.5/T1K)*H2PO4T/HPO4T ! Bates and Acree (1943) ! SR 01/21/12 KP3 = 10.0**(-12.38) *HPO4T/PO4T ! Dean (1985) ! SR 01/01/12 !**** pH evaluation PHT = -PH(K,I)-2.1 IF (PH(K,I) <= 0.0) PHT = -14.0 INCR = 10.0 DO N=1,3 F = 1.0 INCR = INCR/10.0 ITER = 0 DO WHILE (F > 0.0 .AND. ITER < 12) PHT = PHT+INCR HION = 10.0**PHT F = CART*K1*(HION+2.0*K2)/(HION*HION+K1*HION+K1*K2)+KW/HION-ALKT-HION/HT ! SR 01/01/12 IF (AMMONIA_BUFFERING) THEN ! SR 01/01/12 F = F + AMMT*KAMM/(HION+KAMM) ! SR 01/01/12 END IF ! SR 01/01/12 IF (PHOSPHATE_BUFFERING) THEN ! SR 01/01/12 F = F + PHOST*( KP1*KP2*HION + 2*KP1*KP2*KP3 - HION*HION*HION ) & /( HION*HION*HION + KP1*HION*HION + KP1*KP2*HION + KP1*KP2*KP3) ! SR 01/01/12 END IF ! SR 01/01/12 IF (OM_BUFFERING) THEN ! SR 01/01/12 DO JA=1,NAG ! SR 01/01/12 F = F + OMCT*SDEN(JA)*( 1.0/(1.0+HION*(10.0**PK(JA))) - 1.0/(1.0+(10.0**(PK(JA)-4.5))) ) ! SR 01/01/12 END DO ! SR 01/01/12 END IF ! SR 01/01/12 ITER = ITER+1 END DO PHT = PHT-INCR END DO !**** pH, carbon dioxide, bicarbonate, and carbonate concentrations HION = 10.0**PHT PH(K,I) = -PHT CO2(K,I) = TIC(K,I)/(1.0+K1/HION+K1*K2/(HION*HION)) HCO3(K,I) = TIC(K,I)/(1.0+HION/K1+K2/HION) CO3(K,I) = TIC(K,I)/((HION*HION)/(K1*K2)+HION/K2+1.0) END DO END DO RETURN In the water-quality.f90 source file, a new ALKALINITY subroutine was added to realize the nonconservative components of alkalinity. The new code is: !******************************************************************************************************************** !** A L K A L I N I T Y ** !******************************************************************************************************************** ENTRY ALKALINITY ! entire subroutine added ! SR 01/01/12 ! According to Stumm and Morgan (1996), table 4.5 on page 173: ! Utilization of ammonium during photosynthesis results in an alkalinity decrease: 14 eq. alk per 16 moles ammonium ! Utilization of nitrate during photosynthesis results in an alkalinity increase: 18 eq. alk per 16 moles nitrate ! Production of ammonium during respiration results in an alkalinity increase: 14 eq. alk per 16 moles ammonium ! Nitrification of ammonium results in an alkalinity decrease: 2 eq. alk per 1 mole ammonium ! Denitrification of nitrate (to nitrogen gas) results in an alkalinity increase: 1 eq. alk per 1 mole nitrate ! Alkalinity is represented as mg/L CaCO3 (MW=100.088). CaCO3 has 2 equivalents of alk per mole. ! Nitrogen has an atomic mass of 14.00674. These numbers account for the factor of 50.044/14.00674 used below. DO I=IU,ID DO K=KT,KB(I) ALKSS(K,I) = (50.044/14.00674) * ( 14./16.*(NH4AP(K,I)+NH4EP(K,I)+NH4ZR(K,I)+NH4MR(K,I)-NH4MG(K,I)) & + 18./16.*(NO3AG(K,I)+NO3EG(K,I)) & - 2.*NH4D(K,I) + NO3D(K,I) + NO3SED(K,I)*(1-FNO3SED(JW)) ) END DO END DO RETURN |
First posted March 1, 2013 For additional information contact: Part or all of this report is presented in Portable Document Format (PDF); the latest version of Adobe Reader or similar software is required to view it. Download the latest version of Adobe Reader, free of charge. |