@@ -16,6 +16,12 @@ where ``\\sigma`` is calculated with the `material_response` function from
1616Note that `create_cell_state` is already implemented for `<:AbstractMaterial`.
1717"""
1818function FerriteAssembly. element_routine! (
19+ Ke, re, state:: Vector{<:MMB.AbstractMaterialState} ,
20+ ae, material:: MMB.AbstractMaterial , cellvalues:: AbstractCellValues , buffer)
21+ return mechanical_element_routine! (MMB. get_tensorbase (material), Ke, re, state, ae, material, cellvalues, buffer)
22+ end
23+
24+ function mechanical_element_routine! (:: Type{<:SymmetricTensor{2}} ,
1925 Ke, re, state:: Vector{<:MMB.AbstractMaterialState} ,
2026 ae, material:: MMB.AbstractMaterial , cellvalues:: AbstractCellValues , buffer)
2127 cache = FerriteAssembly. get_user_cache (buffer)
@@ -40,6 +46,31 @@ function FerriteAssembly.element_routine!(
4046 end
4147end
4248
49+ function mechanical_element_routine! (:: Type{<:Tensor{2}} ,
50+ Ke, re, state:: Vector{<:MMB.AbstractMaterialState} ,
51+ ae, material:: MMB.AbstractMaterial , cellvalues:: AbstractCellValues , buffer)
52+ cache = FerriteAssembly. get_user_cache (buffer)
53+ Δt = FerriteAssembly. get_time_increment (buffer)
54+ state_old = FerriteAssembly. get_old_state (buffer)
55+ n_basefuncs = getnbasefunctions (cellvalues)
56+ for q_point in 1 : getnquadpoints (cellvalues)
57+ # For each integration point, compute stress and material stiffness
58+ H = function_gradient (cellvalues, q_point, ae) # Displacement gradient
59+ F = H + one (H) # Deformation gradient
60+ P, D, state[q_point] = MMB. material_response (material, F, state_old[q_point], Δt, cache)
61+ dΩ = getdetJdV (cellvalues, q_point)
62+ for i in 1 : n_basefuncs
63+ ∇δN = shape_gradient (cellvalues, q_point, i)
64+ re[i] += (∇δN ⊡ P) * dΩ # add internal force to residual
65+ ∇δN_D = ∇δN ⊡ D # temporary value for speed
66+ for j in 1 : n_basefuncs
67+ ∇N = shape_gradient (cellvalues, q_point, j)
68+ Ke[i, j] += (∇δN_D ⊡ ∇N) * dΩ
69+ end
70+ end
71+ end
72+ end
73+
4374"""
4475 FerriteAssembly.element_residual!(
4576 re, state::Vector{<:MMB.AbstractMaterialState}, ae,
@@ -49,6 +80,12 @@ The `element_residual!` implementation corresponding to the `element_routine!` i
4980for a `MaterialModelsBase.AbstractMaterial`
5081"""
5182function FerriteAssembly. element_residual! (
83+ re, state:: Vector{<:MMB.AbstractMaterialState} ,
84+ ae, material:: MMB.AbstractMaterial , cellvalues:: AbstractCellValues , buffer)
85+ return mechanical_element_residual! (MMB. get_tensorbase (material), re, state, ae, material, cellvalues, buffer)
86+ end
87+
88+ function mechanical_element_residual! (:: Type{<:SymmetricTensor{2}} ,
5289 re, state:: Vector{<:MMB.AbstractMaterialState} ,
5390 ae, material:: MMB.AbstractMaterial , cellvalues:: AbstractCellValues , buffer)
5491 cache = FerriteAssembly. get_user_cache (buffer)
@@ -67,6 +104,26 @@ function FerriteAssembly.element_residual!(
67104 end
68105end
69106
107+ function mechanical_element_residual! (:: Type{<:Tensor{2}} ,
108+ re, state:: Vector{<:MMB.AbstractMaterialState} ,
109+ ae, material:: MMB.AbstractMaterial , cellvalues:: AbstractCellValues , buffer)
110+ cache = FerriteAssembly. get_user_cache (buffer)
111+ Δt = FerriteAssembly. get_time_increment (buffer)
112+ state_old = FerriteAssembly. get_old_state (buffer)
113+ n_basefuncs = getnbasefunctions (cellvalues)
114+ for q_point in 1 : getnquadpoints (cellvalues)
115+ # For each integration point, compute stress and material stiffness
116+ H = function_gradient (cellvalues, q_point, ae) # Displacement gradient
117+ F = H + one (H) # Deformation gradient
118+ P, _, state[q_point] = MMB. material_response (material, F, state_old[q_point], Δt, cache)
119+ dΩ = getdetJdV (cellvalues, q_point)
120+ for i in 1 : n_basefuncs
121+ ∇δN = shape_gradient (cellvalues, q_point, i)
122+ re[i] += (∇δN ⊡ P) * dΩ # add internal force to residual
123+ end
124+ end
125+ end
126+
70127"""
71128 FerriteAssembly.create_cell_state(m::MMB.AbstractMaterial, cv::AbstractCellValues, args...)
72129
0 commit comments