Skip to content

Commit e05bbe5

Browse files
authored
Merge pull request #10 from MultiSimOLab/mmaso/visco-tools
Tools for viscoelasticity
2 parents 82073d4 + c3b3848 commit e05bbe5

3 files changed

Lines changed: 74 additions & 11 deletions

File tree

src/ComputationalModels/BoundaryConditions.jl

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ end
139139

140140
function residual_Neumann(::NothingBC, kwargs...) end
141141

142+
"""
143+
residual_Neumann(...)::Function
144+
145+
Return the Neumann residual as a FUNCTION.
146+
"""
147+
function residual_Neumann(bc::NeumannBC, dΓ::Vector, Λ::Float64)
148+
v -> mapreduce((fi, dΓi) -> (v fi(Λ))dΓi, +, bc.values, dΓ)
149+
end
150+
142151
function residual_Neumann(bc::NeumannBC, v, dΓ, Λ)
143152
bc_func_ = Vector{Function}(undef, length(bc.tags))
144153
for (i, f) in enumerate(bc.values)
@@ -155,20 +164,22 @@ function residual_Neumann(bc::NeumannBC, v, dΓ, Λ⁺, Λ⁻)
155164
return mapreduce(f -> f(v), +, bc_func_)
156165
end
157166

158-
function get_Neumann_dΓ(model, ::NothingBC, degree)
167+
"""
168+
get_Neumann_dΓ(...)::Vector{Gridap.CellData.GenericMeasure}
169+
170+
Return a collection of boundary triangulations at the specified Neumann boundaries.
171+
"""
172+
function get_Neumann_dΓ(model, ::NothingBC, degree::Int)
159173
Vector{Gridap.CellData.GenericMeasure}(undef, 1)
160174
end
161175

162-
function get_Neumann_dΓ(model, bc::NeumannBC, degree)
163-
= Vector{Gridap.CellData.GenericMeasure}(undef, length(bc.tags))
164-
for i in 1:length(bc.tags)
165-
Γ = BoundaryTriangulation(model, tags=bc.tags[i])
166-
dΓ[i] = Measure(Γ, degree)
167-
end
168-
return
176+
function get_Neumann_dΓ(model, bc::NeumannBC, degree::Int)
177+
all_Γ = map(tag -> BoundaryTriangulation(model, tags=tag), bc.tags)
178+
all_dΓ = map(Γi -> Measure(Γi, degree), all_Γ)
179+
all_dΓ
169180
end
170181

171-
function get_Neumann_dΓ(model, bc::MultiFieldBC, degree::Int64)
182+
function get_Neumann_dΓ(model, bc::MultiFieldBC, degree::Int)
172183
= Vector{Vector{Gridap.CellData.GenericMeasure}}(undef, length(bc.BoundaryCondition))
173184
for (i, bc_i) in enumerate(bc.BoundaryCondition)
174185
dΓ[i] = get_Neumann_dΓ(model, bc_i, degree)

src/ComputationalModels/PostProcessors.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,31 @@ function Cauchy(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)
9797
end
9898

9999

100+
function Cauchy(model::ViscoElastic, uh, unh, state_vars, Ω, dΩ, t, Δt)
101+
_, ∂Ψu, _ = model(Δt=Δt)
102+
F, _, _ = get_Kinematics(model.Kinematic)
103+
σ = ∂Ψu (F(uh), F(unh), state_vars...)
104+
return interpolate_σ_everywhere(σ, Ω, dΩ)
105+
end
106+
107+
108+
function interpolate_σ_everywhere(σ, Ω, dΩ)
109+
ref_L2 = ReferenceFE(lagrangian, Float64, 0)
110+
ref_fe = ReferenceFE(lagrangian, Float64, 1)
111+
VL2 = FESpace(Ω, ref_L2, conformity=:L2)
112+
V = FESpace(Ω, ref_fe, conformity=:H1)
113+
n1 = VectorValue(1.0, 0.0, 0.0)
114+
n2 = VectorValue(0.0, 1.0, 0.0)
115+
n3 = VectorValue(0.0, 0.0, 1.0)
116+
σ11h = interpolate_everywhere(L2_Projection(n1 σ n1, dΩ, VL2), V)
117+
σ12h = interpolate_everywhere(L2_Projection(n1 σ n2, dΩ, VL2), V)
118+
σ13h = interpolate_everywhere(L2_Projection(n1 σ n3, dΩ, VL2), V)
119+
σ22h = interpolate_everywhere(L2_Projection(n2 σ n2, dΩ, VL2), V)
120+
σ23h = interpolate_everywhere(L2_Projection(n2 σ n3, dΩ, VL2), V)
121+
σ33h = interpolate_everywhere(L2_Projection(n3 σ n3, dΩ, VL2), V)
122+
ph = interpolate_everywhere(L2_Projection(tr σ, dΩ, VL2), V)
123+
return (σ11h, σ12h, σ13h, σ22h, σ23h, σ33h, ph)
124+
end
100125

101126

102127
function Entropy(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)

src/WeakForms/WeakForms.jl

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ end
3030

3131
function residual(physicalmodel::Mechano, u, v, dΩ, Λ=1.0)
3232
= physicalmodel(Λ)
33-
F,_,_ = get_Kinematics(physicalmodel.Kinematic; Λ=Λ)
33+
F,_,_ = get_Kinematics(physicalmodel.Kinematic; Λ=Λ)
3434
∂Ψu=DΨ[2]
3535

3636
((v)' (∂Ψu (F((u)'))))dΩ
@@ -39,11 +39,38 @@ end
3939

4040
function jacobian(physicalmodel::Mechano, u, du, v, dΩ, Λ=1.0)
4141
= physicalmodel(Λ)
42-
F,_,_ = get_Kinematics(physicalmodel.Kinematic; Λ=Λ)
42+
F,_,_ = get_Kinematics(physicalmodel.Kinematic; Λ=Λ)
4343
∂Ψuu=DΨ[3]
4444
((v)' ((∂Ψuu (F((u)'))) ((du)')))dΩ
4545
end
4646

47+
"""
48+
residual(...)::Function
49+
50+
Return the residual for a visco-elastic model as a FUNCTION.
51+
"""
52+
function residual(model::ViscoElastic, un, vars, dΩ; t, Δt)
53+
_, ∂Ψu, _ = model(t, Δt=Δt)
54+
F, _, _ = get_Kinematics(model.Kinematic, Λ=t)
55+
(u, v) -> ((v)' (∂Ψu(F(u)', F(un)', vars...)))dΩ
56+
end
57+
58+
"""
59+
jacobian(...)::Function
60+
61+
Return the jacobian for a visco-elastic model as a FUNCTION.
62+
"""
63+
function jacobian(model::ViscoElastic, un, vars, dΩ; t, Δt)
64+
_, _, ∂Ψuu = model(t, Δt=Δt)
65+
F, _, _ = get_Kinematics(model.Kinematic, Λ=t)
66+
(u, du, v) -> ((v)' (inner (∂Ψuu(F(u)', F(un)', vars...), (du)')))dΩ
67+
end
68+
69+
70+
# ===================
71+
# Mass term
72+
# ===================
73+
4774
function mass_term(u, v, Coeff, dΩ)
4875
(Coeff* (uv))dΩ
4976
end

0 commit comments

Comments
 (0)