Changes in version 0.10.0 (2025-08-24) New features - Revamped helpers _df replace chain and once functions. Use pluck_cols = TRUE to mimic once behavior, although it will always return a water column as well. - Virus log removal added to solvect_chlorine based on the EPA Guidance Manual Table E-7 (1991) - modify_water can now modify multiple water slots at once. Note that in order to modify multiple slots using modify_water_df, all input arguments must be included as a list. - Acetic acid added as chemical to chemdose_ph. In addition to changing pH, dosing acetic acid will also update TOC and DOC of the input water. - regulate_toc now available for calculating TOC removal compliance - gacrun_toc, gac_toc, and gacbv_toc added to predict TOC removal from GAC treatment using either the EPA WTP model (2001) or the Zachman and Summers (2018) model. Different functions provide different output types: a data frame of the TOC breakthrough curve, a new water with updated TOC, DOC, and UV254 water slots, or the necessary bed volumes to stay below the target effluent TOC. See individual functions for documentation. - pluck_water and _df helpers sped up by relying on base R instead of purrr - chemdose_toc can now account for doc removal due to lime softening from the WTP Model (2001). To implement, use the caoh2 argument. - New model opensys_ph added to predict pH and alkalinity of an input water in an open carbonate system at equilibrium - New function plot_lead added to graph the pH vs DIC contour plot for lead solubility - Alkalinity slots added to the water class. alk and alk_eq represent the total alkalinity, and individual alkalinities due to carbonate, phosphate, ammonium, borate, silicate, and hypochlorite have been added as individual slots (eg. carbonate_alk_eq). Breaking changes - _chain and _once functions have been deprecated. Replace with _df functions. Code should be similar, but has slightly different outputs. - Default water naming in helper functions has been shortened to remove "_water". Eg, new default output_water = "defined", old default output_water = "defined_water". See function documentation for new defaults. - Total alkalinity (alk) now accounts for phosphate, silicate, borate, hypochlorite, and ammonia. Could have a minor impact on final pH and alkalinity calculations in waters with those compounds. - Now depends on R >= 4.1.0 for built in pipe operator, |> Changes in version 0.9.0 (2025-07-03) New features - New chemdose_ph chemicals: CaOCl2, CaSO4, HNO3, KMnO4, NaF, and Na3PO4 - New model dissolve_cu predicts the concentration of copper given pH, DIC, and phosphate based on the empirical model described in Lytle et al. (2018). dissolve_cu_once can also predict copper for waters in a data frame. - chemdose_dbp can now input custom fitting coefficients as a data frame - chemdose_ph_once and chemdose_toc_once are back and only return relevant waters slots in its output. - decarbonate_ph: function to remove CO2 (H2CO3) from a water and determine the new pH (and division of ions) - modify_water: function to modify individual slots in a water that handles unit conversions Breaking changes - applied_treatment slot removed from water. Was not providing any benefit and added complexity. Should be the responsibility of the user to track. - h2co3 slot added to water class calculated based on {H} and total carbonate. - chemdose_ph warns when ion water slots aren't updated due to NA slots. - solvedose_ph updated search range to allow for more water qualities without erroring. Updated search process results in slightly different outputs. - _toc functions are DOC-based and previously assumed no particulate TOC removal. In reality, virtually all particulate TOC is removed with other particulates, so models have been updated to return TOC = DOC - chemdose_toc custom coeff now accepts a data frame instead of a named list - Corrosion index slots removed from water class. - calculate_corrosion now outputs a data frame with the corrosion indices as columns. calculate_corrosion_chain removed because the base function has a numeric output. - calculate_corrosion updated CCPP search range to allow for more water qualities without erroring. - solvect_o3 and solveresid_o3 now return zero instead of NaN when the input dose is zero Changes in version 0.8.2 (2025-05-17) - Reduce examples for CRAN speed again. Changes in version 0.8.1 - Pare down examples and vignettes to speed up CRAN checks - Minor updates to chemdose_chloramine warnings. Changes in version 0.8.0 - calculate_corrosion expanded CCPP search range (fewer errors) Breaking changes - Helper function (_chain and _once) behavior change: can now specify column name unquoted (eg, alum = AlumDose) - Removed most (_once) helper functions because the desired output is almost never all water slots as columns. Refer to pluck_water(parameter = "all") for same behavior. - pac_toc now constrained to accept a smaller range of doses and times. The form of the equation was allowing negative TOC outputs. - define_water, chemdose_ph, blend_waters, and other pH related functions slightly impacted by a fix in concentration vs activity. Previous code assumed pH = 10^-[H+], code has been corrected to pH = 10^-{H+} New features - User may now choose which cation or anion to use for balancing ions - dic now calculated in define_water - dic now available in convert_units - chemdose_chloramine: chloramine formation model given chlorine, ammonia, time - chemdose_chlordecay now has argument, use_chlorine_slot. Function can now use chlorine dose and/or free_chlorine or combined_chlorine slots. Changes in version 0.7.0 (2025-01-22) New features - chlorine and chloramine decay: chemdose_chlordecay - New water slots for chloramine chemistry: combined_chlorine, nh2cl, nhcl2, ncl3 - solvemass_solids separates functionality from solvecost_solids to solve lb/day - biofilter_toc, chemdose_chlordecay, ozonate_bromate, and solvect helpers now available. Breaking changes - chemdose_ct renamed solvect_chlorine - ozonate_ct renamed solvect_o3 - tot_ocl slot in water renamed free_chlorine - define_water argument changes: tot_ocl changed to free_chlorine, added combined_chlorine - Helper function (_chain and _once) behavior change: if multiple values are specified for multiple arguments, all combinations are used. Changes in version 0.6.2 (2024-11-05) - CRAN resubmission. - Minor changes to DESCRIPTION and examples using plan Changes in version 0.6.1 - Initial CRAN submission. - Fix R CMD check notes Changes in version 0.6.0 New features - biofilter_toc updates the bdoc water slot - pac_toc helper functions _chain and _once Breaking changes - biofilter_toc argument, o3_dose, was replaced with ozonated, which accepts TRUE or FALSE inputs Changes in version 0.5.0 Fixes - default temperature is now 25C - corrected enthalpy of reaction for ammonium ion - completed PAC models New features - chemdose_ct: CT calculations, including CT actual, CT required, and giardia log removal - solvecost_ family: cost calculations, including chemicals, power, solids, and labor - solvemass_ :convert chemical doses from mg/L to lb/day - solveresid_o3: ozone decay model and corresponding helper function from WTP model - ozonate_ct: ozone CT model - validate water function, not exported but useful for function writing - chemdose_f: fluoride model for alum addition. Requires site specific fitting. - biofilter_toc: biofiltration model (Terry & Summers) - added ACH to chemdose_ph Breaking changes - total ammonia water slot changed from tot_nh4 to tot_nh3 Code structure changes - renamed and rearranged R scripts to better find functions and associated helper functions - update most functions to use base R, and only use dplyr functions where necessary (increase speed) Changes in version 0.4.0 Fixes - solve_ph code updated to handle starting po4 concentration New features - convert_watermg for cleaner water exports - bromate formation models - ammonia in pH chemistry - new water slots for F, Fe, Al, etc - helper functions for chemdose_dbp - PAC models (incomplete) Breaking changes - treatment slot renamed "applied_treatments" - solve_ph changes. Should only see different values when po4 is in the water. - Added hydration to ferric sulfate and renamed coagulants for consistency. - pluck_water doesn't allow specification of output_column. It is named by default from the input and parameters. Improved pluck does allow multiple parameters and waters in one function. Changes in version 0.3.0 Fixes - Raw water DBP models do not require UVA - Updated incorrect DBP model coefficients New features - CaCl2 now included in possible chemical addition. Breaking changes - define_water now has arguments for "ca" and "mg" and no longer has "ca_hard". - summarize_dbp and summarize_corrosion removed. summarize_wq now takes arguments to summarize general, ions, dbps, or corrosion Changes in version 0.2.1 Bug fixes - Small vignette changes to fix package build. Changes in version 0.2.0 New features - TOC removal through coagulation, chemdose_toc and matching _chain and _once helper functions. - DBP formation from coagulation, chemdose_dbp. No helper functions yet except summarise_dbp - Calculation of corrosion indices, calculate_corrosion and summarise_corrosion with helper functions. - Theoretical lead solubility dissolve_pb with helper functions. - Helper function pluck_water to pull one slot from a water column in a data frame. Breaking changes - Changes in S4 water class and define_water to handle more water quality parameters. Calculation changes - Activity is calculated from ionic strength and used in pH calculations. - Ionic strength is based on TDS or conductivity and is recalculated when appropriate in balance_ions and chemdose_ph Changes in version 0.1.0 - Initial release - Acid/base equilibrium with assumption activity = concentration - Helper functions _chain and _once for applying models to data frames.