Home Reference Manuals Up Return
An example of a complete railway vehicle. Explanation of the input data model can be found in "Description of a rail road vehicle model". Which can be found under Rail Road applications.
Bo'Bo' is the denotation of the axle arrangement classification according to UIC (also known as German classification). For further information please see: Wikipedia. The denotation Bo'Bo' means there are two bogies under the unit and each bogie has two powered axles individually driven by traction motors. This axle arrangment is today the most common arrangement in modern locomotives.
The connection between wheels and rails can be modeled in many different ways. In this tutorial func wr_coupl_pe3 has been used.
The steps 4-10 in this tutorial follows approximately the steps suggested under Debugging a vehicle model.
In step 11 the analyzis of the vehicle starts. A main interest is to check that the vehicle follows the requirements stated in UIC518 and EN14363.
Program GPLOT is a graphic program showing a three dimensional view of the vehicle.
Start program GPLOT with the file runf/tang_ideal_MXDp3.tsimf by:
In the GPLOT-window the mouse buttons are defined as:
If you zoom in to a bogie you can see that all couplings have a hot-spot. If you press the hot-spot with mouse button #1 you will get information of that specific coupling. Below is a close up of the first bogie of the vehicle:
Close the GPLOT-window, before continuing with the next section.
Program RUNF_INFO is a program which lists how masses and couplings in the model are linked together. Program RUNF_INFO is controlled by an input data file which is described in the RUNF_INFO users manual.
idebug/runf_info.idebug | = | Memory dump of all variables in the model |
diags/runf_info.pdf | = | A two-dimensional plot, showing how all bodies connects to each other |
runf_infor/tang_ideal_MXDp3.runf_infor | = | An ASCII-file containing text information about the model |
Close all windows except the genfile-window, before proceeding to next task.
This simulation is used to check the vehicle behaves well on tangent track. Checks all masses are connected and all forces are in balance. From the genfile window perform the simulation by:
gplot runf/tang_ideal_MXDp3.tsimf gp/tang_ideal_MXDp3.gp &
Here you can see the wheels have penetrated the rails because of the flexibility in the contact points.
(It is the very big scale factor that makes it possible to detect this deformation)
Another type analysis that is also very good to start with when debugging and getting acquainted with the model, is modal analysis.
Program MODAL calculates all possible modes of vibration in the model.
Number of modes are as many as the number of equations in the model.
A low damped mechanical system of one degree of freedom has two complex conjugated eigenvalues.
A high damped mechanical system of one degree of freedom has two real eigenvalues, both eigenvalues are negative.
A self oscillating mechanical system is a system where the real part of the eigenvalue is positive.
Before the modal analysis starts, program MODAL linearizes the nonlinear equations
by an amplitude defined in command modal_param.
Make a modal analysis of the vehicle:
copy runf/tang_ideal_MXDp3.tsimf runf/modalRigid_MXDp3.modalf
# pre_process= 'quasi $CURRENT_FILE'Shall be changed to:
pre_process= 'quasi $CURRENT_FILE'
### ### Initial values #[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ # if_then_char_init CalcType .eq. TSIM .or. # CalcType .eq. MODAL # initval read_gpdat gp/$IDENT.gp 1 # endif #[-]} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Shall be changed to:
### ### Initial values #[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ if_then_char_init CalcType .eq. TSIM .or. CalcType .eq. MODAL initval read_gpdat gp/$IDENT.gp 1 endif #[-]} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
insert file runf/wr_coupl.runf # Substructures for connecting the wheelsets to the rails. # func char cwr_coupl= pe3 # A lookup table for the tangential forces. Is a bit faster than pr3, but less accurate. # func char cwr_coupl= pe4 # Similar to pe3 but handles a varying rail profile func char cwr_coupl= pr3 # Uses Fastsim for the tangential creep forces between wheel & railTo:
insert file runf/wr_coupl.runf # Substructures for connecting the wheelsets to the rails. func char cwr_coupl= pe3 # A lookup table for the tangential forces. Is a bit faster than pr3, but less accurate. # func char cwr_coupl= pe4 # Similar to pe3 but handles a varying rail profile # func char cwr_coupl= pr3 # Uses Fastsim for the tangential creep forces between wheel & rail
func const vkmh= 160 # Speed in km/hTo:
func const vkmh= 300 # Speed in km/h
id/modalRigid_MXDp3.id | MPdat -file for plotting in MPLOT |
gp/modalRigid_MXDp3.gp | GPdat -file for animation in GPLOT |
calcmod/modalRigid_MXDp3.mode | mode -file containing all eigenvalues |
calcmod/modalRigid_MXDp3.modf | modf -file containing all eigen forms |
calcmod/modalRigid_MXDp3.modjac | modjac-file for linear analysis |
gplot runf/modalRigid_MXDp3.modalf gp/modalRigid_MXDp3.gp &Now both files are read into GPLOT during its startup phase.
Show animation of the lower sway mode of the BoBo-vehicle:
How to calculate the eigen modes of a mechanical system is shown in the Theory manual
Find the following mode shapes in the vehicle:
Lower sway: |   |
Upper sway: |   |
Body bounce: |   |
Body pitch: |   |
Body yaw: |   |
1:st bogie kinematic mode: |   |
2:d bogie kinematic mode: |   |
Bogie longitudinal vibration: |   |
Close the GPLOT-window, before continuing with the next section.
Results from a modal analysis in a FEM-program of a car-body at free-free conditions are stored in the subdirectory patranr. This example shows how to take car-body structural flexibility into account:
copy runf/modalRigid_MXDp3.modalf runf/modalFlex_MXDp3.modalf(If you not have the runf/modalRigid_MXDp3.modalf-file, please go to section Perform a modal analysis of the vehicle)
# pre_process= 'sed "s!runf/tang_ideal_MXDp3.tsimf!$CURRENT_FILE!" npickf/flex_car.npickf > npickf/$IDENT.npickf' # pre_process= 'npick npickf/$IDENT.npickf'Change them to:
pre_process= 'sed "s!runf/tang_ideal_MXDp3.tsimf!$CURRENT_FILE!" npickf/flex_car.npickf > npickf/$IDENT.npickf' pre_process= 'npick npickf/$IDENT.npickf'
### ### Flexible masses #[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ # if_then_char_init CalcType .ne. NPICK # insert file npickr/$IDENT.npickr # insert file npickr/tors.npickr # Torsional eigenmode wheelset # endif #[-]} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}The above section shall be changed to:
### ### Flexible masses #[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ if_then_char_init CalcType .ne. NPICK insert file npickr/$IDENT.npickr # insert file npickr/tors.npickr # Torsional eigenmode wheelset endif #[-]} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
gplot runf/modalFlex_MXDp3.modalf gp/modalFlex_MXDp3.gp &
Show animation of the first bending mode of the car-body:
If you open the Deform->draw_deform popup menu. You will see that you have got 6 more eigenvalues, compared to the previous case modalRigid. These new equations arise from the three flexible modes added by program NPICK.
Find the following mode shapes in the vehicle:
Lower sway: |   |
Upper sway: |   |
Body bounce: |   |
Body pitch: |   |
Body yaw: |   |
1:st bogie kinematic mode: |   |
2:d bogie kinematic mode: |   |
Car-body bending mode in phase with bogies: |   |
Car-body bending mode out of phase with bogies: |   |
Car-body torsion mode: |   |
Car-body 2:d bending mode: |   |
Please close the GPLOT-window, before continuing with the next section.
There are many reasons why program QUASI sometimes can have difficulties to find the quasi-static position of the vehicle. If this happens, there is a possibility to use program TSIM instead. In order to use program TSIM do the following:
copy runf/tang_ideal_MXDp3.tsimf runf/tang_ideal_MXDp3_vkmh300.tsimf
func const vkmh= 160 # Speed in km/hTo:
func const vkmh= 300 # Speed in km/h
copy runf/tang_ideal_MXDp3_vkmh300.tsimf runf/modalRigid_MXDp3_tsim.modalf
### ### Initial values #[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ # if_then_char_init CalcType .eq. TSIM .or. # CalcType .eq. MODAL # initval read_gpdat gp/$IDENT.gp 1 # endif #[-]} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}To:
### ### Initial values #[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ if_then_char_init CalcType .eq. TSIM .or. CalcType .eq. MODAL initval read_gpdat gp/tang_ideal_MXDp3_vkmh300.gp -1 endif #[-]} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
copy runf/tang_ideal_MXDp3.tsimf runf/crit_ideal_MXDp3.tsimf
func const knwr_= 600e6 # Wheel/rail normal contact stiffness func const mu_ = 0.36 # Friction between wheel and rail # func const mulf_= 1. # Kalker factor (if undefined, runf/wr_coupl.runf will set mulf_= mu_/0.6)to:
func const knwr_= 600e6 # Wheel/rail normal contact stiffness func const mu_ = 0.50 # Friction between wheel and rail func const mulf_= 1. # Kalker factor (if undefined, runf/wr_coupl.runf will set mulf_= mu_/0.6)
# func const vkmh= 160 # Speed in km/h # # func const vkmh_deacc= 5 # Retardation of the train-set, when calculating critical speed # func operp vkmh= 440 - vkmh_deacc * time # Vary vkmh linearilyto:
# # func const vkmh= 160 # Speed in km/h # func const vkmh_deacc= 5 # Retardation of the train-set, when calculating critical speed func operp vkmh= 440 - vkmh_deacc * time # Vary vkmh linearily
###
### Excite and reduce the vehicle speed, to calculate critical speed
#[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
#
# force rel_lsys1 deacc_car_1 car_1 0 0 -hccg_1 -mc_1*vkmh_deacc*1000/3600 0. 0. 0. 0. 0. # Apply negative longitudinal forces,
# in_substruct crit_excit [ 11 ] # $1= bog_no # to create the retardation "vkmh_deacc".
# in_substruct crit_excit [ 12 ] # (The unit of "vkmh_deacc" is [km/h/s])
#
to:
###
### Excite and reduce the vehicle speed, to calculate critical speed
#[-]{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
#
force rel_lsys1 deacc_car_1 car_1 0 0 -hccg_1 -mc_1*vkmh_deacc*1000/3600 0. 0. 0. 0. 0. # Apply negative longitudinal forces,
in_substruct crit_excit [ 11 ] # $1= bog_no # to create the retardation "vkmh_deacc".
in_substruct crit_excit [ 12 ] # (The unit of "vkmh_deacc" is [km/h/s])
#
(To easily remove all comment signs "#". Mark all lines and press CTRL+3)
tstop= 10.to:
tstop= 25.
Ident Critical speed ----------------------------------- crit_ideal_MXDp3 374.545400
copy runf/tang_ideal_MXDp3.tsimf runf/R600_ideal_MXDp3.tsimf
func const CurveRadius= 1e99 # Curve radius in [m] func const CurveCant= 0.000 # Cant of track in [m]to:
func const CurveRadius= 600 # Curve radius in [m] func const CurveCant= 0.150 # Cant of track in [m]
# func const vkmh= 3.6*sqrt(CurveRadius*(Y_cp+CurveCant/(2*bo_)*9.81)) # no_warning func min vkmh= vkmh 160 # func const vkmh= 160 # Speed in km/hto:
func const vkmh= 3.6*sqrt(CurveRadius*(Y_cp+CurveCant/(2*bo_)*9.81)) no_warning func min vkmh= vkmh 160 # # func const vkmh= 160 # Speed in km/h(The speed vkmh will be automatically calculated giving a uncompensated lateral acceleration of 0.6540[m/s2] in the track plane)
tstop= 10.to:
tstop= 25.
gplot runf/R600_ideal_MXDp3.tsimf gp/R600_ideal_MXDp3.gp &
glplot runf/R600_ideal_MXDp3.tsimf gp/R600_ideal_MXDp3.gp &
copy runf/R600_ideal_MXDp3.tsimf runf/R600_tirr_MXDp3.tsimf
# post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT'to:
post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT'
func char ctrack_irreg= Ideal_track # Output in header linesto:
func char ctrack_irreg= track_V120a # Output in header lines
car_1.m.Nmv | Mean Comfort simplified according to CEN Technical |
car_1b1.Nmv | Committee 256 WG 7 and ERRI Question B 153. |
car_1b2.Nmv | At center of car-body, over bogie #1 and over bogie #2 respectively. |
S1_max | Max lateral track-shift force |
Y/Q_1_max | Max flange climb ratio |
bt1MIN | Min vehicle turnover ratio |
car_1b2.yMAX | Max pantograph sway over trailing bogie |
car_1b2.yMIN | Min pantograph sway over trailing bogie |
The simplest method to estimate the wear on wheels and rails, is to calculate the quasi-static portion of the dissipated energy in the contact points. Track irregularities also contribute to wear, but the main portion of the wear is quasi-static due to the curve geometry. To perform this task use program OPTI to initiate several simulations, one simulation for each curve radius.
First create an input data file for program TSIM:
copy runf/tang_ideal_MXDp3.tsimf runf/wear_curve_MXDp3.tsimf
# post_process= 'mplot mplotf/wear_curve_scal.mplotf $IDENT'To:
post_process= 'mplot mplotf/wear_curve_scal.mplotf $IDENT'
### ### 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 ro_trac_design -100.+Xtrac_start 0. 50.+Xtrac_start 0. 150.+Xtrac_start 1/CurveRadius # Right handed curve 200.+Xtrac_start 1/CurveRadius 300.+Xtrac_start 0. 350.+Xtrac_start 0. 450.+Xtrac_start -1/CurveRadius # Left handed curve 500.+Xtrac_start -1/CurveRadius 600.+Xtrac_start 0. 10000.+Xtrac_start 0. func intpl_r f_trac_design -100.+Xtrac_start 0. 50.+Xtrac_start 0. 150.+Xtrac_start CurveCant/(2*bo_) 200.+Xtrac_start CurveCant/(2*bo_) 300.+Xtrac_start 0. 350.+Xtrac_start 0. 450.+Xtrac_start -CurveCant/(2*bo_) 500.+Xtrac_start -CurveCant/(2*bo_) 600.+Xtrac_start 0. 10000.+Xtrac_start 0. func intpl_r z_trac_design -100.+Xtrac_start 0. 50.+Xtrac_start 0. 150.+Xtrac_start -abs(CurveCant)/2. 200.+Xtrac_start -abs(CurveCant)/2. 300.+Xtrac_start 0. 350.+Xtrac_start 0. 450.+Xtrac_start -abs(CurveCant)/2. 500.+Xtrac_start -abs(CurveCant)/2. 600.+Xtrac_start 0. 10000.+Xtrac_start 0.To:
### ### 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 ro_trac_design -100.+Xtrac_start 0. 50.+Xtrac_start 0. 150.+Xtrac_start 1/CurveRadius # Right handed curve 10000.+Xtrac_start 1/CurveRadius func intpl_r f_trac_design -100.+Xtrac_start 0. 50.+Xtrac_start 0. 150.+Xtrac_start CurveCant/(2*bo_) 10000.+Xtrac_start CurveCant/(2*bo_) func intpl_r z_trac_design -100.+Xtrac_start 0. 50.+Xtrac_start 0. 150.+Xtrac_start -abs(CurveCant)/2. 10000.+Xtrac_start -abs(CurveCant)/2.
# func const vkmh= 3.6*sqrt(CurveRadius*(Y_cp+CurveCant/(2*bo_)*9.81)) # no_warning func min vkmh= vkmh 160 # func const vkmh= 160 # Speed in km/hTo:
func const vkmh= 3.6*sqrt(CurveRadius*(Y_cp+CurveCant/(2*bo_)*9.81)) no_warning func min vkmh= vkmh 160 # # func const vkmh= 160 # Speed in km/h
tstop= 10.to:
tstop= 25.
# # |CurveRadius| vkmh|cpa_111l.FM|cpa_111r.FM|cpa_111l.Fn|cpa_111r.Fn| # | | | nu_scal| nu_scal| u_scal| u_scal| #Date: Idents: | | | | | | | Head lines: # | 1.| 1.| 1.| 1.| 1.| 1.| #------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2025-04-07 wear_curve_00001 150.000 56.378 1181.480 436.236 1151.078 436.178 Wheel/Rail= ENS1002t32.5_60E1i40; pr3; Friction=.36; Speed=56.38 2025-04-07 wear_curve_00002 200.000 65.099 888.768 363.557 854.044 363.482 Wheel/Rail= ENS1002t32.5_60E1i40; pr3; Friction=.36; Speed=65.1 2025-04-07 wear_curve_00003 300.000 79.730 538.622 259.765 502.788 259.655 Wheel/Rail= ENS1002t32.5_60E1i40; pr3; Friction=.36; Speed=79.73 2025-04-07 wear_curve_00004 500.000 102.931 276.228 153.916 261.477 153.715 Wheel/Rail= ENS1002t32.5_60E1i40; pr3; Friction=.36; Speed=102.9 2025-04-07 wear_curve_00005 1000.000 142.625 98.250 72.352 100.705 72.195 Wheel/Rail= ENS1002t32.5_60E1i40; pr3; Friction=.36; Speed=142.6 2025-04-07 wear_curve_00006 2000.000 160.000 44.650 20.003 41.770 19.922 Wheel/Rail= ENS1002t32.5_60E1i40; pr3; Friction=.36; Speed=160The two largest values in each column are marked with a red color. The two smallest values in each column are marked with a blue color. In program MTABLE limit values can be defined, values over the limit will be marked with a red bold font.
# # Average energy dissipation, left and right side, wheelset 111 # ------------------------------------------------------------- genoctave2 "(1181.479 + 436.237) / 2."= 808.86 ;# R= 150[m] genoctave2 "( 888.769 + 363.558) / 2."= 626.16 ;# R= 200[m] genoctave2 "( 538.623 + 259.765) / 2."= 399.19 ;# R= 300[m] genoctave2 "( 276.228 + 153.916) / 2."= 215.07 ;# R= 500[m] genoctave2 "( 98.250 + 72.352) / 2."= 85.30 ;# R= 1000[m] genoctave2 "( 44.650 + 20.003) / 2."= 32.33 ;# R= 2000[m] # # Track curve distribution # ------------------------ # R150= 0.02 # R200= 0.01 # R300= 0.10 # R500= 0.12 # R1000= 0.15 # R2000= 0.15 # # Total average energy dissipation, wheelset 111, running on above track curve distribution # ----------------------------------------------------------------------------------------- # R= 150 R= 200 R= 300 R= 500 R= 1000 R= 2000 genoctave2 ".02*808.86 + .01*626.16 + .10*399.19 + .12*215.07 + .15*85.30 + .15*32.33"= 106
I.e. the average wear over the whole track section is
106 [J/m]
This method requires more calculation, but gives more and better results. In this method all steps in the wear loop are performed with the octave script wear_loop.m. The script makes the following calculations in each step:
With this method it is possible to see if the wear will lead to thicker or thinner flanges.
To execute this example:
cd wear_loop
copy runf/R600_ideal_MXDp3.tsimf runf/R600_ideal_MXDp3_wheel_lubr.tsimf
head 3 "Wheel/Rail= $ckpfr; $cwr_coupl; Friction=$mu_; Speed=$vkmh"to
head 3 "Wheel/Rail= $ckpfr; $cwr_coupl; Friction=$muTread $muFlange; Speed=$vkmh"
func const knwr_= 600e6 # Wheel/rail normal contact stiffness func const mu_ = 0.36 # Friction between wheel and rail # func const mulf_= 1. # Kalker factor (if undefined, runf/wr_coupl.runf will set mulf_= mu_/0.6)to:
func const knwr_= 600e6 # Wheel/rail normal contact stiffness # func const mu_ = 0.36 # Friction between wheel and rail # func const mulf_= 1. # Kalker factor (if undefined, runf/wr_coupl.runf will set mulf_= mu_/0.6) ## ## Friction coefficients individual for each contact patch on all wheels ## (will later be adjusted by substruct update_wheel_mu) ## ========================================================================================== func const muTread = 0.5 # Friction coeff on tread func const muFlange= 0.1 # Friction coeff on flange
## ## Create individual variables for all friction coefficients ## (will later be adjusted by substruct update_wheel_mu and/or update_rail_mu) ## ========================================================================================== # in_substruct create_mu [ $1 ] # $1= axl_nochange to:
## ## Create individual variables for all friction coefficients ## (will later be adjusted by substruct update_wheel_mu and/or update_rail_mu) ## ========================================================================================== in_substruct create_mu [ $1 ] # $1= axl_no
## ## Update the friction coeff depending on the location of the contact patch. Wheel lubrication ## =========================================================================================== # in_substruct update_wheel_mu [ $1 ] # $1= axl_nochange to:
## ## Update the friction coeff depending on the location of the contact patch. Wheel lubrication ## =========================================================================================== in_substruct update_wheel_mu [ $1 ] # $1= axl_no
copy runf/R600_ideal_MXDp3.tsimf runf/R600_ideal_MXDp3_rail_lubr.tsimf
head 2 "Railway vehicle with two bogies; 4 driven axles; $CalcType" head 3 "Wheel/Rail= $ckpfr; $cwr_coupl; Friction=$mu_; Speed=$vkmh" head 4 "Curve Radius=$CurveRadius; Track irr.=$ctrack_irreg"to
head 2 "Railway vehicle with two bogies; 4 driven axles; $CalcType" head 3 "Wheel/Rail= $ckpfr; Speed=$vkmh" head 4 "Curve Radius=$CurveRadius; Track irr.=$ctrack_irreg" head 5 "Friction mu_def=$mu_def mu_or=$mu_or mu_ir=$mu_ir mu_gcor=$mu_gcor"
func const knwr_= 600e6 # Wheel/rail normal contact stiffness func const mu_ = 0.36 # Friction between wheel and rail # func const mulf_= 1. # Kalker factor (if undefined, runf/wr_coupl.runf will set mulf_= mu_/0.6)to:
func const knwr_= 600e6 # Wheel/rail normal contact stiffness # func const mu_ = 0.36 # Friction between wheel and rail # func const mulf_= 1. # Kalker factor (if undefined, runf/wr_coupl.runf will set mulf_= mu_/0.6) ## ## Friction coefficient. Rail lubrication ## ---------------------------------------------- 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
## ## Create individual variables for all friction coefficients ## (will later be adjusted by substruct update_wheel_mu or update_rail_mu) ## ========================================================================================== # in_substruct create_mu [ $1 ] # $1= axl_nochange to:
## ## Create individual variables for all friction coefficients ## (will later be adjusted by substruct update_wheel_mu or update_rail_mu) ## ========================================================================================== in_substruct create_mu [ $1 ] # $1= axl_no
## ## Update the friction coeff depending on the location of the contact patch. Rail lubrication ## =========================================================================================== # in_substruct update_rail_mu [ $1 ] # $1= axl_nochange to:
## ## Update the friction coeff depending on the location of the contact patch. Rail lubrication ## =========================================================================================== in_substruct update_rail_mu [ $1 ] # $1= axl_no
Critical speed:
copy runf/tang_ideal_IRW.tsimf runf/crit_ideal_IRW.tsimf
# func const vkmh= 160 # Speed in km/h # # func const vkmh_deacc= 5 # Retardation of the train-set, when calculating critical speed # func operp vkmh= 900 - vkmh_deacc * time # Vary vkmh linearilyto:
# # func const vkmh= 160 # Speed in km/h # func const vkmh_deacc= 5 # Retardation of the train-set, when calculating critical speed func operp vkmh= 900 - vkmh_deacc * time # Vary vkmh linearily
# force rel_lsys1 deacc_car_1 car_1 0 0 -hccg_1 -mc_1*vkmh_deacc*1000/3600 0. 0. 0. 0. 0. # Apply negative longitudinal forces, # in_substruct crit_excit [ 11 ] # $1= bog_no # to create the retardation "vkmh_deacc". # in_substruct crit_excit [ 12 ] # (The unit of "vkmh_deacc" is [km/h/s])to:
force rel_lsys1 deacc_car_1 car_1 0 0 -hccg_1 -mc_1*vkmh_deacc*1000/3600 0. 0. 0. 0. 0. # Apply negative longitudinal forces, in_substruct crit_excit [ 11 ] # $1= bog_no # to create the retardation "vkmh_deacc". in_substruct crit_excit [ 12 ] # (The unit of "vkmh_deacc" is [km/h/s])
tstop= 10.to:
tstop= 30.
As you can see, for this vehicle the critical speed is higher ~824km/h. The critical speed depends on the moment of inertia of the wheels. If the speed is high enough, the moment of inertia of the wheels starts to make the wheelset to behave like a rigid wheelset.
Make a simulation through a curve, without track irregularities:
copy runf/tang_ideal_IRW.tsimf runf/R600_ideal_IRW.tsimf
# post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT'to:
post_process= 'mplot mplotf/Tsim_All_BoBo.mplotf $IDENT'
func const CurveRadius= 1e99 # Curve radius in [m] func const CurveCant= 0.000 # Cant of track in [m]to:
func const CurveRadius= 600 # Curve radius in [m] func const CurveCant= 0.150 # Cant of track in [m]
# func const vkmh= 3.6*sqrt(CurveRadius*(Y_cp+CurveCant/(2*bo_)*9.81)) # no_warning func min vkmh= vkmh 160 # func const vkmh= 160 # Speed in km/hto:
func const vkmh= 3.6*sqrt(CurveRadius*(Y_cp+CurveCant/(2*bo_)*9.81)) no_warning func min vkmh= vkmh 160 # # func const vkmh= 160 # Speed in km/h(The speed vkmh will be automatically calculated giving a lateral acceleration of 0.6540[m/s2] in the track plane)
tstop= 10.to:
tstop= 25.
The above vehicle model describes a quite heavy motor-car approximately. If you want to study a lighter passenger-car without motors, please use runf/tang_ideal_passengerCar.tsimf as Master file.
A vehicle model contains of many input data, and errors in input data may happen for different reasons.
Because of that, it is important to check and debug the model before starting large scale simulations.
At Debugging a vehicle model
you can find some simple tips to debug the model.
Please read Debugging a vehicle model
and try to find the errors in file runf/tang_ideal_err.tsimf.
(At least 3 errors should be possible to find.)