Skip to main content

squid_n_core/model/
material.rs

1//! 材料の型。
2//!
3//! - [`MaterialCategory`] — 材料の区分(鋼材・鉄筋・コンクリート)。
4//! - [`Material`] — 材料(区分・ヤング率・ポアソン比・密度・強度等)。
5
6use super::*;
7
8/// 材料の区分。
9///
10/// 部材が S 造か RC 造かは、断面形状ではなく**この区分で判定する**
11/// ([`crate::structure_kind`])。断面形状は見た目であって力学的な性質ではなく、
12/// H 形のコンクリート部材・矩形断面の鋼部材のいずれもありうるためである。
13/// 任意の材料と任意の断面の組み合わせでも、どの検定式を適用すべきかが定まる。
14///
15/// SRC・CFT は 1 つの材料では表せない複合断面なので、断面形状の側で判定する
16/// (`SrcRect` は内蔵鉄骨のグレードを断面に持ち、CFT は `Material::fc` を
17/// 充填コンクリートの強度として使う)。
18#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
19pub enum MaterialCategory {
20    /// 構造用鋼材。
21    Steel,
22    /// 鉄筋。RC 部材の主筋・せん断補強筋に用いる。
23    ///
24    /// 材料としては鋼だが、これを割り当てた線材は S 造ではない。RC 断面の配筋は
25    /// 断面側(`RcRebar`)にグレード名として持つため、線材の材料として
26    /// 鉄筋を割り当てるのは入力の誤りである。
27    Rebar,
28    /// コンクリート。
29    Concrete,
30}
31
32impl MaterialCategory {
33    /// UI 表示名。
34    pub fn label(&self) -> &'static str {
35        match self {
36            MaterialCategory::Steel => "鋼材",
37            MaterialCategory::Rebar => "鉄筋",
38            MaterialCategory::Concrete => "コンクリート",
39        }
40    }
41}
42
43#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
44pub struct Material {
45    pub id: MaterialId,
46    pub name: String,
47    /// 材料の区分。S 造・RC 造の判定はこの値による([`MaterialCategory`])。
48    pub category: MaterialCategory,
49    pub young: f64,
50    pub poisson: f64,
51    pub density: f64,
52    #[serde(default)]
53    pub shear: Option<f64>,
54    /// コンクリート設計基準強度 Fc [N/mm²]。
55    /// 鋼材では `None`。RC 設計(令91条)の許容圧縮・せん断に用いる。
56    #[serde(default)]
57    pub fc: Option<f64>,
58    /// 降伏応力 fy [N/mm²]。鋼材の弾塑性挙動(ファイバ材料・端ばねスケルトン)に用いる。
59    /// `None` の場合、ファイバ材料は弾性(降伏しない)として扱う(P5 非線形)。
60    #[serde(default)]
61    pub fy: Option<f64>,
62    /// コンクリートの種類(普通/軽量1種/軽量2種)。固定荷重の
63    /// 単位体積重量表・許容応力度低減(軽量コンクリートは
64    /// 普通コンクリートの 0.9 倍。技術基準解説書)に用いる。鋼材では意味を持たない(既定 Normal)。
65    /// 旧スキーマ(フィールド無し)は Normal 扱い。
66    #[serde(default)]
67    pub concrete_class: crate::units::ConcreteClass,
68    /// 保有水平耐力計算(プッシュオーバー)用の材料強度割増係数の直接入力。
69    /// `None`(既定)の場合は自動判定(鋼材グレードは 1.1、590N 級の
70    /// SA440・TMCP440 は 1.05、RC 主筋は 1.1。せん断補強筋は割増対象外)。
71    /// 直接入力材料など自動判定できない材料に対して割増を指定する用途。
72    /// 許容応力度計算(一次設計)には影響しない。
73    /// 旧スキーマ(フィールド無し)は None(自動判定)扱い。
74    #[serde(default)]
75    pub strength_factor: Option<f64>,
76}
77
78impl Material {
79    pub fn shear_modulus(&self) -> f64 {
80        self.shear
81            .unwrap_or_else(|| self.young / (2.0 * (1.0 + self.poisson)))
82    }
83}