@@ -77,6 +77,24 @@ function SolidMechanicsNeumannBoundaryCondition(input_mesh::ExodusDatabase, bc_p
77
77
)
78
78
end
79
79
80
+ function SolidMechanicsNeumannPressureBoundaryCondition (input_mesh:: ExodusDatabase , bc_params:: Parameters )
81
+ side_set_name = bc_params[" side set" ]
82
+ expression = bc_params[" function" ]
83
+ side_set_id = side_set_id_from_name (side_set_name, input_mesh)
84
+ num_nodes_per_side, side_set_node_indices = Exodus. read_side_set_node_list (input_mesh, side_set_id)
85
+ side_set_node_indices = Int64 .(side_set_node_indices)
86
+
87
+ # Build symbolic expressions
88
+ pressure_num = eval (Meta. parse (expression))
89
+
90
+ # Compile them into functions
91
+ pressure_fun = eval (build_function (pressure_num, [t, x, y, z]; expression= Val (false )))
92
+
93
+ return SolidMechanicsNeumannPressureBoundaryCondition (
94
+ side_set_name, side_set_id, num_nodes_per_side, side_set_node_indices, pressure_fun
95
+ )
96
+ end
97
+
80
98
function SolidMechanicsOverlapSchwarzBoundaryCondition (
81
99
coupled_block_name:: String ,
82
100
tol:: Float64 ,
@@ -313,6 +331,22 @@ function apply_bc(model::SolidMechanics, bc::SolidMechanicsNeumannBoundaryCondit
313
331
end
314
332
end
315
333
334
+ function apply_bc (model:: SolidMechanics , bc:: SolidMechanicsNeumannPressureBoundaryCondition )
335
+ ss_node_index = 1
336
+ for side in bc. num_nodes_per_side
337
+ side_nodes = bc. side_set_node_indices[ss_node_index: (ss_node_index + side - 1 )]
338
+ side_coordinates = model. reference[:, side_nodes]
339
+ nodal_force_component = get_side_set_nodal_pressure (side_coordinates, bc. pressure_fun, model. time)
340
+ ss_node_index += side
341
+ side_node_index = 1
342
+ for node_index in side_nodes
343
+ dof_indices = [3 * node_index - 2 , 3 * node_index - 1 , 3 * node_index]
344
+ model. boundary_force[dof_indices] += nodal_force_component[:, side_node_index]
345
+ side_node_index += 1
346
+ end
347
+ end
348
+ end
349
+
316
350
function compute_rotation_matrix (axis:: SVector{3,Float64} ):: SMatrix{3,3,Float64}
317
351
e1 = @SVector [1.0 , 0.0 , 0.0 ]
318
352
angle_btwn = acos (dot (axis, e1))
@@ -846,6 +880,9 @@ function create_bcs(params::Parameters)
846
880
elseif bc_type == " Neumann"
847
881
boundary_condition = SolidMechanicsNeumannBoundaryCondition (input_mesh, bc_setting_params)
848
882
push! (boundary_conditions, boundary_condition)
883
+ elseif bc_type == " Neumann pressure"
884
+ boundary_condition = SolidMechanicsNeumannPressureBoundaryCondition (input_mesh, bc_setting_params)
885
+ push! (boundary_conditions, boundary_condition)
849
886
elseif bc_type == " Schwarz contact"
850
887
sim = params[" parent_simulation" ]
851
888
sim. controller. schwarz_contact = true
0 commit comments