[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
_images/demo_deterministic_32_1.png

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
_images/demo_deterministic_37_1.png
_images/demo_deterministic_37_2.png
_images/demo_deterministic_37_3.png
[19]:
analysis.save_results()
[19]:
'Results/date_04_12_2024_time_19_47/'