Skip to content

Commit 3dbac33

Browse files
committed
Updated Weibull_3p files
1 parent 8736461 commit 3dbac33

5 files changed

Lines changed: 1304 additions & 9 deletions

File tree

srlife/damage.py

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def __init__(self, pset, *args, cares_cutoff=True, page=False):
3131
page (bool): if true, page or store results to disk
3232
"""
3333
self.cares_cutoff = cares_cutoff
34-
self.shear_sensitive = pset.get_default("shear_sensitive", True)
34+
self.shear_sensitive = pset.get_default("shear_sensitive", False)
3535
self.page = page
3636
self.page_prefix = ""
3737

@@ -956,11 +956,13 @@ def calculate_volume_flaw_flattened_eq_stress(
956956
self.material = material
957957
self.mandel_stress = mandel_stress
958958

959+
self.suvals = material.threshold_vol(temperatures)
959960
self.mvals = material.modulus_vol(temperatures)
960961
N = material.Nv(temperatures)
961962
B = material.Bv(temperatures)
962963

963964
# Temperature average values
965+
suavg = np.mean(self.suvals,axis=0)
964966
mavg = np.mean(self.mvals, axis=0)
965967
Navg = np.mean(N, axis=0)
966968
Bavg = np.mean(B, axis=0)
@@ -1047,6 +1049,11 @@ def calculate_volume_flaw_flattened_eq_stress(
10471049
+ (sigma_e_max ** (Navg[..., None, None] - 2))
10481050
) ** (1 / (Navg[..., None, None] - 2))
10491051

1052+
# Subtracting threshold stress
1053+
sigma_e_0 -= suavg[...,None, None]
1054+
sigma_e_0[sigma_e_0 < 0] = 0
1055+
1056+
10501057
# Defining area integral element wise
10511058
integral = (
10521059
(sigma_e_0 ** mavg[..., None, None])
@@ -1098,6 +1105,7 @@ def calculate_surface_flaw_flattened_eq_stress(
10981105
self.material = material
10991106
self.mandel_stress = mandel_stress
11001107

1108+
suvals = material.threshold_surf(temperatures)
11011109
mvals = material.modulus_surf(temperatures)
11021110
N = material.Ns(temperatures)
11031111
B = material.Bs(temperatures)
@@ -1106,6 +1114,7 @@ def calculate_surface_flaw_flattened_eq_stress(
11061114
count_surface_elements = np.count_nonzero(surface_elements)
11071115

11081116
# Temperature average values
1117+
suavg = np.mean(suvals,axis=0)[:count_surface_elements]
11091118
mavg = np.mean(mvals, axis=0)[:count_surface_elements]
11101119
Navg = np.mean(N, axis=0)[:count_surface_elements]
11111120
Bavg = np.mean(B, axis=0)[:count_surface_elements]
@@ -1198,6 +1207,10 @@ def calculate_surface_flaw_flattened_eq_stress(
11981207
+ (sigma_e_max ** (Navg[..., None, None, None] - 2))
11991208
) ** (1 / (Navg[..., None, None, None] - 2))
12001209

1210+
# Subtracting threshold stress
1211+
sigma_e_0 -= suavg[...,None, None, None]
1212+
sigma_e_0[sigma_e_0 < 0] = 0
1213+
12011214
# Defining area integral element wise
12021215
integral = (sigma_e_0 ** mavg[..., None, None, None]) * self.ddelta
12031216

@@ -1262,8 +1275,6 @@ def calculate_volume_flaw_element_log_reliability(
12621275
mavg = np.mean(mvals, axis=0)
12631276
kavg = np.mean(kvals, axis=0)
12641277

1265-
# shear_sensitive = True
1266-
12671278
if self.shear_sensitive is True:
12681279
try:
12691280
kbar = self.calculate_volume_flaw_kbar(
@@ -1428,19 +1439,21 @@ def calculate_volume_flaw_element_log_reliability(
14281439
pstress = self.calculate_volume_principal_stress(mandel_stress)
14291440

14301441
# Material parameters
1442+
suvals = material.threshold_vol(temperatures)
14311443
svals = material.strength_vol(temperatures)
14321444
mvals = material.modulus_vol(temperatures)
14331445
kvals = svals ** (-mvals)
14341446
N = material.Nv(temperatures)
14351447
B = material.Bv(temperatures)
14361448

14371449
# Temperature average values
1450+
suavg = np.mean(suvals,axis=0)
14381451
mavg = np.mean(mvals, axis=0)
14391452
kavg = np.mean(kvals, axis=0)
14401453
Navg = np.mean(N, axis=0)
14411454
Bavg = np.mean(B, axis=0)
14421455

1443-
# Only tension
1456+
# Only tension
14441457
pstress[pstress < 0] = 0
14451458

14461459
# Max principal stresss over all time steps for each element
@@ -1463,10 +1476,15 @@ def calculate_volume_flaw_element_log_reliability(
14631476
+ (pstress_max ** (Navg[..., None] - 2))
14641477
) ** (1 / (Navg[..., None] - 2))
14651478

1466-
# Log reliability in each element
1467-
log_reliability = (
1468-
-kavg * np.sum(pstress_0 ** mavg[..., None], axis=-1) * volumes
1469-
)
1479+
# Subtracting threshold stress
1480+
pstress_0 -= suavg[...,None]
1481+
pstress_0[pstress_0 < 0] = 0
1482+
1483+
## Without threshold
1484+
log_reliability = (
1485+
-kavg * np.sum(pstress_0 ** mavg[..., None], axis=-1) * volumes
1486+
)
1487+
14701488

14711489
return log_reliability
14721490

@@ -1498,6 +1516,7 @@ def calculate_surface_flaw_element_log_reliability(
14981516
"""
14991517

