@@ -12,7 +12,7 @@ using StaticArrays: @MMatrix
1212using ... Data_Manager
1313using ... Material_Basis: get_Hooke_matrix
1414using .... Helpers: get_fourth_order, progress_bar
15- using ... Zero_Energy_Control: create_zero_energy_mode_stiffness!
15+ using ... Zero_Energy_Control
1616
1717export init_model
1818export 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
164173end
@@ -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
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
401410end
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}}},
566575end
567576
568577function 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
573583end
@@ -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
625639end
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,
0 commit comments