delta-theory 6.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
core/materials.py ADDED
@@ -0,0 +1,688 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ ================================================================================
4
+ materials.py - 統合材料データベース
5
+ ================================================================================
6
+
7
+ δ理論で使用する全材料パラメータを一元管理
8
+
9
+ 統合元:
10
+ - materials.py (MaterialGPU)
11
+ - unified_yield_fatigue_v6_9.py (Material + MATERIALS)
12
+ - dbt_unified.py (Material + MATERIAL_FE)
13
+ - delta_fatigue_app.py (MATERIAL_DB)
14
+
15
+ Author: 環 & ご主人さま (飯泉真道)
16
+ Date: 2026-02-02
17
+ ================================================================================
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ from dataclasses import dataclass, field
23
+ from typing import ClassVar, Dict, List, Literal, Optional
24
+ import numpy as np
25
+
26
+
27
+ # ==============================================================================
28
+ # 物理定数
29
+ # ==============================================================================
30
+ eV_to_J: float = 1.602176634e-19 # 1 eV in Joule
31
+ k_B: float = 1.380649e-23 # Boltzmann constant [J/K]
32
+ PI: float = np.pi
33
+
34
+
35
+ # ==============================================================================
36
+ # 構造プリセット(BCC/FCC/HCP)
37
+ # ==============================================================================
38
+ @dataclass(frozen=True)
39
+ class StructurePreset:
40
+ """結晶構造に依存するプリセット値"""
41
+ name: str
42
+ Z_bulk: int # バルク配位数
43
+ alpha0: float # 幾何係数 (δ理論)
44
+ M_taylor: float # Taylor因子
45
+ r_th: float # 疲労限度閾値
46
+ n_cl: float # Basquin指数
47
+ desc: str # 説明
48
+
49
+
50
+ STRUCTURE_PRESETS: Dict[str, StructurePreset] = {
51
+ "BCC": StructurePreset(
52
+ name="BCC",
53
+ Z_bulk=8,
54
+ alpha0=0.289,
55
+ M_taylor=3.0,
56
+ r_th=0.65,
57
+ n_cl=10.0,
58
+ desc="Body-Centered Cubic - 明確な疲労限度",
59
+ ),
60
+ "FCC": StructurePreset(
61
+ name="FCC",
62
+ Z_bulk=12,
63
+ alpha0=0.250,
64
+ M_taylor=3.06,
65
+ r_th=0.02,
66
+ n_cl=7.0,
67
+ desc="Face-Centered Cubic - 疲労限度なし",
68
+ ),
69
+ "HCP": StructurePreset(
70
+ name="HCP",
71
+ Z_bulk=12,
72
+ alpha0=0.350,
73
+ M_taylor=4.0,
74
+ r_th=0.20,
75
+ n_cl=9.0,
76
+ desc="Hexagonal Close-Packed - 中間的挙動",
77
+ ),
78
+ }
79
+
80
+
81
+ # ==============================================================================
82
+ # 統合材料データクラス
83
+ # ==============================================================================
84
+ @dataclass
85
+ class Material:
86
+ """
87
+ 統合材料データベース
88
+
89
+ 全てのδ理論モジュールで使用する材料パラメータを一元管理
90
+
91
+ カテゴリ:
92
+ [基本] 結晶構造、格子定数、弾性定数、熱物性
93
+ [δ理論] Lindemann閾値、結合エネルギー、d電子方向性
94
+ [τ/σ] せん断/引張比、双晶因子、圧縮/引張比
95
+ [粒界] 分離仕事、偏析エネルギー (DBT用)
96
+ [疲労] 熱軟化、Born崩壊、A_int (疲労用)
97
+ [表示] プロット色
98
+ """
99
+
100
+ # ==========================================================================
101
+ # [必須] デフォルト値なし(先に定義)
102
+ # ==========================================================================
103
+ name: str # 材料名 (Fe, Cu, Al, ...)
104
+ structure: Literal["BCC", "FCC", "HCP"] # 結晶構造
105
+ a: float # 格子定数 @ 300K [m]
106
+ T_m: float # 融点 [K]
107
+ E: float # ヤング率 [Pa]
108
+ nu: float # ポアソン比
109
+ rho: float # 密度 [kg/m³]
110
+ M_amu: float # 原子質量 [amu]
111
+ delta_L: float # Lindemann閾値
112
+ E_bond_eV: float # 結合エネルギー [eV]
113
+ f_d: float # d電子方向性係数
114
+
115
+ # ==========================================================================
116
+ # [オプション] デフォルト値あり
117
+ # ==========================================================================
118
+ # 熱物性
119
+ alpha_thermal: float = 1.5e-5 # 線膨張係数 [1/K]
120
+
121
+ # τ/σ (v6.9用)
122
+ c_a: float = 1.633 # HCP c/a比 (FCC/BCCは使わない)
123
+ T_twin: float = 1.0 # 双晶因子 (引張)
124
+ R_comp: float = 1.0 # 圧縮/引張 比 (σ_c/σ_t)
125
+ A_texture: float = 1.0 # 集合組織係数
126
+
127
+ # 粒界 (DBT用)
128
+ W_sep0: float = 2.0 # 基準分離仕事 [J/m²]
129
+ delta_sep: float = 0.2e-9 # 分離変位 [m]
130
+ E_seg_eV: float = 0.45 # 偏析エネルギー [eV] (Fe-P系デフォルト)
131
+
132
+ # 疲労
133
+ lambda_base: float = 25.0 # 熱軟化パラメータ
134
+ kappa: float = 1.0 # 非線形熱軟化係数
135
+ fG: float = 0.10 # Born崩壊係数 (融点での G/G₀)
136
+ A_int: float = 1.0 # 内部スケール (Fe=1.0基準)
137
+
138
+ # 表示
139
+ color: str = "#333333" # プロット色
140
+
141
+ # ==========================================================================
142
+ # 計算プロパティ
143
+ # ==========================================================================
144
+
145
+ @property
146
+ def preset(self) -> StructurePreset:
147
+ """構造プリセットを取得"""
148
+ return STRUCTURE_PRESETS[self.structure]
149
+
150
+ @property
151
+ def Z_bulk(self) -> int:
152
+ """バルク配位数"""
153
+ return self.preset.Z_bulk
154
+
155
+ @property
156
+ def alpha0(self) -> float:
157
+ """幾何係数"""
158
+ return self.preset.alpha0
159
+
160
+ @property
161
+ def M_taylor(self) -> float:
162
+ """Taylor因子"""
163
+ return self.preset.M_taylor
164
+
165
+ @property
166
+ def r_th(self) -> float:
167
+ """疲労限度閾値"""
168
+ return self.preset.r_th
169
+
170
+ @property
171
+ def n_cl(self) -> float:
172
+ """Basquin指数"""
173
+ return self.preset.n_cl
174
+
175
+ @property
176
+ def G(self) -> float:
177
+ """剛性率 [Pa]"""
178
+ return self.E / (2 * (1 + self.nu))
179
+
180
+ @property
181
+ def b(self) -> float:
182
+ """バーガースベクトル [m]"""
183
+ if self.structure == "BCC":
184
+ return self.a * np.sqrt(3) / 2
185
+ elif self.structure == "FCC":
186
+ return self.a / np.sqrt(2)
187
+ else: # HCP
188
+ return self.a
189
+
190
+ @property
191
+ def V_act(self) -> float:
192
+ """活性化体積 [m³]"""
193
+ return self.b ** 3
194
+
195
+ @property
196
+ def E_eff(self) -> float:
197
+ """有効結合エネルギー [J]"""
198
+ return self.E_bond_eV * eV_to_J * self.alpha0 * self.f_d
199
+
200
+ # ==========================================================================
201
+ # 表示
202
+ # ==========================================================================
203
+
204
+ def __str__(self) -> str:
205
+ return f"Material({self.name}, {self.structure}, T_m={self.T_m}K)"
206
+
207
+ def summary(self) -> str:
208
+ """詳細サマリー"""
209
+ return f"""
210
+ {'='*60}
211
+ Material: {self.name} ({self.structure})
212
+ {'='*60}
213
+ [基本]
214
+ a = {self.a*1e10:.3f} Å
215
+ T_m = {self.T_m:.0f} K
216
+ E = {self.E/1e9:.0f} GPa
217
+ G = {self.G/1e9:.1f} GPa
218
+ ν = {self.nu}
219
+ ρ = {self.rho} kg/m³
220
+
221
+ [δ理論]
222
+ δ_L = {self.delta_L}
223
+ E_bond = {self.E_bond_eV} eV
224
+ f_d = {self.f_d}
225
+ α₀ = {self.alpha0} (preset)
226
+ b = {self.b*1e10:.3f} Å
227
+
228
+ [τ/σ]
229
+ T_twin = {self.T_twin}
230
+ R_comp = {self.R_comp}
231
+ A_texture = {self.A_texture}
232
+
233
+ [疲労]
234
+ r_th = {self.r_th} (preset)
235
+ n_cl = {self.n_cl} (preset)
236
+ A_int = {self.A_int}
237
+ λ_base = {self.lambda_base}
238
+ fG = {self.fG}
239
+ {'='*60}
240
+ """
241
+
242
+
243
+ # ==============================================================================
244
+ # 材料データベース
245
+ # ==============================================================================
246
+
247
+ # --------------------------------------------------------------------------
248
+ # BCC 金属
249
+ # --------------------------------------------------------------------------
250
+
251
+ Fe = Material(
252
+ name="Fe",
253
+ structure="BCC",
254
+ a=2.92e-10,
255
+ T_m=1811,
256
+ alpha_thermal=1.50e-5,
257
+ E=211e9,
258
+ nu=0.29,
259
+ rho=7870,
260
+ M_amu=55.845,
261
+ # δ理論
262
+ delta_L=0.18,
263
+ E_bond_eV=4.28,
264
+ f_d=1.5,
265
+ # τ/σ
266
+ T_twin=1.0,
267
+ R_comp=1.0,
268
+ # 粒界
269
+ W_sep0=2.0,
270
+ delta_sep=0.2e-9,
271
+ E_seg_eV=0.45,
272
+ # 疲労
273
+ lambda_base=49.2,
274
+ kappa=0.573,
275
+ fG=0.027,
276
+ A_int=1.0,
277
+ # 表示
278
+ color="#1f77b4",
279
+ )
280
+
281
+ W = Material(
282
+ name="W",
283
+ structure="BCC",
284
+ a=3.16e-10,
285
+ T_m=3695,
286
+ alpha_thermal=4.51e-6,
287
+ E=411e9,
288
+ nu=0.28,
289
+ rho=19300,
290
+ M_amu=183.84,
291
+ # δ理論
292
+ delta_L=0.16,
293
+ E_bond_eV=8.90,
294
+ f_d=4.7,
295
+ # τ/σ
296
+ T_twin=1.0,
297
+ R_comp=1.0,
298
+ # 疲労
299
+ lambda_base=10.9,
300
+ kappa=2.759,
301
+ fG=0.021,
302
+ A_int=0.85,
303
+ # 表示
304
+ color="#17becf",
305
+ )
306
+
307
+ # --------------------------------------------------------------------------
308
+ # FCC 金属
309
+ # --------------------------------------------------------------------------
310
+
311
+ Cu = Material(
312
+ name="Cu",
313
+ structure="FCC",
314
+ a=3.61e-10,
315
+ T_m=1357,
316
+ alpha_thermal=1.70e-5,
317
+ E=130e9,
318
+ nu=0.34,
319
+ rho=8960,
320
+ M_amu=63.546,
321
+ # δ理論
322
+ delta_L=0.10,
323
+ E_bond_eV=3.49,
324
+ f_d=2.0,
325
+ # τ/σ
326
+ T_twin=1.0,
327
+ R_comp=1.0,
328
+ # 疲労
329
+ lambda_base=26.3,
330
+ kappa=1.713,
331
+ fG=0.101,
332
+ A_int=1.41,
333
+ # 表示
334
+ color="#d62728",
335
+ )
336
+
337
+ Al = Material(
338
+ name="Al",
339
+ structure="FCC",
340
+ a=4.05e-10,
341
+ T_m=933,
342
+ alpha_thermal=2.30e-5,
343
+ E=70e9,
344
+ nu=0.35,
345
+ rho=2700,
346
+ M_amu=26.982,
347
+ # δ理論
348
+ delta_L=0.10,
349
+ E_bond_eV=3.39,
350
+ f_d=1.6,
351
+ # τ/σ
352
+ T_twin=1.0,
353
+ R_comp=1.0,
354
+ # 疲労
355
+ lambda_base=27.3,
356
+ kappa=4.180,
357
+ fG=0.101,
358
+ A_int=0.71,
359
+ # 表示
360
+ color="#2ca02c",
361
+ )
362
+
363
+ Ni = Material(
364
+ name="Ni",
365
+ structure="FCC",
366
+ a=3.52e-10,
367
+ T_m=1728,
368
+ alpha_thermal=1.30e-5,
369
+ E=200e9,
370
+ nu=0.31,
371
+ rho=8900,
372
+ M_amu=58.693,
373
+ # δ理論
374
+ delta_L=0.11,
375
+ E_bond_eV=4.44,
376
+ f_d=2.6,
377
+ # τ/σ
378
+ T_twin=1.0,
379
+ R_comp=1.0,
380
+ # 疲労
381
+ lambda_base=22.6,
382
+ kappa=0.279,
383
+ fG=0.092,
384
+ A_int=1.37,
385
+ # 表示
386
+ color="#ff7f0e",
387
+ )
388
+
389
+ Au = Material(
390
+ name="Au",
391
+ structure="FCC",
392
+ a=4.08e-10,
393
+ T_m=1337,
394
+ alpha_thermal=1.42e-5,
395
+ E=79e9,
396
+ nu=0.44,
397
+ rho=19300,
398
+ M_amu=196.967,
399
+ # δ理論
400
+ delta_L=0.10,
401
+ E_bond_eV=3.81,
402
+ f_d=1.1,
403
+ # τ/σ
404
+ T_twin=1.0,
405
+ R_comp=1.0,
406
+ # 疲労
407
+ lambda_base=25.0,
408
+ kappa=1.5,
409
+ fG=0.101,
410
+ A_int=1.0,
411
+ # 表示
412
+ color="#e377c2",
413
+ )
414
+
415
+ Ag = Material(
416
+ name="Ag",
417
+ structure="FCC",
418
+ a=4.09e-10,
419
+ T_m=1235,
420
+ alpha_thermal=1.89e-5,
421
+ E=83e9,
422
+ nu=0.37,
423
+ rho=10490,
424
+ M_amu=107.868,
425
+ # δ理論
426
+ delta_L=0.10,
427
+ E_bond_eV=2.95,
428
+ f_d=2.0,
429
+ # τ/σ
430
+ T_twin=1.0,
431
+ R_comp=1.0,
432
+ # 疲労
433
+ lambda_base=24.0,
434
+ kappa=1.8,
435
+ fG=0.101,
436
+ A_int=1.0,
437
+ # 表示
438
+ color="#bcbd22",
439
+ )
440
+
441
+ # --------------------------------------------------------------------------
442
+ # HCP 金属
443
+ # --------------------------------------------------------------------------
444
+
445
+ Ti = Material(
446
+ name="Ti",
447
+ structure="HCP",
448
+ a=2.95e-10,
449
+ T_m=1941,
450
+ alpha_thermal=8.60e-6,
451
+ E=116e9,
452
+ nu=0.32,
453
+ rho=4500,
454
+ M_amu=47.867,
455
+ # δ理論
456
+ delta_L=0.10,
457
+ E_bond_eV=4.85,
458
+ f_d=5.7,
459
+ # τ/σ
460
+ c_a=1.587,
461
+ T_twin=1.0,
462
+ R_comp=1.0,
463
+ # 疲労
464
+ lambda_base=43.1,
465
+ kappa=0.771,
466
+ fG=0.101,
467
+ A_int=1.10,
468
+ # 表示
469
+ color="#9467bd",
470
+ )
471
+
472
+ Mg = Material(
473
+ name="Mg",
474
+ structure="HCP",
475
+ a=3.21e-10,
476
+ T_m=923,
477
+ alpha_thermal=2.70e-5,
478
+ E=45e9,
479
+ nu=0.29,
480
+ rho=1740,
481
+ M_amu=24.305,
482
+ # δ理論
483
+ delta_L=0.117,
484
+ E_bond_eV=1.51,
485
+ f_d=8.2,
486
+ # τ/σ
487
+ c_a=1.624,
488
+ T_twin=0.6, # 双晶活性
489
+ R_comp=0.6, # 圧縮異方性
490
+ # 疲労
491
+ lambda_base=7.5,
492
+ kappa=37.568,
493
+ fG=0.082,
494
+ A_int=0.60,
495
+ # 表示
496
+ color="#8c564b",
497
+ )
498
+
499
+ Zn = Material(
500
+ name="Zn",
501
+ structure="HCP",
502
+ a=2.66e-10,
503
+ T_m=693,
504
+ alpha_thermal=3.02e-5,
505
+ E=108e9,
506
+ nu=0.25,
507
+ rho=7140,
508
+ M_amu=65.38,
509
+ # δ理論
510
+ delta_L=0.12,
511
+ E_bond_eV=1.35,
512
+ f_d=2.0,
513
+ # τ/σ
514
+ c_a=1.856,
515
+ T_twin=0.9,
516
+ R_comp=1.2,
517
+ # 疲労
518
+ lambda_base=15.0,
519
+ kappa=5.0,
520
+ fG=0.075,
521
+ A_int=0.75,
522
+ # 表示
523
+ color="#7f7f7f",
524
+ )
525
+
526
+
527
+ # ==============================================================================
528
+ # 材料データベース辞書
529
+ # ==============================================================================
530
+
531
+ MATERIALS: Dict[str, Material] = {
532
+ # BCC
533
+ "Fe": Fe, "Iron": Fe, "SECD": Fe,
534
+ "W": W, "Tungsten": W,
535
+ # FCC
536
+ "Cu": Cu, "Copper": Cu, "FCC_Cu": Cu,
537
+ "Al": Al, "Aluminum": Al,
538
+ "Ni": Ni, "Nickel": Ni,
539
+ "Au": Au, "Gold": Au,
540
+ "Ag": Ag, "Silver": Ag,
541
+ # HCP
542
+ "Ti": Ti, "Titanium": Ti,
543
+ "Mg": Mg, "Magnesium": Mg,
544
+ "Zn": Zn, "Zinc": Zn,
545
+ }
546
+
547
+
548
+ def get_material(name: str) -> Material:
549
+ """名前から材料を取得"""
550
+ if name not in MATERIALS:
551
+ available = list_materials()
552
+ raise ValueError(f"Unknown material: {name}. Available: {available}")
553
+ return MATERIALS[name]
554
+
555
+
556
+ def list_materials() -> List[str]:
557
+ """主要材料一覧"""
558
+ return ["Fe", "W", "Cu", "Al", "Ni", "Au", "Ag", "Ti", "Mg", "Zn"]
559
+
560
+
561
+ def list_by_structure(structure: str) -> List[str]:
562
+ """構造別材料一覧"""
563
+ return [name for name in list_materials()
564
+ if MATERIALS[name].structure == structure]
565
+
566
+
567
+ # ==============================================================================
568
+ # 後方互換: MaterialGPU クラス (既存コードとの互換用)
569
+ # ==============================================================================
570
+
571
+ class MaterialGPU:
572
+ """
573
+ 後方互換用ラッパー
574
+
575
+ 既存の materials.py を使用しているコードのために、
576
+ 同じインターフェースを提供
577
+ """
578
+
579
+ @classmethod
580
+ def Fe(cls) -> Material:
581
+ return Fe
582
+
583
+ @classmethod
584
+ def W(cls) -> Material:
585
+ return W
586
+
587
+ @classmethod
588
+ def Cu(cls) -> Material:
589
+ return Cu
590
+
591
+ @classmethod
592
+ def Al(cls) -> Material:
593
+ return Al
594
+
595
+ @classmethod
596
+ def Ni(cls) -> Material:
597
+ return Ni
598
+
599
+ @classmethod
600
+ def Au(cls) -> Material:
601
+ return Au
602
+
603
+ @classmethod
604
+ def Ag(cls) -> Material:
605
+ return Ag
606
+
607
+ @classmethod
608
+ def Ti(cls) -> Material:
609
+ return Ti
610
+
611
+ @classmethod
612
+ def Mg(cls) -> Material:
613
+ return Mg
614
+
615
+ @classmethod
616
+ def Zn(cls) -> Material:
617
+ return Zn
618
+
619
+ # エイリアス
620
+ @classmethod
621
+ def SECD(cls) -> Material:
622
+ return Fe
623
+
624
+ @classmethod
625
+ def Iron(cls) -> Material:
626
+ return Fe
627
+
628
+ @classmethod
629
+ def Copper(cls) -> Material:
630
+ return Cu
631
+
632
+ @classmethod
633
+ def Aluminum(cls) -> Material:
634
+ return Al
635
+
636
+ @classmethod
637
+ def FCC_Cu(cls) -> Material:
638
+ return Cu
639
+
640
+ @classmethod
641
+ def list_materials(cls) -> List[str]:
642
+ return list_materials()
643
+
644
+ @classmethod
645
+ def get(cls, name: str) -> Material:
646
+ return get_material(name)
647
+
648
+
649
+ # ==============================================================================
650
+ # テスト
651
+ # ==============================================================================
652
+
653
+ if __name__ == "__main__":
654
+ print("=" * 60)
655
+ print("統合材料データベース テスト")
656
+ print("=" * 60)
657
+
658
+ print("\n[利用可能な材料]")
659
+ print(f" 全体: {list_materials()}")
660
+ print(f" BCC: {list_by_structure('BCC')}")
661
+ print(f" FCC: {list_by_structure('FCC')}")
662
+ print(f" HCP: {list_by_structure('HCP')}")
663
+
664
+ print("\n[構造プリセット]")
665
+ for name, preset in STRUCTURE_PRESETS.items():
666
+ print(f" {name}: r_th={preset.r_th}, n_cl={preset.n_cl}, α₀={preset.alpha0}")
667
+
668
+ print("\n[材料サマリー: Fe]")
669
+ print(Fe.summary())
670
+
671
+ print("\n[材料サマリー: Cu]")
672
+ print(Cu.summary())
673
+
674
+ print("\n[材料サマリー: Mg]")
675
+ print(Mg.summary())
676
+
677
+ print("\n[計算プロパティ確認]")
678
+ for name in ["Fe", "Cu", "Ti"]:
679
+ mat = get_material(name)
680
+ print(f" {name}: b={mat.b*1e10:.3f}Å, G={mat.G/1e9:.1f}GPa, "
681
+ f"V_act={mat.V_act*1e30:.3f}ų")
682
+
683
+ print("\n[後方互換テスト]")
684
+ mat_gpu = MaterialGPU.get("Fe")
685
+ print(f" MaterialGPU.get('Fe'): {mat_gpu}")
686
+ print(f" MaterialGPU.Fe(): {MaterialGPU.Fe()}")
687
+
688
+ print("\n✅ テスト完了!")