diff --git a/Project.toml b/Project.toml index cd65d1b48..8c27983b4 100644 --- a/Project.toml +++ b/Project.toml @@ -4,7 +4,6 @@ authors = ["Boris Kaus , Albert De Montserrat x2 = DiffusionCreep(Name="test") DiffusionCreep: Name = test, n=1.0, r=0.0, p=-3.0, A=1.5 m³·⁰ MPa⁻¹·⁰ s⁻¹·⁰, E=500.0 kJ mol⁻¹·⁰, V=2.4e-5 m³·⁰ mol⁻¹·⁰, FT=1.7320508075688772, FE=1.1547005383792517) ``` """ -struct DiffusionCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} - Name::S +struct DiffusionCreep{T,N,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} + Name::NTuple{N,Char} n::GeoUnit{T,U1} # powerlaw exponent r::GeoUnit{T,U1} # exponent of water-fugacity p::GeoUnit{T,U1} # grain size exponent @@ -90,9 +90,11 @@ struct DiffusionCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} U3 = typeof(EU).types[2] U4 = typeof(VU).types[2] U5 = typeof(RU).types[2] + N = length(Name) + name = ntuple(i -> Name[i], Val(N)) # Create struct - return new{T,String,U1,U2,U3,U4,U5}( - Name, nU, rU, pU, AU, EU, VU, RU, Int8(Apparatus), FT, FE + return new{T,N,U1,U2,U3,U4,U5}( + name, nU, rU, pU, AU, EU, VU, RU, Int8(Apparatus), FT, FE ) end @@ -104,8 +106,6 @@ function DiffusionCreep(Name, n, r, p, A, E, V, R, Apparatus, FT, FE) ) end -Adapt.@adapt_structure DiffusionCreep - """ Transform_DiffusionCreep(name) Transforms units from MPa, kJ etc. to basic units such as Pa, J etc. diff --git a/src/CreepLaw/DislocationCreep.jl b/src/CreepLaw/DislocationCreep.jl index 2b47359a8..36ed26784 100644 --- a/src/CreepLaw/DislocationCreep.jl +++ b/src/CreepLaw/DislocationCreep.jl @@ -41,9 +41,8 @@ julia> x2 = DislocationCreep(n=3) DislocationCreep: n=3, r=0.0, A=1.5 MPa^-3 s^-1, E=476.0 kJ mol^-1, V=6.0e-6 m^3 mol^-1, Apparatus=AxialCompression ``` """ -struct DislocationCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} - Name::S - # Name::NTuple +struct DislocationCreep{T,N,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} + Name::NTuple{N,Char} n::GeoUnit{T,U1} # power-law exponent r::GeoUnit{T,U1} # exponent of water-fugacity A::GeoUnit{T,U2} # material specific rheological parameter @@ -80,9 +79,11 @@ struct DislocationCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} U3 = typeof(EU).types[2] U4 = typeof(VU).types[2] U5 = typeof(RU).types[2] + N = length(Name) + name = ntuple(i -> Name[i], Val(N)) # Create struct - return new{T,String,U1,U2,U3,U4,U5}( - Name, nU, rU, AU, EU, VU, RU, Int8(Apparatus), FT, FE + return new{T,N,U1,U2,U3,U4,U5}( + name, nU, rU, AU, EU, VU, RU, Int8(Apparatus), FT, FE ) end @@ -93,8 +94,6 @@ struct DislocationCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} end end -Adapt.@adapt_structure DislocationCreep - """ Transforms units from MPa, kJ etc. to basic units such as Pa, J etc. """ diff --git a/src/CreepLaw/GrainBoundarySliding.jl b/src/CreepLaw/GrainBoundarySliding.jl index 9b347cec2..d79d107d4 100644 --- a/src/CreepLaw/GrainBoundarySliding.jl +++ b/src/CreepLaw/GrainBoundarySliding.jl @@ -45,8 +45,8 @@ GrainBoundarySliding: Name = test, n=1.0, p=-3.0, A=1.5 m³·⁰ MPa⁻¹·⁰ s ``` """ -struct GrainBoundarySliding{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} - Name::S +struct GrainBoundarySliding{T,N,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} + Name::NTuple{N,Char} n::GeoUnit{T,U1} # powerlaw exponent p::GeoUnit{T,U1} # grain size exponent A::GeoUnit{T,U2} # material specific rheological parameter @@ -84,9 +84,11 @@ struct GrainBoundarySliding{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} U3 = typeof(EU).types[2] U4 = typeof(VU).types[2] U5 = typeof(RU).types[2] + N = length(Name) + name = ntuple(i -> Name[i], Val(N)) # Create struct - return new{T,String,U1,U2,U3,U4,U5}( - Name, nU, pU, AU, EU, VU, RU, Int8(Apparatus), FT, FE + return new{T,N,U1,U2,U3,U4,U5}( + name, nU, pU, AU, EU, VU, RU, Int8(Apparatus), FT, FE ) end @@ -97,8 +99,6 @@ struct GrainBoundarySliding{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} end end -Adapt.@adapt_structure GrainBoundarySliding - """ Transform_GrainBoundarySliding(name) Transforms units from MPa, kJ etc. to basic units such as Pa, J etc. diff --git a/src/CreepLaw/NonLinearPeierlsCreep.jl b/src/CreepLaw/NonLinearPeierlsCreep.jl index c0229cb22..644368482 100644 --- a/src/CreepLaw/NonLinearPeierlsCreep.jl +++ b/src/CreepLaw/NonLinearPeierlsCreep.jl @@ -35,8 +35,8 @@ julia> x2 = NonLinearPeierlsCreep(n=1) NonLinearPeierlsCreep: n=1, A=1.5 MPa^-3 s^-1, E=476.0 kJ mol^-1, Apparatus=AxialCompression ``` """ -struct NonLinearPeierlsCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} - Name::S +struct NonLinearPeierlsCreep{T,N,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} + Name::NTuple{N,Char} n::GeoUnit{T,U1} # power-law exponent q::GeoUnit{T,U1} # stress relation exponent o::GeoUnit{T,U1} # ... (normally called p but used as 'o' since p already exists) @@ -76,10 +76,11 @@ struct NonLinearPeierlsCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} U3 = typeof(AU).types[2] U4 = typeof(EU).types[2] U5 = typeof(RU).types[2] - + N = length(Name) + name = ntuple(i -> Name[i], Val(N)) # Create struct - return new{T,String,U1,U2,U3,U4,U5}( - Name, nU, qU, oU, TauPU, AU, EU, RU, Int8(Apparatus), FT, FE + return new{T,N,U1,U2,U3,U4,U5}( + name, nU, qU, oU, TauPU, AU, EU, RU, Int8(Apparatus), FT, FE ) end @@ -90,8 +91,6 @@ struct NonLinearPeierlsCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} end end -Adapt.@adapt_structure NonLinearPeierlsCreep - """ Transforms units from GPa, MPa, kJ etc. to basic units such as Pa, J etc. """ diff --git a/src/CreepLaw/PeierlsCreep.jl b/src/CreepLaw/PeierlsCreep.jl index 69da52db9..1473b8762 100644 --- a/src/CreepLaw/PeierlsCreep.jl +++ b/src/CreepLaw/PeierlsCreep.jl @@ -35,8 +35,8 @@ julia> x2 = PeierlsCreep(n=1) PeierlsCreep: Name = , n=1.0, q=2.0, o=1.0, TauP=8.5e9 Pa, A=5.7e11 s^-1.0, E=476.0 kJ mol^-1.0, FT=1.7320508075688772, FE=1.1547005383792517, Apparatus=1 ``` """ -struct PeierlsCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} - Name::S +struct PeierlsCreep{T,N,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} + Name::NTuple{N,Char} n::GeoUnit{T,U1} # power-law exponent q::GeoUnit{T,U1} # stress relation exponent o::GeoUnit{T,U1} # ... (normally called p but used as 'o' since p already exists) @@ -76,10 +76,11 @@ struct PeierlsCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} U3 = typeof(AU).types[2] U4 = typeof(EU).types[2] U5 = typeof(RU).types[2] - + N = length(Name) + name = ntuple(i -> Name[i], Val(N)) # Create struct - return new{T,String,U1,U2,U3,U4,U5}( - Name, nU, qU, oU, TauPU, AU, EU, RU, Int8(Apparatus), FT, FE + return new{T,N,U1,U2,U3,U4,U5}( + name, nU, qU, oU, TauPU, AU, EU, RU, Int8(Apparatus), FT, FE ) end @@ -90,8 +91,6 @@ struct PeierlsCreep{T,S,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T} end end -Adapt.@adapt_structure PeierlsCreep - """ Transforms units from GPa, MPa, kJ etc. to basic units such as Pa, J etc. """ diff --git a/src/MaterialParameters.jl b/src/MaterialParameters.jl index 1c9480490..fdc8a1888 100644 --- a/src/MaterialParameters.jl +++ b/src/MaterialParameters.jl @@ -7,13 +7,12 @@ using Unitful: Energy using Unitful using Parameters, LaTeXStrings, BibTeX using ..Units -using Static, Adapt +using Static import Base.show, Base.convert using GeoParams: AbstractMaterialParam, AbstractMaterialParamsStruct, AbstractPhaseDiagramsStruct, AbstractComposite - # Define an "empty" Material parameter structure struct No_MaterialParam{_T} <: AbstractMaterialParam end No_MaterialParam() = No_MaterialParam{Float64}() @@ -64,7 +63,7 @@ Structure that holds all material parameters for a given phase """ @with_kw_noshow struct MaterialParams{ - S, + N, Vdensity<:Tuple, Vgravity<:Tuple, Vcreep<:Tuple, @@ -79,7 +78,7 @@ Structure that holds all material parameters for a given phase Vmelting<:Tuple, Vseismvel<:Tuple, } <: AbstractMaterialParamsStruct - Name::S # Phase name + Name::NTuple{N,Char} # Phase name Phase::Int64 = 1 # Number of the phase (optional) Nondimensional::Bool = false # Are all fields non-dimensionalized or not? Density::Vdensity = () # Density equation of state @@ -97,8 +96,6 @@ Structure that holds all material parameters for a given phase SeismicVelocity::Vseismvel = () # Seismic velocity end -Adapt.@adapt_structure MaterialParams - """ SetMaterialParams(; Name::String="", Phase::Int64=1, Density = nothing, @@ -242,9 +239,10 @@ function SetMaterialParams( CharDim, ) + name = ntuple(i -> Name[i], length(Name)) # define struct for phase, while also specifying the maximum number of definitions for every field phase = MaterialParams( - Name, + name, Phase, false, Density,