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}