Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Precompute A^-1/n and A^-n in DislocationCreep and DiffusionCreep #207

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 13 additions & 11 deletions src/CreepLaw/DiffusionCreep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ julia> 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,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T}
struct DiffusionCreep{T,U1,U2,U3,U4,U5,U6} <: AbstractCreepLaw{T}
Name::Ptr{UInt8}
n::GeoUnit{T,U1} # powerlaw exponent
r::GeoUnit{T,U1} # exponent of water-fugacity
Expand All @@ -56,6 +56,7 @@ struct DiffusionCreep{T,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T}
E::GeoUnit{T,U3} # activation energy
V::GeoUnit{T,U4} # activation volume
R::GeoUnit{T,U5} # universal gas constant
A_to_minus_n::GeoUnit{T,U6} # universal gas constant
Apparatus::Int8 # type of experimental apparatus, either AxialCompression, SimpleShear or Invariant
FT::T # type of experimental apparatus, either AxialCompression, SimpleShear or Invariant
FE::T # type of experimental apparatus, either AxialCompression, SimpleShear or Invariant
Expand All @@ -71,7 +72,6 @@ struct DiffusionCreep{T,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T}
R=8.3145J / mol / K,
Apparatus=AxialCompression,
)

# Corrections from lab experiments
FT, FE = CorrectionFactor(Apparatus)
# Convert to GeoUnits
Expand All @@ -82,23 +82,26 @@ struct DiffusionCreep{T,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T}
EU = convert(GeoUnit, E)
VU = convert(GeoUnit, V)
RU = convert(GeoUnit, R)
u = (Pa^(-nU.val - r) / s * m^(-pU.val)) ^ (-nU.val)
A_to_minus_n = convert(GeoUnit, (AU.val^(-nU.val)) * u)
# Extract struct types
T = typeof(rU).types[1]
T = typeof(rU).types[1]
U1 = typeof(rU).types[2]
U2 = typeof(AU).types[2]
U3 = typeof(EU).types[2]
U4 = typeof(VU).types[2]
U5 = typeof(RU).types[2]
U6 = typeof(A_to_minus_n).types[2]
name = pointer(ptr2string(Name))
# Create struct
return new{T,U1,U2,U3,U4,U5}(
name, nU, rU, pU, AU, EU, VU, RU, Int8(Apparatus), FT, FE
return new{T,U1,U2,U3,U4,U5,U6}(
name, nU, rU, pU, AU, EU, VU, RU, A_to_minus_n, Int8(Apparatus), FT, FE
)
end

end

function DiffusionCreep(Name, n, r, p, A, E, V, R, Apparatus, FT, FE)
function DiffusionCreep(Name, n, r, p, A, E, V, R, A_to_minus_nU, Apparatus, FT, FE)
return DiffusionCreep(;
Name=Name, n=n, r=r, p=p, A=A, E=E, V=V, R=R, Apparatus=Apparatus
)
Expand Down Expand Up @@ -255,12 +258,11 @@ end
@inline function compute_τII(
a::DiffusionCreep, EpsII::Quantity; T=1K, P=0Pa, f=1NoUnits, d=1m, kwargs...
)
@unpack_units n, r, p, A, E, V, R = a
@unpack_units n, r, p, A, E, V, R, A_to_minus_n = a
FT, FE = a.FT, a.FE

n_inv = inv(n)

τ = @pow A^(-n_inv) *
τ = @pow A_to_minus_n *
EpsII *
FE *
f^(-r * n_inv) *
Expand Down Expand Up @@ -296,14 +298,14 @@ end
d=one(precision(a)),
kwargs...,
)
@unpack_val n, r, p, A, E, V, R = a
@unpack_val n, r, p, A, E, V, R, A_to_minus_n = a
FT, FE = a.FT, a.FE

n_inv = inv(n)

