Home Up Search Reference Manuals Return
Creates coordinate systems
x | = | Along the track |
y | = | To the right, when looking in positive X-direction |
z | = | Downwards |
Direction | Greek letter | Gensys abbrv. |
||
X-rot | = | φ | = | "f" |
Y-rot | = | χ | = | "k" |
Z-rot | = | ψ | = | "p" |
lsys e_abs_bendrf esys_1 Vo `Xtrac_start - (10+buff.A_1)` # Create an Euler system ro_trac_design f_trac_design z_trac_design # The recommendation is to create 4 4 4 4 4 4 # one Euler system per vehicle lsys l_local lsc_1 esys_1 0. 0. 0. # Create a linear system for the car-body lsys l_local lsb_11 esys_1 acb_ 0. 0. # Create a linear system for the leading bogie lsys l_local lsa_111 esys_1 acb_+aba_ 0. 0. # Create a linear system for the first wheelset in leading bogie lsys l_local lsa_112 esys_1 acb_-aba_ 0. 0. # Create a linear system for the second wheelset in leading bogie lsys l_local lsb_12 esys_1 -acb_ 0. 0. # Create a linear system for the trailing bogie lsys l_local lsa_121 esys_1 -acb_+aba_ 0. 0. # Create a linear system for the first wheelset in trailing bogie lsys l_local lsa_122 esys_1 -acb_-aba_ 0. 0. # Create a linear system for the second wheelset in trailing bogieWhere:
acb_ | = | Longitudinal distance from mid-point of car-body to mid-point of bogie |
aba_ | = | Longitudinal distance from mid-point of bogie to wheelset |
Creates masses
Example:
mass m_rigid_6 car_1 lsc_1 0 0 -hccg_ mc_ mc_ mc_ Jfc_ Jkc_ Jpc_ # Create a car-body mass m_rigid_6 bog_11 lsb_11 0 0 -hbcg_ mb_ mb_ mb_ Jfb_ Jkb_ Jpb_ # Create a bogie frame mass m_rigid_6 axl_111 lsa_111 0 0 -ro_ ma_ ma_ ma_ Jfa_ Jka_ Jpa_ # Create a wheelset mass m_rigid_6f trc_111 lsa_111 0 0 0. 0. mt_ mt_ Jft_ 0. 0. # Create a track-piece . . . mass m_rigid_36b car_1 lsc_1 a b -h mxx mxy mxz mxf mxk mxp # Defines a mass having myx myy myz myf myk myp # products of inertia mzx mzy mzz mzf mzk mzp mfx mfy mfz mff mfk mfp mkx mky mkz mkf mkk mkp mpx mpy mpz mpf mpk mpp . . . mass m_flex_1 car_1 fq1 damp1 fq2 damp2 fq3 ,,, # Adding flexible modes to a rigid mass . . .
Connecting the masses to each other.
Example:
coupl p_lin36 kmbl_= 0. 0. 0. 0. 0. 0. 12e6 0. 0. 0. 0. 0. # Bushing property 0. 8e6 0. 0. 0. 0. # A 6x6 dimensional linear coupling matrix 0. 0. 12e6 0. 0. 0. 0. 0. 0. 10e3 0. 0. 0. 0. 0. 0. 10e3 0. 0. 0. 0. 0. 0. 10e3 coupl k kmbl bog_11 aba_-.3 -1. -.4 # Bushing. The coupling lnk_11l -.3 -1. -.4 kmbl_ # Property esys_1 m # Coordinate system and direction of action coupl k ktr car_1 7.5 0. -0.4 # Traction rod bog_11 -.2 0. -0.3 # Body #2 and its attachment coordinate 25e6 # Property esys_1 c # Coordinate system and direction of action coupl kc czcb car_1 `acb_+0.34` 1.25 -1.0 # Vertical damper bog_11 0.34 1.25 -0.5 # Body #2 and its attachment coordinate `2*pi*20.*40e3` 40e3 # Properties. Cut-off frequency at 20[Hz] esys_1 z # Coordinate system and direction of action coupl p_nlin_s kycbs_= # Lateral bumpstop property 0. # Pre-stress force 0.030 0. # Break-point #1 [m],[N] 0.040 15e3 # Break-point #2 [m],[N] 0.090 2e6 # Break-point #3 [m],[N] coupl k kycbs car_1 acb_ 0. -1.0 # Lateral bumpstop. The coupling bog_11 0. 0. -1.0 # Body #2 and its attachment coordinate kycbs_ # Property esys_1 y # Coordinate system and direction of action coupl k_coil3 kzcb # Compressed coil spring between car-body and bogie car_1 acb_ 1. -1. # Body #1 and its attachment coordinate bog_11 0. 1. -0.8 # Body #2 and its attachment coordinate 600e3 600e3 900e3 0. 0. 0. # Stiffnesses in all 6 directions hfree hcomp rf # Height of spring esys_1 m # Coordinate system and direction of action
Deformation in a coupling with zero-length
c_name.d= mass2.x - mass1.xThe force in the coupling is defined as:
c_name.F= Stiffness * c_name.dThe forces acting on the two masses are defined as:
c_name.F1x= c_name.F c_name.F2x= -c_name.FSum up the the total force acting on the masses:
mass1.Fx= mass1.Fx + c_name.F1x mass2.Fx= mass2.Fx + c_name.F2xBoth ends of a coupling with a direction of action equal to "x", "y", "z", "f", "k", "p", "m" must coinside. If not, a force will be generated.
Couplings with length
Must have a direction of action equal to "cx", "cy", "cz", "c" or "cu".
Direction "cx" means that the coupling is acting in longitudinal direction,
but the initial longitudinal distance between its two ends are removed from the force calculation:
c_name.F= Stiffness * ( c_name.d - c_name.l )Direction "cy" and "cz" works in the same way as "cx", but they work in lateral and vertical direction.
Couplings with a direction of action equal to c or cu gives forces along the coupling. In these couplings a positive value in variable c_name.d means an elongation of the coupling. Also in these types of couplings the original length of the coupling is removed, when calculating the force in the coupling.
Apply constraints on masses.
Example:
constr fix_free_1 axl_111.k= 0. # Elliminate the pitch rotation in the wheelset constr conn_free_1 abox_111l.x = 1. axl_111.x +1.025 axl_111.p # Force the axlebox to constr conn_free_1 abox_111l.y = 1. axl_111.y # follow the wheelset constr conn_free_1 abox_111l.z = 1. axl_111.z -1.025 axl_111.f # in all directions constr conn_free_1 abox_111l.f = 1. axl_111.f # except pitch constr conn_free_1 abox_111l.p = 1. axl_111.p constr conn_free_1 abox_111l.vx= 1. axl_111.vx +1.025 axl_111.vp # Also apply constraints constr conn_free_1 abox_111l.vy= 1. axl_111.vy # on the velocity constr conn_free_1 abox_111l.vz= 1. axl_111.vz -1.025 axl_111.vf # equations constr conn_free_1 abox_111l.vf= 1. axl_111.vf constr conn_free_1 abox_111l.vp= 1. axl_111.vp
Low level commands.
Example:
func const bo_ = 0.75 # Define a constant
func operp vkmh= 400 - vkmh_deacc * time # Evaluate formulas
func char ctrack_irreg= "Ideal_track" # Define a character variable
Create a conditional if_then-statement.
Example:
if_then lsa_111.pn .gt. Xtrac_stop func print06_char_all " " func print06_char_all " Execution interrupted due to lsa_111.pn > Xtrac_stop" func print06_char_all " ----------------------------------------------------" func stop endif
Create a conditional if_then_init-statement.
Example:
if_then_init .exist. cp3_111r.Fx s_var gpdat_force1 cp3_111r.Fx s_var gpdat_force1 cp3_111r.Fy s_var gpdat_force1 cp3_111r.Fz endif
Create a conditional if_then_init_char-statement.
Example:
if_then_char_init CalcType .eq. TSIM pre_process= 'quasi $CURRENT_FILE' post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT' endif
Include the contents from an other file
Example:
insert file $genkpf/ENS1002t32.5_uic60i40.kpfr
Group of commands that are frequently used on each car-body, bogie or wheelset can put in a substruct to made the tsimf-file smaller.
Example:
substruct interrupt_criterions [ # $1 Wheelset number func operp whe_$1l.z= axl_$1.z - bo_ * axl_$1.f # Vert position of left and func operp whe_$1r.z= axl_$1.z + bo_ * axl_$1.f # right wheel func operp wr_$1l.gap= ral_$1l.z + tral$1l.z + 0.028 - whe_$1l.z # Vert difference between wheel and rail func operp wr_$1r.gap= ral_$1r.z + tral$1r.z + 0.028 - whe_$1r.z # (flange height= 28mm) s_var sngl wr_$1l.gap s_var sngl wr_$1r.gap # Save the variable on id-file if_then wr_$1l.gap .gt. 0.10 func print06_char_all " " func print06_char_all " Execution interrupted due to wr_$1l.gap > 0.10" func print06_char_all " ----------------------------------------------" func stop endif if_then wr_$1r.gap .gt. 0.10 func print06_char_all " " func print06_char_all " Execution interrupted due to wr_$1r.gap > 0.10" func print06_char_all " ----------------------------------------------" func stop endif ] in_substruct interrupt_criterions [ 111 ] # $1 Wheelset number in_substruct interrupt_criterions [ 112 ] in_substruct interrupt_criterions [ 121 ] ... etc.
Head lines are defined with commad head:
## ## Headlines ## ================================================================ head 1 "" # Intentionally left blank in order to set the page title in MPLOT head 2 "Railway vehicle with two bogies; 4 driven axles; $CalcType" head 3 "Wheel/Rail= $ckpfr; Friction=$mu_; Speed=$vkmh" head 4 "Curve Radius=$CurveRadius; Track irr.=$ctrack_irreg" # head 5 "Variation: "
Maximum 10 head lines can be defined. Every line is read until end-of-line. Maximum 80 character per line.
GENSYS uses the same input data file for all types of analysis. However a few input data are analysis specific. These analysis specific commands has mainly been collected in the following four commands: fresp_param, modal_param, quasi_param and tsim_param.
Program FRESP calculates frequency response spectras. The following line is only read by program FRESP:
fresp_param= Fourier_CG1 1.e-4 fstart= .3 fstop= 20. fstep= -1.06
The analysis in the program FRESP is linear, Before the calculation starts the model will be linearized. The linearization amplitude is given in the first argument in analysis Fourier_CG1. In the example above the linearization amplitude is set to 1.e-4 which equals 0.1[mm]. The linearization of the model is made automatically.
Before the analysis in program FRESP starts, it is recommended that initial values from program QUASI are calculated first, and the initial values are feed into FRESP via the initval read_gpdat-command. In order to ensure that all forces in the model are in equilibrium.
Command fexcit is also an input data command, but the command must be given after the masses has been defined. Therefore you will find the documentation about "fexcit" later in this manual page.
Program MODAL performs modal analysis, finding all eigenvalues in the input data model. The following line is only read by program MODAL:
modal_param= Schur_fact1 1.e-4
Before the analysis in program MODAL starts, it is recommended that initial values from program QUASI are calculated first, and the initial values are feed into MODAL via the initval read_gpdat-command. In order to ensure that all forces in the model are in equilibrium.
Program QUASI performs quasi statical analysis, searching the position of all integrated variables where all internal forces are balanced with respect to external forces and acceleration fields. The following line is only read by program QUASI:
quasi_param= Damped_Tens 1.e-4 .2 10 16.
QUASI automatically stores the position of the vehicle in the GPdat-file. If the user is interested in storing forces, displacements, etc. on the MPdat-file he or she must specify those variables in command s_var scalar_0.
Program TSIM performs time domain integration. The following line is only read by program TSIM:
tsim_param= heun_u tstart= 0. tstop=10. tstep= 0.001 tout= 0.005
In the input data file the user can specify pre- and post- process commands.
Preprocess commands will be executed before the calculation begins.
Postprocess commands will be executed when the calculation is finished.
## ## Pre- & Post- Processing ## ========================================================== if_then_char_init CalcType .eq. TSIM .or. CalcType .eq. MODAL pre_process= 'sed "s!runf/Master.runf!$CURRENT_FILE!" npickf/flex_car.npickf > npickf/$IDENT.npickf' pre_process= 'npick npickf/$IDENT.npickf' pre_process= 'quasi $CURRENT_FILE' post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT' # post_process= 'mplot mplotf/critSpeedGoalfunc.mplotf $IDENT' # post_process= 'mgv diags/$IDENT.ps' endif
Create an input data file for program NPICK with the UNIX sed-command:
pre_process= 'sed "s!runf/Master.runf!$CURRENT_FILE!" npickf/flex_car.npickf > npickf/$IDENT.npickf'
Launch the NPICK program:
pre_process= 'npick npickf/$IDENT.npickf'
$IDENT will be replaced with the name of actual ident
$CURRENT_FILE will be replaced with the name of current input data file
Set the initial values for all equations in the model. This is necessary in the FRESP- and MODAL-program. In program TSIM this is not necessary, but it can avoid initial vibrations.
pre_process= 'quasi $CURRENT_FILE'
After the analysis in the CALC program, the user may wish to calculate max. track-shift forces, max. flange climb ration, different wear index, ride index,,, etc.
post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT'
The Designed Track Gauge is defined with the following two variables:
func const bo_ = 0.75 # Lateral semi-distance between the nominal rolling circles of the wheels func const TrackGauge= 1435. # Gauge to be used in the intpl_track_irr-commands
N.B. The track irregularity files contains the absolute gauge. Why it is necessary to use a track file with the correct gauge. Read more about "Track Gauge" under Modify the track gauge
The track alignment is described in two parts:
Designed track geometry and
Track irregularities.
The designed track geometry describes the curve radiuses and cant(superelevation).
Track irregularities are the deviations from the designed track geometry.
Often the Designed track geometry and Track irregularities are separated into two parts.
However there exists track recording vehicles that measures the both signals at the same time,
in this case command
func intpl_track_irr3
shall be used.
Example:
### ### Track irregularities ### ========================================================== func char ctrack_irreg= NoTrackIrr # Output in header lines #[-]{ func const bo_ = 0.75 # Lateral semi-distance between the nominal rolling circles of the wheels func const TrackGauge= 1435. # Gauge to be used in the intpl_track_irr-commands # if_then_char_init ctrack_irreg .eq. "NoTrackIrr" # {{ func const YMtrac= 1e-3 # From mm to m; Scale factor 1.00; Lateral irregularities func const ZMtrac= 1e-3 # From mm to m; Scale factor 1.00; Vertical irregularities func const GMtrac= 1e-3 # From mm to m; Scale factor 1.00; Gauge irregularities func const CMtrac= 1e-3/(2*bo_) # From mm to rad; Scale factor 1.00; Cant irregularities func const XtracStart= 0. func const XtracStop= 30000. func intpl_track_irr2 XtracStart XtracStop Ideal_track TrackGauge # elseif_then_char_init ctrack_irreg .eq. "UIC518_wheel_unloading" # }{ func const YMtrac= 1e-3 # From mm to m; Scale factor 1.00; Lateral irregularities func const ZMtrac= 1e-3 # From mm to m; Scale factor 1.00; Vertical irregularities func const GMtrac= 1e-3 # From mm to m; Scale factor 1.00; Gauge irregularities func const CMtrac= 1e-3/(2*bo_) # From mm to rad; Scale factor 1.00; Cant irregularities func const XtracStart= 0. func const XtracStop= 3000. func const worstPos= 66. func intpl_r lat_trac -100.0 0.0 XtracStop 0.0 func intpl_r vert_trac # vertical alignment in mm -100.0 0.0 -10.0 0.0 -9.0 0.0 -8.0 0.0 0.0 0.0 worstPos-6-.1 0.0 worstPos-6-.00006 0.0 # Several points in order to avoid ringing in the spline interpolation worstPos-6-.00004 0.0 worstPos-6-.00003 0.0 worstPos-6-.00001 0.0 worstPos-6 0.0 worstPos-6+0.0003 0.0005 worstPos-6+0.0006 0.001 worstPos-6+0.006 0.01 worstPos-0.006 9.99 worstPos-0.0006 9.999 worstPos-0.0003 9.9995 worstPos 10.0 # 20 dip on high rail worstPos+0.0003 9.9995 # 6 m semi-span worstPos+0.0006 9.999 worstPos+0.006 9.99 worstPos+6-0.006 0.01 worstPos+6-0.0006 0.001 worstPos+6-0.0003 0.0005 worstPos+6 0.0 worstPos+6+.00001 0.0 worstPos+6+.00003 0.0 worstPos+6+.00004 0.0 worstPos+6+.00006 0.0 XtracStop 0.0 func intpl_r spv_trac # track gauge in mm -100.0 TrackGauge XtracStop TrackGauge func intpl_r fi_trac # cant in mm -100.0 0.0 -10.0 0.0 -9.0 0.0 -8.0 0.0 0.0 0.0 worstPos-6-.1 0.0 worstPos-6-.00006 0.0 # Several points in order to avoid ringing in the spline interpolation worstPos-6-.00004 0.0 worstPos-6-.00003 0.0 worstPos-6-.00001 0.0 worstPos-6 0.0 worstPos-6+0.0003 -0.001 worstPos-6+0.0006 -0.002 worstPos-6+0.006 -0.02 worstPos-0.006 -19.98 worstPos-0.0006 -19.998 worstPos-0.0003 -19.999 worstPos -20.0 # 20 dip on high rail worstPos+0.0003 -19.999 # 6 m semi-span worstPos+0.0006 -19.998 worstPos+0.006 -19.98 worstPos+6-0.006 -0.02 worstPos+6-0.0006 -0.002 worstPos+6-0.0003 -0.001 worstPos+6 0.0 worstPos+6+.00001 0.0 worstPos+6+.00003 0.0 worstPos+6+.00004 0.0 worstPos+6+.00006 0.0 XtracStop 0.0 # elseif_then_char_init ctrack_irreg .eq. "track_irr4" # }{ func const YMtrac 0.000650 # from mm to m, and factor 0.65 func const ZMtrac 0.000800 # from mm to m, and factor 0.80 func const GMtrac 0.001000 # from mm to m, and factor 0.65 func const CMtrac 0.000533 # from mm to rad, and factor 0.80 func const XtracStart= 0. func const XtracStop= 2003. func intpl_track_irr2 XtracStart XtracStop track/track_irr4.trax TrackGauge # elseif_then_char_init ctrack_irreg .eq. "track_V120a" # }{ func const YMtrac= 1e-3 # From mm to m; Scale factor 1.00; Lateral irregularities func const ZMtrac= 1e-3 # From mm to m; Scale factor 1.00; Vertical irregularities func const GMtrac= 1e-3 # From mm to m; Scale factor 1.00; Gauge irregularities func const CMtrac= 1e-3/(2*bo_) # From mm to rad; Scale factor 1.00; Cant irregularities func const XtracStart= 1400. func const XtracStop= 3100. func intpl_track_irr2 XtracStart XtracStop track/track_V120a.trax TrackGauge # elseif_then_char_init ctrack_irreg .eq. "track_V120b" # }{ func const YMtrac= 1e-3 # From mm to m; Scale factor 1.00; Lateral irregularities func const ZMtrac= 1e-3 # From mm to m; Scale factor 1.00; Vertical irregularities func const GMtrac= 1e-3 # From mm to m; Scale factor 1.00; Gauge irregularities func const CMtrac= 1e-3/(2*bo_) # From mm to rad; Scale factor 1.00; Cant irregularities func const XtracStart= 1050. func const XtracStop= 3000. func intpl_track_irr2 XtracStart XtracStop track/track_V120b.trax TrackGauge # elseif_then_char_init ctrack_irreg .eq. "track_V160a" # }{ func const YMtrac= 1e-3 # From mm to m; Scale factor 1.00; Lateral irregularities func const ZMtrac= 1e-3 # From mm to m; Scale factor 1.00; Vertical irregularities func const GMtrac= 1e-3 # From mm to m; Scale factor 1.00; Gauge irregularities func const CMtrac= 1e-3/(2*bo_) # From mm to rad; Scale factor 1.00; Cant irregularities func const XtracStart= 700. func const XtracStop= 4200. func intpl_track_irr2 XtracStart XtracStop track/track_V160a.trac TrackGauge # elseif_then_char_init ctrack_irreg .eq. "track_V200a" # }{ func const YMtrac= 1e-3 # From mm to m; Scale factor 1.00; Lateral irregularities func const ZMtrac= 1e-3 # From mm to m; Scale factor 1.00; Vertical irregularities func const GMtrac= 1e-3 # From mm to m; Scale factor 1.00; Gauge irregularities func const CMtrac= 1e-3/(2*bo_) # From mm to rad; Scale factor 1.00; Cant irregularities func const XtracStart= 0. func const XtracStop= 4997. func intpl_track_irr2 XtracStart XtracStop track/track_V200a.trac TrackGauge # else func print06_char_init " " func print06_char_init " ***ERROR*** In Input Reading" func print06_char_init " Unvalid value given for character variable ctrack_irreg" func stop endif # }} # s_var scalar_0 XtracStart # Save start coordinate as a scalar for post processing s_var scalar_0 XtracStop # Save stop coordinate as a scalar for post processing #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
In the track irregularity files
trac, trax
and trax_wdesign
the errors are stored in [mm],
but all calculations in CALC are performed in SI-units,
therefore must the track irregularities be converted into [m].
The conversion into [m] is made by setting the constants, YMtrac,
ZMtrac and GMtrac equal to 0.001.
Variable CMtrac translates from [mm] to [rad],
therefore CMtrac is dependent on the gauge.
In order to automatically adjust for the current gauge used CMtrac has been defined as 1e-3/(2*bo_).
Track irregularity files written in trac-, trax- or trax_wdesign-format includes the measured gauge in absolute coordinates. In some cases the vehicle designer wish to change the average gauge of a track, in order to check the behavior of the vehicle in a tight or wide gauge.
For the above purposes the user has access to two key-variables gaugeAverage and gaugeDev_. The variables gaugeAverage and gaugeDev_ operates on column #4 in the track file in the following way:
tral$2.gauge= (column_4(axl_$2.pn) - gaugeAverage)*GMtrac + gaugeDev_ tral$2r.y= column_2(axl_$2.pn) + tral$2.gauge/2. tral$2l.y= column_2(axl_$2.pn) - tral$2.gauge/2.Where:
axl_$2.pn | = | The longitudinal position of axle $2 (axl_$2.pn= lsa_$2.pn + axl_$2.x) |
lsa_$2.pn | = | The longitudinal position of the local coordinate system for axle $2 |
axl_$2.x | = | The longitudinal position of axle $2 relative to local coordinate system lsa_$2 |
column_4(x) | = | The value of column #4 (gauge errors) interpolated at x in the track irregularity file |
GMtrac | = | Unit translation and multiplying factor described under Track Irregularities above |
column_2(x) | = | The value of column #2 (lateral errors) interpolated at x in the track irregularity file |
tral$2r.y | = | lateral error on top of right rail under axle number $2 |
tral$2l.y | = | lateral error on top of left rail under axle number $2 |
Example #1
Set the preferred average value of the gauge, by defining the variable track_width.
## ## Automatically modify the gauge of the track ## =========================================== func const track_width= 1435. func mean_r2_init Xavg gaugeAverage spv_trac Xtrac_start Xtrac_stop func print06_char_init ' ' func print06_init gaugeAverage func operp_init gaugeDev_= 0.001 * ( track_width - 1435. )
In the example above the average value of the gauge is changed to the value given in the variable track_width independently of what gauge the track data file has.
Example #2
Modify the average value of the gauge manually.
## ## Set the variables gaugeAverage and gaugeDev_ manually ## ====================================================== func const gaugeAverage= 1435. # Set the average gauge of the track # func const gaugeDev_= -0.008 # Make the track 8 mm tighter # func const gaugeDev_= -0.004 # Make the track 4 mm tighter func const gaugeDev_= 0.000 # Do not change the gauge of the track # func const gaugeDev_= 0.004 # Make the track 4 mm wider # func const gaugeDev_= 0.008 # Make the track 8 mm wider
The track gauge is modigied in two steps:
In the memory of program CALC the user has access to the following variables regarding the track irregularities:
tral$2r.y | = | Lateral track irregularity on top of right rail under axle number $2 |
tral$2l.y | = | Lateral track irregularity on top of left rail under axle number $2 |
tral$2r.z | = | Vertical track irregularity on top of right rail under axle number $2 |
tral$2l.z | = | Vertical track irregularity on top of left rail under axle number $2 |
Designed or nominal track geometry is deviation from tangent track that is made intentionally, e.g. curves and cant (superelevation). See further information under track/designed_track_geom.html
If track irregularities has been read with func intpl_track_irr3 this section must be omitted, otherwise the memory fields roTracDesign, fiTracDesign and zTracDesign will be defined twice and an error will occur.
Example of a S-shaped curve. The curve changes from a right handed curve direct to a left handed curve without an intermediate tangent track section.
### ### Designed(nominal) track geometry ### ========================================================== func const CurveRadius= 1e99 # Curve radius in [m] func const CurveCant= 0.000 # Cant of track in [m] #[-]{ # func intpl_r roTracDesign -100.+XtracStart 0. # Tangent track 40.+XtracStart 0. 160.+XtracStart 1/CurveRadius # Right handed circular curve 240.+XtracStart 1/CurveRadius 480.+XtracStart -1/CurveRadius # Left handed circular curve 560.+XtracStart -1/CurveRadius 680.+XtracStart 0. # Tangent track 1000.+XtracStart 0. func intpl_r fiTracDesign -100.+XtracStart 0. 40.+XtracStart 0. 160.+XtracStart CurveCant/(2*bo_) 240.+XtracStart CurveCant/(2*bo_) 480.+XtracStart -CurveCant/(2*bo_) 560.+XtracStart -CurveCant/(2*bo_) 680.+XtracStart 0. 1000.+XtracStart 0. func intpl_r zTracDesign -100.+XtracStart 0. 40.+XtracStart 0. 160.+XtracStart -abs(CurveCant)/2. 240.+XtracStart -abs(CurveCant)/2. 480.+XtracStart -abs(CurveCant)/2. 560.+XtracStart -abs(CurveCant)/2. 680.+XtracStart 0. 1000.+XtracStart 0. s_var scalar_0 CurveRadius s_var scalar_0 CurveCant func const CurveTCbeg1= 40+XtracStart # Beginning of transition curve func const CurveTCend1= 160+XtracStart # End of transition curve s_var scalar_0 CurveTCbeg1 # Store for evaluation s_var scalar_0 CurveTCend1 # of PCT #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
In the example above the curve radius equals 1e99[m] which is practically equal to tangent track.
Variable Xtrac_start has previously been defined under section track irregularity.
This is a practical way of connecting the
designed track geometry and
track irregularities to each other.
The three memory fields: roTracDesign, fiTracDesign and zTracDesign defined above, will later be used in the lsys-command when creating the coordinate systems.
N.B. The description of the designed track must start on tangent track otherwise an error will occur.
### ### Wheel-rail contact model ### ------------------------------------------------------------- func char cwr_coupl= pe3 # Up to three simultaneous contact areas # func char cwr_coupl= pe4 # Up to 2x2 contact areas
In order to speed up simulation times so called wheel/rail geometry functions can be defined. These functions can be calculated with the KPF pre processor program. The definition of the wheel/rail geometry functions can be written in many different ways:
Same profiles on all vehiclesIf the train-set has the same wheel profiles on all vehicles, the definition of the wheel-rail geometry functions can be as the following:
## ## Define wheel-rail geometry functions ## ==================================== insert file $genkpf/ENS1002t32.5_uic60i40..kpfr in_substruct ENS1002t32.5_uic60i40 [ " " ] # All wheels in the vehicle
If the train-set has different wheel profiles on different vehicles, the definition of the wheel-rail geometry functions should be as the following:
## ## Define wheel-rail geometry functions ## ==================================== insert file $genkpf/ENS1002t32.5_uic60i40.kpfr insert file $genkpf/ENS1002t32.5_uic60i30.kpfr insert file $genkpf/ENS1002t32.5_uic60i20.kpfr # in_substruct ENS1002t32.5_uic60i40 [ 1 ] # Vehicle #1 in_substruct ENS1002t32.5_uic60i30 [ 2 ] # Vehicle #2 in_substruct ENS1002t32.5_uic60i20 [ 3 ] # Vehicle #3
If the train-set has different wheel-rail profiles on each wheel, the definition of the wheel-rail geometry functions should be as the following:
## ## Define wheel-rail geometry functions ## ==================================== insert file kpfr/wheel1_rail1.kpfr insert file kpfr/wheel2_rail1.kpfr insert file kpfr/wheel1_rail2.kpfr insert file kpfr/wheel2_rail2.kpfr # in_substruct kpf_wheel1_rail1 [ 111r ] # Axle 111 right side in_substruct kpf_wheel1_rail2 [ 111l ] # Axle 111 left side in_substruct kpf_wheel2_rail1 [ 112r ] # Axle 112 right side in_substruct kpf_wheel2_rail2 [ 112l ] # Axle 112 left side in_substruct kpf_wheel1_rail1 [ 121r ] # Axle 121 right side in_substruct kpf_wheel1_rail2 [ 121l ] # Axle 121 left side in_substruct kpf_wheel2_rail1 [ 122r ] # Axle 122 right side in_substruct kpf_wheel2_rail2 [ 122l ] # Axle 122 left side
If the user wishes to calculate the wheel/rail geometry functions by only give the wheel- and rail- profiles in the input data file. The following three lines can be used:
pre_process= 'create_kpfr kpff/Master.kpff kpf/S1002.wheel kpf/uic60i40.rail create_kpfr' insert file kpfr/create_kpfr.kpfr in_substruct create_kpfr [ " " ]
Script create_kpfr is located in directory $gensys/bin and is accessible via environment variable $PATH.
Argument no 1 is the input data file for program KPF.
Argument no 2 is the wheel profile.
Argument no 3 is the rail profile.
Argument no 4 an ident text string.
The in-line created kpfr-file is included with the insert-command and used with the in_substruct-command.
If not the wheel/rail geometries are constant along the track, the definition of the wheel-rail geometry functions can be written in the following way:
## ## Define a wheel-rail geometry functions which varies along the track ## ------------------------------------------------------------------- insert file $genkpf/S1002t32.5_bv50i30.kpfr insert file $genkpf/S1002t32.5_bv50i30_worn_r3.kpfr insert file $genkpf/S1002t32.5_bv50i30_worn_l3.kpfr in_substruct S1002t32.5_bv50i30 [ tangtrc ] in_substruct S1002t32.5_bv50i30_worn_r3 [ Rcurve ] in_substruct S1002t32.5_bv50i30_worn_l3 [ Lcurve ] # func kpf_variable_1 " " -100. tangtrc 40. tangtrc 45. Rcurve 355. Rcurve 360. tangtrc 365. Lcurve 675. Lcurve 680. tangtrc 1000. tangtrc
Above example shows a track consisting of 8 sections with different wheel/rail geometries.
Region | Wheel/rail geometry function |
---|---|
-100 - 40. | tangtrc (tangent track) |
40. - 45. | Linear transition from tangtrc to Rcurve |
45. - 355 | Rcurve |
355 - 360 | Linear transition from Rcurve to tangtrc |
,,, etc. |
## ## Define wheel-rail geometry functions ## ========================================================== func char ckpfr= ENS1002t32.5_uic60i40 # if_then_char_init ckpfr .eq. "ckona_fl" func copy_init lambda0= 0.025 # Rail inclination 1/40 func copy_init lambda = 0.30 # Effective conicity s_var scalar_0 lambda func operp_init epsilon= 50.7 * ( lambda - lambda0 ) # Contact angle difference parameter insert file $genkpf/kpf_ckona_fl.kpfr in_substruct kpf_ckona [ " " lambda lambda0 epsilon ] # elseif_then_char_init ckpfr .eq. "rkona" insert file $genkpf/kpf_rkona.kpfr in_substruct kpf_rkona [ " " 0. ] # elseif_then_char_init ckpfr .eq. "ENS1002t32.5_uic60i40" insert file $genkpf/ENS1002t32.5_uic60i40.kpfr in_substruct ENS1002t32.5_uic60i40 [ " " ] # elseif_then_char_init ckpfr .eq. "ENS1002t32.5_uic60i30" insert file $genkpf/ENS1002t32.5_uic60i30.kpfr in_substruct ENS1002t32.5_uic60i30 [ " " ] # elseif_then_char_init ckpfr .eq. "ENS1002t32.5_uic60i20" insert file $genkpf/ENS1002t32.5_uic60i20.kpfr in_substruct ENS1002t32.5_uic60i20 [ " " ] # elseif_then_char_init ckpfr .eq. "SjNormalt33_uic60i40" insert file $genkpf/SjNormalt33_uic60i40.kpfr in_substruct SjNormalt33_uic60i40 [ " " ] # elseif_then_char_init ckpfr .eq. "SjNormalt33_uic60i20" insert file $genkpf/SjNormalt33_uic60i20.kpfr in_substruct SjNormalt33_uic60i20 [ " " ] # elseif_then_char_init ckpfr .eq. "Variable_W/R-geom" insert file $genkpf/S1002t32.5_bv50i30.kpfr insert file $genkpf/S1002t32.5_bv50i30_worn_r3.kpfr insert file $genkpf/S1002t32.5_bv50i30_worn_l3.kpfr in_substruct S1002t32.5_bv50i30 [ tangtrc ] in_substruct S1002t32.5_bv50i30_worn_r3 [ Rcurve ] in_substruct S1002t32.5_bv50i30_worn_l3 [ Lcurve ] func kpf_variable_1 " " -100. tangtrc 40. tangtrc 45. Rcurve 355. Rcurve 360. tangtrc 365. Lcurve 675. Lcurve 680. tangtrc 1000. tangtrc # else func print06_char_init " " func print06_char_init " ***ERROR*** In Input Reading" func print06_char_init " Unvalid value given for character variable ckpfr" func stop endif
Definition of variable mu_ to be used in command func wr_couple_pe3. (please see further down under section Substructures to VEHICLE(s)):
func const mu_ = 0.50 # Wheel/Rail Friction Coefficient
In program CALC the underscore character "_" has a very special meaning. It means that program CALC truncates the name of the variable until a defined variable can be found.
The reason for using this feature in this case is that it will be easy to define different coefficients of friction in different contact points on different wheels. Gensys will now read the wheel/rail friction coefficient according to:
mu_ | = | The default value of the friction coefficient. Will be valid if no other variables with higher priority can be found. |
mu_1 | = | The wheel/rail friction coefficient valid for the first vehicle in the train-set |
mu_11 | = | The wheel/rail friction coefficient valid for the first bogie in the first vehicle |
mu_111 | = | The wheel/rail friction coefficient valid for the first wheelset in the first bogie in the first vehicle |
mu_111r | = | The wheel/rail friction coefficient valid for the right wheel in the first wheelset in the first bogie in the first vehicle |
mu_111r1 | = | The wheel/rail friction coefficient valid for contact point cp1 on the right wheel in the first wheelset in the first bogie in the first vehicle |
Example: If the user in the input data file define the following three variables:
func const mu_111r1= 0.1 # Specific wheel/rail friction coefficient for cp1 on wheel 111r func const mu_1 = 0.2 # Specific wheel/rail friction coefficient for the first vehicle func const mu_ = 0.5 # Default wheel/rail friction coefficient
The contact point "cp1" on the right wheel on the leading axle will be given a coefficient of friction equal to 0.1. Other contact points on the first vehicle will be given a coefficient of friction equal to 0.2. All other contact points on the other vehicles will be given a coefficient of friction equal to 0.5.
Instead of defining a default friction coefficient for all contact patches on all wheels, create individual friction coefficients for all contact patches. To create individual friction coefficients the following substructure can be used:
## ## Friction coefficients individual for each contact patch on all wheels ## (will later be adjusted by substruct update_mu) ## ========================================================================================== func const muTread = 0.5 # Friction coeff from 30mm and up func const muFlange= 0.1 # Friction coeff up to 24mm. Between 24-30mm there is a linear transition substruct create_mu [ # $1= Wheelset number func const mu_$1l1= 0.5 func const mu_$1r1= 0.5 # Fric coeff func const mu_$1l2= 0.5 func const mu_$1r2= 0.5 func const mu_$1l3= 0.5 func const mu_$1r3= 0.5 func const mulf_$1l1= mu_$1l1/0.6 func const mulf_$1r1= mu_$1r1/0.6 # Creep relax func const mulf_$1l2= mu_$1l2/0.6 func const mulf_$1r2= mu_$1r2/0.6 func const mulf_$1l3= mu_$1l3/0.6 func const mulf_$1r3= mu_$1r3/0.6 s_var sngl mu_$1l1 s_var sngl mu_$1l2 s_var sngl mu_$1l3 s_var sngl mu_$1r3 s_var sngl mu_$1r2 s_var sngl mu_$1r1 ]
Before making calls to wheel/rail-couplings, call the above substruct for all wheelsets the model.
To update the friction coefficients depending on the positions of the contact patches. The following can be used:
## ## Update the friction coeff depending on the location of the contact point ## (From -.070 to +.032 the friction muTread applies. ## From +.033 to +.070 the friction muFlange applies. ## Between +.032 to +.033 is a linear transition area) ## ========================================================================================== substruct update_mu [ # $1= Wheel number no_warning func intpl_l mu_$1l1= cp1_$1l.posw -.070 muTread .032 muTread .033 muFlange .070 muFlang no_warning func intpl_l mu_$1l2= cp2_$1l.posw -.070 muTread .032 muTread .033 muFlange .070 muFlang no_warning func intpl_l mu_$1l3= cp3_$1l.posw -.070 muTread .032 muTread .033 muFlange .070 muFlang # no_warning func intpl_l mu_$1r3= cp3_$1r.posw -.070 muTread .032 muTread .033 muFlange .070 muFlang no_warning func intpl_l mu_$1r2= cp2_$1r.posw -.070 muTread .032 muTread .033 muFlange .070 muFlang no_warning func intpl_l mu_$1r1= cp1_$1r.posw -.070 muTread .032 muTread .033 muFlange .070 muFlang # no_warning func div mulf_$1l1= mu_$1l1 0.6 no_warning func div mulf_$1r1= mu_$1r1 0.6 no_warning func div mulf_$1l2= mu_$1l2 0.6 no_warning func div mulf_$1r2= mu_$1r2 0.6 no_warning func div mulf_$1l3= mu_$1l3 0.6 no_warning func div mulf_$1r3= mu_$1r3 0.6 ]
After the calls to wheel/rail-couplings has been made, the above substruct can be called for all wheelsets the model, to update the values of the friction coefficients.
Instead of defining a default friction coefficient for all contact patches on all wheels, create individual friction coefficients for all contact patches. To create individual friction coefficients the following substructure can be used:
## ## Friction coefficients individual for each contact patch on all wheels ## (will later be adjusted by substruct update_mu) ## ====================================================================================== func const mu_radius= 1/750 # Lubricate all curves tighter than 750 m func const mu_def = 0.5 # Default friction coeff valid for curves bigger than 750 m func const mu_or = 0.5 # Default friction coeff in curves; outer rail func const mu_ir = 0.25 # Default friction coeff in curves; inner rail func const mu_gcor= 0.1 # Friction coeff on gauge corner and below; outer rail substruct create_mu [ # $1= Wheelset number func const mu_$1l1= 0.5 func const mu_$1r1= 0.5 # Fric coeff func const mu_$1l2= 0.5 func const mu_$1r2= 0.5 func const mu_$1l3= 0.5 func const mu_$1r3= 0.5 func const mulf_$1l1= mu_$1l1/0.6 func const mulf_$1r1= mu_$1r1/0.6 # Creep relax func const mulf_$1l2= mu_$1l2/0.6 func const mulf_$1r2= mu_$1r2/0.6 func const mulf_$1l3= mu_$1l3/0.6 func const mulf_$1r3= mu_$1r3/0.6 # s_var sngl mu_$1l1 s_var sngl mu_$1l2 s_var sngl mu_$1l3 s_var sngl mu_$1r3 s_var sngl mu_$1r2 s_var sngl mu_$1r1 ]
Before making calls to wheel/rail-couplings, call the above substruct for all wheelsets the model.
To update the friction coefficients depending on the positions of the contact patches. The following can be used:
## ## Update the friction coeff depending on track curve radius and location of the contact point ## =========================================================================================== substruct update_mu [ # $1= Wheel number ## ## First interpolate along the track depending on track curvature ## Lubricate tangent track with mu_def ## Lubricate tread with mu_ir for inner rail and mu_or for outer rail ## Lubricate gauge corner with mu_gcor for outer rail ## ------------------------------------------------------------------- func intpl_l mutl_$1= lsa_$1.b ## Tread left side as function of curve radius -1. mu_ir -mu_radius-1e-6 mu_ir -mu_radius mu_def # Left handed curve lubricate left tread; inner rail mu_radius mu_def mu_radius+1e-6 mu_or 1. mu_or # Right handed curve lubricate left tread; outer rail func intpl_l mufl_$1= lsa_$1.b ## Flange left side as function of curve radius -1. mu_ir -mu_radius-1e-6 mu_ir -mu_radius mu_def # Left handed curve lubricate left flange; inner rail mu_radius mu_def mu_radius+1e-6 mu_gcor 1. mu_gcor # Right handed curve lubricate left flange; outer rail # func intpl_l mutr_$1= lsa_$1.b ## Tread right side as function of curve radius -1. mu_or -mu_radius-1e-6 mu_or -mu_radius mu_def # Left handed curve lubricate right tread; outer rail mu_radius mu_def mu_radius+1e-6 mu_ir 1. mu_ir # Right handed curve lubricate right tread; inner rail func intpl_l mufr_$1= lsa_$1.b ## Flange right side as function of curve radius -1. mu_gcor -mu_radius-1e-6 mu_gcor -mu_radius mu_def # Left handed curve lubricate right flange; outer rail mu_radius mu_def mu_radius+1e-6 mu_ir 1. mu_ir # Right handed curve lubricate right flange; inner rail ## ## Second interpolate laterally depending on the lateral position of the contact points ## ------------------------------------------------------------------------------------ no_warning func intpl_l mu_$1l1= cp1_$1l.posr -.070 0.5 .026 0.5 .027 0.5 .070 0.5 no_warning func intpl_l mu_$1l2= cp2_$1l.posr -.070 0.5 .026 0.5 .027 0.5 .070 0.5 no_warning func intpl_l mu_$1l3= cp3_$1l.posr -.070 0.5 .026 0.5 .027 0.5 .070 0.5 no_warning func intpl_l mu_$1r3= cp3_$1r.posr -.070 0.5 .026 0.5 .027 0.5 .070 0.5 no_warning func intpl_l mu_$1r2= cp2_$1r.posr -.070 0.5 .026 0.5 .027 0.5 .070 0.5 no_warning func intpl_l mu_$1r1= cp1_$1r.posr -.070 0.5 .026 0.5 .027 0.5 .070 0.5 # no_warning func copy mu_$1l1.y1= mutl_$1 no_warning func copy mu_$1l2.y1= mutl_$1 # Update the values in the above no_warning func copy mu_$1l3.y1= mutl_$1 # interpolation no_warning func copy mu_$1r3.y1= mutr_$1 no_warning func copy mu_$1r2.y1= mutr_$1 no_warning func copy mu_$1r1.y1= mutr_$1 # no_warning func copy mu_$1l1.y2= mutl_$1 no_warning func copy mu_$1l2.y2= mutl_$1 no_warning func copy mu_$1l3.y2= mutl_$1 no_warning func copy mu_$1r3.y2= mutr_$1 no_warning func copy mu_$1r2.y2= mutr_$1 no_warning func copy mu_$1r1.y2= mutr_$1 # no_warning func copy mu_$1l1.y3= mufl_$1 no_warning func copy mu_$1l2.y3= mufl_$1 no_warning func copy mu_$1l3.y3= mufl_$1 no_warning func copy mu_$1r3.y3= mufr_$1 no_warning func copy mu_$1r2.y3= mufr_$1 no_warning func copy mu_$1r1.y3= mufr_$1 # no_warning func copy mu_$1l1.y4= mufl_$1 no_warning func copy mu_$1l2.y4= mufl_$1 no_warning func copy mu_$1l3.y4= mufl_$1 no_warning func copy mu_$1r3.y4= mufr_$1 no_warning func copy mu_$1r2.y4= mufr_$1 no_warning func copy mu_$1r1.y4= mufr_$1 # no_warning func div mulf_$1l1= mu_$1l1 0.6 # Also update the creep relaxation factors no_warning func div mulf_$1l2= mu_$1l2 0.6 no_warning func div mulf_$1l3= mu_$1l3 0.6 no_warning func div mulf_$1r3= mu_$1r3 0.6 no_warning func div mulf_$1r2= mu_$1r2 0.6 no_warning func div mulf_$1r1= mu_$1r1 0.6 ]
After the calls to wheel/rail-couplings has been made, the above substruct can be called for all wheelsets the model, to update the values of the friction coefficients.
This block is mainly the same for all railway vehicle models.
N.B. This block do not create any input data for gensys.
These substructures will only be stored in temporary files,
waiting to be used in a in_substruct-command later in the file.
## ## Create wheelsets ## ==================================================================== substruct create_axl [ mass m_rigid_6 axl_$1 lsa_$1 0. 0. -ro_$1 ma_$1 ma_$1 ma_$1 Jfa_$1 Jka_$1 Jpa_$1 constr fix_free_1 axl_$1.k= 0. initval set_var axl_$1.vk= -Vo/ro_$1 ] ## ## Create track-pieces ## ==================================================================== substruct create_trc [ mass m_rigid_6f trc_$1 lsa_$1 0. 0. 0. 0. myt_$1 mzt_$1 Jft_$1 0. 0. constr fix_rigid_1 trc_$1 x 0. # constr fix_rigid_1 trc_$1 z 0. constr fix_rigid_1 trc_$1 k 0. constr fix_rigid_1 trc_$1 p 0. mass fixpoint_6 rail_$1r lsa_$1 0. bo_ 0. mass fixpoint_6 rail_$1l lsa_$1 0. -bo_ 0. ] ## ## Calculation of creep and creepforces between wheels and rails ## ================================================================ substruct wr_coupl_pe3 [ func wr_coupl_pe3 # $1 # Name/number of the wheelset lsa_$1 # Name of the linear local coordinate system # lat_trac vert_trac spv_trac fi_trac # Track irregularities memory fields YMtrac ZMtrac GMtrac CMtrac # Multiplication factors for track irregularities gaugeAverage # Average gauge of spv_trac gaugeDev_$1 # Modify average gauge for a different conicity 1 # Type of contact normal to the contact surface # axl_$1 # Body wheel right side axl_$1 # Body wheel left side trc_$1 # Body track right side trc_$1 # Body track left side # # # Right wheel: ro_$1r # Nominal radius 17e6 # kyrt_$1r # Lateral stiffness rail - track 230e6 # kzrt_$1r # Vertical stiffness rail - track -kmbaF0_$1+ma_$1/2*9.81 # kzrtF0_$1r # Vertical prestress force rail - track 10e3 # cyrt_$1r # Lateral damping rail - track 50e3 # czrt_$1r # Vertical damping rail - track bo_$1r # Lateral semi-distance to nominal running circle, right side # # # Left wheel: ro_$1l # Nominal radius 17e6 # kyrt_$1l # Lateral stiffness rail - track 230e6 # kzrt_$1l # Vertical stiffness rail - track -kmbaF0_$1+ma_$1/2*9.81 # kzrtF0_$1l # Vertical prestress force rail - track 10e3 # cyrt_$1l # Lateral damping rail - track 50e3 # czrt_$1l # Vertical damping rail - track -bo_$1l # Lateral semi-distance to nominal running circle, left side # cp1_$1r # Name of contact point #1 right side trc_$1 cp1_$1r.ksi cp1_$1r.bo 0. # Contact on track axl_$1 0. cp1_$1r.bo 0. # Contact on wheel/wheelset mu_$1r1 # Coefficient of friction 2.05e11 .3 # Modulus of elasticity and Poisson's ratio mu_$1r1/.6 mu_$1r1/.6 mu_$1r1/.6 # Creepage reduction due to contaminated rail surface 0. 2400e6 # Prestress force and stiffness normal to the surface # cp1_$1l trc_$1 cp1_$1l.ksi cp1_$1l.bo 0. # Contact on track axl_$1 0. cp1_$1l.bo 0. # Contact on wheel/wheelset mu_$1l1 # Coefficient of friction 2.05e11 .3 # Modulus of elasticity and Poisson's ratio mu_$1l1/.6 mu_$1l1/.6 mu_$1l1/.6 # Creepage reduction due to contaminated rail surface 0. 2400e6 # Prestress force and stiffness normal to the surface # # cp2_$1r trc_$1 cp2_$1r.ksi cp2_$1r.bo 0. # Contact on track axl_$1 0. cp2_$1r.bo 0. # Contact on wheel/wheelset mu_$1r2 # Coefficient of friction 2.05e11 .3 # Modulus of elasticity and Poisson's ratio mu_$1r2/.6 mu_$1r2/.6 mu_$1r2/.6 # Creepage reduction due to contaminated rail surface 0. 2400e6 # Prestress force and stiffness normal to the surface # cp2_$1l trc_$1 cp2_$1l.ksi cp2_$1l.bo 0. # Contact on track axl_$1 0. cp2_$1l.bo 0. # Contact on wheel/wheelset mu_$1l2 # Coefficient of friction 2.05e11 .3 # Modulus of elasticity and Poisson's ratio mu_$1l2/.6 mu_$1l2/.6 mu_$1l2/.6 # Creepage reduction due to contaminated rail surface 0. 2400e6 # Prestress force and stiffness normal to the surface # # cp3_$1r trc_$1 cp3_$1r.ksi cp3_$1r.bo 0. # Contact on track axl_$1 0. cp3_$1r.bo 0. # Contact on wheel/wheelset mu_$1r3 # Coefficient of friction 2.05e11 .3 # Modulus of elasticity and Poisson's ratio mu_$1r3/.6 mu_$1r3/.6 mu_$1r3/.6 # Creepage reduction due to contaminated rail surface 0. 2400e6 # Prestress force and stiffness normal to the surface # cp3_$1l trc_$1 cp3_$1l.ksi cp3_$1l.bo 0. # Contact on track axl_$1 0. cp3_$1l.bo 0. # Contact on wheel/wheelset mu_$1l3 # Coefficient of friction 2.05e11 .3 # Modulus of elasticity and Poisson's ratio mu_$1l3/.6 mu_$1l3/.6 mu_$1l3/.6 # Creepage reduction due to contaminated rail surface 0. 2400e6 # Prestress force and stiffness normal to the surface ] ## ## Animate track irregularities in GPLOT ## ====================================== substruct animateRails [ no_warning func copy rail_$1$2.y= tral$1$2.y no_warning func copy rail_$1$2.z= tral$1$2.z no_warning func copy rail_$1$2.k= tral$1$2.k no_warning func copy rail_$1$2.p= tral$1$2.p ] ## ## Coupling track - ground ## ========================================================== substruct create_trc_couplz [ coupl k3 kztg$2r trc_$2 0. bo_ 0.340 grd_$2 0. bo_ 0.340 kytg_$2r kytg_$2r kztg_$2r .25 .5 esys_$1 m coupl k3 kztg$2l trc_$2 0. -bo_ 0.340 grd_$2 0. -bo_ 0.340 kytg_$2l kytg_$2r kztg_$2r .25 .5 esys_$1 m # coupl kc cztg$2r trc_$2 0. bo_ 0.340 grd_$2 0. bo_ 0.590 kcztg_$2r cztg_$2r esys_$1 z coupl kc cztg$2l trc_$2 0. -bo_ 0.340 grd_$2 0. -bo_ 0.590 kcztg_$2l cztg_$2l esys_$1 z # coupl kc cytg$2 trc_$2 0. 0.2 0.172 grd_$2 0. -.2 0.172 kcytg_$2 cytg_$2 esys_$1 y ]For a sketch and more information about the track model, please look under Track Model.
## ## Wear- and RCF- indexes ## ================================================================ substruct wearRCF [ func fl_wear_w $1 mu_$11 mu_$12 mu_$13 s_var var_0 cpa_$1.Fnu s_var var_0 cp1_$1.Fnu s_var var_0 cp2_$1.Fnu s_var var_0 cp3_$1.Fnu s_var var_0 cpa_$1.FMnu s_var var_0 cp1_$1.FMnu s_var var_0 cp2_$1.FMnu s_var var_0 cp3_$1.FMnu func mul cp1_$1.nuxm= mu_/0.6 cp1_$1.nux # Reduced creepage according to mulf_ func mul cp2_$1.nuxm= mu_/0.6 cp2_$1.nux # I.e. dry friction only func mul cp3_$1.nuxm= mu_/0.6 cp3_$1.nux func mul cp1_$1.nuym= mu_/0.6 cp1_$1.nuy func mul cp2_$1.nuym= mu_/0.6 cp2_$1.nuy func mul cp3_$1.nuym= mu_/0.6 cp3_$1.nuy func cabs cp1_$1.num= cp1_$1.nuxm cp1_$1.nuym # Total creepage func cabs cp2_$1.num= cp2_$1.nuxm cp2_$1.nuym func cabs cp3_$1.num= cp3_$1.nuxm cp3_$1.nuym s_var sngl cp1_$1.num s_var sngl cp2_$1.num s_var sngl cp3_$1.num ## ## Yield Dang Residual Wear Contact Wear ## Name whe_ Stress Van Stress Limit ForceLlim Cp1 Cp2 Cp3 func rolling_fatigue_3 RCF_$1 $1 300e6 0.32 0. .0025 .0035 30e3 cp1_$1.num cp2_$1.num cp3_$1.num ## ## YieldStress= 300e6 after some hardening ## # RCF-surf according to the shake-down map: s_var sngl RCF_$1.FIs1 s_var sngl RCF_$1.FIs2 s_var sngl RCF_$1.FIs3 # RCF-surf attenuated with respect to wear: s_var sngl RCF_$1.FPs1 s_var sngl RCF_$1.FPs2 s_var sngl RCF_$1.FPs3 # func max RCF_$1.FIs= RCF_$1.FIs1 RCF_$1.FIs2 RCF_$1.FIs3 s_var sngl RCF_$1.FIs # Total RCF-surf according to shake-down map s_var sngl RCF_$1.FPs # Total RCF-surf attenuated with respect to wear s_var sngl RCF_$1.FPb # Total RCF-subsurf s_var sngl RCF_$1.FPd # Total RCF-deep subsurf ## Surface fatigue index Subsurface fatigue index Deep subsurface fatigue index s_var sngl RCF_$1.FPs s_var sngl RCF_$1.FPb s_var sngl RCF_$1.FPd s_var sngl RCF_$1.FPs1 s_var sngl RCF_$1.FIs1 s_var sngl RCF_$1.FPs2 s_var sngl RCF_$1.FIs2 s_var sngl RCF_$1.FPs3 s_var sngl RCF_$1.FIs3 func operp RCF_$1.FPbm= RCF_$1.FPb / 450e6 - 1 s_var sngl RCF_$1.FPbm ]
substruct saveCorrugation [ if_then_init .exist. cp1_$1l.nux func cabs cp1_$1l.anu= cp1_$1l.nux cp1_$1l.nuy func cabs cp1_$1r.anu= cp1_$1r.nux cp1_$1r.nuy s_var var_0 cp1_$1l.anu s_var var_0 cp1_$1r.anu endif if_then_init .exist. cp2_$1l.nux func cabs cp2_$1l.anu= cp2_$1l.nux cp2_$1l.nuy func cabs cp2_$1r.anu= cp2_$1r.nux cp2_$1r.nuy s_var var_0 cp2_$1l.anu s_var var_0 cp2_$1r.anu endif if_then_init .exist. cp3_$1l.nux func cabs cp3_$1l.anu= cp3_$1l.nux cp3_$1l.nuy func cabs cp3_$1r.anu= cp3_$1r.nux cp3_$1r.nuy s_var var_0 cp3_$1l.anu s_var var_0 cp3_$1r.anu endif ]
## ## Secant conicity ## ========================================================== substruct secant_conicity [ func operp cp_$1l.dr= ( cp1_$1l.Fn * cp1_$1l.dr + { cp2_$1l.Fn | 0. } * { cp2_$1l.dr | 0. } + { cp3_$1l.Fn | 0. } * { cp3_$1l.dr | 0. } ) / ( cp1_$1l.Fn + { cp2_$1l.Fn | 0. } + { cp3_$1l.Fn | 0. } ) func operp cp_$1r.dr= ( cp1_$1r.Fn * cp1_$1r.dr + { cp2_$1r.Fn | 0. } * { cp2_$1r.dr | 0. } + { cp3_$1r.Fn | 0. } * { cp3_$1r.dr | 0. } ) / ( cp1_$1r.Fn + { cp2_$1r.Fn | 0. } + { cp3_$1r.Fn | 0. } ) func operp tral$1.g= Track_Gauge*1e-3 + tral$1r.y - tral$1l.y + ral_$1r.y - ral_$1l.y func create_spline axl_$1.yoff= axlyoff_ tral$1.g func operp axl_$1.eta= ( cp_$1r.eta - cp_$1l.eta ) / 2. - axl_$1.yoff if_then axl_$1.eta .gt. 0.0005 func operp axl_$1.lam1= ( cp_$1r.dr - cp_$1l.dr ) / 2 / axl_$1.eta endif if_then axl_$1.eta .lt. -.0005 no_warning func operp axl_$1.lam1= ( cp_$1r.dr - cp_$1l.dr ) / 2 / axl_$1.eta endif func u_lim axl_$1.lam1= 1.2 func l_lim axl_$1.lam1= 0. func lpass2 axl_$1.lam2= axl_$1.lam1 3. 0.9239 func lpass2 axl_$1.lam = axl_$1.lam2 3. 0.3827 s_var sngl tral$1.g s_var sngl axl_$1.yoff s_var sngl axl_$1.eta s_var sngl axl_$1.lam1 s_var sngl axl_$1.lam ]
### ### Length to buffers ### ------------------------------------------------------------- func const buff.A_1= 6.5+1.5 # Coupler semi-distance
The speed of the vehicle can be defined in different ways:
Constant speed
Set speed according to a formula
Set speed according to cant deficiency
Read speed profile from an external file
Just create a variable named Vo. Gensys do always use SI-units in input data, why variable Vo shall be expressed in m/s. However the user can define another variable in order to express the speed in km/h or mph, for output in header lines etc.
func const vkmh= 160 # The initial speed of the vehicle in km/h func div Vo = vkmh 3.6 # Expressed in m/s s_var sngl vkmh # Save variable vkmh for postprocessing
or:
func const vmph= 100 # The initial speed of the vehicle in mph func div Vo = vkmh 2.236936 # Expressed in m/s s_var sngl vmph # Save variable speed for postprocessing
Variable Vo will later be used in the lsys-command when creating the coordinate systems.
N.B. The vehicle will only be given the speed Vo as an initial value.
This longitudinal speed may change during the simulation due to the slope of the track, energy dissipation in dampers and wheel/rail-contact,,, etc.
In long time-domain simulations, please regulate the longitudinal position of the vehicle in some way.
For more information see paragraph Regulate the longitudinal position of the vehicle under section VEHICLE(s).
In order to calculate max non-linear critical speed, variable vkmh can start at a very high value where the vehicle runs unstable. Then reduce the speed gradually until the vehicle becomes stable:
func const vkmhDeacc= 5 # Deacceleration when calculating critical speed func operp vkmh= 400 - vkmhDeacc * time # Vary vkmh linearily func div Vo = vkmh 3.6 # Expressed in m/s s_var sngl vkmh # Save variable vkmh for postprocessing
At the point where the oscillations of the vehicle stops is called the non-linear critical speed of the vehicle.
In order to also reduce the speed of the vehicle it is also necessary to apply braking forces on the vehicle(s). See further information about the braking forces at Excite the vehicle in order to calculate critical speed.
func const Y_cp= `.65 * sign(CurveRadius)` # lateral acc. in track plane func const vkmh= `3.6 * sqrt(CurveRadius * (Y_cp + CurveCant/(2*bo_)*9.81))` no_warning func min vkmh= vkmh 160 func div Vo = vkmh 3.6 s_var sngl vkmh
In this case vkmh will be controlled by the curve radius and cant of the curve. However its value will be maximized to 160 [km/h].
In the formula above the unit of Y_cp is [m/s].
Often the unit [mm] is used for defining cant deficiency.
The relation between cant deficiency expressed in [mm] and expressed in [m/s] is:
Y_cp= cant_deficiency_mm*1e-3/(2*bo_)*9.81
The following table shows the relation between Y_cp expessed in [mm] and [m/s] for
the most common cant deficiencies:
cant deficiency [mm] |
Y_cp [m/s] |
|
---|---|---|
100 | 0.6540 | ~0.65 |
150 | 0.9810 | ~1.00 |
180 | 1.1772 | ~1.18 |
245 | 1.6023 | ~1.60 |
When measuring track forces and ride comfort on an actual vehicle it can be difficult to keep a constant speed during the whole test. In order to compare measurements and simulations it is sometimes necessary to simulate with exactly the same speed profile as was used during the test. The following input data code can be used:
func intpl_r SpeedField insert free_form '(a,a)' track/Speed.txt # Vo speed in m/s lsys e_abs_bendrf esys_1 SpeedField `XtracStart - Buffer.A_1` roTracDesign fiTracDesign zTracDesign 4 4 4 4 4 4 func copy Vo= esys_1.vx func mul vkmh= esys_1.vx 3.6
The file track/Speed.txt comprises two columns.
The first column is the position along the track.
The second column is the speed of the vehicle.
Example: The first lines in file track/Speed.txt:
# # pos speed # [m] [m/s] # ----------- 0.00 34.30 0.17 34.30 0.34 34.30 0.51 34.30 0.69 34.30 0.86 34.30 1.03 34.30 1.20 34.30 1.37 34.30 1.54 34.30 1.72 34.31 1.89 34.30 2.06 34.30 2.23 34.30 . . .
N.B.
The input data code above only controls the motion of esys_1 and its linear local sub-coordinate systems.
In order to make the vehicle to follow the speed profile, the longitudinal position of the vehicle must be regulated.
See Regulate the longitudinal position of the vehicle under section VEHICLE(s).
### ### Euler coordinate systems #[-]{ ========================================================== func const Buffer.A_= 10.00 # Buffer semi-distance (longitudinal) lsys e_abs_bendrf esys_1 Vo `XtracStart - Buffer.A_1` roTracDesign fiTracDesign zTracDesign 4 4 4 4 4 4 # s_var sngl esys_1.b # Curvature s_var sngl esys_1.c # Cant s_var sngl esys_1.x # Positions of the Euler coordinate system s_var sngl esys_1.y # expressed in the fixed fsys-coordinate system s_var sngl esys_1.z # s_var sngl esys_1.vf # Roll speed for evaluation of PCT #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Coordinate systems taking large rotations into consideration are Euler coordinate systems. These types of coordinate systems all begins with the letter e_ in GENSYS. Linear coordinate systems begins with the letter l_. Normally when creating a railway vehicle, only one esys is created per vehicle and that coordinate system is located approximately in the middle of the vehicle, and other linear lsys are related to this esys.
The speed of the Euler system is defined in argument Vo. However if the speed along the track varies according to a speed profile, a memory field can be inserted as an argument to lsys e_abs_bendrf.
Coordinate system lsys e_abs_bendrf is very similar to lsys e_abs_bend which defines an ideal transition curve of type clothoid. But coordinate system lsys e_abs_bendrf is more close to a transition curve we see in reality. Because in reality the transition curve have rounded corners in the beginning and in the end.
### ### Vehicle properties #[-]{ ========================================================== substruct vehProperties [ # $1 car_# ## ## Basic vehicle geometry ## ---------------------- func const acb_$1= 6.5 # bogie pivot semi-distance (longitudinal) func const aba_$1= 1.5 # wheelset semi-distance within a bogie (long.) ## ## Vehicle bodies ## -------------- ## Car-body (c) func const actaracg_$1= 0.0 # centre of gravity position, longitudinal func const hctaracg_$1= 2.0 # centre of gravity position, vertical func const mctara_$1= 52000 # mass func const Jfctara_$1= mctara_$1*(1.50^2+1.538^2)/3 # moment of inertia, roll func const Jkctara_$1= mctara_$1*(1.50^2+(acb_$1+aba_$1+.58)^2)/3 # moment of inertia, pitch func const Jpctara_$1= Jkctara_$1 # moment of inertia, yaw func const hfloor_$1= 1.3 # floor level ## ## Bogie frames (b) func const hbcg_$1= 0.7 # centre of gravity position, vertical func const mb_$1 = 10000 # mass func const Jfb_$1= 3000 # moment of inertia, roll func const Jkb_$1= 10000 # moment of inertia, pitch func const Jpb_$1= 15000 # moment of inertia, yaw ## ## Axles (a) func const ro_$1 = 0.50 # centre of gravity pos., vert. (wheel radius) func const ma_$1 = 2000 # mass func const Jfa_$1= 1200 # moment of inertia, roll func const Jka_$1= 250 # moment of inertia, pitch func const Jpa_$1= 1200 # moment of inertia, yaw ## ## Track pieces (t) func const myt_$1= 2e3*2.5*2.5*1.36 # Density 2e3 kg/m^2 func const mzt_$1= myt_$1 func const Jft_$1= mzt_$1*(2.5^2+2.5^2)/12 #### #### Secondary suspension: ##[-]{ ------------------------------------------------------------- ## ## Secondary suspension: Coil springs between car and bogie ## ------------------------------------------------------------ func const kzcb.B_$1= 1.0 # lateral semi distance [m] func const kzcb.H_$1= 1.0 # top of spring [m] func const kzcb.hs_$1= 0.32 # height of spring [m] coupl p_lin kxcb_$1= 0.0 600e3 # stiffness, longitudinal shear [N/m] coupl p_lin kycb_$1= 0.0 600e3 # stiffness, lateral shear [N/m] func const kzcbF0_$1= -mctara_$1*9.81/4 # preload force coupl p_lin kzcb_$1 = kzcbF0_$1 900e3 # stiffness, vertical compression [N/m] ## ## Secondary suspension: Anti-roll bars ## ----------------------------------------------------- func const kfcb.H_$1= 1.0 # Height above top of rail [m] coupl p_lin kfcb_$1 = 0. 2.5e6 # Roll stiffness [Nm/rad] ## ## Secondary suspension: Traction rods ## ----------------------------------------------------- func const ktr.Ac_$1= 7.5 # rod position in car-body, longitudinal func const ktr.Ab_$1= -.2 # rod position in bogie, longitudinal func const ktr.Bc_$1= 0.0 # rod position in car-body, lateral func const ktr.Bb_$1= 0.0 # rod position in bogie, lateral func const ktr.Hc_$1= 0.4 # rod position in car-body, vertical func const ktr.Hb_$1= 0.3 # rod position in bogie, vertical coupl p_lin ktr_$1= 0. 25e6 # stiffness coupl p_lin ctr_$1= 0. 100e3 # parallel viscous damping ## ## Secondary suspension: Lateral bumpstops ## ----------------------------------------------------- func const kycbs.H_$1= 1.0 # Height above top of rail [m] coupl p_nlin_s kycbs_$1= 0. 0.030, 0.0 # Break-point #1 [m],[N] 0.040, 15e3 # Break-point #2 [m],[N] 0.090, 2e6 # Break-point #3 [m],[N] ## ## Secondary suspension: Vertical bumpstops ## ----------------------------------------------------- func const kzcbs.A_$1= 0.0 # Longitudinal distance [m] func const kzcbs.B_$1= 1.0 # Lateral semi-distance [m] func const kzcbs.H_$1= 1.0 # Height above top of rail [m] coupl p_nlin_s kzcbs_$1= 0. 0.025, 0.0 # Break-point #1 [m],[N] 0.030, 15e3 # Break-point #2 [m],[N] 0.080, 2e6 # Break-point #3 [m],[N] ## ## Secondary suspension: Lateral viscous dampers ## -------------------------------------------------------- func const cycb.A_$1 = 0.34 # damper position, longitudinal func const cycb.Bc_$1= 0.9 # position in car-body, lateral func const cycb.Bb_$1= 0.4 # position in bogie, lateral func const cycb.Hc_$1= 0.7 # position in car-body, vertical func const cycb.Hb_$1= 0.6 # position in bogie, vertical coupl p_lin cycb_$1= 0.0 40e3 # damping coefficient ## ## Secondary suspension: Vertical viscous dampers ## -------------------------------------------------------- func const czcb.A_$1 = 0.34 # damper position, longitudinal func const czcb.B_$1 = 1.25 # damper position, lateral func const czcb.Hc_$1= 1.0 # position in car-body, vertical func const czcb.Hb_$1= 0.5 # position in bogie, vertical coupl p_lin czcb_$1= 0.0 40e3 # damping coefficient ## ## Secondary suspension: Yaw viscous dampers ## -------------------------------------------------------- func const cccb.Ac_$1= 7.3 # position in car-body, longitudinal func const cccb.Ab_$1= -0.4 # position in bogie, longitudinal func const cccb.Bc_$1= 1.3 # position in car-body, lateral func const cccb.Bb_$1= 1.3 # position in bogie, lateral func const cccb.Hc_$1= 0.7 # position in car-body, vertical func const cccb.Hb_$1= 0.6 # position in bogie, vertical coupl p_lin kccb_$1= 0. 25e6 # series stiffness coupl p_nlin cccb_$1= 0. -1.032 -26e3 # Blow-off compression -0.032 -16e3 # Damping coeff. compression 0. 0. 0.032 16e3 # Damping coeff. expansion 1.032 26e3 # Blow-off expansion ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #### #### Primary suspension: ##[-]{ ---------------------------------------------------------------------------- ## ## Primary suspension: springs ## ---------------------------------------------------------------------------- func const kmba.B_$1= 1.0 # spring position, lateral # func const kmbaF0_$1= (2*kzcbF0_$1-mb_$1*9.81)/4 coupl p_lin36 kmba_$1= 0. 0. kmbaF0_$1 0. 0. 0. 20e6 0. 0. 0. 0. 0. 0. 20e6 0. 0. 0. 0. 0. 0. 1200e3 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. # coupl p_lin36 cmba_$1= 0. 0. 0. 0. 0. 0. 20e3 0. 0. 0. 0. 0. 0. 20e3 0. 0. 0. 0. 0. 0. 5e3 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ## ## Primary suspension: Lateral bumpstops ## ---------------------------------------------------------------------------- func const kybas.H_$1= 0.4 # Height above top of rail [m] coupl p_nlin_s kybas_$1= 0. # symmetric non-linear stiffness 0.025 0.0 # break-point #1 0.050 1e6 # break-point #2 ## ## Primary suspension: Vertical bumpstops ## ---------------------------------------------------------------------------- func const kzbas.A_$1= 0.0 # Longitudinal distance [m] func const kzbas.B_$1= 1.1 # Lateral semi-distance [m] func const kzbas.H_$1= 0.4 # Height above top of rail [m] coupl p_nlin_s kzbas_$1= 0. # symmetric non-linear stiffness 0.025 0.0 # break-point #1 0.050 1e6 # break-point #2 ## ## Primary suspension: Vertical viscous damper ## ---------------------------------------------------------------------------- func const czba.A_$1 = 0.0 # damper position, longitudinal func const czba.Bb_$1= 1.1 # damper position, lateral in bogie func const czba.Ba_$1= 1.1 # damper position, lateral in axle func const czba.Hb_$1= 1.0 # damper position, vertical in bogie func const czba.Ha_$1= ro_$1 # damper position, vertical in axle coupl p_lin czba_$1= 0. 60e3 # viscous damping ## ## Coupling track - ground ## ========================================================== coupl p_lin kytg_$1 = 0. 40e6 coupl p_lin cytg_$1 = 0. 2*.55*sqrt(kytg_$1.v1*myt_$1) coupl p_lin kcytg_$1= 0. 2*pi*072.*cytg_$1.v1 coupl p_lin kztg_$1 = kmbaF0_$1-(ma_$1+mzt_$1)/2*9.81 220e6 # Stiffness under ballast coupl p_lin cztg_$1 = 0. 2*0.36*sqrt(kztg_$1.v1*mzt_$1/2) # Damping in ballast coupl p_lin kcztg_$1= 0. 2*pi*91*cztg_$1.v1 ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ] #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - in_substruct vehProperties [ " " ] # $1 car_#
In above example you can see that subtructure vehProperties is called with the argument " ". This means that argument $1 will be replaced with the "space" character, i.e. nothing.
Therefore all property names will end with an underscore character "_". Indicating that these values are the default values of all properties or a variables.
In program CALC the underscore character "_" has a very special meaning. For example, if a property or a variable in gensys is called czba_111r it means that the damping coefficient for the vertical damper located on the right side of the first axle in the first bogie in the first vehicle shall have this value. If property or variable czba_111r not can be found then will gensys continue and search for the property or variable czba_111. If this property or variable not can be found either, program CALC will continue and search for the property or variable czba_11,,, etc. until the name czba_ has been reached. If property or variable czba_ not can be found program CALC will write an error message and stop further execution.
By using this name convention it is easy to model asymmetric vehicle in gensys. E.g. if input data looks like this:
coupl p_lin czba_ = 0. 60e3 coupl p_lin czba_111r= 0. 0. coupl p_lin czba_121 = 0. 30e3
This will model a vehicle where default value of the vertical primary dampers is 60e3. But the damper on the right side of axle 111 is broken, and both dampers on axle 121 have only 50% left of their capacity.
### ### Load properties #[-]{ ------------------------------------------------------------- substruct loadProperties [ # $1 car_#, $2 Weight, $3 C.g. long pos, $4 C.g. height, $5 Length, $6 Width, $7 Height func const mcload_$1 = $2 # Load weight func const acloadcg_$1= $3 # c.g. longitudinal func const hcloadcg_$1= $4 # c.g. vertical func const Jfcload_$1= `mcload_$1*($7^2+$6^2)/12` func const Jkcload_$1= `mcload_$1*($5^2+$7^2)/12` func const Jpcload_$1= `mcload_$1*($6^2+$5^2)/12` # func const mc_$1 = `mctara_$1 + mcload_$1` # Total weight func const accg_$1=`(actaracg_$1*mctara_$1 + acloadcg_$1*mcload_$1) / mc_$1` # Centre of gravity position, longitudinal func const hccg_$1=`(hctaracg_$1*mctara_$1 + hcloadcg_$1*mcload_$1) / mc_$1` # Centre of gravity position, vertical # func const Jfc_$1= `Jfcload_$1 + mcload_$1* (hcloadcg_$1-hccg_$1)^2` func const Jkc_$1= `Jkcload_$1 + mcload_$1*((acloadcg_$1-accg_$1)^2+(hcloadcg_$1-hccg_$1)^2)` func const Jpc_$1= `Jpcload_$1 + mcload_$1* (acloadcg_$1-accg_$1)^2` # no_warning func const Jfc_$1= `Jfctara_$1 + mctara_$1* (hctaracg_$1-hccg_$1)^2 + Jfc_$1` no_warning func const Jkc_$1= `Jkctara_$1 + mctara_$1*((actaracg_$1-accg_$1)^2+(hctaracg_$1-hccg_$1)^2) + Jkc_$1` no_warning func const Jpc_$1= `Jpctara_$1 + mctara_$1* (actaracg_$1-accg_$1)^2 + Jpc_$1` ] #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - in_substruct loadProperties [ "1" 0e3 0. 1.650 14.000 2.400 1.300 ] # in_substruct loadProperties [ "2" 0e3 0. 1.650 14.000 2.400 1.300 ]
Cargo and passengers can be rigidly attached to the car-body as in substructure loadProperties above. This substructure is called for each vehicle in the train-set, allowing to have different loads on different vehicles.
If the user wants to make a better model, the load can be modeled in a separate mass. and connected to the car-body with springs and dampers.
The whole vehicle is modeled in a big substructure named vehicle. By writing the input data file in this way it is easy to create many vehicles in the train-set.
### ### VEHICLE(s) #[-]{ ========================================================== substruct vehicle [ # $1 car_#
A sketch of the vehicle
The sketch is not necessary but it helps new readers to understand the model.
## ## A sketch of the vehicle ## =========================================== ! ! ! _________________________________________________|_________________________________________________ ! / | \ ! / | \ ! / | \ ! / | \ ! / | \ ! / | \ ! / | mc_, Jfc_, Jkc_, Jpc_ \ ! \ -O-------------------------------------------------------/--------- ! \______________________________________________________|______________________________________________________/ ^ ! ____________|_____________ | ____________|_____________ | ! | | | | | |mb_,Jfb_,Jkb_,Jpb_ |hccg_ ! | | | | | -O---------------------- | ! |____________|_____________| | |____________|_____________| ^ | ! ___ | ___ | ___ | ___ | | ! / \ | / \ | / \ | / \ |hbcg_ | ! | + | | | + | | | + | | | + | | | ! _r.l.______\___/_____|______\___/_________________________|_________________________\___/_____|______\_|_/______|________|____ ! | | | | ! lsa_$122 lsb_$12 lsa_$121 lsc_$1 lsa_$112 lsb_$11 lsa_$111 ! | | | | ! | | acb_ | aba_ | ! | |---------------------------------->|------->| ! | ! esys_$1 !
Linear local coordinate systems
It is a good practice to have separate coordinate systems for all masses that have different longitudinal positions along the track,
because then will all displacements be expressed relative to the track where the mass is located.
However do not create unnecessarily many coordinate system, because that will lead to longer execution times.
## ## Local linear coordinate systems ## =============================== ## ## lsys l_local l_name esys a b h ## ----------------------------------------------------- lsys l_local lsc_$1 esys_$1 0.0 0.0 0.0 lsys l_local lsb_$11 lsc_$1 acb_$1 0.0 0.0 lsys l_local lsb_$12 lsc_$1 -acb_$1 0.0 0.0 lsys l_local lsa_$111 lsb_$11 aba_$11 0.0 0.0 lsys l_local lsa_$112 lsb_$11 -aba_$11 0.0 0.0 lsys l_local lsa_$121 lsb_$12 aba_$12 0.0 0.0 lsys l_local lsa_$122 lsb_$12 -aba_$12 0.0 0.0 # s_var sngl lsc_$1.vf # Roll speed for calculation of PCT
Vehicle and track masses
All properties has previously been defined under section Vehicle properties.
All substructures has previously been defined under section Substructures to VEHICLE(s).
Ground point grd_$1 is used for connecting a soft longitudinal spring to the car-body of the vehicle,
in order to keep up the speed during long simulations.
For more information see paragraph Regulate the longitudinal position of the vehicle under section VEHICLE(s).
Ground points grd_$111, grd_$112, grd_$121 and grd_$122 are used for connecting the track model to the fixed ground.
#### #### Vehicle and track masses ##[-]{ ================================================================ ## ## mass m_rigid_6 m_name lsys acg bcg hcg m m m Jf Jk Jp ## ------------------------------------------------------------------------------------------------ mass m_rigid_6 car_$1 lsc_$1 accg_$1 0.0 -hccg_$1 mc_$1 mc_$1 mc_$1 Jfc_$1 Jkc_$1 Jpc_$1 # car-body mass m_rigid_6 bog_$11 lsb_$11 0.0 0.0 -hbcg_$11 mb_$11 mb_$11 mb_$11 Jfb_$11 Jkb_$11 Jpb_$11 # bogies mass m_rigid_6 bog_$12 lsb_$12 0.0 0.0 -hbcg_$12 mb_$12 mb_$12 mb_$12 Jfb_$12 Jkb_$12 Jpb_$12 ## ## Create wheelsets ## ==================================================================== in_substruct create_axl [ $111 ] in_substruct create_axl [ $112 ] in_substruct create_axl [ $121 ] in_substruct create_axl [ $122 ] ## ## Create track-pieces ## ==================================================================== in_substruct create_trc [ $111 ] in_substruct create_trc [ $112 ] in_substruct create_trc [ $121 ] in_substruct create_trc [ $122 ] # mass fixpoint_6 grd_$1 lsc_$1 0.0 0.0 0.0 # ground points mass fixpoint_6 grd_$111 lsa_$111 0.0 0.0 0.0 mass fixpoint_6 grd_$112 lsa_$112 0.0 0.0 0.0 mass fixpoint_6 grd_$121 lsa_$121 0.0 0.0 0.0 mass fixpoint_6 grd_$122 lsa_$122 0.0 0.0 0.0 ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Regulate the longitudinal position of the vehicle
The longitudinal position of the vehicle must be regulated to avoid too big longitudinal difference between the masses and their coordinate systems.
In reality the vehicles rolls freely along the track, there is no spring or damper that controls their longitudinal positions.
However when simulating through curves the wheelsets must not deviate too much from their coordinate systems,
because the deviation can cause a angle of attack in the contact points.
If the longitudinal difference between a mass and its coordinate systems is more than 0.1[m] a warning message will be written on error output,
and the user will be recommended to regulate the position of the vehicle better.
Reasons that causes error in longitudinal position of the vehicle:
The most simple speed regulator is a linear spring and damper connected between car_$1 and the fixed point grd_$1:
#### #### Regulate the longitudinal position of the vehicle #### (In order to keep the speed up during long simulations) ##[-]{ ================================================================ ## ## Longitudinal stiffness connecting the car-body to the lsc_$1 coordinate system ## ============================================================================= func const mvhe_$1= mc_$1+mb_$11+mb_$12+ma_$111+Jka_$111/ro_$111^2+ma_$112+Jka_$112/ro_$112^2+ma_$121+Jka_$121/ro_$121^2+ma_$122+Jka_$122/ro_$122^2 coupl k kxcg1 car_$1 0 0 -hccg_$1*.6 grd_$1 0 0 -hccg_$1*.6 (2*pi*.25)^2*mvhe_$1 esys_$1 x # fo= 0.25[Hz] coupl c cxcg1 car_$1 0 0 -hccg_$1*.6 grd_$1 0 0 -hccg_$1*.6 4*pi*.7*.25*mvhe_$1 esys_$1 x # zeta=0.7 ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
A better speed regulator could consist of a PID-regulator. This example shows a PID-regulator that generates a pitch moment on the wheel-sets:
#### #### Regulate the longitudinal position of the vehicle #### (In order to keep the speed up during long simulations) ##[-]{ ================================================================ ## ## Apply pitch moment on the wheelsets ## ========================================================== func const fxcg= 0.25 func const mvhe_$1= mc_$1+mb_$11+mb_$12+ma_$111+Jka_$111/ro_$111^2+ma_$112+Jka_$112/ro_$112^2+ma_$121+Jka_$121/ro_$121^2+ma_$122+Jka_$122/ro_$122^2 func const Kreg_$1= (2*pi*fxcg)^2*mvhe_$1*ro_$1/4 func const Creg_$1= 4*pi*.70*fxcg*mvhe_$1*ro_$1/4 func operp car_.x = ( car_$1.x * mc_$1 + bog_$11.x * mb_$11 + bog_$12.x * mb_$12 + axl_$111.x * ma_$111 + axl_$112.x * ma_$112 + axl_$121.x * ma_$121 + axl_$122.x * ma_$122 ) / mvhe_$1 func operp car_.vx= ( car_$1.vx * mc_$1 + bog_$11.vx * mb_$11 + bog_$12.vx * mb_$12 + axl_$111.vx * ma_$111 + axl_$112.vx * ma_$112 + axl_$121.vx * ma_$121 + axl_$122.vx * ma_$122 ) / mvhe_$1 # func mul MtractionK_$1= Kreg_$1 car_.x func mul MtractionC_$1= Creg_$1 car_.vx func add Mtraction_$1= MtractionK_$1 MtractionC_$1 func lpass2_0 MtractionF1_$1= Mtraction_$1 5. .9239 # Second order low pass filter, start value equal to 0(zero) func lpass2_0 MtractionF2_$1= MtractionF1_$1 5. .3827 # Second order low pass filter, start value equal to 0(zero) # func incr axl_$111.Mk= MtractionF2_$1 func incr axl_$112.Mk= MtractionF2_$1 func incr axl_$121.Mk= MtractionF2_$1 func incr axl_$122.Mk= MtractionF2_$1 ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
An even better model can be created if the regulating force is created by applying a contact force between the wheelset and the bogie frame on the cog-wheels in the gearbox.
N.B. If a speed profile has been given under Speed above, accelerations and retardations can be very high. This can lead to very high pitch velocities of the wheelsets. Please make sure that the friction between wheel and rail is sufficient.
Acceleration variables for Ride Index calculations
The acceleration signals are used for Ride Comfort evaluations.
The evaluation takes place in postprocessor MPLOT.
The output variables from the commands are stored on the id-file with the substructure $gensys/calc/insert_files/save_car1.ins
mentioned under Save-files above.
## ## Acceleration response points on car-body floor ## ============================================== func accp_bodyf0 car_$1b1 car_$1 acb_$1 0.0 -hfloor_$1 func accp_bodyf0 car_$1_m car_$1 0.0 0.0 -hfloor_$1 func accp_bodyf0 car_$1b2 car_$1 -acb_$1 0.0 -hfloor_$1
#### #### Passengers ##[-]{ ============================================== ! ! _______________ ! | | ! | | ! | spass | # Sprung passenger mass ! | | # 90 % of total passenger weight ! | | ! | | ! |_______________| ! | | ! / | | | # Stiffness and damping in passenger ! kpass \ |_|_| cpass # Eigenfrequency 5 [Hz] ! / |___| # Relative damping 50 % ! \ | ! __|_________|__ ! | | # Unsprung passenger mass ! | upass | # 10 % of total passenger weight ! |_______________| ! | | ! / | | | ! kseat \ |_|_| cseat ! / |___| ! \ | ! __|_________|__ ! ! car-body ! ! coupl p_lin36 kpass_= 0. 0. -9.81*72 0. 0. 0. (2*pi*5)^2*80 0. 0. 0. 0. 0. 0. (2*pi*1)^2*80 0. 0. 0. 0. 0. 0. (2*pi*5)^2*80 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. # coupl p_lin36 cpass_= 0. 0. 0. 0. 0. 0. 2*0.5*(2*pi*5)*80 0. 0. 0. 0. 0. 0. 2*0.5*(2*pi*1)*80 0. 0. 0. 0. 0. 0. 2*0.5*(2*pi*5)*80 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. # coupl p_lin36 kseat_= 0. 0. -9.81*80 0. 0. 0. 80e3 0. 0. 0. 0. 0. 0. 80e3 0. 0. 0. 0. 0. 0. 80e3 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. # coupl p_lin36 cseat_= 0. 0. 0. 0. 0. 0. 250 0. 0. 0. 0. 0. 0. 250 0. 0. 0. 0. 0. 0. 250 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. # func const pass.A= 1.0 func const pass.B= 0.4 func const spass.H= 1.1 func const upass.H= 0.8 substruct passenger [ # $1 car_no $2 bog_no $3 +/- fwd/aft $4 r/l $5 +/- right/left ] mass m_rigid_6 spass_$1$2$4 lsc_$1 $3pass.A $5pass.B -spass.H 72 72 72 0 0 0 # Sprung passenger mass mass m_rigid_6 upass_$1$2$4 lsc_$1 $3pass.A $5pass.B -upass.H 8 8 8 0 0 0 # Unsprung passenger mass body box_mass spass_$1$2$4 +.10 -.10 .15 -.15 0.20 -.60 body box_mass upass_$1$2$4 -$3.50 +$3.10 .15 -.15 0.07 -.07 constr fix_rigid_1 spass_$1$2$4 f= 0. constr fix_rigid_1 spass_$1$2$4 k= 0. constr fix_rigid_1 spass_$1$2$4 p= 0. constr fix_rigid_1 upass_$1$2$4 f= 0. constr fix_rigid_1 upass_$1$2$4 k= 0. constr fix_rigid_1 upass_$1$2$4 p= 0. coupl k kpass$1$2$4 spass_$1$2$4 $3pass.A $5pass.B -spass.H upass_$1$2$4 $3pass.A $5pass.B -spass.H kpass_$1$2$4 esys_$1 m coupl c cpass$1$2$4 spass_$1$2$4 $3pass.A $5pass.B -spass.H upass_$1$2$4 $3pass.A $5pass.B -spass.H cpass_$1$2$4 esys_$1 m coupl k kseat$1$2$4 upass_$1$2$4 $3pass.A $5pass.B -upass.H car_$1 $3pass.A $5pass.B -upass.H kseat_$1$2$4 esys_$1 m coupl c cseat$1$2$4 upass_$1$2$4 $3pass.A $5pass.B -upass.H car_$1 $3pass.A $5pass.B -upass.H cseat_$1$2$4 esys_$1 m s_var var_0 upass_$1$2$4.x s_var var_0 upass_$1$2$4.y s_var var_0 upass_$1$2$4.z s_var var_0 upass_$1$2$4.f s_var var_0 upass_$1$2$4.k s_var var_0 upass_$1$2$4.p s_var var_0 upass_$1$2$4.vx s_var var_0 upass_$1$2$4.vy s_var var_0 upass_$1$2$4.vz s_var var_0 upass_$1$2$4.vf s_var var_0 upass_$1$2$4.vk s_var var_0 upass_$1$2$4.vp s_var var_0 spass_$1$2$4.x s_var var_0 spass_$1$2$4.y s_var var_0 spass_$1$2$4.z s_var var_0 spass_$1$2$4.f s_var var_0 spass_$1$2$4.k s_var var_0 spass_$1$2$4.p s_var var_0 spass_$1$2$4.vx s_var var_0 spass_$1$2$4.vy s_var var_0 spass_$1$2$4.vz s_var var_0 spass_$1$2$4.vf s_var var_0 spass_$1$2$4.vk s_var var_0 spass_$1$2$4.vp ## ## Acceleration in seated passengers ## ============================================== func accp_bodyfix upass_$1$2$4 upass_$1$2$4 1. -pass.B -upass.H func accp_bodyfix spass_$1$2$4 spass_$1$2$4 1. -pass.B -spass.H s_var var_0 upass_$1$2$4.ax s_var var_0 upass_$1$2$4.ay s_var var_0 upass_$1$2$4.az s_var var_0 spass_$1$2$4.ax s_var var_0 spass_$1$2$4.ay s_var var_0 spass_$1$2$4.az ## ## Update prestress forces in secondary springs ## ============================================== func incr_init kzairbag_11l.F0= -80*9.81*(acb+airbag.A+$3pass.A)/2/(acb+airbag.A)*(airbag.B-$5pass.B)/2/airbag.B func incr_init kzairbag_11r.F0= -80*9.81*(acb+airbag.A+$3pass.A)/2/(acb+airbag.A)*(airbag.B+$5pass.B)/2/airbag.B func incr_init kzairbag_12l.F0= -80*9.81*(acb+airbag.A-$3pass.A)/2/(acb+airbag.A)*(airbag.B-$5pass.B)/2/airbag.B func incr_init kzairbag_12r.F0= -80*9.81*(acb+airbag.A-$3pass.A)/2/(acb+airbag.A)*(airbag.B+$5pass.B)/2/airbag.B ] in_substruct passenger [ 1 1 + l - ] # in_substruct passenger [ 1 1 + r + ] in_substruct passenger [ 1 2 - l - ] # in_substruct passenger [ 1 2 - r + ] ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Position points for gauging
The command pos_rlsys2 calculates the position of a point on a mass.
The position can be expressed in an another coordinate system,
making it possible to express the location of the point relative to the track
where the point is located.
## ## Position points for gauging ## =============================================== func pos_rlsys2 car_$1b1 car_$1 lsb_$11 acb_$1 0.0 -5.6 # Pantograph sway func pos_rlsys2 car_$1b2 car_$1 lsb_$12 -acb_$1 0.0 -5.6
Graphical representation of the masses
These commands are not read by program CALC only by program GPLOT.
#### #### Graphical representation of the masses ##[-]{ ================================================================ ## Car-body ## ------------------------------------------- if_then_char_init CalcType .eq. GLPLOT insert file vhedat/body_car_X2000.ins # insert file vhedat/body_car_Rc.ins else body box_mass_733 car_$1 acb_$1+2.25 1.43 0.7 acb_$1+1.38 1.2 -1.7 acb_$1+2.25 -1.43 0.7 acb_$1+1.38 -1.2 -1.7 -(acb_$1+2.25) 1.43 0.7 -(acb_$1+2.25) 1.2 -1.7 -(acb_$1+2.25) -1.43 0.7 -(acb_$1+2.25) -1.2 -1.7 endif ## Bogies ## ------------------------------------------- body box_mass bog_$11 aba_$11+.25 -aba_$11-.25 1. -1. 0.15 -.2 body box_mass bog_$12 aba_$12+.25 -aba_$12-.25 1. -1. 0.15 -.2 ## Wheelsets ## ------------------------------------------- body whe_set_mass axl_$111 ro_$111 bo_$111 body whe_set_mass axl_$112 ro_$112 bo_$112 body whe_set_mass axl_$121 ro_$121 bo_$121 body whe_set_mass axl_$122 ro_$122 bo_$122 # if_then_char_init CalcType .eq. GLPLOT body opengl_mass axl_$111 1 1 1 1 CYL_W_DISK .35 13 .45 .55 # Brake disks body opengl_mass axl_$111 1 1 1 1 CYL_W_DISK .35 13 -.45 -.55 body opengl_mass axl_$112 1 1 1 1 CYL_W_DISK .35 13 .45 .55 body opengl_mass axl_$112 1 1 1 1 CYL_W_DISK .35 13 -.45 -.55 body opengl_mass axl_$121 1 1 1 1 CYL_W_DISK .35 13 .45 .55 body opengl_mass axl_$121 1 1 1 1 CYL_W_DISK .35 13 -.45 -.55 body opengl_mass axl_$122 1 1 1 1 CYL_W_DISK .35 13 .45 .55 body opengl_mass axl_$122 1 1 1 1 CYL_W_DISK .35 13 -.45 -.55 endif ## ## body type m_name polygon ## ------------------------------------------------------------------------------ if_then_char_init CalcType .ne. GLPLOT body box_mass trc_$111 0.5 -.5 1.2675 -1.2675 0.340 0.172 body box_mass rail_$111r 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass rail_$111l 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass trc_$112 0.5 -.5 1.2675 -1.2675 0.340 0.172 body box_mass rail_$112r 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass rail_$112l 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass trc_$121 0.5 -.5 1.2675 -1.2675 0.340 0.172 body box_mass rail_$121r 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass rail_$121l 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass trc_$122 0.5 -.5 1.2675 -1.2675 0.340 0.172 body box_mass rail_$122r 0.5 -.5 0.0325 -.0325 0.172 0. body box_mass rail_$122l 0.5 -.5 0.0325 -.0325 0.172 0. endif ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Couplings between the masses
The whole model is paramerized by variables defined in section Vehicle properties
#### #### Secondary suspension: ##[-]{ ================================================================ ## ## Secondary suspension: Coil springs ## ================================== coupl k3_l kzcb$11r # Name, first spring, right side car_$1 acb_$1 kzcb.B_$1 -kzcb.H_$1 # Body #1 and its attachment point bog_$11 0.0 kzcb.B_$1 -kzcb.H_$1 # Body #2 and its attachment point kxcb_$11r kycb_$11r kzcb_$11r # Properties kzcb.hs_$1 .5 # Height of spring esys_$1 m # Coordinate system and direction of action bog_$11.f bog_$11.k bog_$11.p # Spring tilted according to the bogie # coupl k3_l kzcb$11l # Name, first spring, left side car_$1 acb_$1 -kzcb.B_$1 -kzcb.H_$1 # Body #1 and its attachment point bog_$11 0.0 -kzcb.B_$1 -kzcb.H_$1 # Body #2 and its attachment point kxcb_$11l kycb_$11l kzcb_$11l # Properties kzcb.hs_$1 .5 # Height of spring esys_$1 m # Coordinate system and direction of action bog_$11.f bog_$11.k bog_$11.p # Spring tilted according to the bogie # coupl k3_l kzcb$12r # Name, second spring, right side car_$1 -acb_$1 kzcb.B_$1 -kzcb.H_$1 # Body #1 and its attachment point bog_$12 0.0 kzcb.B_$1 -kzcb.H_$1 # Body #2 and its attachment point kxcb_$12r kycb_$12r kzcb_$12r # Properties kzcb.hs_$1 .5 # Height of spring esys_$1 m # Coordinate system and direction of action bog_$12.f bog_$12.k bog_$12.p # Spring tilted according to the bogie # coupl k3_l kzcb$12l # Name, second spring, left side car_$1 -acb_$1 -kzcb.B_$1 -kzcb.H_$1 # Body #1 and its attachment point bog_$12 0.0 -kzcb.B_$1 -kzcb.H_$1 # Body #2 and its attachment point kxcb_$12l kycb_$12l kzcb_$12l # Properties kzcb.hs_$1 .5 # Height of spring esys_$1 m # Coordinate system and direction of action bog_$12.f bog_$12.k bog_$12.p # Spring tilted according to the bogie ## ## Secondary suspension: Anti-roll bars ## ==================================== ## ## coupl k c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ----------------------------------------------------------------------------------------- coupl k kfcb$11 car_$1 acb_$1 0.0 -kfcb.H_$1 bog_$11 0.0 0.0 -kfcb.H_$1 kfcb_$11 esys_$1 f coupl k kfcb$12 car_$1 -acb_$1 0.0 -kfcb.H_$1 bog_$12 0.0 0.0 -kfcb.H_$1 kfcb_$12 esys_$1 f ## ## Secondary suspension: Traction rods ## =================================== ## ## c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ----------------------------------------------------------------------------------------------- coupl k ktr$11 car_$1 ktr.Ac_$1 ktr.Bc_$1 -ktr.Hc_$1 bog_$11 ktr.Ab_$1 ktr.Bb_$1 -ktr.Hb_$1 ktr_$11 esys_$1 c coupl k ktr$12 car_$1 -ktr.Ac_$1 ktr.Bc_$1 -ktr.Hc_$1 bog_$12 -ktr.Ab_$1 ktr.Bb_$1 -ktr.Hb_$1 ktr_$12 esys_$1 c coupl c ctr$11 car_$1 ktr.Ac_$1 ktr.Bc_$1 -ktr.Hc_$1 bog_$11 ktr.Ab_$1 ktr.Bb_$1 -ktr.Hb_$1 ctr_$11 esys_$1 c coupl c ctr$12 car_$1 -ktr.Ac_$1 ktr.Bc_$1 -ktr.Hc_$1 bog_$12 -ktr.Ab_$1 ktr.Bb_$1 -ktr.Hb_$1 ctr_$12 esys_$1 c ## ## Secondary suspension: Lateral bumpstops ## ======================================= ## ## coupl k c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ---------------------------------------------------------------------------------------- coupl k kycbs$11 car_$1 acb_$1 0.0 -kycbs.H_$1 bog_$11 0.0 0.0 -kycbs.H_$1 kycbs_$11 esys_$1 y coupl k kycbs$12 car_$1 -acb_$1 0.0 -kycbs.H_$1 bog_$12 0.0 0.0 -kycbs.H_$1 kycbs_$12 esys_$1 y # s_var sngl kycbs$11.d s_var sngl kycbs$12.d s_var sngl kycbs$11.F s_var sngl kycbs$12.F ## ## Secondary suspension: Vertical bumpstops ## ======================================== ## ## coupl k c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ----------------------------------------------------------------------------------------------------------------- coupl k kzcbs$11r car_$1 acb_$1+kzcbs.A_$1 kzcbs.B_$1 -kzcbs.H_$1 bog_$11 kzcbs.A_$1 kzcbs.B_$1 -kzcbs.H_$1 kzcbs_$11r esys_$1 z coupl k kzcbs$11l car_$1 acb_$1+kzcbs.A_$1 -kzcbs.B_$1 -kzcbs.H_$1 bog_$11 kzcbs.A_$1 -kzcbs.B_$1 -kzcbs.H_$1 kzcbs_$11l esys_$1 z coupl k kzcbs$12r car_$1 -acb_$1-kzcbs.A_$1 kzcbs.B_$1 -kzcbs.H_$1 bog_$12 -kzcbs.A_$1 kzcbs.B_$1 -kzcbs.H_$1 kzcbs_$12r esys_$1 z coupl k kzcbs$12l car_$1 -acb_$1-kzcbs.A_$1 -kzcbs.B_$1 -kzcbs.H_$1 bog_$12 -kzcbs.A_$1 -kzcbs.B_$1 -kzcbs.H_$1 kzcbs_$12l esys_$1 z # s_var sngl kzcbs$11r.d s_var sngl kzcbs$11l.d s_var sngl kzcbs$12r.d s_var sngl kzcbs$12l.d s_var sngl kzcbs$11r.F s_var sngl kzcbs$11l.F s_var sngl kzcbs$12r.F s_var sngl kzcbs$12l.F ## ## Secondary suspension: Lateral viscous dampers ## ============================================= ## ## coupl c c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## -------------------------------------------------------------------------------------------------------------- coupl c cycb$11r car_$1 acb_$1+cycb.A_$1 cycb.Bc_$1 -cycb.Hc_$1 bog_$11 cycb.A_$1 cycb.Bb_$1 -cycb.Hb_$1 cycb_$11r esys_$1 c coupl c cycb$11l car_$1 acb_$1+cycb.A_$1 -cycb.Bc_$1 -cycb.Hc_$1 bog_$11 cycb.A_$1 -cycb.Bb_$1 -cycb.Hb_$1 cycb_$11l esys_$1 c coupl c cycb$12r car_$1 -acb_$1-cycb.A_$1 cycb.Bc_$1 -cycb.Hc_$1 bog_$12 -cycb.A_$1 cycb.Bb_$1 -cycb.Hb_$1 cycb_$12r esys_$1 c coupl c cycb$12l car_$1 -acb_$1-cycb.A_$1 -cycb.Bc_$1 -cycb.Hc_$1 bog_$12 -cycb.A_$1 -cycb.Bb_$1 -cycb.Hb_$1 cycb_$12l esys_$1 c ## ## Secondary suspension: Vertical viscous dampers ## ============================================== ## ## coupl c c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ------------------------------------------------------------------------------------------------------------- coupl c czcb$11r car_$1 acb_$1+czcb.A_$1 czcb.B_$1 -czcb.Hc_$1 bog_$11 czcb.A_$1 czcb.B_$1 -czcb.Hb_$1 czcb_$11r esys_$1 z coupl c czcb$11l car_$1 acb_$1+czcb.A_$1 -czcb.B_$1 -czcb.Hc_$1 bog_$11 czcb.A_$1 -czcb.B_$1 -czcb.Hb_$1 czcb_$11l esys_$1 z coupl c czcb$12r car_$1 -acb_$1-czcb.A_$1 czcb.B_$1 -czcb.Hc_$1 bog_$12 -czcb.A_$1 czcb.B_$1 -czcb.Hb_$1 czcb_$12r esys_$1 z coupl c czcb$12l car_$1 -acb_$1-czcb.A_$1 -czcb.B_$1 -czcb.Hc_$1 bog_$12 -czcb.A_$1 -czcb.B_$1 -czcb.Hb_$1 czcb_$12l esys_$1 z ## ## Secondary suspension: Yaw viscous dampers ## ========================================= ## ## c_name body1 a1 b1 h1 body2 a2 b2 h2 prop_k prop_c esys dire ## ------------------------------------------------------------------------------------------------------------------- coupl kc cccb$11r car_$1 cccb.Ac_$1 cccb.Bc_$1 -cccb.Hc_$1 bog_$11 cccb.Ab_$1 cccb.Bb_$1 -cccb.Hb_$1 kccb_$11r cccb_$11r esys_$1 c coupl kc cccb$11l car_$1 cccb.Ac_$1 -cccb.Bc_$1 -cccb.Hc_$1 bog_$11 cccb.Ab_$1 -cccb.Bb_$1 -cccb.Hb_$1 kccb_$11l cccb_$11l esys_$1 c coupl kc cccb$12r car_$1 -cccb.Ac_$1 cccb.Bc_$1 -cccb.Hc_$1 bog_$12 -cccb.Ab_$1 cccb.Bb_$1 -cccb.Hb_$1 kccb_$12r cccb_$12r esys_$1 c coupl kc cccb$12l car_$1 -cccb.Ac_$1 -cccb.Bc_$1 -cccb.Hc_$1 bog_$12 -cccb.Ab_$1 -cccb.Bb_$1 -cccb.Hb_$1 kccb_$12l cccb_$12l esys_$1 c ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #### #### Primary suspension: ##[-]{ ================================================================ ## ## Primary suspension: Springs ## =========================== ## ## c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ------------------------------------------------------------------------------------------------------- coupl k kmba$111r bog_$11 aba_$11 kmba.B_$1 -ro_$111 axl_$111 0.0 kmba.B_$1 -ro_$111 kmba_$111r esys_$1 m coupl k kmba$111l bog_$11 aba_$11 -kmba.B_$1 -ro_$111 axl_$111 0.0 -kmba.B_$1 -ro_$111 kmba_$111l esys_$1 m coupl k kmba$112r bog_$11 -aba_$11 kmba.B_$1 -ro_$112 axl_$112 0.0 kmba.B_$1 -ro_$112 kmba_$112r esys_$1 m coupl k kmba$112l bog_$11 -aba_$11 -kmba.B_$1 -ro_$112 axl_$112 0.0 -kmba.B_$1 -ro_$112 kmba_$112l esys_$1 m coupl k kmba$121r bog_$12 aba_$12 kmba.B_$1 -ro_$121 axl_$121 0.0 kmba.B_$1 -ro_$121 kmba_$121r esys_$1 m coupl k kmba$121l bog_$12 aba_$12 -kmba.B_$1 -ro_$121 axl_$121 0.0 -kmba.B_$1 -ro_$121 kmba_$121l esys_$1 m coupl k kmba$122r bog_$12 -aba_$12 kmba.B_$1 -ro_$122 axl_$122 0.0 kmba.B_$1 -ro_$122 kmba_$122r esys_$1 m coupl k kmba$122l bog_$12 -aba_$12 -kmba.B_$1 -ro_$122 axl_$122 0.0 -kmba.B_$1 -ro_$122 kmba_$122l esys_$1 m # coupl c cmba$111r bog_$11 aba_$11 kmba.B_$1 -ro_$111 axl_$111 0.0 kmba.B_$1 -ro_$111 cmba_$111r esys_$1 m coupl c cmba$111l bog_$11 aba_$11 -kmba.B_$1 -ro_$111 axl_$111 0.0 -kmba.B_$1 -ro_$111 cmba_$111l esys_$1 m coupl c cmba$112r bog_$11 -aba_$11 kmba.B_$1 -ro_$112 axl_$112 0.0 kmba.B_$1 -ro_$112 cmba_$112r esys_$1 m coupl c cmba$112l bog_$11 -aba_$11 -kmba.B_$1 -ro_$112 axl_$112 0.0 -kmba.B_$1 -ro_$112 cmba_$112l esys_$1 m coupl c cmba$121r bog_$12 aba_$12 kmba.B_$1 -ro_$121 axl_$121 0.0 kmba.B_$1 -ro_$121 cmba_$121r esys_$1 m coupl c cmba$121l bog_$12 aba_$12 -kmba.B_$1 -ro_$121 axl_$121 0.0 -kmba.B_$1 -ro_$121 cmba_$121l esys_$1 m coupl c cmba$122r bog_$12 -aba_$12 kmba.B_$1 -ro_$122 axl_$122 0.0 kmba.B_$1 -ro_$122 cmba_$122r esys_$1 m coupl c cmba$122l bog_$12 -aba_$12 -kmba.B_$1 -ro_$122 axl_$122 0.0 -kmba.B_$1 -ro_$122 cmba_$122l esys_$1 m ## ## Primary suspension: Lateral bumpstops ## ====================================== ## ## c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ------------------------------------------------------------------------------------------------ coupl k kybas$111 bog_$11 aba_$11 0.0 -kybas.H_$1 axl_$111 0.0 0.0 -kybas.H_$1 kybas_$111 esys_$1 y coupl k kybas$112 bog_$11 -aba_$11 0.0 -kybas.H_$1 axl_$112 0.0 0.0 -kybas.H_$1 kybas_$112 esys_$1 y coupl k kybas$121 bog_$12 aba_$12 0.0 -kybas.H_$1 axl_$121 0.0 0.0 -kybas.H_$1 kybas_$121 esys_$1 y coupl k kybas$122 bog_$12 -aba_$12 0.0 -kybas.H_$1 axl_$122 0.0 0.0 -kybas.H_$1 kybas_$122 esys_$1 y # s_var sngl kybas$111.d s_var sngl kybas$112.d s_var sngl kybas$121.d s_var sngl kybas$122.d s_var sngl kybas$111.F s_var sngl kybas$112.F s_var sngl kybas$121.F s_var sngl kybas$122.F ## ## Primary suspension: Vertical bumpstops ## ====================================== ## ## c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ----------------------------------------------------------------------------------------------------------------------- coupl k kzbas$111r bog_$11 aba_$11+kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 axl_$111 kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 kzbas_$111r esys_$1 z coupl k kzbas$112r bog_$11 -aba_$11-kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 axl_$112 -kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 kzbas_$112r esys_$1 z coupl k kzbas$121r bog_$12 aba_$12+kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 axl_$121 kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 kzbas_$121r esys_$1 z coupl k kzbas$122r bog_$12 -aba_$12-kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 axl_$122 -kzbas.A_$1 kzbas.B_$1 -kzbas.H_$1 kzbas_$122r esys_$1 z coupl k kzbas$111l bog_$11 aba_$11+kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 axl_$111 kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 kzbas_$111l esys_$1 z coupl k kzbas$112l bog_$11 -aba_$11-kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 axl_$112 -kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 kzbas_$112l esys_$1 z coupl k kzbas$121l bog_$12 aba_$12+kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 axl_$121 kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 kzbas_$121l esys_$1 z coupl k kzbas$122l bog_$12 -aba_$12-kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 axl_$122 -kzbas.A_$1 -kzbas.B_$1 -kzbas.H_$1 kzbas_$122l esys_$1 z # s_var sngl kzbas$111r.d s_var sngl kzbas$111l.d s_var sngl kzbas$112r.d s_var sngl kzbas$112l.d s_var sngl kzbas$121r.d s_var sngl kzbas$121l.d s_var sngl kzbas$122r.d s_var sngl kzbas$122l.d s_var sngl kzbas$111r.F s_var sngl kzbas$111l.F s_var sngl kzbas$112r.F s_var sngl kzbas$112l.F s_var sngl kzbas$121r.F s_var sngl kzbas$121l.F s_var sngl kzbas$122r.F s_var sngl kzbas$122l.F ## ## Primary suspension: Vertical viscous damper ## =========================================== ## ## c_name body1 a1 b1 h1 body2 a2 b2 h2 prop esys dire ## ----------------------------------------------------------------------------------------------------------------- coupl c czba$111r bog_$11 aba_$11+czba.A_$1 czba.Bb_$1 -czba.Hb_$1 axl_$111 +czba.A_$1 czba.Ba_$1 -czba.Ha_$1 czba_$111r esys_$1 c coupl c czba$111l bog_$11 aba_$11+czba.A_$1 -czba.Bb_$1 -czba.Hb_$1 axl_$111 +czba.A_$1 -czba.Ba_$1 -czba.Ha_$1 czba_$111l esys_$1 c coupl c czba$112r bog_$11 -aba_$11-czba.A_$1 czba.Bb_$1 -czba.Hb_$1 axl_$112 -czba.A_$1 czba.Ba_$1 -czba.Ha_$1 czba_$112r esys_$1 c coupl c czba$112l bog_$11 -aba_$11-czba.A_$1 -czba.Bb_$1 -czba.Hb_$1 axl_$112 -czba.A_$1 -czba.Ba_$1 -czba.Ha_$1 czba_$112l esys_$1 c coupl c czba$121r bog_$12 aba_$12+czba.A_$1 czba.Bb_$1 -czba.Hb_$1 axl_$121 +czba.A_$1 czba.Ba_$1 -czba.Ha_$1 czba_$121r esys_$1 c coupl c czba$121l bog_$12 aba_$12+czba.A_$1 -czba.Bb_$1 -czba.Hb_$1 axl_$121 +czba.A_$1 -czba.Ba_$1 -czba.Ha_$1 czba_$121l esys_$1 c coupl c czba$122r bog_$12 -aba_$12-czba.A_$1 czba.Bb_$1 -czba.Hb_$1 axl_$122 -czba.A_$1 czba.Ba_$1 -czba.Ha_$1 czba_$122r esys_$1 c coupl c czba$122l bog_$12 -aba_$12-czba.A_$1 -czba.Bb_$1 -czba.Hb_$1 axl_$122 -czba.A_$1 -czba.Ba_$1 -czba.Ha_$1 czba_$122l esys_$1 c ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Couplings between wheels and rails
Substructure wr_coupl_pe3 is defined in section Substructures to VEHICLE(s)
#### #### Couplings between wheels and rails ##[-]{ ================================================================ ## ## Variable vertical rail-track stiffness due to .65[m] sleeper spacing ## ==================================================================== # func const kzrtF0_$1= 0. # -kmbaF0_$1+ma_$1/2*9.81 # Vertical prestress force rail - track # # func add axl_$111.X= lsa_$111.pn axl_$111.x # func add axl_$112.X= lsa_$112.pn axl_$112.x # func add axl_$121.X= lsa_$121.pn axl_$121.x # func add axl_$122.X= lsa_$122.pn axl_$122.x # # func operp kzrt_$111 = 230e6 + 27e6 * sin( 9.666438934 * axl_$111.X ) #- .25 * 25e6 * cos( 19.33287787 * axl_$111.X ) # func operp kzrt_$112 = 230e6 + 27e6 * sin( 9.666438934 * axl_$112.X ) #- .25 * 25e6 * cos( 19.33287787 * axl_$112.X ) # func operp kzrt_$121 = 230e6 + 27e6 * rail_sin( 9.666438934 * axl_$121.X ) #- .25 * 25e6 * cos( 19.33287787 * axl_$121.X ) # func operp kzrt_$122 = 230e6 + 27e6 * sin( 9.666438934 * axl_$122.X ) #- .25 * 25e6 * cos( 19.33287787 * axl_$122.X ) ## ## Calculation of creep and creepforces between wheels and rails ## ================================================================ in_substruct wr_coupl_pe3 [ $111 ] in_substruct wr_coupl_pe3 [ $112 ] in_substruct wr_coupl_pe3 [ $121 ] in_substruct wr_coupl_pe3 [ $122 ] ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Animate track irregularities in GPLOT
In substructure "create_axl" under section Substructures to VEHICLE(s) above
has dummy rails been created.
These rails is only used for animation of track irregularities in program GPLOT.
## ## Animate track irregularities in GPLOT ## ====================================== if_then_init .exist. rail_$111r.z in_substruct animateRails [ $111 l ] in_substruct animateRails [ $111 r ] in_substruct animateRails [ $112 l ] in_substruct animateRails [ $112 r ] in_substruct animateRails [ $121 l ] in_substruct animateRails [ $121 r ] in_substruct animateRails [ $122 l ] in_substruct animateRails [ $122 r ] endif
Wear- and RCF- indexes
Substructure "wearRCF" defined under section Substructures to VEHICLE(s)
contains formulas for evaluating wear- and RCF-indexes.
## ## Wear- and RCF- indexes ## ================================================================ in_substruct wearRCF [ $111l ] in_substruct wearRCF [ $111r ] in_substruct wearRCF [ $112l ] in_substruct wearRCF [ $112r ]
Coupling track - ground
Connect the track piece to ground by calling substructure create_trc_couplz.
Substructure "create_trc_couplz" has previously been defined under section Substructures to VEHICLE(s).
## ## Coupling track - ground ## ========================================================== in_substruct create_trc_couplz [ $1 $111 ] in_substruct create_trc_couplz [ $1 $112 ] in_substruct create_trc_couplz [ $1 $121 ] in_substruct create_trc_couplz [ $1 $122 ]
Store variables for postprocessing
Make calls to the substructure save_car1, save_bog1, save_axl1 and save_creep1 in order to save variables for postprocessing.
The substructure has previously been defined under section Save-files for variable storing.
#### #### Store variables for postprocessing ##[-]{ ================================================================ # in_substruct save_car1 [ $1 ] # in_substruct save_bog1 [ $11 ] in_substruct save_bog1 [ $12 ] # in_substruct save_axl1 [ $111 ] in_substruct save_axl1 [ $112 ] in_substruct save_axl1 [ $121 ] in_substruct save_axl1 [ $122 ] # in_substruct save_creep1 [ $111l ] in_substruct save_creep1 [ $111r ] # s_var force_on bog_$11 k # Store all forces acting on specified mass (for debugging) ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Write to GPdat-file for animations in program GPLOT
In order to animate forces in program GPLOT these forces must be stored in the gp-file
Also the shape of the wheel profile must be defined.
## ## Write to GPdat-file for animations in program GPLOT ## ================================================================ # s_var gpdat_force1 kzcb$11r.F1y # s_var gpdat_force1 kzcb$11l.F1y # if_then_init .exist. cp1_$111r.Fx s_var gpdat_force1 cp1_$111r.Fx s_var gpdat_force1 cp1_$111r.Fy s_var gpdat_force1 cp1_$111r.Fz s_var gpdat_force1 cp1_$111l.Fx s_var gpdat_force1 cp1_$111l.Fy s_var gpdat_force1 cp1_$111l.Fz s_var gpdat_force1 cp1_$112r.Fx s_var gpdat_force1 cp1_$112r.Fy s_var gpdat_force1 cp1_$112r.Fz s_var gpdat_force1 cp1_$112l.Fx s_var gpdat_force1 cp1_$112l.Fy s_var gpdat_force1 cp1_$112l.Fz endif if_then_init .exist. cp2_$111r.Fx s_var gpdat_force1 cp2_$111r.Fx s_var gpdat_force1 cp2_$111r.Fy s_var gpdat_force1 cp2_$111r.Fz s_var gpdat_force1 cp2_$111l.Fx s_var gpdat_force1 cp2_$111l.Fy s_var gpdat_force1 cp2_$111l.Fz s_var gpdat_force1 cp2_$112r.Fx s_var gpdat_force1 cp2_$112r.Fy s_var gpdat_force1 cp2_$112r.Fz s_var gpdat_force1 cp2_$112l.Fx s_var gpdat_force1 cp2_$112l.Fy s_var gpdat_force1 cp2_$112l.Fz endif if_then_init .exist. cp3_$111r.Fx s_var gpdat_force1 cp3_$111r.Fx s_var gpdat_force1 cp3_$111r.Fy s_var gpdat_force1 cp3_$111r.Fz s_var gpdat_force1 cp3_$111l.Fx s_var gpdat_force1 cp3_$111l.Fy s_var gpdat_force1 cp3_$111l.Fz s_var gpdat_force1 cp3_$112r.Fx s_var gpdat_force1 cp3_$112r.Fy s_var gpdat_force1 cp3_$112r.Fz s_var gpdat_force1 cp3_$112l.Fx s_var gpdat_force1 cp3_$112l.Fy s_var gpdat_force1 cp3_$112l.Fz endif # s_var gpdat_wheel_info $111r lsa_$111.b $genkpf/../w_prof/EN13715.2006/ENS1002t32.5.wheel s_var gpdat_wheel_info $111l lsa_$111.b $genkpf/../w_prof/EN13715.2006/ENS1002t32.5.wheel s_var gpdat_wheel_info $112r lsa_$112.b $genkpf/../w_prof/EN13715.2006/ENS1002t32.5.wheel s_var gpdat_wheel_info $112l lsa_$112.b $genkpf/../w_prof/EN13715.2006/ENS1002t32.5.wheel ] #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - in_substruct vehicle [ 1 ] # in_substruct vehicle [ 2 ] # in_substruct vehicle [ 3 ]
Connect the vehicles with couplers
Friction in buffers
#### #### Friction in buffers between vehicles ##[-]{ ================================================================ # # coupl p_lin kfycc_= 0. 20e6 # substruct BufferFric [ # $1= The car ahead $2= Car number coupl kf2 kfycc$11 car_$1 acb_$1+aba_$11+1. 0. -hccg_$1 grd_$1 acb_$1+aba_$11+1. 0. -hccg_$1 kfycc_$11 kfycc_$11 500 esys_$1 y z coupl kf2 kfycc$12 car_$1 -acb_$1-aba_$12-1. 0. -hccg_$1 grd_$1 -acb_$1-aba_$12-1. 0. -hccg_$1 kfycc_$12 kfycc_$12 500 esys_$1 y z ] ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Draw bars
#### #### Draw bars ##[-]{ ========================================================== # func const wdraw.A= Buffer.A_ # Draw bar semi-distance (longitudinal) func const wdraw.H= 1.005 # Height to draw bar func const draw.set= 0.15 # Viscous damping in draw bar # # coupl p_nlin_t kdraw_= 0. 0. 0e6 0. 1.9e6 .030 5.9e6 .048 7.2e6 .062 20.00e6 # coupl p_nlin_t kdraw_= 0. 0. 0e6 0. 1.9e6 .060 5.9e6 .096 7.2e6 .124 20.00e6 .144 400e6 coupl p_nlin_t kdraw_= 0. 0. 0e6 0. 2.3e6 .040 5.8e6 .076 11.1e6 .100 24.9e6 .120 400e6 # +-0 mm clearance # coupl p_nlin_t kdraw_= 0. 22e3 0e6 -0.001 22e6 0. 2.3e6 .040 5.8e6 .076 11.1e6 .100 24.9e6 .120 400e6 # # coupl p_lin cdraw_= 0. `2*draw.set*sqrt(kdraw_.v3*m_$1)` # Viscous damping coupl p_lin cdraw_= 0. `draw.set*kdraw_.v3/pi/1.` # Viscous damping at 1Hz coupl p_lin kcdraw_= 0. `2*pi*5*cdraw_.v1` # Serial stiffness 5Hz ## ## Draw bar; Positive deformation in tension ## ========================================================== substruct draw_bar [ # $1= The car ahead $2= Car number coupl k kdraw$1 car_$2 wdraw.A 0. -wdraw.H # Positive in tension car_$1 -wdraw.A 0. -wdraw.H kdraw_$1 esys_$1$2 cu s_var var_0 kdraw$1.d s_var var_0 kdraw$1.F # Parallel kc-coupling in ; Only active in contact if_then kdraw$1.dx .gt. 0. coupl kc cdraw$1 car_$2 wdraw.A 0. -wdraw.H car_$1 -wdraw.A 0. -wdraw.H kcdraw_$1 cdraw_$1 esys_$1$2 cu endif s_var var_0 cdraw$1.d s_var var_0 cdraw$1.F ] ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # in_substruct draw_bar [ 1 2 ] # in_substruct draw_bar [ 2 3 ]
Buffer Oleo5
#### #### Buffer Oleo5 ##[-]{ ========================================================== func const Buffer.R= 1.500 # Radius of buffer head func const Buffer.H= 1.025 # Height above rail func const Buffer.B= 0.875 # Lateral semi-distance substruct bufferOleo5 [ # $1= The car ahead $2= Car number $3= r/l= right/left $4= +/-= right/left ## ## Position of buffers ## =============================================== func pos_rlsys3 car_$1buffb$3 car_$1 lsbuff_$1$2 -(Buffer.A_$1-Buffer.R) $4.875 -Buffer.H func pos_rlsys3 car_$2bufff$3 car_$2 lsbuff_$1$2 Buffer.A_$2-Buffer.R $4.875 -Buffer.H # func pos_rlsys3 car_$1buffbl car_$1 lsbuff_$1$2 -(Buffer.A_$1-Buffer.R) -.875 -Buffer.H # func pos_rlsys3 car_$2bufffl car_$2 lsbuff_$1$2 Buffer.A_$1-Buffer.R -.875 -Buffer.H func operp buffer$2$3.x = .5 * ( car_$2bufff$3.x - car_$1buffb$3.x + `2*Buffer.R` ) # Half motion because the buffers are connected in series func deriv buffer$2$3.vx= buffer$2$3.x # func operp buffer$2$3.x = .5 * ( car_$2$3.x - car_$1.x ) # Half motion because the buffers # func operp buffer$2$3.vx= .5 * ( car_$2$3.vx - car_$1.vx ) # are connected in series ## ## Gas volume ## ------------- func const buffer$2$3.fss= 0. func integ buffer$2$3.Fss= buffer$2$3.fss # Force in static spring func const buffer$2$3.kss= 100e6 # Stiffness in outer mechanical stop func mul buffer$2$3.Fu= buffer$2$3.kss buffer$2$3.x func min2 buffer$2$3.dx= 0.121 buffer$2$3.x if_then buffer$2$3.Fu .gt. 50e3 func operp buffer$2$3.xru= 0.122 / ( 0.122 - buffer$2$3.dx ) # Compressed gas-volume func power buffer$2$3.Vru= buffer$2$3.xru 1.4 # Adiabatic compression no_warning func mul buffer$2$3.Fu = 50.0e3 buffer$2$3.Vru endif func mul buffer$2$3.Fl= buffer$2$3.kss/2 buffer$2$3.x if_then buffer$2$3.Fl .gt. 12.5e3 func operp buffer$2$3.xrl= 0.300 / ( 0.300 - buffer$2$3.dx ) # gas-volume in expansion func power buffer$2$3.Vrl= buffer$2$3.xrl 1.4 # Adiabatic compression no_warning func mul buffer$2$3.Fl = 12.5e3 buffer$2$3.Vrl endif func intpl_r buffer$2$3.Faf= -1 0 -2e-4 0 0 1 1 1 no_warning func copy buffer$2$3.Faf.y1= buffer$2$3.Fl no_warning func copy buffer$2$3.Faf.y2= buffer$2$3.Fl no_warning func copy buffer$2$3.Faf.y3= buffer$2$3.Fu no_warning func copy buffer$2$3.Faf.y4= buffer$2$3.Fu func copy buffer$2$3.Fa= 0. if_then buffer$2$3.x .gt. 0. no_warning func create_l buffer$2$3.Fa= buffer$2$3.Faf buffer$2$3.vx endif no_warning func operp buffer$2$3.fss= `2*pi*200` * ( buffer$2$3.Fa - buffer$2$3.Fss ) # Integrate up to the static force ## ## Kc-damper in parallel ## --------------------- func copy buffer$2$3.Fkc = 0. func const buffer$2$3.vkcp= 0. # Massless point in kc-damper func integ buffer$2$3.kcp = buffer$2$3.vkcp if_then buffer$2$3.x .gt. 0. func intpl_r buffer$2$3.Cvect= -1 10e3 0 10e3 1e-9 10e3 .4 10e3 1.893888889 430e3 # Non-linj damping coeff # func operp buffer$2$3.pin= 10e3 + ( buffer$2$3.x - 0.044 ) * .19e8 # The metering pin no_warning func max2 buffer$2$3.Cvect.y3= buffer$2$3.pin 10e3 # increases the damping no_warning func max2 buffer$2$3.Cvect.y4= buffer$2$3.pin 10e3 # at large strokes no_warning func max2 buffer$2$3.Cvect.y5= buffer$2$3.pin 430e3 # func create_l buffer$2$3.C= buffer$2$3.Cvect buffer$2$3.vx # Current damping coeff func mul buffer$2$3.kkc= buffer$2$3.C 250 # Current serial spring stiffness # no_warning func operp buffer$2$3.Fkc= buffer$2$3.kkc * buffer$2$3.kcp # Force in serial spring no_warning func operp buffer$2$3.vkcp= buffer$2$3.vx - buffer$2$3.Fkc / buffer$2$3.C # Velocity of massless point else no_warning func mul buffer$2$3.vkcp= 1 -buffer$2$3.kcp # Regulate buffer$2$3.kcp to zero endif ## ## Add the forces from gas-volume and kc-damper ## -------------------------------------------- func add buffer$2$3.Fx= buffer$2$3.Fss buffer$2$3.Fkc # Add the forces from gas-volume and kc-damper func l_lim buffer$2$3.Fx= 0 # No tension force #func mul buffer$2$3.Fx2= 2 buffer$2$3.Fx # Two buffers func operp car_$1$2$3.fsys.Fx= esys_$1$2.11 * buffer$2$3.Fx # Rotate the force to fsys func operp car_$1$2$3.fsys.Fy= esys_$1$2.12 * buffer$2$3.Fx func operp car_$1$2$3.fsys.Fz= esys_$1$2.13 * buffer$2$3.Fx func operp car_$1$3.add1.Fx= esys_$1.11 * car_$1$2$3.fsys.Fx + esys_$1.12 * car_$1$2$3.fsys.Fy + esys_$1.13 * car_$1$2$3.fsys.Fz # Rotate the force to esys_$1 func operp car_$1$3.add1.Fy= esys_$1.21 * car_$1$2$3.fsys.Fx + esys_$1.22 * car_$1$2$3.fsys.Fy + esys_$1.23 * car_$1$2$3.fsys.Fz func operp car_$1$3.add1.Fz= esys_$1.31 * car_$1$2$3.fsys.Fx + esys_$1.32 * car_$1$2$3.fsys.Fy + esys_$1.33 * car_$1$2$3.fsys.Fz func operp car_$1$3.add1.Mf= car_$1$3.add1.Fz * `$4Buffer.B` - car_$1$3.add1.Fy * `hccg_$1-Buffer.H` func operp car_$1$3.add1.Mk= car_$1$3.add1.Fx * `hccg_$1-Buffer.H` - car_$1$3.add1.Fz * `accg_$1-Buffer.A_$1` func operp car_$1$3.add1.Mp= car_$1$3.add1.Fy * `accg_$1-Buffer.A_$1` - car_$1$3.add1.Fx * `$4Buffer.B` func operp car_$2$3.add2.Fx= -esys_$2.11 * car_$1$2$3.fsys.Fx - esys_$2.12 * car_$1$2$3.fsys.Fy - esys_$2.13 * car_$1$2$3.fsys.Fz # Rotate the force to esys_$2 func operp car_$2$3.add2.Fy= -esys_$2.21 * car_$1$2$3.fsys.Fx - esys_$2.22 * car_$1$2$3.fsys.Fy - esys_$2.23 * car_$1$2$3.fsys.Fz func operp car_$2$3.add2.Fz= -esys_$2.31 * car_$1$2$3.fsys.Fx - esys_$2.32 * car_$1$2$3.fsys.Fy - esys_$2.33 * car_$1$2$3.fsys.Fz func operp car_$2$3.add2.Mf= car_$2$3.add2.Fz * `$4Buffer.B` - car_$2$3.add2.Fy * `hccg_$2-Buffer.H` func operp car_$2$3.add2.Mk= car_$2$3.add2.Fx * `hccg_$2-Buffer.H` - car_$2$3.add2.Fz * `Buffer.A_$2-accg_$2` func operp car_$2$3.add2.Mp= car_$2$3.add2.Fy * `Buffer.A_$2-accg_$2` - car_$2$3.add2.Fx * `$4Buffer.B` func incr car_$1.Fx= car_$1$3.add1.Fx # Add the buffer force to the cars func incr car_$1.Fy= car_$1$3.add1.Fy func incr car_$1.Fz= car_$1$3.add1.Fz func incr car_$1.Mf= car_$1$3.add1.Mf func incr car_$1.Mk= car_$1$3.add1.Mk func incr car_$1.Mp= car_$1$3.add1.Mp func incr car_$2.Fx= car_$2$3.add2.Fx # Add the buffer force to the cars func incr car_$2.Fy= car_$2$3.add2.Fy func incr car_$2.Fz= car_$2$3.add2.Fz func incr car_$2.Mf= car_$2$3.add2.Mf func incr car_$2.Mk= car_$2$3.add2.Mk func incr car_$2.Mp= car_$2$3.add2.Mp s_var sngl car_$1$3.add1.Fx s_var sngl car_$1$3.add1.Fy s_var sngl car_$1$3.add1.Fz s_var sngl car_$1$3.add1.Mf s_var sngl car_$1$3.add1.Mk s_var sngl car_$1$3.add1.Mp s_var sngl car_$2$3.add2.Fx s_var sngl car_$2$3.add2.Fy s_var sngl car_$2$3.add2.Fz s_var sngl car_$2$3.add2.Mf s_var sngl car_$2$3.add2.Mk s_var sngl car_$2$3.add2.Mp s_var sngl buffer$2$3.x s_var sngl buffer$2$3.vx s_var sngl buffer$2$3.Fx s_var sngl buffer$2$3.Fss s_var sngl buffer$2$3.Fu s_var sngl buffer$2$3.Fl s_var sngl buffer$2$3.Fa s_var sngl buffer$2$3.Fkc s_var sngl buffer$2$3.kcp s_var sngl buffer$2$3.vkcp func mul buffer$2$3.W= buffer$2$3.Fx buffer$2$3.vx # Power consumption func integ buffer$2$3.J= buffer$2$3.W # Dissipated energy s_var sngl buffer$2$3.W s_var sngl buffer$2$3.J ] ##[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # in_substruct bufferOleo5 [ 1 2 r + ] # in_substruct bufferOleo5 [ 1 2 l - ] # in_substruct bufferOleo5 [ 2 3 r + ] # in_substruct bufferOleo5 [ 2 3 l - ]
Output from program NPICK is written in a way that the result directly can be inserted in the input data for program CALC. In order to avoid program NPICK to read this line before the result file npickr/$IDENT.npickr has been created, the insert command must be put inside an if_then_char_init-statement.
### ### Flexible masses #[-]{ ================================================================ if_then_char_init CalcType .ne. NPICK insert file npickr/$IDENT.npickr endif # # insert file npickr/tors.npickr # Torsional eigenmode wheelset # #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Initial values from a previous calculation in TSIM or QUASI can be read. In this case it is assumed the program mode QUASI should create this file gp/$IDENT.gp. In order to avoid program mode QUASI to read this line before the result file gp/$IDENT.gp has been created, the initval command must be put inside an if_then_char_init-statement.
### ### Initial values #[-]{ ================================================================ if_then_char_init CalcType .eq. TSIM .or. CalcType .eq. MODAL initval read_gpdat gp/$IDENT.gp 1 endif #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$IDENT will be replaced with the name of actual ident
CALC output files are of two kinds:
## ## Convenience files for variable storing on id-file ## ================================================================ insert file $gensys/calc/insert_files/save_car1.ins # Save variables for car-body insert file $gensys/calc/insert_files/save_bol1.ins # Save variables for bolster beam insert file $gensys/calc/insert_files/save_bog1.ins # Save variables for bogie insert file $gensys/calc/insert_files/save_axl1.ins # Save variables for axle insert file $gensys/calc/insert_files/save_creep1.ins # Save variables for the contact points insert file $gensys/calc/insert_files/save_mass_1.ins # Save variables for masses
Program CALC do not store all variables in result file MPdat, because it will generate a too big result file, therefore the user must specify the variables to be stored in MPdat-file. The above substructure files have been written in order to easily store the most interesting variables for post processing. The insertion of above substructures are made later in the input data file.
## ## Write to gp-file for animations in program GPLOT ## ========================================================== s_var gpdat_r1 # Create a gp-file for animation in gplot # if_then_char_init ckpfr .eq. "Variable_W/R-geom" s_var gpdat_rail_info_left -100. $genkpf/../r_prof/bv50/bv50i30.rail 40. $genkpf/../r_prof/bv50/bv50i30.rail 45. $genkpf/../r_prof/bv50_worn/worn_rail_high3.rail 355. $genkpf/../r_prof/bv50_worn/worn_rail_high3.rail 360. $genkpf/../r_prof/bv50/bv50i30.rail 365. $genkpf/../r_prof/bv50_worn/worn_rail_low3.rail 675. $genkpf/../r_prof/bv50_worn/worn_rail_low3.rail 680. $genkpf/../r_prof/bv50/bv50i30.rail 1000. $genkpf/../r_prof/bv50/bv50i30.rail s_var gpdat_rail_info_right -100. $genkpf/../r_prof/bv50/bv50i30.rail 40. $genkpf/../r_prof/bv50/bv50i30.rail 45. $genkpf/../r_prof/bv50_worn/worn_rail_low3.rail 355. $genkpf/../r_prof/bv50_worn/worn_rail_low3.rail 360. $genkpf/../r_prof/bv50/bv50i30.rail 365. $genkpf/../r_prof/bv50_worn/worn_rail_high3.rail 675. $genkpf/../r_prof/bv50_worn/worn_rail_high3.rail 680. $genkpf/../r_prof/bv50/bv50i30.rail 1000. $genkpf/../r_prof/bv50/bv50i30.rail # else s_var gpdat_rail_info_right -100 $genkpf/../r_prof/uic60/uic60i40.rail 3000 $genkpf/../r_prof/uic60/uic60i40.rail s_var gpdat_rail_info_left -100 $genkpf/../r_prof/uic60/uic60i40.rail 3000 $genkpf/../r_prof/uic60/uic60i40.rail endif
Command s_var gpdat_r1 initiates the creating of a gp-file.
In order to animate the wheel-rail contact in program GPLOT the shape of the rail profile must be defined, this is done with the s_var gpdat_rail_info_right and s_var gpdat_rail_info_left commands.
The shape of the wheel profiles are defined under VEHICLE(s).
These values are created and stored in the id-file for comparisons in diagrams in program MPLOT.
### ### Limit values according to UIC 518 4th edition, 2009 #[-]{ ========================================================== substruct LimitValues [ ## ## Static vertical forces ## ============================================================== func const Q_stat_axle_$111= (mc_$1+mb_$11+mb_$12+ma_$111+ma_$112+ma_$121+ma_$122)*9.81/4 func const Q_stat_axle_$112= (mc_$1+mb_$11+mb_$12+ma_$111+ma_$112+ma_$121+ma_$122)*9.81/4 func const Q_stat_axle_$121= (mc_$1+mb_$11+mb_$12+ma_$111+ma_$112+ma_$121+ma_$122)*9.81/4 func const Q_stat_axle_$122= (mc_$1+mb_$11+mb_$12+ma_$111+ma_$112+ma_$121+ma_$122)*9.81/4 func max_init Q_stat_axle_max_$1= Q_stat_axle_$111 Q_stat_axle_$112 Q_stat_axle_$121 Q_stat_axle_$122 func min_init Q_stat_axle_min_$1= Q_stat_axle_$111 Q_stat_axle_$112 Q_stat_axle_$121 Q_stat_axle_$122 func const Q_stat_wheel_$111l= Q_stat_axle_$111/2 func const Q_stat_wheel_$111r= Q_stat_axle_$111/2 func const Q_stat_wheel_$112l= Q_stat_axle_$112/2 func const Q_stat_wheel_$112r= Q_stat_axle_$112/2 func const Q_stat_wheel_$121l= Q_stat_axle_$121/2 func const Q_stat_wheel_$121r= Q_stat_axle_$121/2 func const Q_stat_wheel_$122l= Q_stat_axle_$122/2 func const Q_stat_wheel_$122r= Q_stat_axle_$122/2 func max_init Q_stat_wheel_max_$1= Q_stat_wheel_$111l Q_stat_wheel_$112l Q_stat_wheel_$121l Q_stat_wheel_$122l Q_stat_wheel_$111r Q_stat_wheel_$112r Q_stat_wheel_$121r Q_stat_wheel_$122r func min_init Q_stat_wheel_min_$1= Q_stat_wheel_$111l Q_stat_wheel_$112l Q_stat_wheel_$121l Q_stat_wheel_$122l Q_stat_wheel_$111r Q_stat_wheel_$112r Q_stat_wheel_$121r Q_stat_wheel_$122r ## ## 10.1.1 Safety ## ============================================================== # ## 10.1.1.1 Track-shift force recommended limit # func const S2m_lim_$111= 1.0*(10e3+Q_stat_axle_$111/3.) func const S2m_lim_$112= 1.0*(10e3+Q_stat_axle_$112/3.) func const S2m_lim_$121= 1.0*(10e3+Q_stat_axle_$121/3.) func const S2m_lim_$122= 1.0*(10e3+Q_stat_axle_$122/3.) s_var scalar_0 S2m_lim_$111 s_var scalar_0 S2m_lim_$112 s_var scalar_0 S2m_lim_$121 s_var scalar_0 S2m_lim_$122 # func const S2m_lim_min_$1= 1.0*(10e3+Q_stat_axle_min_$1/3.) s_var scalar_0 S2m_lim_min_$1 # ## 10.1.1.3 Instability # func const sS_lim_$1= S2m_lim_min_$1/2 s_var scalar_0 sS_lim_$1 ## ## 10.1.2 Track fatigue ## ============================================================================= # ## 10.1.2.1 Vertical force Q: Limit values for Q 99.85 percentile # func const Q_lim_min_$1 = 90e3+Q_stat_wheel_min_$1 # if_then_init Q_stat_wheel_max_$1 .lt. 125e3 if_then_init vkmh .le. 160 no_warning func min_init Q_lim_min_$1= Q_lim_min_$1 200e3 elseif_then_init vkmh .le. 200 no_warning func min_init Q_lim_min_$1= Q_lim_min_$1 190e3 elseif_then_init vkmh .le. 250 no_warning func min_init Q_lim_min_$1= Q_lim_min_$1 180e3 elseif_then_init vkmh .le. 300 no_warning func min_init Q_lim_min_$1= Q_lim_min_$1 170e3 else no_warning func min_init Q_lim_min_$1= Q_lim_min_$1 160e3 endif else no_warning func const Q_lim_min_$1= 0e3 func print06_char_init " " func print06_char_init "* warning * In Input Reading" func print06_char_init " Too high static wheel load" func print06_char_init " Q_lim_min according to UIC 518 cannot be determined" endif s_var scalar_0 Q_lim_min_$1 # ## 10.1.2.2 Quasi-static lateral force in curves (Yqst): # func operp Yqst_lim_$111= 30e3 + 10500e3 * abs( lsa_$111.b ) func operp Yqst_lim_$112= 30e3 + 10500e3 * abs( lsa_$112.b ) func operp Yqst_lim_$121= 30e3 + 10500e3 * abs( lsa_$121.b ) func operp Yqst_lim_$122= 30e3 + 10500e3 * abs( lsa_$122.b ) s_var var_0 Yqst_lim_$111 s_var var_0 Yqst_lim_$112 s_var var_0 Yqst_lim_$121 s_var var_0 Yqst_lim_$122 # func min Yqst_lim_min_$1= Yqst_lim_$111 Yqst_lim_$112 Yqst_lim_$121 Yqst_lim_$122 s_var scalar_0 Yqst_lim_min_$1 ] #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - in_substruct LimitValues [ 1 ] #in_substruct LimitValues [ 2 ] #in_substruct LimitValues [ 3 ]
In addition to the following lines variable Vo also must decrease with vkmhDeacc [km/h/s] as described under paragraph Set speed according to a formula under section Speed.
### ### Excite the vehicle to calculate critical speed #[-]{ ========================================================== substruct ExciteCritSpeed [ initval set_var car_$1.vy= .15 initval set_var car_$1.vp= .15 force rel_lsys1 deacc_car_$1 car_$1 0 0 -hccg_$1 -mc_$1*vkmhDeacc/3.6 0. 0. 0. 0. 0. # Deacceleration vkmhDeacc in [km/h/s] force rel_lsys1 deacc_bog_$11 bog_$11 0 0 -hbcg_$11 -mb_$11*vkmhDeacc/3.6 0. 0. 0. 0. 0. # as external forces force rel_lsys1 deacc_bog_$12 bog_$12 0 0 -hbcg_$12 -mb_$12*vkmhDeacc/3.6 0. 0. 0. 0. 0. force rel_lsys1 deacc_axl_$111 axl_$111 0 0 -ro_$111 -(ma_$111+Jka_$111/ro_$111^2)*vkmhDeacc/3.6 0. 0. 0. 0. 0. force rel_lsys1 deacc_axl_$112 axl_$112 0 0 -ro_$112 -(ma_$112+Jka_$112/ro_$112^2)*vkmhDeacc/3.6 0. 0. 0. 0. 0. force rel_lsys1 deacc_axl_$121 axl_$121 0 0 -ro_$121 -(ma_$121+Jka_$121/ro_$121^2)*vkmhDeacc/3.6 0. 0. 0. 0. 0. force rel_lsys1 deacc_axl_$122 axl_$122 0 0 -ro_$122 -(ma_$122+Jka_$122/ro_$122^2)*vkmhDeacc/3.6 0. 0. 0. 0. 0. #[-]} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - in_substruct ExciteCritSpeed [ 1 ] # in_substruct ExciteCritSpeed [ 2 ] # in_substruct ExciteCritSpeed [ 3 ]
### ### Stop the simulation at tstop or the end of the track ### ========================================================== tstop= 10. if_then lsa_111.pn .gt. XtracStop func print06_char_all " " func print06_char_all " Execution interrupted due to lsa_111.pn > XtracStop" func print06_char_all " ----------------------------------------------------" func stop endif
The properties of the track affects the behavior of the vehicle, especially the track forces at higher frequencies. Typically the track flexibility v.s. frequency looks as:
The following track model has been developed to follow the above track properties:
Comparisions between measured and calculated track forces show overall good agreement. Measured results were filtered in a 100[Hz] low-pass filter, why forces at higher frequencies not could be compared. Therefore also the simulated results were filtered with the same low-pass filter.
Vertical forces left wheel:
Vertical forces right wheel:
Lateral forces left wheel:
Lateral forces right wheel:
PSD of vertical forces left and right wheel:
PSD of lateral forces left and right wheel:
## ## Define a frequency spectra ## (in this case a white spectra. The amplitude is ## equal to 1[m] for all frequencies) ## ------------------------------------------------ func intpl_r spectra 0 1 100 1 ## ## Calculate the time delay between the axles ## ------------------------------------------------ func oper t_axl_111 ( acb + aba ) / Vo func oper t_axl_112 ( acb - aba ) / Vo func oper t_axl_121 ( -acb + aba ) / Vo func oper t_axl_122 ( -acb - aba ) / Vo ## ## Apply the excitation to all track-pieces ## ------------------------------------------------ fexcit displ_fr trc_111 z spectra -t_axl_111 fexcit displ_fr trc_112 z spectra -t_axl_112 fexcit displ_fr trc_121 z spectra -t_axl_121 fexcit displ_fr trc_122 z spectra -t_axl_122
## ## Define a frequency spectra ## (in this case a white spectra. The amplitude is ## equal to 1 [mm] for all frequencies) ## ------------------------------------------------ func intpl_r spectra 0 0.001 100 0.001 ## ## Calculate the time delay between the axles ## ------------------------------------------------ func oper t_axl_111 ( acb + aba ) / Vo func oper t_axl_112 ( acb - aba ) / Vo func oper t_axl_121 ( -acb + aba ) / Vo func oper t_axl_122 ( -acb - aba ) / Vo ## ## Set constraints in lateral direction to all track-pieces ## -------------------------------------------------------- constr fix_rigid_1 trc_111 y 0. constr fix_rigid_1 trc_112 y 0. constr fix_rigid_1 trc_121 y 0. constr fix_rigid_1 trc_122 y 0. ## ## Apply the excitation to all track-pieces ## ------------------------------------------------ fexcit displ_fr trc_111 y spectra -t_axl_111 fexcit displ_fr trc_112 y spectra -t_axl_112 fexcit displ_fr trc_121 y spectra -t_axl_121 fexcit displ_fr trc_122 y spectra -t_axl_122