runmat_analysis_core/problem/
structure.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
4pub struct StructuralModel {
5 #[serde(default)]
6 pub nodes: Vec<StructuralNode>,
7 #[serde(default)]
8 pub elements: Vec<StructuralElement>,
9 #[serde(default)]
10 pub beam_sections: Vec<BeamSectionModel>,
11 #[serde(default)]
12 pub shell_sections: Vec<ShellSectionModel>,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
16pub struct StructuralNode {
17 pub node_id: u32,
18 pub coordinates_m: [f64; 3],
19}
20
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
22pub struct StructuralElement {
23 pub element_id: String,
24 pub region_id: String,
25 pub kind: StructuralElementKind,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29#[serde(rename_all = "snake_case")]
30pub enum StructuralElementKind {
31 Beam(BeamElementModel),
32 Shell(ShellElementModel),
33}
34
35#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
36pub struct BeamElementModel {
37 pub node_ids: [u32; 2],
38 pub section_id: String,
39 #[serde(default = "default_beam_reference_axis")]
40 pub reference_axis: [f64; 3],
41}
42
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
44pub struct ShellElementModel {
45 pub node_ids: [u32; 3],
46 pub section_id: String,
47 #[serde(default = "default_shell_reference_axis")]
48 pub reference_axis: [f64; 3],
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub struct BeamSectionModel {
53 pub section_id: String,
54 pub area_m2: f64,
55 pub iy_m4: f64,
56 pub iz_m4: f64,
57 pub torsion_j_m4: f64,
58 #[serde(default)]
59 pub outer_fiber_y_m: f64,
60 #[serde(default)]
61 pub outer_fiber_z_m: f64,
62 #[serde(default)]
63 pub torsion_outer_radius_m: f64,
64}
65
66#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
67pub struct ShellSectionModel {
68 pub section_id: String,
69 pub thickness_m: f64,
70 #[serde(default = "default_shell_shear_correction")]
71 pub shear_correction: f64,
72 #[serde(default = "default_shell_drilling_stiffness_scale")]
73 pub drilling_stiffness_scale: f64,
74}
75
76fn default_beam_reference_axis() -> [f64; 3] {
77 [0.0, 0.0, 1.0]
78}
79
80fn default_shell_reference_axis() -> [f64; 3] {
81 [1.0, 0.0, 0.0]
82}
83
84fn default_shell_shear_correction() -> f64 {
85 5.0 / 6.0
86}
87
88fn default_shell_drilling_stiffness_scale() -> f64 {
89 1.0e-4
90}