Skip to main content

squid_n_core/model/
constraint.rs

1//! 拘束条件の型。
2//!
3//! - [`Constraint`] — 剛床・MPC・剛リンクの拘束定義。
4
5use super::*;
6use crate::dof::Dof;
7
8#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
9pub enum Constraint {
10    /// 剛床(面内剛体ダイアフラム)。**剛床の唯一の情報源**であり、階
11    /// ([`Story`])は剛床を保持しない(階と剛床は別概念。`model::story` の
12    /// モジュールドキュメント参照)。階から剛床を辿るときは
13    /// [`Model::diaphragms_of`] を使う。
14    ///
15    /// この拘束が存在すること自体が「面内剛体である」ことを意味する。
16    /// スレーブ節点は階のレベル上にある節点に限る
17    /// ([`Model::on_diaphragm_level`])。
18    RigidDiaphragm {
19        /// この剛床が属する階。1 つの階が複数の剛床を持つことがある(段差床)。
20        story: StoryId,
21        master: NodeId,
22        slaves: Vec<NodeId>,
23        /// この剛床が負担する地震用重量 [N]。多剛床の階では層の水平力 Pi を
24        /// 剛床ごとの重量比で分配するために用いる(多剛床の設計用せん断力。
25        /// 令88条・昭55建告1793号)。None は未算定(階に単一剛床なら層重量全量)。
26        #[serde(default)]
27        weight: Option<f64>,
28        /// 副剛床の層せん断力係数 Ci の直接入力(令88条・昭55建告1793号の
29        /// 層せん断力係数)。Some の剛床は主系統の Ai 分布から除外され、
30        /// 水平力 = ci_override × 剛床重量(等価震度扱い。上階に同一系統の
31        /// 剛床が積み上がらない副剛床を想定)として作用する。
32        /// None は主系統(Ai 分布)。
33        #[serde(default)]
34        ci_override: Option<f64>,
35    },
36    Mpc {
37        master: NodeId,
38        terms: Vec<(NodeId, Dof, f64)>,
39    },
40    RigidLink {
41        master: NodeId,
42        slaves: Vec<NodeId>,
43        dofs: Dof6Mask,
44    },
45}
46
47impl Constraint {
48    /// 重量・Ci 指定を持たない剛床拘束を作る。
49    ///
50    /// 階に剛床が 1 つだけの場合、水平力はその剛床へ全量載るため重量比の按分が
51    /// 不要になる([`Model::diaphragms_of`] を用いる分配側の規則)。多剛床の階を
52    /// 作るときだけ `weight`・`ci_override` を明示的に設定する。
53    pub fn rigid_diaphragm(story: StoryId, master: NodeId, slaves: Vec<NodeId>) -> Self {
54        Constraint::RigidDiaphragm {
55            story,
56            master,
57            slaves,
58            weight: None,
59            ci_override: None,
60        }
61    }
62}