Skip to content

Commit 354f451

Browse files
committed
some fixes
1 parent d876cf9 commit 354f451

File tree

5 files changed

+95
-77
lines changed

5 files changed

+95
-77
lines changed

src/Core/Solver/Matrix_linear_static.jl

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ function init_solver(solver_options::Dict{Any,Any},
122122

123123
for (block, nodes) in pairs(block_nodes)
124124
model_param = Data_Manager.get_properties(block, "Material Model")
125-
Correspondence_matrix_based.init_model(nodes, model_param)
125+
Correspondence_matrix_based.init_model(nodes, model_param, block)
126126
end
127127
@timeit "init_matrix" Correspondence_matrix_based.init_matrix()
128128

@@ -217,7 +217,7 @@ function run_solver(solver_options::Dict{Any,Any},
217217
nodes)
218218

219219
if matrix_update
220-
@timeit "update stiffness matrix" K = compute_matrix(active_nodes)
220+
@timeit "update stiffness matrix" K=compute_matrix(active_nodes)
221221
else
222222
K = Data_Manager.get_stiffness_matrix()
223223
end
@@ -227,13 +227,16 @@ function run_solver(solver_options::Dict{Any,Any},
227227

228228
# reshape
229229
# All 2 time steps fields must be in the loop, because switch NP1 to N changes the adresses
230-
uN = Data_Manager.get_field("Displacements", "N")
231-
uNP1 = Data_Manager.get_field("Displacements", "NP1")
232-
velocities = Data_Manager.get_field("Velocity", "NP1")
233-
deformed_coorNP1 = Data_Manager.get_field("Deformed Coordinates", "NP1")
234-
forces = Data_Manager.get_field("Forces", "NP1")
235-
force_densities_N = Data_Manager.get_field("Force Densities", "N")
236-
force_densities_NP1 = Data_Manager.get_field("Force Densities", "NP1")
230+
uN::NodeVectorField{Float64} = Data_Manager.get_field("Displacements", "N")
231+
uNP1::NodeVectorField{Float64} = Data_Manager.get_field("Displacements", "NP1")
232+
velocities::NodeVectorField{Float64} = Data_Manager.get_field("Velocity", "NP1")
233+
deformed_coorNP1::NodeVectorField{Float64} = Data_Manager.get_field("Deformed Coordinates",
234+
"NP1")
235+
forces::NodeVectorField{Float64} = Data_Manager.get_field("Forces", "NP1")
236+
force_densities_N::NodeVectorField{Float64} = Data_Manager.get_field("Force Densities",
237+
"N")
238+
force_densities_NP1::NodeVectorField{Float64} = Data_Manager.get_field("Force Densities",
239+
"NP1")
237240

238241
non_BCs = Data_Manager.get_bc_free_dof()
239242
#force_densities_NP1[active_nodes, :] .= force_densities_N[active_nodes, :]
@@ -258,6 +261,7 @@ function run_solver(solver_options::Dict{Any,Any},
258261
step_time)
259262

260263
external_force_densities .= external_forces ./ volume # it must be delta external forces
264+
deformed_coorNP1 .= coor .+ uNP1
261265

262266
@timeit "compute_models" compute_stiff_matrix_compatible_models(block_nodes,
263267
dt,
@@ -272,7 +276,7 @@ function run_solver(solver_options::Dict{Any,Any},
272276
nodes)
273277

274278
if matrix_update
275-
@timeit "update stiffness matrix" K = compute_matrix(active_nodes)
279+
@timeit "update stiffness matrix" K=compute_matrix(active_nodes)
276280

277281
else
278282
K = Data_Manager.get_stiffness_matrix()
@@ -346,8 +350,8 @@ function filter_and_map_bc(non_BCs, active_nodes, dof, nnodes::Int64)
346350
filtered = []
347351
for i in eachindex(active_nodes)
348352
for j in 1:dof
349-
if active_nodes[i] + (j - 1)*nnodes in non_BCs
350-
push!(filtered, i+(j - 1) * length(active_nodes))
353+
if active_nodes[i] + (j - 1) * nnodes in non_BCs
354+
push!(filtered, i + (j - 1) * length(active_nodes))
351355
end
352356
end
353357
end
@@ -356,7 +360,7 @@ function filter_and_map_bc(non_BCs, active_nodes, dof, nnodes::Int64)
356360
end
357361

358362
function compute_matrix(nodes::AbstractVector{Int64})
359-
if length(nodes)==0
363+
if length(nodes) == 0
360364
return Data_Manager.get_stiffness_matrix()
361365
end
362366
Bond_Deformation.compute(nodes,

src/Models/Material/Material_Models/Correspondence/Correspondence_matrix_based.jl

Lines changed: 72 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ using StaticArrays: @MMatrix
1212
using ...Data_Manager
1313
using ...Material_Basis: get_Hooke_matrix
1414
using ....Helpers: get_fourth_order, progress_bar
15-
using ...Zero_Energy_Control: create_zero_energy_mode_stiffness!
15+
using ...Zero_Energy_Control
1616

1717
export init_model
1818
export add_zero_energy_stiff!
@@ -129,36 +129,45 @@ function compute_linearized_operator(CB_ik::AbstractArray{Float64,3},
129129
factor = omega_ij * V_k * omega_ik
130130

131131
@inbounds begin
132-
K_ijk[1, 1] = factor * (CB_ik[1, 1, 1]*DX_1 + CB_ik[1, 2, 1]*DX_2)
133-
K_ijk[1, 2] = factor * (CB_ik[1, 1, 2]*DX_1 + CB_ik[1, 2, 2]*DX_2)
134-
K_ijk[2, 1] = factor * (CB_ik[2, 1, 1]*DX_1 + CB_ik[2, 2, 1]*DX_2)
135-
K_ijk[2, 2] = factor * (CB_ik[2, 1, 2]*DX_1 + CB_ik[2, 2, 2]*DX_2)
132+
K_ijk[1, 1] = factor * (CB_ik[1, 1, 1] * DX_1 + CB_ik[1, 2, 1] * DX_2)
133+
K_ijk[1, 2] = factor * (CB_ik[1, 1, 2] * DX_1 + CB_ik[1, 2, 2] * DX_2)
134+
K_ijk[2, 1] = factor * (CB_ik[2, 1, 1] * DX_1 + CB_ik[2, 2, 1] * DX_2)
135+
K_ijk[2, 2] = factor * (CB_ik[2, 1, 2] * DX_1 + CB_ik[2, 2, 2] * DX_2)
136136
end
137137
elseif dof == 3
138-
DX_1 = D_inv_i[1, 1]*X_ij[1] + D_inv_i[1, 2]*X_ij[2] + D_inv_i[1, 3]*X_ij[3]
139-
DX_2 = D_inv_i[2, 1]*X_ij[1] + D_inv_i[2, 2]*X_ij[2] + D_inv_i[2, 3]*X_ij[3]
140-
DX_3 = D_inv_i[3, 1]*X_ij[1] + D_inv_i[3, 2]*X_ij[2] + D_inv_i[3, 3]*X_ij[3]
138+
DX_1 = D_inv_i[1, 1] * X_ij[1] + D_inv_i[1, 2] * X_ij[2] + D_inv_i[1, 3] * X_ij[3]
139+
DX_2 = D_inv_i[2, 1] * X_ij[1] + D_inv_i[2, 2] * X_ij[2] + D_inv_i[2, 3] * X_ij[3]
140+
DX_3 = D_inv_i[3, 1] * X_ij[1] + D_inv_i[3, 2] * X_ij[2] + D_inv_i[3, 3] * X_ij[3]
141141
factor = omega_ij * V_k * omega_ik
142142

143143
@inbounds begin
144144
K_ijk[1, 1] = factor *
145-
(CB_ik[1, 1, 1]*DX_1 + CB_ik[1, 2, 1]*DX_2 + CB_ik[1, 3, 1]*DX_3)
145+
(CB_ik[1, 1, 1] * DX_1 + CB_ik[1, 2, 1] * DX_2 +
146+
CB_ik[1, 3, 1] * DX_3)
146147
K_ijk[1, 2] = factor *
147-
(CB_ik[1, 1, 2]*DX_1 + CB_ik[1, 2, 2]*DX_2 + CB_ik[1, 3, 2]*DX_3)
148+
(CB_ik[1, 1, 2] * DX_1 + CB_ik[1, 2, 2] * DX_2 +
149+
CB_ik[1, 3, 2] * DX_3)
148150
K_ijk[1, 3] = factor *
149-
(CB_ik[1, 1, 3]*DX_1 + CB_ik[1, 2, 3]*DX_2 + CB_ik[1, 3, 3]*DX_3)
151+
(CB_ik[1, 1, 3] * DX_1 + CB_ik[1, 2, 3] * DX_2 +
152+
CB_ik[1, 3, 3] * DX_3)
150153
K_ijk[2, 1] = factor *
151-
(CB_ik[2, 1, 1]*DX_1 + CB_ik[2, 2, 1]*DX_2 + CB_ik[2, 3, 1]*DX_3)
154+
(CB_ik[2, 1, 1] * DX_1 + CB_ik[2, 2, 1] * DX_2 +
155+
CB_ik[2, 3, 1] * DX_3)
152156
K_ijk[2, 2] = factor *
153-
(CB_ik[2, 1, 2]*DX_1 + CB_ik[2, 2, 2]*DX_2 + CB_ik[2, 3, 2]*DX_3)
157+
(CB_ik[2, 1, 2] * DX_1 + CB_ik[2, 2, 2] * DX_2 +
158+
CB_ik[2, 3, 2] * DX_3)
154159
K_ijk[2, 3] = factor *
155-
(CB_ik[2, 1, 3]*DX_1 + CB_ik[2, 2, 3]*DX_2 + CB_ik[2, 3, 3]*DX_3)
160+
(CB_ik[2, 1, 3] * DX_1 + CB_ik[2, 2, 3] * DX_2 +
161+
CB_ik[2, 3, 3] * DX_3)
156162
K_ijk[3, 1] = factor *
157-
(CB_ik[3, 1, 1]*DX_1 + CB_ik[3, 2, 1]*DX_2 + CB_ik[3, 3, 1]*DX_3)
163+
(CB_ik[3, 1, 1] * DX_1 + CB_ik[3, 2, 1] * DX_2 +
164+
CB_ik[3, 3, 1] * DX_3)
158165
K_ijk[3, 2] = factor *
159-
(CB_ik[3, 1, 2]*DX_1 + CB_ik[3, 2, 2]*DX_2 + CB_ik[3, 3, 2]*DX_3)
166+
(CB_ik[3, 1, 2] * DX_1 + CB_ik[3, 2, 2] * DX_2 +
167+
CB_ik[3, 3, 2] * DX_3)
160168
K_ijk[3, 3] = factor *
161-
(CB_ik[3, 1, 3]*DX_1 + CB_ik[3, 2, 3]*DX_2 + CB_ik[3, 3, 3]*DX_3)
169+
(CB_ik[3, 1, 3] * DX_1 + CB_ik[3, 2, 3] * DX_2 +
170+
CB_ik[3, 3, 3] * DX_3)
162171
end
163172
end
164173
end
@@ -224,19 +233,19 @@ function create_mapping_structure(nodes::AbstractVector{Int64},
224233
mapping[i][1] = idx
225234
for n in 1:dof
226235
for m in 1:dof
227-
I[idx] = (i-1)*dof + m
228-
J[idx] = (i-1)*dof + n
236+
I[idx] = (i - 1) * dof + m
237+
J[idx] = (i - 1) * dof + n
229238
idx += 1
230239
end
231240
end
232241

233242
# Blocks (i, k) for k ∈ nlist[i]
234243
for (k_idx, k) in enumerate(ni)
235-
mapping[i][k_idx+1] = idx
244+
mapping[i][k_idx + 1] = idx
236245
for n in 1:dof
237246
for m in 1:dof
238-
I[idx] = (i-1)*dof + m
239-
J[idx] = (k-1)*dof + n
247+
I[idx] = (i - 1) * dof + m
248+
J[idx] = (k - 1) * dof + n
240249
idx += 1
241250
end
242251
end
@@ -322,7 +331,7 @@ function assemble_stiffness(nodes::AbstractVector{Int64},
322331
mapping_i = mapping[i]
323332

324333
for (j_idx, j) in enumerate(ni)
325-
omega_ij = omega[i][j_idx]*bond_damage[i][j_idx]
334+
omega_ij = omega[i][j_idx] * bond_damage[i][j_idx]
326335
V_j = volume[j]
327336
X_ij = bond_geometry[i][j_idx]
328337

@@ -331,7 +340,7 @@ function assemble_stiffness(nodes::AbstractVector{Int64},
331340
mapping_j = mapping[j]
332341

333342
for (k_idx, k) in enumerate(ni)
334-
omega_ik = omega[i][k_idx]*bond_damage[i][k_idx]
343+
omega_ik = omega[i][k_idx] * bond_damage[i][k_idx]
335344
V_k = volume[k]
336345

337346
compute_linearized_operator(@view(CB_k[k_idx, :, :, :]),
@@ -341,7 +350,7 @@ function assemble_stiffness(nodes::AbstractVector{Int64},
341350
# Row j entries
342351
i_pos_in_j = neighbor_pos_j[i]
343352
if i_pos_in_j != 0
344-
add_block_scaled!(V_thread, mapping_j[i_pos_in_j+1],
353+
add_block_scaled!(V_thread, mapping_j[i_pos_in_j + 1],
345354
buffers.K_block, V_i, dof)
346355
end
347356

@@ -350,14 +359,14 @@ function assemble_stiffness(nodes::AbstractVector{Int64},
350359
else
351360
k_pos_in_j = neighbor_pos_j[k]
352361
if k_pos_in_j != 0
353-
add_block_scaled!(V_thread, mapping_j[k_pos_in_j+1],
362+
add_block_scaled!(V_thread, mapping_j[k_pos_in_j + 1],
354363
buffers.K_block, -V_i, dof)
355364
end
356365
end
357366

358367
# Row i entries
359368
add_block_scaled!(V_thread, i_diag_idx, buffers.K_block, -V_j, dof)
360-
add_block_scaled!(V_thread, mapping_i[k_idx+1], buffers.K_block, V_j,
369+
add_block_scaled!(V_thread, mapping_i[k_idx + 1], buffers.K_block, V_j,
361370
dof)
362371
end
363372
end
@@ -396,7 +405,7 @@ end
396405

397406
@inline function add_block_scaled!(V, start_idx, block, scale, dof)
398407
@turbo for i in 1:dof, j in 1:dof
399-
V[start_idx+(j-1)*dof+i-1] += scale * block[i, j]
408+
V[start_idx + (j - 1) * dof + i - 1] += scale * block[i, j]
400409
end
401410
end
402411

@@ -500,11 +509,11 @@ function add_zero_energy_stiff!(K::SparseMatrixCSC{Float64,Int64},
500509
K_ii_block = zeros(dof, dof)
501510

502511
for d1 in 1:dof
503-
row = (i-1)*dof + d1
512+
row = (i - 1) * dof + d1
504513
for j in active_nodes
505514
if i != j
506515
for d2 in 1:dof
507-
col = (j-1)*dof + d2
516+
col = (j - 1) * dof + d2
508517
K_ii_block[d1, d2] -= K_stab[row, col]
509518
end
510519
end
@@ -513,8 +522,8 @@ function add_zero_energy_stiff!(K::SparseMatrixCSC{Float64,Int64},
513522

514523
for d1 in 1:dof
515524
for d2 in 1:dof
516-
row = (i-1)*dof + d1
517-
col = (i-1)*dof + d2
525+
row = (i - 1) * dof + d1
526+
col = (i - 1) * dof + d2
518527
K[row, col] += K_ii_block[d1, d2]
519528
end
520529
end
@@ -534,8 +543,8 @@ function add_block_to_coo!(I_indices::Vector{Int},
534543
for d1 in 1:dof
535544
for d2 in 1:dof
536545
if abs(block[d1, d2]) > 1e-14
537-
push!(I_indices, (i-1)*dof + d1)
538-
push!(J_indices, (j-1)*dof + d2)
546+
push!(I_indices, (i - 1) * dof + d1)
547+
push!(J_indices, (j - 1) * dof + d2)
539548
push!(values, block[d1, d2])
540549
end
541550
end
@@ -548,15 +557,15 @@ function compute_bond_force(bond_force::Vector{Vector{Vector{Float64}}},
548557
dof::Int64)
549558
@inbounds for i in nodes
550559
ni = nlist[i]
551-
i_offset = (i-1)*dof
560+
i_offset = (i - 1) * dof
552561

553562
for (j_idx, j) in enumerate(ni)
554-
j_offset = (j-1)*dof
563+
j_offset = (j - 1) * dof
555564
f_ij = zeros(dof)
556565

557566
for m in 1:dof
558567
for n in 1:dof
559-
f_ij[m] += K[i_offset+m, j_offset+n] * (u[j, n] - u[i, n])
568+
f_ij[m] += K[i_offset + m, j_offset + n] * (u[j, n] - u[i, n])
560569
end
561570
end
562571

@@ -566,8 +575,9 @@ function compute_bond_force(bond_force::Vector{Vector{Vector{Float64}}},
566575
end
567576

568577
function init_model(nodes::AbstractVector{Int64},
569-
material_parameter::Dict)
570-
if Data_Manager.get_max_rank()>1
578+
material_parameter::Dict, block_id::Int64)
579+
Zero_Energy_Control.init_model(nodes, material_parameter, block_id)
580+
if Data_Manager.get_max_rank() > 1
571581
@error "Correspondence matrix based not implemented for parallel runs."
572582
end
573583
end
@@ -581,9 +591,10 @@ function init_matrix()
581591
bond_geometry = Data_Manager.get_field("Bond Geometry")
582592
inverse_shape_tensor = Data_Manager.get_field("Inverse Shape Tensor")
583593
nlist = Data_Manager.get_nlist()
584-
number_of_neighbors=Data_Manager.get_field("Number of Neighbors")
594+
number_of_neighbors = Data_Manager.get_field("Number of Neighbors")
585595
volume = Data_Manager.get_field("Volume")
586596
omega = Data_Manager.get_field("Influence Function")
597+
# using the elasticity matrix allows the introduction of heterogeneous materials
587598
C_voigt = Data_Manager.get_field("Elasticity Matrix")
588599
bond_geometry_N = Data_Manager.get_field("Deformed Bond Geometry", "N")
589600
bond_damage = Data_Manager.get_field("Bond Damage", "NP1")
@@ -604,23 +615,26 @@ function init_matrix()
604615

605616
Data_Manager.init_stiffness_matrix(index_x, index_y, vals, total_dof)
606617
K_sparse = Data_Manager.get_stiffness_matrix()
607-
608-
if Data_Manager.get_analysis_model("Zero Energy Control Model", 1) != "Global"
609-
@warn "Global Energy Control Model is not active for block 1. Must be for all blocks, when used."
618+
if haskey(Data_Manager.get_properties(1, "Material Model"), "Zero Energy Control")
619+
if Data_Manager.get_properties(1, "Material Model")["Zero Energy Control"] ==
620+
"Global"
621+
Zero_Energy_Control.create_zero_energy_mode_stiffness!(nodes, dof, C_voigt,
622+
inverse_shape_tensor,
623+
zStiff)
624+
625+
add_zero_energy_stiff!(K_sparse,
626+
nodes,
627+
dof,
628+
zStiff,
629+
inverse_shape_tensor,
630+
nlist,
631+
volume,
632+
bond_geometry_N,
633+
bond_damage,
634+
omega)
635+
end
610636
else
611-
create_zero_energy_mode_stiffness!(nodes, dof, C_voigt,
612-
inverse_shape_tensor, zStiff)
613-
614-
add_zero_energy_stiff!(K_sparse,
615-
nodes,
616-
dof,
617-
zStiff,
618-
inverse_shape_tensor,
619-
nlist,
620-
volume,
621-
bond_geometry_N,
622-
bond_damage,
623-
omega)
637+
@warn "Global Energy Control Model is not active for block 1. Must be for all blocks, when used."
624638
end
625639
end
626640

@@ -653,8 +667,8 @@ function compute_model(nodes::AbstractVector{Int64})
653667

654668
Data_Manager.init_stiffness_matrix(index_x, index_y, vals, total_dof)
655669

656-
create_zero_energy_mode_stiffness!(nodes, dof, C_voigt,
657-
inverse_shape_tensor, zStiff)
670+
Zero_Energy_Control.create_zero_energy_mode_stiffness!(nodes, dof, C_voigt,
671+
inverse_shape_tensor, zStiff)
658672

659673
K_sparse = Data_Manager.get_stiffness_matrix()
660674
add_zero_energy_stiff!(K_sparse,

src/Models/Material/Material_Models/Zero_Energy_Control/Zero_Energy_Control.jl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ function init_model(nodes::AbstractVector{Int64}, material_parameter::Dict, bloc
2626
Data_Manager.set_model_module(zero_energy_model, mod)
2727
mod.init_model(nodes, material_parameter)
2828
else
29-
Data_Manager.set_analysis_model("Zero Energy Control Model", block, [])
30-
29+
Data_Manager.set_analysis_model("Zero Energy Control Model", block, "")
3130
@warn "No zero energy control activated for corresponcence in block $block. This might cause errors."
3231
end
3332
end
@@ -57,8 +56,7 @@ function create_zero_energy_mode_stiffness!(nodes::AbstractVector{Int64},
5756
Kinv::Array{Float64,3},
5857
zStiff::Array{Float64,3})
5958
zero_energy_model = Data_Manager.get_analysis_model("Zero Energy Control Model", 1)
60-
mod = Data_Manager.get_model_module(zero_energy_model)
61-
return mod.create_zero_energy_mode_stiffness!(nodes, dof, CVoigt,
62-
Kinv, zStiff)
59+
mod = Data_Manager.get_model_module(zero_energy_model[1])
60+
return mod.create_zero_energy_mode_stiffness!(nodes, dof, CVoigt, Kinv, zStiff)
6361
end
6462
end

test/fullscale_tests/test_linear_static_matrix_based_solver/linear_static_matrix_based_solver_2D.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ PeriLab:
2222
Symmetry: "isotropic plane stress"
2323
Young's Modulus: 209695.43147208123
2424
Poisson's Ratio: 0.2944
25+
Zero Energy Control: "Global"
2526
Mat_2:
2627
Material Model: "Correspondence Elastic"
2728
Symmetry: "isotropic plane stress"
2829
Young's Modulus: 209695.43147208123
2930
Poisson's Ratio: 0.2944
31+
Zero Energy Control: "Global"
3032
Blocks:
3133
block_1:
3234
Block ID: 1

0 commit comments

Comments
 (0)