Compare Different Tracks

This example demonstrates how to set up and run a basic simulation using the Rolland library to calculate the frequency response of different railway tracks. The example includes continuous and discrete tracks with different with a single or double layer. See [1] for more information.

Python Code
  1  """
  2  Comparative Track Vibration Analysis using Rolland API
  3
  4  This example demonstrates a comparison of vibration characteristics for:
  5      1. Continuous slab track
  6      2. Continuous ballasted track
  7      3. Discrete slab track
  8      4. Discrete ballasted track
  9
 10  All tracks are excited with the same Gaussian impulse at 71.7m position.
 11  """
 12
 13  # Import required components from Rolland library
 14  from rolland.postprocessing import Response as resp
 15  from rolland.postprocessing import TDR
 16  from rolland import (
 17      ContSlabSingleRailTrack,
 18      ContBallastedSingleRailTrack,
 19      SimplePeriodicSlabSingleRailTrack,
 20      SimplePeriodicBallastedSingleRailTrack
 21  )
 22  from rolland import DiscrPad, Sleeper, Ballast, ContPad, Slab
 23  from rolland import PMLRailDampVertic, DiscretizationEBBVerticConst
 24  from rolland import DeflectionEBBVertic, GaussianImpulse
 25  from rolland.database.rail.db_rail import UIC60  # Standard rail profile
 26
 27  # 1. TRACK DEFINITIONS ---------------------------------------------------------
 28
 29  # 1.1 Continuous slab track
 30  cont_slab_track = ContSlabSingleRailTrack(
 31      rail=UIC60,                                     # Standard UIC60 rail profile
 32      pad=ContPad(sp=[300e6, 0], dp=[30000, 0]),      # Stiffness [N/m], damping [Ns/m]
 33      l_track=145.2                                   # Track length [m]
 34  )
 35
 36  # 1.2 Continuous ballasted track
 37  cont_ballasted_track = ContBallastedSingleRailTrack(
 38      rail=UIC60,
 39      pad=ContPad(sp=[300e6, 0], dp=[30000, 0]),
 40      slab=Slab(ms=250),                              # Slab mass [kg]
 41      ballast=Ballast(sb=[100e6, 0], db=[80000, 0]),  # Ballast properties
 42      l_track=145.2
 43  )
 44
 45  # 1.3 Discrete slab track (equally spaced mounting positions)
 46  discr_slab_track = SimplePeriodicSlabSingleRailTrack(
 47      rail=UIC60,
 48      pad=DiscrPad(sp=[180e6, 0], dp=[30000, 0]),
 49      num_mount=243,                                  # Number of mounting positions
 50      distance=0.6                                    # sleeper spacing [m]
 51  )
 52
 53  # 1.4 Discrete ballasted track (equally spaced mounting positions)
 54  discr_ballasted_track = SimplePeriodicBallastedSingleRailTrack(
 55      rail=UIC60,
 56      pad=DiscrPad(sp=[180e6, 0], dp=[18000, 0]),
 57      sleeper=Sleeper(ms=150),                        # Sleeper mass [kg]
 58      ballast=Ballast(sb=[105e6, 0], db=[48000, 0]),
 59      num_mount=243,
 60      distance=0.6
 61  )
 62
 63  # 2. BOUNDARY CONDITIONS ------------------------------------------------------
 64  # Perfectly Matched Layer absorbing boundaries
 65  bound = PMLRailDampVertic(l_bound=33.0)             # 33.0 m boundary domain
 66
 67
 68  # 3. EXCITATION SETUP ---------------------------------------------------------
 69  # Gaussian impulse at the same position for all tracks
 70  x_excit = 71.7                                      # Excitation position [m]
 71  excit = GaussianImpulse(x_excit=x_excit)
 72
 73  # 4. SIMULATION SETUP & EXECUTION ----------------------------------------------
 74  # Discretize and simulate each track type
 75  discr1 = DiscretizationEBBVerticConst(track=cont_slab_track, bound=bound)
 76  discr2 = DiscretizationEBBVerticConst(track=cont_ballasted_track, bound=bound)
 77  discr3 = DiscretizationEBBVerticConst(track=discr_slab_track, bound=bound)
 78  discr4 = DiscretizationEBBVerticConst(track=discr_ballasted_track, bound=bound)
 79
 80  defl1 = DeflectionEBBVertic(discr=discr1, excit=excit)
 81  defl2 = DeflectionEBBVertic(discr=discr2, excit=excit)
 82  defl3 = DeflectionEBBVertic(discr=discr3, excit=excit)
 83  defl4 = DeflectionEBBVertic(discr=discr4, excit=excit)
 84
 85  # 5. POSTPROCESSING & COMPARISON ----------------------------------------------
 86  # 5.1 Calculate frequency responses for each track at the excitation point
 87  pp1 = resp(results=defl1)  # Continuous slab
 88  pp2 = resp(results=defl2)  # Continuous ballasted
 89  pp3 = resp(results=defl3)  # Discrete slab
 90  pp4 = resp(results=defl4)  # Discrete ballasted
 91
 92  resp.plot(
 93      [(pp1.freq, abs(pp1.mob)),
 94       (pp2.freq, abs(pp2.mob)),
 95       (pp3.freq, abs(pp3.mob)),
 96       (pp4.freq, abs(pp4.mob))],
 97
 98      ['ContSlabSingleRailTrack',
 99       'ContBallastedSingleRailTrack',
100       'SimplePeriodicSlabSingleRailTrack',
101       'SimplePeriodicBallastedSingleRailTrack'],
102
103      title='Frequency Response',
104      x_label='Frequency [Hz]',
105      y_label='Mobility [m/Ns]',
106  )
107
108  # 5.2 Calculate Track Decay Rate (TDR) for each track
109  tdr1 = TDR(results=defl1)
110  tdr2 = TDR(results=defl2)
111  tdr3 = TDR(results=defl3)
112  tdr4 = TDR(results=defl4)
113
114  TDR.plot([(tdr1.freq, tdr1.tdr), (tdr2.freq, tdr2.tdr), (tdr3.freq, tdr3.tdr), (tdr4.freq, tdr4.tdr)],
115       ['ContSlabSingleRailTrack',
116        'ContBallastedSingleRailTrack',
117        'SimplePeriodicSlabSingleRailTrack',
118        'SimplePeriodicBallastedSingleRailTrack'],
119        'Track-Decay-Rate', 'f [Hz]', 'TDR [dB/m]', plot_type='loglog')
../_images/example_different_tracks.png ../_images/example_different_tracks_tdr.png