Skip to main content

runmat_analysis_core/problem/
structure.rs

1use 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}