[1]:
%matplotlib inline
%load_ext autoreload
%autoreload 2
[2]:
import matplotlib.pyplot as plt
from helpr.api import CrackEvolutionAnalysis
from helpr.physics.environment import EnvironmentSpecification
from helpr.physics.crack_growth import get_design_curve
from helpr.physics.stress_state import calc_r_ratio
from helpr.physics.stress_state import calc_r_ratio
from helpr.utilities.unit_conversion import convert_ksi_to_mpa, convert_in_to_m
from probabilistic.capabilities.uncertainty_definitions import DeterministicCharacterization
[3]:
# turn warnings back on for general use
import warnings
warnings.filterwarnings('ignore')
Demonstration of Crack Growth Curves
[4]:
pipe_outer_diameter = DeterministicCharacterization(name='outer_diameter',
value=convert_in_to_m(36)) # 36 inch outer diameter
wall_thickness = DeterministicCharacterization(name='wall_thickness',
value=convert_in_to_m(0.406)) # 0.406 inch wall thickness
yield_strength = DeterministicCharacterization(name='yield_strength',
value=convert_ksi_to_mpa(52)) # material yield strength of 52 ksi
fracture_resistance = DeterministicCharacterization(name='fracture_resistance', value=55)
max_pressure = DeterministicCharacterization(name='max_pressure',
value=convert_ksi_to_mpa(0.85)) # maximum pressure during oscillation MPa
min_pressure = DeterministicCharacterization(name='min_pressure',
value=convert_ksi_to_mpa(0.638)) # minimum pressure during oscillation (or R = 0.75)
temperature = DeterministicCharacterization(name='temperature',
value=293) # K -> temperature of gas degrees C
volume_fraction_h2 = DeterministicCharacterization(name='volume_fraction_h2',
value=0.1) # % mole fraction H2 in natural gas blend
flaw_depth = DeterministicCharacterization(name='flaw_depth',
value=25) # flaw 5% through pipe thickness
flaw_length = DeterministicCharacterization(name='flaw_length',
value=convert_in_to_m(1.575)) # length of initial crack/flaw, m
[5]:
analysis = CrackEvolutionAnalysis(outer_diameter=pipe_outer_diameter,
wall_thickness=wall_thickness,
max_pressure=max_pressure,
min_pressure=min_pressure,
temperature=temperature,
volume_fraction_h2=volume_fraction_h2,
yield_strength=yield_strength,
fracture_resistance=fracture_resistance,
flaw_length=flaw_length,
flaw_depth=flaw_depth)
analysis.perform_study()
Crack Growth Curves for Different Hydrogen Volume Fractions
[6]:
environment_0 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=0)
environment_1 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=0.01)
environment_2 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=0.1)
environment_3 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=1)
analysis.postprocess_single_crack_results()
specified_r=calc_r_ratio(k_min=environment_0.min_pressure,
k_max=environment_0.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_0)
plt.plot(dk, da_dn, 'r--', zorder=2)
specified_r=calc_r_ratio(k_min=environment_1.min_pressure,
k_max=environment_1.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_1)
plt.plot(dk, da_dn, 'g-.', zorder=2)
specified_r=calc_r_ratio(k_min=environment_2.min_pressure,
k_max=environment_2.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_2)
plt.plot(dk, da_dn, 'm-', zorder=2)
specified_r=calc_r_ratio(k_min=environment_3.min_pressure,
k_max=environment_3.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_3)
plt.plot(dk, da_dn, 'b:', zorder=2)
plt.title(r'Varying $\chi_{H_2}$; R=0.75; P$_{max}$=850psi')
plt.legend([r'Exercised Rates ($\chi_{H_2}$=0.1)', '$\chi_{H_2}$=0', '$\chi_{H_2}$=0.01', '$\chi_{H_2}$=0.1', '$\chi_{H_2}$=1'], loc='upper left');
Cycles to a(crit) Cycles to 25% a(crit) Cycles to 1/2 Nc \
Total cycles 13429.245632 1.000000 6714.622816
a/t 0.330777 0.082694 0.270571
Cycles to FAD line
Total cycles 11234.120022
a/t 0.298563
Crack Growth Curves for Different Load Ratios (R)
[7]:
environment = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_0 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=max_pressure.value*.9,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_1 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=max_pressure.value*.75,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_2 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=max_pressure.value*.5,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_3 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=max_pressure.value*.1,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
analysis.postprocess_single_crack_results()
specified_r=calc_r_ratio(k_min=environment_0.min_pressure,
k_max=environment_0.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_0)
plt.plot(dk, da_dn, 'r--', zorder=2)
specified_r=calc_r_ratio(k_min=environment_1.min_pressure,
k_max=environment_1.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_1)
plt.plot(dk, da_dn, 'g-.', zorder=2)
specified_r=calc_r_ratio(k_min=environment_2.min_pressure,
k_max=environment_2.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_2)
plt.plot(dk, da_dn, 'm-', zorder=2)
specified_r=calc_r_ratio(k_min=environment_3.min_pressure,
k_max=environment_3.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_3)
plt.plot(dk, da_dn, 'b:', zorder=2)
plt.legend([f'Exercised Rates \n (R={min_pressure.value/max_pressure.value:.2f})', 'R=0.9', 'R=0.75', 'R=0.5', 'R=0.1'], loc='upper left')
mole_frac_string = f"={analysis.nominal_input_parameter_values['volume_fraction_h2'][0]:.2f}; "
plt.title(r'Varying R; $\chi_{H_2}$' + mole_frac_string + r'P$_{max}$=840psi');
Cycles to a(crit) Cycles to 25% a(crit) Cycles to 1/2 Nc \
Total cycles 13429.245632 1.000000 6714.622816
a/t 0.330777 0.082694 0.270571
Cycles to FAD line
Total cycles 11234.120022
a/t 0.298563
Crack Growth Curves for Different Max Pressures
[8]:
environment_0 = EnvironmentSpecification(max_pressure=convert_ksi_to_mpa(4),
min_pressure=convert_ksi_to_mpa(4)*.75,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_1 = EnvironmentSpecification(max_pressure=convert_ksi_to_mpa(0.85),
min_pressure=convert_ksi_to_mpa(0.85)*.75,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_2 = EnvironmentSpecification(max_pressure=convert_ksi_to_mpa(0.05),
min_pressure=convert_ksi_to_mpa(0.05)*.75,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
environment_3 = EnvironmentSpecification(max_pressure=convert_ksi_to_mpa(0.005),
min_pressure=convert_ksi_to_mpa(0.005)*.75,
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=analysis.nominal_input_parameter_values['volume_fraction_h2'])
analysis.postprocess_single_crack_results()
specified_r = calc_r_ratio(k_min=environment_0.min_pressure,
k_max=environment_0.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_0)
plt.plot(dk, da_dn, 'r--', zorder=2)
specified_r = calc_r_ratio(k_min=environment_1.min_pressure,
k_max=environment_1.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_1)
plt.plot(dk, da_dn, 'g-.', zorder=2)
specified_r = calc_r_ratio(k_min=environment_2.min_pressure,
k_max=environment_2.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_2)
plt.plot(dk, da_dn, 'm-', zorder=2)
specified_r = calc_r_ratio(k_min=environment_3.min_pressure,
k_max=environment_3.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_3)
plt.plot(dk, da_dn, 'b:', zorder=2)
mole_frac_string = f"={analysis.nominal_input_parameter_values['volume_fraction_h2'][0]:.2f}; "
plt.legend([f'Exercised Rates \n (850)', '4000', '850', '50', '5'], title=r'P$_{max} (psi)$', loc='upper left')
plt.title(r'Varying P$_{max}$; $\chi_{H_2}$' + mole_frac_string + f'R=0.75');
Cycles to a(crit) Cycles to 25% a(crit) Cycles to 1/2 Nc \
Total cycles 13429.245632 1.000000 6714.622816
a/t 0.330777 0.082694 0.270571
Cycles to FAD line
Total cycles 11234.120022
a/t 0.298563
Crack Growth Curve For Air
[9]:
volume_fraction_h2 = DeterministicCharacterization(name='volume_fraction_h2',
value=0) # % mole fraction H2 in natural gas blend
analysis = CrackEvolutionAnalysis(outer_diameter=pipe_outer_diameter,
wall_thickness=wall_thickness,
max_pressure=max_pressure,
min_pressure=min_pressure,
temperature=temperature,
volume_fraction_h2=volume_fraction_h2,
yield_strength=yield_strength,
fracture_resistance=fracture_resistance,
flaw_length=flaw_length,
flaw_depth=flaw_depth)
analysis.perform_study()
[10]:
environment_0 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=0)
environment_1 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=0.01)
environment_2 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=0.1)
environment_3 = EnvironmentSpecification(max_pressure=analysis.nominal_input_parameter_values['max_pressure'],
min_pressure=analysis.nominal_input_parameter_values['min_pressure'],
temperature=analysis.nominal_input_parameter_values['temperature'],
volume_fraction_h2=1)
analysis.postprocess_single_crack_results()
specified_r = calc_r_ratio(k_min=environment_0.min_pressure,
k_max=environment_0.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_0)
plt.plot(dk, da_dn, 'r--', zorder=2)
specified_r = calc_r_ratio(k_min=environment_1.min_pressure,
k_max=environment_1.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_1)
plt.plot(dk, da_dn, 'g-.', zorder=2)
specified_r = calc_r_ratio(k_min=environment_2.min_pressure,
k_max=environment_2.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_2)
plt.plot(dk, da_dn, 'm-', zorder=2)
specified_r = calc_r_ratio(k_min=environment_3.min_pressure,
k_max=environment_3.max_pressure,
k_res=0)
dk, da_dn = get_design_curve(specified_r=specified_r,
environment_obj=environment_3)
plt.plot(dk, da_dn, 'b:', zorder=2)
plt.title(r'Varying $\chi_{H_2}$; R=0.75; P$_{max}$=840psi')
plt.legend([r'Exercised Rates ($\chi_{H_2}$=0)', '$\chi_{H_2}$=0 (Air)', '$\chi_{H_2}$=0.01', '$\chi_{H_2}$=0.1', '$\chi_{H_2}$=1'], loc='upper left');
Cycles to a(crit) Cycles to 25% a(crit) Cycles to 1/2 Nc \
Total cycles 83795.842870 1.000000 41897.921435
a/t 0.330777 0.082694 0.279891
Cycles to FAD line
Total cycles 60638.160647
a/t 0.298563