From d1529a756a40e80e354edb7207aa96202a3f817a Mon Sep 17 00:00:00 2001 From: Stuart Daines Date: Sun, 12 Jan 2025 20:36:46 +0000 Subject: [PATCH 1/2] Add Julia 1.11 public keyword - define public API as list of public methods etc in PALEOboxes.jl - move deprecated methods to new deprecated.jl file - remove unused parameters Vector in ReactionBase (duplicates pars::ParametersTuple field) and replace add_par method with and error message (only used within PALEOboxes.jl) --- docs/src/DomainsVariablesFields.md | 2 - docs/src/Reaction API.md | 1 - docs/src/Solver API.md | 1 - src/Domain.jl | 2 +- src/Fields.jl | 11 +-- src/Grids.jl | 11 ++- src/Model.jl | 1 - src/PALEOboxes.jl | 94 ++++++++++++++++--- src/Reaction.jl | 63 ++++--------- src/ReactionFactory.jl | 11 +-- src/VariableDomain.jl | 8 -- src/VariableReaction.jl | 1 - src/data/IsotopeData.jl | 1 - src/deprecated.jl | 63 +++++++++++++ src/reactioncatalog/FluxPerturb.jl | 4 +- src/reactioncatalog/Fluxes.jl | 10 +- src/reactioncatalog/Forcings.jl | 5 +- src/reactioncatalog/GridForcings.jl | 5 +- src/reactioncatalog/GridReactions.jl | 6 +- src/reactioncatalog/Reservoirs.jl | 8 +- src/reactioncatalog/VariableStats.jl | 4 +- src/reactionmethods/RateStoich.jl | 2 +- src/utils/ChemistryUtils.jl | 5 +- src/utils/DocStrings.jl | 9 +- src/utils/IteratorUtils.jl | 4 + src/utils/SIMDutils.jl | 5 + src/utils/TestUtils.jl | 5 +- .../ParameterAggregator.jl | 0 src/variableaggregators/VariableAggregator.jl | 1 - test/ReactionReservoirFlux.jl | 2 +- test/runratestoichtests.jl | 1 - test/runreservoirtests.jl | 1 - 32 files changed, 222 insertions(+), 125 deletions(-) create mode 100644 src/deprecated.jl rename src/{ => variableaggregators}/ParameterAggregator.jl (100%) diff --git a/docs/src/DomainsVariablesFields.md b/docs/src/DomainsVariablesFields.md index aa811d58..ee244ecd 100644 --- a/docs/src/DomainsVariablesFields.md +++ b/docs/src/DomainsVariablesFields.md @@ -182,8 +182,6 @@ allocate_values check_values zero_values! dof_values -get_values_output - init_values! copyfieldto! diff --git a/docs/src/Reaction API.md b/docs/src/Reaction API.md index 1befd909..a2fb879e 100644 --- a/docs/src/Reaction API.md +++ b/docs/src/Reaction API.md @@ -23,7 +23,6 @@ Parameter VecParameter VecVecParameter ParametersTuple -add_par setvalue! ``` diff --git a/docs/src/Solver API.md b/docs/src/Solver API.md index 29dc766f..e5600d8f 100644 --- a/docs/src/Solver API.md +++ b/docs/src/Solver API.md @@ -115,5 +115,4 @@ CurrentModule = PALEOboxes ```@docs set_data! get_data -get_data_output ``` diff --git a/src/Domain.jl b/src/Domain.jl index 6f33fe25..0b550192 100644 --- a/src/Domain.jl +++ b/src/Domain.jl @@ -1,4 +1,4 @@ -import Infiltrator + """ Domain diff --git a/src/Fields.jl b/src/Fields.jl index 2690e5e6..ac12fb28 100644 --- a/src/Fields.jl +++ b/src/Fields.jl @@ -109,8 +109,7 @@ Defines a Data type that can be composed with an [`AbstractSpace`](@ref) to form Concrete subtypes should implement: -[`allocate_values`](@ref), [`check_values`](@ref), [`zero_values!`](@ref), [`dof_values`](@ref), -[`get_values_output`](@ref) +[`allocate_values`](@ref), [`check_values`](@ref), [`zero_values!`](@ref), [`dof_values`](@ref) If the subtype needs to provide values for a numerical solver (eg as a state variable), it also needs to implement: @@ -326,10 +325,6 @@ Convert Field `values` to a Vector of components """ function get_components(values, FieldData::Type{<:AbstractData}) end -"Optional: sanitize `values` for storing as model output. -Default implementation is usually OK - only implement for custom types that should be converted to standard types for storage" -get_values_output(values, data_type::Type{<:AbstractData}, data_dims::Tuple{Vararg{NamedDimension}}, Space, mesh) = values - ################################################################ @@ -470,10 +465,6 @@ function add_field_vec!(dest::Field{FieldData, Space, V, N, Mesh}, a, cellrange, return add_field_vec!(dest.values, FieldData, dest.data_dims, Space, a, cellrange, srcvalues, soff) end -"sanitized version of `values`, suitable for storing as output" -function get_values_output(field::Field{FieldData, Space, V, N, Mesh}) where {FieldData, Space, V, N, Mesh} - return get_values_output(field.values, FieldData, field.data_dims, Space, field.mesh) -end # get values from `linkvar_field`, optionally applying view defined by `linksubdomain` diff --git a/src/Grids.jl b/src/Grids.jl index 16af7f70..1da11587 100644 --- a/src/Grids.jl +++ b/src/Grids.jl @@ -1,9 +1,14 @@ module Grids import NCDatasets -import PALEOboxes as PB - -import Infiltrator # Julia debugger +import ...PALEOboxes as PB +using ...PALEOboxes: @public + +@public available_spaces +@public create_default_cellrange, get_tiled_cellranges +@public BoundarySubdomains, InteriorSubdomain, set_subdomain!, get_subdomain +@public UnstructuredVectorGrid, UnstructuredColumnGrid, CartesianLinearGrid, CartesianArrayGrid +@public cartesian_to_internal, internal_to_cartesian, substitute_cell_names, column_indices ########################### # Subdomains diff --git a/src/Model.jl b/src/Model.jl index 4c0139dc..258eca97 100644 --- a/src/Model.jl +++ b/src/Model.jl @@ -1,4 +1,3 @@ -import Infiltrator """ Model diff --git a/src/PALEOboxes.jl b/src/PALEOboxes.jl index 09992e3a..fb2f8fe1 100644 --- a/src/PALEOboxes.jl +++ b/src/PALEOboxes.jl @@ -32,6 +32,84 @@ import Atomix import PrecompileTools import TimerOutputs: @timeit, @timeit_debug +# https://discourse.julialang.org/t/is-compat-jl-worth-it-for-the-public-keyword/119041/22 +# define @public for backwards compatibility with Julia < v1.11 +macro public(ex) + if VERSION >= v"1.11" + args = ex isa Symbol ? (ex,) : Base.isexpr(ex, :tuple) ? ex.args : error("@public parse error") + esc(Expr(:public, args...)) + else + nothing + end +end + +@public DocStrings + +@public AbstractModel, Model, create_model_from_config, check_variable_links, check_ready, initialize_reactiondata! +@public DispatchMethodLists, dispatch_setup, create_dispatch_methodlists, do_deriv, dispatch_methodlist +@public get_num_domains, show_methods_setup, show_methods_initialize, show_methods_do, show_variables, show_links, show_parameters +@public get_data, get_table + +@public AbstractDomain, get_domain, AbstractSubdomain, set_data_dimension!, get_data_dimension + +@public VariableDomain, VariableDomPropDep, VariableDomContribTarget, set_data!, allocate_variables! +@public VariableAggregator, VariableAggregatorNamed, ParameterAggregator + +@public NamedDimension, get_dimensions, get_dimension, set_coordinates!, get_coordinates + +@public AbstractMesh, AbstractMeshOrNothing, AbstractSubdomain, get_mesh, has_internal_cartesian, internal_size, cartesian_size, Grids + +@public AbstractCellRange, create_default_cellrange, CellRange, CellRangeColumns + +@public Reservoirs, Fluxes, FluxPerturb, Forcings, GridForcings, GridReactions + +@public AbstractReaction, ReactionBase, get_reaction, set_model_geometry, register_methods!, register_dynamic_methods!, + add_method_setup!, add_method_initialize!, add_method_do!, create_reaction +@public show_all_reactions, doc_reaction + +@public AbstractParameter, Parameter, ParametersTuple, + ParBool, ParDouble, ParInt, ParString, ParEnum, ParDoubleVec, ParDoubleVecVec, ParIntVec, ParStringVec, + setvalue!, setvalueanddefault!, setfrozen!, set_parameter_value!, get_parameter_value + +@public VariableBase, show_variable, get_variable, get_variables, has_variable, get_reaction_variables +@public VariableType, VariableFunction, VariablePhase +@public Attribute, StandardAttributes, get_attribute, set_attribute!, has_attribute, set_variable_attribute!, get_variable_attribute +@public VariableReaction, + VarProp, VarPropScalar, VarPropStateIndep, VarPropScalarStateIndep, + VarDep, VarDepColumn, VarDepScalar, VarDepStateIndep, VarDepColumnStateIndep, VarDepScalarStateIndep, + VarTarget, VarTargetScalar, + VarContrib, VarContribColumn, VarContribScalar, + VarStateExplicit, VarStateExplicitScalar, + VarTotal, VarTotalScalar, + VarStateTotal, VarStateTotalScalar, + VarDeriv, VarDerivScalar, + VarState, VarStateScalar, + VarConstraint, VarConstraintScalar +@public AbstractVarList, Varlist_single, VarList_namedtuple, VarList_namedtuple_fields, VarList_components, VarList_tuple, VarList_vector, + VarList_ttuple, VarList_vvector, VarList_nothing, VarList_tuple_nothing, VarList_fields + +@public AbstractReactionMethod, ReactionMethod +@public add_method_setup_initialvalue_vars_default!, add_method_initialize_zero_vars_default!, add_method_do_totals_default! +@public RateStoich, create_ratestoich_method, parse_number_name +@public LinInterp, interp, value_ad, zero_ad + +@public AbstractField, Field, get_field, add_field! + +@public AbstractSpace, ScalarSpace, CellSpace, ColumnSpace + +@public AbstractData, allocate_values, check_values, check_data_type, init_values!, zero_values!, dof_values!, + copyfieldto!, copytofield!, add_field_vec!, num_components, get_components +@public UndefinedData, ScalarData, AbstractIsotopeScalar, IsotopeLinear, ArrayScalarData +@public isotope_totaldelta, get_total, get_delta + +@public AbstractModelData, ModelData, create_modeldata, add_arrays_data! + +@public Constants, TestUtils, IteratorUtils, ChemistryUtils, DocStrings, SIMDutils + +@public collate_markdown, precompile_reaction, run_model + + + include("utils/DocStrings.jl") include("Types.jl") @@ -47,7 +125,7 @@ include("VariableReaction.jl") include("VariableDomain.jl") include("Parameter.jl") -include("ParameterAggregator.jl") +include("variableaggregators/ParameterAggregator.jl") include("ReactionMethodSorting.jl") include("Model.jl") @@ -76,20 +154,8 @@ include("variableaggregators/VariableAggregator.jl") include("reactioncatalog/Reactions.jl") -# Deprecated functions -""" - get_statevar - -DEPRECATED - moved to PALEOmodel -""" -function get_statevar end +include("deprecated.jl") -""" - get_statevar_norm - -DEPRECATED - moved to PALEOmodel -""" -function get_statevar_norm end ##################################################### # Precompilation diff --git a/src/Reaction.jl b/src/Reaction.jl index be947cbf..4d804f14 100644 --- a/src/Reaction.jl +++ b/src/Reaction.jl @@ -22,8 +22,6 @@ Derived types should implement [`register_methods!`](@ref), and may optionally i [`set_model_geometry`](@ref), [`check_configuration`](@ref), [`register_dynamic_methods!`](@ref). Methods should be registered using [`add_method_setup!`](@ref), [`add_method_initialize!`](@ref), [`add_method_do!`](@ref). - -Any parameters not included in `pars` should be added explicitly with [`add_par`](@ref) (this is rarely needed). """ AbstractReaction @@ -46,8 +44,6 @@ Base.@kwdef mutable struct ReactionBase classname::String "external parameters and values supplied from Model or Domain" external_parameters::Dict{String, Any} = Dict{String, Any}() - "Reaction parameters" - parameters::Vector{AbstractParameter} = Vector{AbstractParameter}() methods_setup::Vector{AbstractReactionMethod} = Vector{AbstractReactionMethod}() methods_initialize::Vector{AbstractReactionMethod}=Vector{AbstractReactionMethod}() @@ -101,20 +97,29 @@ end ########################################################## "Get all parameters" -get_parameters(@nospecialize(reaction::AbstractReaction)) = reaction.base.parameters +function get_parameters(@nospecialize(reaction::AbstractReaction)) + if hasfield(typeof(reaction), :pars) + all_parameters = AbstractParameter[v for v in getfield(reaction, :pars)::NamedTuple] + else + all_parameters = AbstractParameter[] + end + + return all_parameters +end "Get parameter by name" -function get_parameter(@nospecialize(reaction::AbstractReaction), parname::AbstractString; allow_not_found=false) - matchpars = filter(p -> p.name==parname, reaction.base.parameters) - - length(matchpars) <= 1 || - error("coding error: duplicate parameter name '$(name)' for Reaction: ", reaction) - - !isempty(matchpars) || allow_not_found || - error("configuration error, Reaction $(fullname(reaction)) $(reaction)\n", - "has no parameter name='$(parname)' (available parameters $([p.name for p in get_parameters(reaction)]))") +function get_parameter(reaction::AbstractReaction, parname::AbstractString; allow_not_found=false) - return isempty(matchpars) ? nothing : matchpars[1] + if hasfield(typeof(reaction), :pars) && hasfield(typeof(reaction.pars), Symbol(parname)) + par = getfield(reaction.pars, Symbol(parname)) + else + allow_not_found || + error("configuration error, Reaction $(fullname(reaction)) $(reaction)\n", + "has no parameter name='$(parname)' (available parameters $([p.name for p in get_parameters(reaction)]))") + par = nothing + end + + return par end set_parameter_value!(@nospecialize(reaction::AbstractReaction), parname::AbstractString, value) = @@ -248,34 +253,6 @@ end # Helper functions to allow a Reaction implementation to populate Parameter and ReactionMethod lists ######################################################################################### -""" - add_par(reaction::AbstractReaction, par::AbstractParameter) - add_par(reaction::AbstractReaction, objectwithpars) - -Add a single parameter or parameters from fields of `objectwithpars` to a new Reaction. - -Not usually needed: Parameters in `pars::ParametersTuple`` will be added automatically, only needed if there are additional -Parameters that are not members of `pars`. -""" -function add_par(@nospecialize(reaction::AbstractReaction), par::AbstractParameter) - - if isnothing(get_parameter(reaction, par.name, allow_not_found=true)) - push!(reaction.base.parameters, par) - else - error("attempt to add duplicate parameter name=''", par.name, "'' to reaction", reaction) - end - - return nothing -end - -function add_par(@nospecialize(reaction::AbstractReaction), objectwithpars) - for f in fieldnames(typeof(objectwithpars)) - if getfield(objectwithpars, f) isa AbstractParameter - add_par(reaction, getfield(objectwithpars, f)) - end - end -end - """ add_method_setup!(reaction::AbstractReaction, method::AbstractReactionMethod) diff --git a/src/ReactionFactory.jl b/src/ReactionFactory.jl index d14e6c76..2069ff2f 100644 --- a/src/ReactionFactory.jl +++ b/src/ReactionFactory.jl @@ -99,7 +99,7 @@ end Create and configure a reaction. -Sets `ReactionBase` with name, classname, external_parameters, and list of `Parameters` from `pars` field (if present) +Sets `ReactionBase` with name, classname, external_parameters """ function create_reaction( ReactionType::Type{<:AbstractReaction}, name::String, external_parameters::Dict{String, Any}; @@ -107,10 +107,7 @@ function create_reaction( ) base=ReactionBase(;name, classname, external_parameters) rj = create_reaction(ReactionType, base) - # Add parameters from pars field - if hasproperty(rj, :pars) - add_par(rj, rj.pars) - end + return rj end @@ -126,10 +123,6 @@ function create_reaction( end -function add_reaction_factory(ReactionType::Type{<:AbstractReaction}) - Base.depwarn("call to deprecated add_reaction_factory($ReactionType), this does nothing and can be removed", :add_reaction_factory, force=true) -end - """ show_all_reactions(classfilter="", typenamefilter="") diff --git a/src/VariableDomain.jl b/src/VariableDomain.jl index 287c06be..80e8ada2 100644 --- a/src/VariableDomain.jl +++ b/src/VariableDomain.jl @@ -174,15 +174,7 @@ Get Variable `var` data array from [`Field`](@ref).values get_data(var::VariableDomain, modeldata::AbstractModelData, arrays_idx::Int=1) = get_field(var, modeldata, arrays_idx).values get_data(var::VariableDomain, domaindata::AbstractDomainData) = get_field(var, domaindata).values -""" - get_data_output(var::VariableDomain, modeldata::AbstractModelData, arrays_idx::Int) -> get_values_output(field.values) - get_data_output(var::VariableDomain, domaindata::AbstractDomainData) -> get_values_output(field.values) -Get a sanitized version of Variable `var` data array for storing as output -from [`get_values_output`]@ref)`(`[`Field`](@ref).values`)` -""" -get_data_output(var::VariableDomain, modeldata::AbstractModelData, arrays_idx::Int=1) = get_values_output(get_field(var, modeldata, arrays_idx)) -get_data_output(var::VariableDomain, domaindata::AbstractDomainData) = get_values_output(get_field(var, domaindata)) #################################################################### # Create and add to Domain diff --git a/src/VariableReaction.jl b/src/VariableReaction.jl index 92181fb5..74366c74 100644 --- a/src/VariableReaction.jl +++ b/src/VariableReaction.jl @@ -1,4 +1,3 @@ -# import Infiltrator ############################################# # VariableReaction diff --git a/src/data/IsotopeData.jl b/src/data/IsotopeData.jl index 5ae4abb3..f14e6b35 100644 --- a/src/data/IsotopeData.jl +++ b/src/data/IsotopeData.jl @@ -1,4 +1,3 @@ -# import Infiltrator import StructArrays diff --git a/src/deprecated.jl b/src/deprecated.jl new file mode 100644 index 00000000..fbc3230f --- /dev/null +++ b/src/deprecated.jl @@ -0,0 +1,63 @@ + +""" + get_statevar + +DEPRECATED - moved to PALEOmodel +""" +function get_statevar end + +""" + get_statevar_norm + +DEPRECATED - moved to PALEOmodel +""" +function get_statevar_norm end + +"DEPRECATED +Optional: sanitize `values` for storing as model output. +Default implementation is usually OK - only implement for custom types that should be converted to standard types for storage" +get_values_output(values, data_type::Type{<:AbstractData}, data_dims::Tuple{Vararg{NamedDimension}}, Space, mesh) = values + +"DEPRECATED sanitized version of `values`, suitable for storing as output" +function get_values_output(field::Field{FieldData, Space, V, N, Mesh}) where {FieldData, Space, V, N, Mesh} + return get_values_output(field.values, FieldData, field.data_dims, Space, field.mesh) +end + + +""" + get_data_output(var::VariableDomain, modeldata::AbstractModelData, arrays_idx::Int) -> get_values_output(field.values) + get_data_output(var::VariableDomain, domaindata::AbstractDomainData) -> get_values_output(field.values) + +DEPRECATED +Get a sanitized version of Variable `var` data array for storing as output +from [`get_values_output`]@ref)`(`[`Field`](@ref).values`)` +""" +get_data_output(var::VariableDomain, modeldata::AbstractModelData, arrays_idx::Int=1) = get_values_output(get_field(var, modeldata, arrays_idx)) +get_data_output(var::VariableDomain, domaindata::AbstractDomainData) = get_values_output(get_field(var, domaindata)) + + +function add_reaction_factory(ReactionType::Type{<:AbstractReaction}) + Base.depwarn("call to deprecated add_reaction_factory($ReactionType), this does nothing and can be removed", :add_reaction_factory, force=true) +end + +""" + add_par(reaction::AbstractReaction, par::AbstractParameter) + add_par(reaction::AbstractReaction, objectwithpars) + +Add a single parameter or parameters from fields of `objectwithpars` to a new Reaction. + +Not usually needed: Parameters in `pars::ParametersTuple`` will be added automatically, only needed if there are additional +Parameters that are not members of `pars`. +""" +function add_par(@nospecialize(reaction::AbstractReaction), par::AbstractParameter) + + error("add_par has been removed: all Parameters should be added to field pars::PB.ParametersTuple, please update your code "* + "reaction $reaction par $par") + + return nothing +end + +function add_par(@nospecialize(reaction::AbstractReaction), objectwithpars) + error("add_par has been removed: all Parameters should be added to field pars::PB.ParametersTuple, please update your code "* + "reaction $reaction") +end diff --git a/src/reactioncatalog/FluxPerturb.jl b/src/reactioncatalog/FluxPerturb.jl index 7fed80e2..4f05577a 100644 --- a/src/reactioncatalog/FluxPerturb.jl +++ b/src/reactioncatalog/FluxPerturb.jl @@ -1,9 +1,11 @@ module FluxPerturb -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public using ..DocStrings +@public ReactionFluxPerturb, ReactionRestore """ ReactionFluxPerturb diff --git a/src/reactioncatalog/Fluxes.jl b/src/reactioncatalog/Fluxes.jl index 94a2b9b8..38ccc551 100644 --- a/src/reactioncatalog/Fluxes.jl +++ b/src/reactioncatalog/Fluxes.jl @@ -35,13 +35,17 @@ Naming conventions for Earth system fluxes: """ module Fluxes -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public + import SparseArrays import LinearAlgebra # for I -import Infiltrator # Julia debugger - using ..DocStrings + +@public ReactionFluxTarget, ReactionFluxTransfer +@public FluxContrib, FluxContribScalar, FluxTarget, FluxTargetScalar + """ FluxContrib( fluxprefix::AbstractString, flux_list; diff --git a/src/reactioncatalog/Forcings.jl b/src/reactioncatalog/Forcings.jl index 28e69f8d..a95fdbf4 100644 --- a/src/reactioncatalog/Forcings.jl +++ b/src/reactioncatalog/Forcings.jl @@ -1,9 +1,12 @@ module Forcings -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public using ..DocStrings +@public ReactionForceInterp + """ ReactionForceInterp diff --git a/src/reactioncatalog/GridForcings.jl b/src/reactioncatalog/GridForcings.jl index 90d0be56..d654baf8 100644 --- a/src/reactioncatalog/GridForcings.jl +++ b/src/reactioncatalog/GridForcings.jl @@ -4,10 +4,11 @@ import NCDatasets import MAT import Interpolations -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public using ..DocStrings -using Infiltrator # Julia debugger +@public ReactionForceGrid """ ReactionForceGrid diff --git a/src/reactioncatalog/GridReactions.jl b/src/reactioncatalog/GridReactions.jl index 6a73d383..b6ceb9b8 100644 --- a/src/reactioncatalog/GridReactions.jl +++ b/src/reactioncatalog/GridReactions.jl @@ -1,10 +1,10 @@ module GridReactions -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public using ..DocStrings -import Infiltrator # Julia debugger - +@public ReactionUnstructuredVectorGrid, ReactionCartesianGrid, ReactionGrid2DNetCDF """ ReactionUnstructuredVectorGrid diff --git a/src/reactioncatalog/Reservoirs.jl b/src/reactioncatalog/Reservoirs.jl index 91272ceb..6ff292ba 100644 --- a/src/reactioncatalog/Reservoirs.jl +++ b/src/reactioncatalog/Reservoirs.jl @@ -1,12 +1,14 @@ # -*- coding: utf-8 -*- module Reservoirs -import PALEOboxes as PB - -import Infiltrator # Julia debugger +import ...PALEOboxes as PB +using ...PALEOboxes: @public using ..DocStrings +@public ReactionReservoirScalar, ReactionReservoir, ReactionReservoirTotal, ReactionReservoirConst, + ReactionReservoirForced, ReactionReservoirWellMixed, ReactionConst, ReactionScalarConst + """ ReactionReservoirScalar diff --git a/src/reactioncatalog/VariableStats.jl b/src/reactioncatalog/VariableStats.jl index 0494ffbe..72c7de79 100644 --- a/src/reactioncatalog/VariableStats.jl +++ b/src/reactioncatalog/VariableStats.jl @@ -1,11 +1,9 @@ # -*- coding: utf-8 -*- module VariableStats -import PALEOboxes as PB +import ...PALEOboxes as PB using ..DocStrings -import Infiltrator # Julia debugger - """ ReactionSum, ReactionVectorSum diff --git a/src/reactionmethods/RateStoich.jl b/src/reactionmethods/RateStoich.jl index 4e152563..433014ba 100644 --- a/src/reactionmethods/RateStoich.jl +++ b/src/reactionmethods/RateStoich.jl @@ -1,4 +1,4 @@ -import Infiltrator + """ RateStoich( ratevartemplate, stoich_statevarname; diff --git a/src/utils/ChemistryUtils.jl b/src/utils/ChemistryUtils.jl index 40602fd9..0545db36 100644 --- a/src/utils/ChemistryUtils.jl +++ b/src/utils/ChemistryUtils.jl @@ -1,8 +1,11 @@ module ChemistryUtils -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public import OrderedCollections +@public parse_chemical_formula, calc_molar_mass + """ parse_chemical_formula(formula::AbstractString) -> element_counts::OrderedDict{Symbol, Float64} diff --git a/src/utils/DocStrings.jl b/src/utils/DocStrings.jl index d902d11f..2fd0a187 100644 --- a/src/utils/DocStrings.jl +++ b/src/utils/DocStrings.jl @@ -14,7 +14,7 @@ so may fail if this call fails with default parameters. """ module DocStrings import DocStringExtensions as DSE - import PALEOboxes as PB + import ...PALEOboxes as PB struct Pars <: DSE.Abbreviation end @@ -29,9 +29,7 @@ module DocStrings try rj = PB.create_reaction(object, PB.ReactionBase(name="test", classname="test", external_parameters=Dict{String, Any}())) - if hasproperty(rj, :pars) - PB.add_par(rj, rj.pars) - end + # println(buf, "$object $(length(PB.get_parameters(rj))) Parameters" ) for p in PB.get_parameters(rj) md = "- `$(p.name)[" @@ -67,9 +65,6 @@ module DocStrings # println(buf, "PARS binding $binding object $object") rj = PB.create_reaction(object, PB.ReactionBase(name="test", classname="test", external_parameters=Dict{String, Any}())) - if hasproperty(rj, :pars) - PB.add_par(rj, rj.pars) - end d = PB.Domain(name="test", ID=1, parameters=Dict{String, Any}()) rj.base.domain = d diff --git a/src/utils/IteratorUtils.jl b/src/utils/IteratorUtils.jl index 1d1ef5e1..7b08d1fe 100644 --- a/src/utils/IteratorUtils.jl +++ b/src/utils/IteratorUtils.jl @@ -1,5 +1,9 @@ module IteratorUtils +using ...PALEOboxes: @public + +@public zipstrict, check_lengths_equal, foreach_tuple, foreach_tuple_p, foreach_longtuple, foreach_longtuple_p + """ check_lengths_equal(it1, it2) check_lengths_equal(it1, it2, it3) diff --git a/src/utils/SIMDutils.jl b/src/utils/SIMDutils.jl index 05f692e2..85d460ec 100644 --- a/src/utils/SIMDutils.jl +++ b/src/utils/SIMDutils.jl @@ -6,6 +6,11 @@ Helper functions to pack and unpack vector data to enable use of SIMD instructio """ module SIMDutils +using ...PALEOboxes: @public + +@public FP64P2, FP64P4, FP32P4, FP32P8 +@public SIMDIter, vgatherind, vscatterind!, vaddind! + import SLEEF_jll import SIMD import Preferences diff --git a/src/utils/TestUtils.jl b/src/utils/TestUtils.jl index b1b3d457..75eb7256 100644 --- a/src/utils/TestUtils.jl +++ b/src/utils/TestUtils.jl @@ -9,7 +9,10 @@ module TestUtils using BenchmarkTools using InteractiveUtils -import PALEOboxes as PB +import ...PALEOboxes as PB +using ...PALEOboxes: @public + +@public bench_method, bench_model, check_round, check_true "repeatedly call `dispatch_methodlist` `N` times to generate a long-duration run for profiling" function profile_dispatchlist(dispatchlist, N, deltat::Float64=0.0) diff --git a/src/ParameterAggregator.jl b/src/variableaggregators/ParameterAggregator.jl similarity index 100% rename from src/ParameterAggregator.jl rename to src/variableaggregators/ParameterAggregator.jl diff --git a/src/variableaggregators/VariableAggregator.jl b/src/variableaggregators/VariableAggregator.jl index aa6c968d..1f8b04b0 100644 --- a/src/variableaggregators/VariableAggregator.jl +++ b/src/variableaggregators/VariableAggregator.jl @@ -1,5 +1,4 @@ -# import Infiltrator ################################################################# # VariableAggregator diff --git a/test/ReactionReservoirFlux.jl b/test/ReactionReservoirFlux.jl index 84603b47..5f4406cb 100644 --- a/test/ReactionReservoirFlux.jl +++ b/test/ReactionReservoirFlux.jl @@ -1,4 +1,4 @@ -module ReactionRateStoichMockModule +module ReactionReservoirFluxModule import PALEOboxes as PB diff --git a/test/runratestoichtests.jl b/test/runratestoichtests.jl index 0bbf3e18..0f0f948b 100644 --- a/test/runratestoichtests.jl +++ b/test/runratestoichtests.jl @@ -1,7 +1,6 @@ import PALEOboxes as PB using Test -# import Infiltrator include("ReactionRateStoichMock.jl") diff --git a/test/runreservoirtests.jl b/test/runreservoirtests.jl index 66223c2f..49ed67b6 100644 --- a/test/runreservoirtests.jl +++ b/test/runreservoirtests.jl @@ -4,7 +4,6 @@ using Logging import PALEOboxes as PB -import Infiltrator include("ReactionReservoirFlux.jl") From f825e342d4ce78d215b4f7a1dffaa8f30026a3bc Mon Sep 17 00:00:00 2001 From: Stuart Daines Date: Tue, 14 Jan 2025 10:42:54 +0000 Subject: [PATCH 2/2] add some more public definitions --- src/PALEOboxes.jl | 4 +- src/reactioncatalog/Constants.jl | 62 +++++++++++++++++++--------- src/reactioncatalog/Fluxes.jl | 4 +- src/reactioncatalog/VariableStats.jl | 2 + 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/PALEOboxes.jl b/src/PALEOboxes.jl index fb2f8fe1..4377e434 100644 --- a/src/PALEOboxes.jl +++ b/src/PALEOboxes.jl @@ -61,7 +61,7 @@ end @public AbstractCellRange, create_default_cellrange, CellRange, CellRangeColumns -@public Reservoirs, Fluxes, FluxPerturb, Forcings, GridForcings, GridReactions +@public Reservoirs, Fluxes, FluxPerturb, Forcings, GridForcings, GridReactions, VariableStats @public AbstractReaction, ReactionBase, get_reaction, set_model_geometry, register_methods!, register_dynamic_methods!, add_method_setup!, add_method_initialize!, add_method_do!, create_reaction @@ -91,7 +91,7 @@ end @public AbstractReactionMethod, ReactionMethod @public add_method_setup_initialvalue_vars_default!, add_method_initialize_zero_vars_default!, add_method_do_totals_default! @public RateStoich, create_ratestoich_method, parse_number_name -@public LinInterp, interp, value_ad, zero_ad +@public LinInterp, interp, value_ad, zero_ad, smoothstepcubic @public AbstractField, Field, get_field, add_field! diff --git a/src/reactioncatalog/Constants.jl b/src/reactioncatalog/Constants.jl index 76ce3c81..68d1870f 100644 --- a/src/reactioncatalog/Constants.jl +++ b/src/reactioncatalog/Constants.jl @@ -1,29 +1,53 @@ module Constants +using ...PALEOboxes: @public + +@public k_CtoK, k_molVolIdealGas, k_Rgas, k_Avogadro +@public age_present_yr, k_solar_presentday, k_secpyr, k_secpday, k_daypyr, k_g_earth, k_SurfAreaEarth +@public k_atmmixrN2, k_atmmixrO2 +@public STANDARD_ATOMIC_WEIGHTS + # Physical constants -const k_CtoK = 273.15 # convert temperature in Celsius to Kelvin -const k_molVolIdealGas= 22.4136 # l/mol molar volume of ideal gas at STP (0C, 1 atm) -const k_Rgas = 8.3144621 # J/K/mol gas constant -const k_Avogadro = 6.0221409e23 # molecules mol-1 +"convert temperature in Celsius to Kelvin" +const k_CtoK = 273.15 +"l/mol molar volume of ideal gas at STP (0C, 1 atm)" +const k_molVolIdealGas= 22.4136 +"J/K/mol gas constant" +const k_Rgas = 8.3144621 +"molecules mol-1" +const k_Avogadro = 6.0221409e23 # Earth system present-day constants -const age_present_yr = 4.5e9 # Age of Earth at present-day -const k_solar_presentday = 1368.0 # present-day solar insolation W/m^2 -const k_secpyr = 3.15569e7 # present-day seconds per year -const k_secpday = 24.0*3600.0 # sec per day -const k_daypyr = k_secpyr/k_secpday # days in a year -const k_g_earth = 9.80665 # gravitational field strength for Earth m/s^2 -const k_SurfAreaEarth = 5.101e14 # Earth surface area in m - -const pCO2atm0 = 280e-6 # ppm pre-industrial pCO2 -const k16_PANtoO = 3.762 # -const k18_oceanmass = 1.397e21 # kg Ocean total mass -const k_moles1atm = 1.77e20 # Moles in 1 atm -const k_preindCO2atm = 280e-6 # pre-industrial pCO2 (atm) +"Age of Earth at present-day" +const age_present_yr = 4.5e9 +"present-day solar insolation W/m^2" +const k_solar_presentday = 1368.0 +"present-day seconds per year" +const k_secpyr = 3.15569e7 +"sec per day" +const k_secpday = 24.0*3600.0 +"days in a year" +const k_daypyr = k_secpyr/k_secpday +"gravitational field strength for Earth m/s^2" +const k_g_earth = 9.80665 +"Earth surface area in m^2" +const k_SurfAreaEarth = 5.101e14 + +"ppm pre-industrial pCO2" +const pCO2atm0 = 280e-6 +# const k16_PANtoO = 3.762 # +"COPSE kg Ocean total mass" +const k18_oceanmass = 1.397e21 +"COPSE Moles in 1 atm" +const k_moles1atm = 1.77e20 +"pre-industrial pCO2 (atm)" +const k_preindCO2atm = 280e-6 # Atmospheric composition from Sarmiento & Gruber (2006) Table 3.1.1 (which cites Weast & Astle 1982) -const k_atmmixrN2 = 0.78084 # N2 atmospheric mixing ratio (moles / moles dry air) -const k_atmmixrO2 = 0.20946 # O2 atmospheric mixing ratio (moles / moles dry air) +"present day Earth N2 atmospheric mixing ratio (moles / moles dry air)" +const k_atmmixrN2 = 0.78084 +"present day O2 atmospheric mixing ratio (moles / moles dry air)" +const k_atmmixrO2 = 0.20946 """ STANDARD_ATOMIC_WEIGHTS diff --git a/src/reactioncatalog/Fluxes.jl b/src/reactioncatalog/Fluxes.jl index 38ccc551..08e7f606 100644 --- a/src/reactioncatalog/Fluxes.jl +++ b/src/reactioncatalog/Fluxes.jl @@ -39,7 +39,7 @@ import ...PALEOboxes as PB using ...PALEOboxes: @public import SparseArrays -import LinearAlgebra # for I +using LinearAlgebra: I using ..DocStrings @@ -432,7 +432,7 @@ function prepare_do_transfer(m::PB.ReactionMethod, (input_vardata, output_vardat elseif rj.pars.transfer_matrix[] == "Identity" input_length == output_length || PB.infoerror(io, "$(PB.fullname(m)) Identity transfer_matrix but Variable lengths don't match (input, output) $(input_length) != $(output_length)") - rj.transfer_matrix_tr = SparseArrays.sparse(LinearAlgebra.I, input_length, output_length).*rj.pars.transfer_multiplier[] + rj.transfer_matrix_tr = SparseArrays.sparse(I, input_length, output_length).*rj.pars.transfer_multiplier[] println(io, " using Identity transfer matrix * $(rj.pars.transfer_multiplier[])") elseif rj.pars.transfer_matrix[] == "Distribute" rj.transfer_matrix_tr = SparseArrays.sparse(ones(input_length, output_length)./output_length.*rj.pars.transfer_multiplier[]) diff --git a/src/reactioncatalog/VariableStats.jl b/src/reactioncatalog/VariableStats.jl index 72c7de79..bfa052d8 100644 --- a/src/reactioncatalog/VariableStats.jl +++ b/src/reactioncatalog/VariableStats.jl @@ -2,8 +2,10 @@ module VariableStats import ...PALEOboxes as PB +using ...PALEOboxes: @public using ..DocStrings +@public ReactionSum, ReactionVectorSum, ReactionWeightedMean, ReactionAreaVolumeValInRange """ ReactionSum, ReactionVectorSum