15001518
# Material parameters
1519+
suvals = material.threshold_surf(temperatures)
15011520
svals = material.strength_surf(temperatures)
15021521
mvals = material.modulus_surf(temperatures)
15031522
kvals = svals ** (-mvals)
@@ -1508,6 +1527,7 @@ def calculate_surface_flaw_element_log_reliability(
15081527
count_surface_elements = np.count_nonzero(surface)
15091528

15101529
# Temperature average values
1530+
suavg = np.mean(suvals,axis=0)[:count_surface_elements]
15111531
mavg = np.mean(mvals, axis=0)[:count_surface_elements]
15121532
kavg = np.mean(kvals, axis=0)[:count_surface_elements]
15131533
Navg = np.mean(N, axis=0)[:count_surface_elements]
@@ -1545,6 +1565,10 @@ def calculate_surface_flaw_element_log_reliability(
15451565
+ (surf_pstress_max ** (Navg[..., None, None] - 2))
15461566
) ** (1 / (Navg[..., None, None] - 2))
15471567

1568+
# Subtracting threshold stress
1569+
surf_pstress_0 -= suavg[...,None, None]
1570+
surf_pstress_0[surf_pstress_0 < 0] = 0
1571+
15481572
# Summing up over last two axes i.e. over the elements of surface stress and
15491573
# surfaces for which normals are there
15501574

@@ -1586,11 +1610,13 @@ def calculate_volume_flaw_avg_normal_stress(
15861610
self.material = material
15871611
self.mandel_stress = mandel_stress
15881612

1613+
suvals = material.threshold_vol(temperatures)
15891614
mvals = material.modulus_vol(temperatures)
15901615
N = material.Nv(temperatures)
15911616
B = material.Bv(temperatures)
15921617

15931618
# Temperature average values
1619+
suavg = np.mean(suvals,axis=0)
15941620
mavg = np.mean(mvals, axis=0)
15951621
Navg = np.mean(N, axis=0)
15961622
Bavg = np.mean(B, axis=0)
@@ -1674,6 +1700,10 @@ def calculate_volume_flaw_avg_normal_stress(
16741700
+ (sigma_n_max ** (Navg[..., None, None] - 2))
16751701
) ** (1 / (Navg[..., None, None] - 2))
16761702

1703+
# Subtracting threshold stress
1704+
sigma_n_0 -= suavg[...,None, None]
1705+
sigma_n_0[sigma_n_0 < 0] = 0
1706+
16771707
integral = (
16781708
(sigma_n_0 ** mavg[..., None, None])
16791709
* np.sin(self.A)
@@ -1716,6 +1746,7 @@ def calculate_surface_flaw_avg_normal_stress(
17161746
self.material = material
17171747
self.mandel_stress = mandel_stress
17181748

1749+
suvals = material.threshold_surf(temperatures)
17191750
mvals = material.modulus_surf(temperatures)
17201751
N = material.Ns(temperatures)
17211752
B = material.Bs(temperatures)
@@ -1728,6 +1759,7 @@ def calculate_surface_flaw_avg_normal_stress(
17281759
count_surface_elements = np.count_nonzero(surface)
17291760

17301761
# Temperature average values
1762+
suavg = np.mean(suvals,axis=0)[:count_surface_elements]
17311763
mavg = np.mean(mvals, axis=0)[:count_surface_elements]
17321764
Navg = np.mean(N, axis=0)[:count_surface_elements]
17331765
Bavg = np.mean(B, axis=0)[:count_surface_elements]
@@ -1822,6 +1854,11 @@ def calculate_surface_flaw_avg_normal_stress(
18221854
+ (sigma_n_max ** (Navg[..., None, None, None] - 2))
18231855
) ** (1 / (Navg[..., None, None, None] - 2))
18241856

1857+
# Subtracting threshold stress
1858+
sigma_n_0 -= suavg[...,None, None, None]
1859+
sigma_n_0[sigma_n_0 < 0] = 0
1860+
1861+
18251862
integral = ((sigma_n_0 ** mavg[..., None, None, None]) * self.ddelta) / (
18261863
2 * np.pi
18271864
)

srlife/data/damage/SiC.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
<!-- Weibull strength should be compatible with units of K, MPa, and mm -->
22
<models type="ceramic">
33
<base type="StandardModel">
4+
<threshold_vol>
5+
<temperatures>298.15 1073.15 1273.15 1473.15 1673.15 1773.15</temperatures>
6+
<values>0.0 0.0 0.0 0.0 0.0 0.0</values>
7+
</threshold_vol>
8+
<threshold_surf>
9+
<temperatures>298.15 1073.15 1273.15 1473.15 1673.15 1773.15</temperatures>
10+
<values>0.0 0.0 0.0 0.0 0.0 0.0</values>
11+
</threshold_surf>
412
<strength_vol>
513
<temperatures>298.15 1073.15 1273.15 1473.15 1673.15 1773.15</temperatures>
614
<values>507.0 467.0 528.0 570.0 476.0 471.0</values>
@@ -37,6 +45,14 @@
3745
</fatigue_Bs>
3846
</base>
3947
<cares type="StandardModel">
48+
<threshold_vol>
49+
<temperatures>298.15 1073.15 1273.15 1473.15 1673.15 1773.15</temperatures>
50+
<values>0.0 0.0 0.0 0.0 0.0 0.0</values>
51+
</threshold_vol>
52+
<threshold_surf>
53+
<temperatures>298.15 1073.15 1273.15 1473.15 1673.15 1773.15</temperatures>
54+
<values>0.0 0.0 0.0 0.0 0.0 0.0</values>
55+
</threshold_surf>
4056
<strength_vol>
4157
<temperatures>298.15 811.15 1089.15 1366.15 1566.15</temperatures>
4258
<values>552.94 552.94 552.94 552.94 552.94</values>

srlife/materials.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,9 @@ class StandardCeramicMaterial:
708708

709709
def __init__(
710710
self,
711+
su_temperatures,
712+
threshold_v,
713+
threshold_s,
711714
s_temperatures,
712715
strengths_v,
713716
strengths_s,
@@ -727,6 +730,11 @@ def __init__(
727730
):
728731
super().__init__(*args, **kwargs)
729732

733+
self.su_temperatures = su_temperatures
734+
self.threhold_v = threshold_v
735+
self.threhold_s = threshold_s
736+
self.su_v = inter.interp1d(s_temperatures, threshold_v)
737+
self.su_s = inter.interp1d(s_temperatures, threshold_s)
730738
self.s_temperatures = s_temperatures
731739
self.strengths_v = strengths_v
732740
self.strengths_s = strengths_s
@@ -750,6 +758,18 @@ def __init__(
750758
self.Bv = inter.interp1d(Bv_temperatures, Bvvals)
751759
self.Bs = inter.interp1d(Bv_temperatures, Bsvals)
752760

761+
def threshold_vol(self, T):
762+
"""
763+
Weibull threshold parameter for volume flaws as a function of temperature
764+
"""
765+
return self.su_v(T)
766+
767+
def threshold_surf(self, T):
768+
"""
769+
Weibull threshold parameter for surface flaws as a function of temperature
770+
"""
771+
return self.su_s(T)
772+
753773
def strength_vol(self, T):
754774
"""
755775
Weibull strength for volume flaws as a function of temperature
@@ -824,6 +844,13 @@ def load(cls, node):
824844
Parameters:
825845
node: node with model
826846
"""
847+
threshold_v = node.find("threshold_vol")
848+
su_temps = threshold_v.find("temperatures")
849+
su_vals_v = threshold_v.find("values")
850+
851+
threshold_s = node.find("threshold_surf")
852+
su_vals_s = threshold_s.find("values")
853+
827854
strength_v = node.find("strength_vol")
828855
s_temps = strength_v.find("temperatures")
829856
svals_v = strength_v.find("values")
@@ -856,6 +883,9 @@ def load(cls, node):
856883
Bsvals = Bs.find("values")
857884

858885
return StandardCeramicMaterial(
886+
np.array(list(map(float, su_temps.text.strip().split()))),
887+
np.array(list(map(float, su_vals_v.text.strip().split()))),
888+
np.array(list(map(float, su_vals_s.text.strip().split()))),
859889
np.array(list(map(float, s_temps.text.strip().split()))),
860890
np.array(list(map(float, svals_v.text.strip().split()))),
861891
np.array(list(map(float, svals_s.text.strip().split()))),

0 commit comments

Comments
 (0)