return @pow (
FE *
A^(-n_inv) *
A_to_minus_n*
f^(-r * n_inv) *
d^(-p * n_inv) *
(EpsII * FE)^(n_inv - 1) *
Expand Down
33 changes: 18 additions & 15 deletions src/CreepLaw/DislocationCreep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,15 @@
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,U1,U2,U3,U4,U5} <: AbstractCreepLaw{T}
struct DislocationCreep{T,U1,U2,U3,U4,U5,U6} <: AbstractCreepLaw{T}
Name::Ptr{UInt8}
n::GeoUnit{T,U1} # power-law exponent
r::GeoUnit{T,U1} # exponent of water-fugacity
A::GeoUnit{T,U2} # material specific rheological parameter
E::GeoUnit{T,U3} # activation energy
V::GeoUnit{T,U4} # activation volume
R::GeoUnit{T,U5} # universal gas constant
A_to_minus_n::GeoUnit{T,U6} # universal gas constant
Apparatus::Int8 # type of experimental apparatus, either AxialCompression, SimpleShear or Invariant
FT::T # type of experimental apparatus, either AxialCompression, SimpleShear or Invariant
FE::T # type of experimental apparatus, either AxialCompression, SimpleShear or Invariant
Expand All @@ -72,21 +73,24 @@
EU = convert(GeoUnit, E)
VU = convert(GeoUnit, V)
RU = convert(GeoUnit, R)
u = (Pa^(-nU.val) / s) ^ (-1/nU.val)
A_to_minus_n = convert(GeoUnit, (AU.val^(-1/nU.val)) * u)
# Extract struct types
T = typeof(nU).types[1]
T = typeof(nU).types[1]
U1 = typeof(nU).types[2]
U2 = typeof(AU).types[2]
U3 = typeof(EU).types[2]
U4 = typeof(VU).types[2]
U5 = typeof(RU).types[2]
U6 = typeof(A_to_minus_n).types[2]
name = pointer(ptr2string(Name))
# Create struct
return new{T,U1,U2,U3,U4,U5}(
name, nU, rU, AU, EU, VU, RU, Int8(Apparatus), FT, FE
return new{T,U1,U2,U3,U4,U5,U6}(
name, nU, rU, AU, EU, VU, RU, A_to_minus_n, Int8(Apparatus), FT, FE
)
end

function DislocationCreep(Name, n, r, A, E, V, R, Apparatus, FT, FE)
function DislocationCreep(Name, n, r, A, E, V, R, A_to_minus_nU, Apparatus, FT, FE)
return DislocationCreep(;
Name=Name, n=n, r=r, A=A, E=E, V=V, R=R, Apparatus=Apparatus
)
Expand Down Expand Up @@ -201,27 +205,27 @@
args...,
)
n, r, A, E, V, R = if EpsII isa Quantity
@unpack_units n, r, A, E, V, R = a
@unpack_units n, r, A, E, V, R, A_to_minus_n = a

Check warning on line 208 in src/CreepLaw/DislocationCreep.jl

View check run for this annotation

Codecov / codecov/patch

src/CreepLaw/DislocationCreep.jl#L208

Added line #L208 was not covered by tests
n, r, A, E, V, R
else
@unpack_val n, r, A, E, V, R = a
@unpack_val n, r, A, E, V, R, A_to_minus_n = a
n, r, A, E, V, R
end

FT, FE = a.FT, a.FE
_n = inv(n)

return @pow A^-_n * (EpsII * FE)^_n * f^(-r * _n) * exp((E + P * V) / (n * R * T)) / FT
return @pow A_to_minus_n * (EpsII * FE)^_n * f^(-r * _n) * exp((E + P * V) / (n * R * T)) / FT
end

@inline function compute_τII(
a::DislocationCreep, EpsII::Quantity; P=0Pa, T=1K, f=1NoUnits, args...
)
@unpack_units n, r, A, E, V, R = a
@unpack_units n, r, A, E, V, R, A_to_minus_n = a
FT, FE = a.FT, a.FE
_n = inv(n)

return @pow A^-_n * f^(-r * _n) * (EpsII * FE)^_n * exp((E + P * V) / (n * R * T)) / FT
return @pow A_to_minus_n * f^(-r * _n) * (EpsII * FE)^_n * exp((E + P * V) / (n * R * T)) / FT
end

"""
Expand Down Expand Up @@ -256,25 +260,24 @@
f=one(precision(a)),
args...,
)
@unpack_val n, r, A, E, V, R = a
@unpack_val n, r, A, E, V, R, A_to_minus_n = a
FT, FE = a.FT, a.FE
_n = inv(n)


return @pow (
FE * A^-_n * f^(-r * _n) * (EpsII * FE)^(_n - 1) * exp((E + P * V) / (R * T * n))
FE * A_to_minus_n * f^(-r * _n) * (EpsII * FE)^(_n - 1) * exp((E + P * V) / (R * T * n))
) / (FT * n)
end

@inline function dτII_dεII(
a::DislocationCreep, EpsII::Quantity; P=0Pa, T=1K, f=1NoUnits, args...
)
@unpack_units n, r, A, E, V, R = a
@unpack_units n, r, A, E, V, R, A_to_minus_n = a

Check warning on line 275 in src/CreepLaw/DislocationCreep.jl

View check run for this annotation

Codecov / codecov/patch

src/CreepLaw/DislocationCreep.jl#L275

Added line #L275 was not covered by tests
FT, FE = a.FT, a.FE
_n = inv(n)

return @pow (
FE * A^-_n * f^(-r * _n) * (EpsII * FE)^(_n - 1) * exp((E + P * V) / (R * T * n))
FE * A_to_minus_n * f^(-r * _n) * (EpsII * FE)^(_n - 1) * exp((E + P * V) / (R * T * n))
) / (FT * n)
end

Expand Down
Loading