[1]:
%matplotlib inline
%load_ext autoreload
%autoreload 2
[2]:
import numpy as np
import matplotlib.pyplot as plt
from helpr.physics.api import CrackEvolutionAnalysis
from helpr.physics.pipe import Pipe
from helpr.physics.crack_initiation import DefectSpecification
from helpr.physics.environment import EnvironmentSpecification
from helpr.physics.material import MaterialSpecification
from helpr.physics.stress_state import InternalAxialHoopStress
from helpr.physics.cycle_evolution import CycleEvolution
from helpr.physics.crack_growth import CrackGrowth, get_design_curve
from helpr.utilities.unit_conversion import convert_psi_to_mpa, convert_in_to_m
from helpr.utilities.plots import generate_pipe_life_assessment_plot
from helpr.utilities.postprocessing import calc_pipe_life_criteria, report_single_pipe_life_criteria_results, report_single_cycle_evolution
from probabilistic.capabilities.uncertainty_definitions import DeterministicCharacterization
Single Deterministic Pipeline Lifetime Evaluation
Problem Specification
Geometry
[3]:
pipe_outer_diameter = convert_in_to_m(36) # 36 inch outer diameter
wall_thickness = convert_in_to_m(0.406) # 0.406 inch wall thickness
Material Properties
[4]:
yield_strength = convert_psi_to_mpa(52_000) # material yield strength of 52_000 psi
fracture_resistance = 55 # fracture resistance (toughness) MPa m1/2
Operating Conditions
[5]:
max_pressure = convert_psi_to_mpa(840) # maximum pressure during oscillation MPa
min_pressure = convert_psi_to_mpa(638) # minimum pressure during oscillation (or R = 0.75)
temperature = 293 # K -> temperature of gas degrees C
volume_fraction_h2 = 1 # % mole fraction H2 in natural gas blend
Initial Crack Dimensions
[6]:
flaw_depth = 25 # flaw 25% through pipe thickness
flaw_length = convert_in_to_m(1.575) # width of initial crack/flaw, m
Physics Modeling Choices
[7]:
stress_intensity_method = 'api' # Stress intensity factor method used
surface = 'inside'
Modular Analysis
Create Pipe Object
[8]:
pipe_module = Pipe(outer_diameter=pipe_outer_diameter,
wall_thickness=wall_thickness)
Specify Pipe Material Properties
[9]:
material_module = MaterialSpecification(yield_strength=yield_strength,
fracture_resistance=fracture_resistance)
Specify Defect
[10]:
defect_module = DefectSpecification(flaw_depth=flaw_depth,
flaw_length=flaw_length,
surface=surface)
Specify Pipe Gaseous Environment
[11]:
environment_module = EnvironmentSpecification(max_pressure=max_pressure,
min_pressure=min_pressure,
temperature=temperature,
volume_fraction_h2=volume_fraction_h2)
Determine Stress Environment on Pipe
[12]:
stress_module = InternalAxialHoopStress(pipe=pipe_module,
environment=environment_module,
material=material_module,
defect=defect_module,
stress_intensity_method=stress_intensity_method)
Specify Crack Growth Model
[13]:
crack_growth_module = CrackGrowth(environment=environment_module,
growth_model_specification={'model_name': 'code_case_2938'})
Evolve Cracks Over Cycles to Failure
[14]:
pipe_evaluation = CycleEvolution(pipe=pipe_module,
stress_state=stress_module,
defect=defect_module,
environment=environment_module,
material=material_module,
crack_growth_model=crack_growth_module)
load_cycling = pipe_evaluation.calc_life_assessment()
Postprocess QoIs (life criteria)
[15]:
life_criteria = calc_pipe_life_criteria(cycle_results=load_cycling,
pipe=pipe_module,
material=material_module)
Plot QoI
[16]:
specific_life_criteria_result = report_single_pipe_life_criteria_results(life_criteria, pipe_index=0)
specific_load_cycling = report_single_cycle_evolution(load_cycling, pipe_index=0)
generate_pipe_life_assessment_plot(specific_load_cycling, specific_life_criteria_result, 'Test Pipe')
plt.savefig('./Figures/deterministic_crack_growth.png', format='png', dpi=300)
Cycles to a(crit) Cycles to 25% a(crit) Cycles to 1/2 Nc
Total cycles 58168.074078 1.000000 29084.037039
a/t 0.499076 0.124769 0.288095

Interact with Modular Analysis Through API
Specify Problem, Initiate Crack, and Evolve Crack to Failure
[17]:
analysis = CrackEvolutionAnalysis(outer_diameter=DeterministicCharacterization(name='outer_diameter', value=pipe_outer_diameter),
wall_thickness=DeterministicCharacterization(name='wall_thickness', value=wall_thickness),
flaw_depth=DeterministicCharacterization(name='flaw_depth', value=flaw_depth),
max_pressure=DeterministicCharacterization(name='max_pressure', value=max_pressure),
min_pressure=DeterministicCharacterization(name='min_pressure', value=min_pressure),
temperature=DeterministicCharacterization(name='temperature', value=temperature),
volume_fraction_h2=DeterministicCharacterization(name='volume_fraction_h2', value=volume_fraction_h2),
yield_strength=DeterministicCharacterization(name='yield_strength', value=yield_strength),
fracture_resistance=DeterministicCharacterization(name='fracture_resistance', value=fracture_resistance),
flaw_length=DeterministicCharacterization(name='flaw_length', value=flaw_length),
stress_intensity_method=stress_intensity_method,
surface=surface)
analysis.perform_study()
Postprocess and Plot QoI
[18]:
analysis.postprocess_single_crack_results()
analysis.get_design_curve_plot()
plt.savefig('./Figures/deterministic_crack_growth_rate.png', format='png', dpi=300)
_, _ = analysis.assemble_failure_assessment_diagram()
Cycles to a(crit) Cycles to 25% a(crit) Cycles to 1/2 Nc
Total cycles 58168.074078 1.000000 29084.037039
a/t 0.499076 0.124769 0.288095



[19]:
analysis.save_results()
[19]:
'Results/date_04_12_2024_time_19_47/'