﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
1715	Simulation code for gearbox-model generates divide by zero ( during initialization ?)	perob88	perob88	"I have made a simple manual gearbox with clutch.

 In Dymola I couln't get it to simulate using instantatnious gear shifts because of issues with signals without well defined derivative. As workaround I added a first order system for the speed equation, as follows: 
{{{model IdealGearBox
        extends
        Modelica.Mechanics.Rotational.Interfaces.PartialElementaryTwoFlangesAndSupport2;
      parameter Real ratios[:]={1}
        ""Transmission ratios (flange_a.phi/flange_b.phi)"";
      parameter Real Tg=0.1 ""Time constant for change of gear ratio."";

      Modelica.Blocks.Interfaces.IntegerInput Gear ""Gear number"";

      Modelica.SIunits.Angle phi_a
        ""Angle between left shaft flange and support"";
      Modelica.SIunits.Angle phi_b
        ""Angle between right shaft flange and support"";
      Real gearRatio(start=1, fixed=true);
      equation
      der(gearRatio) = ((if Gear == 0 then 1 else ratios[Gear]) - gearRatio)/Tg;
      der(phi_a) = gearRatio*der(phi_b);
      phi_a = flange_a.phi - phi_support;
      phi_b = flange_b.phi - phi_support;
      0 = gearRatio*flange_a.tau + flange_b.tau;
end IdealGearBox;}}}

 


When simulatig a simple vehicle with this gearbox solution i get the following:

{{{""Following Error has occurred.
Unknown error throw   | [line] 42 | [file] util/division.c
        | division by zero""}}}

Running the executable manually gives:
{{{ warning | division by zero in partial equation: $DER.simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a / simplevehicle1.chassis.Wheel.w because simplevehicle1.chassis.Wheel.w == 0
        | [line] 1102 | [file] TestModel.c
throw   | [line] 42 | [file] util/division.c
        | division by zero}}}

If I remove 
{{{der(gearRatio) = ((if Gear == 0 then 1 else ratios[Gear]) - gearRatio)/Tg;}}}

 and replace with
{{{gearRatio = (if Gear == 0 then 1 else ratios[Gear]);}}}

everyting is running smoothly but in my opinion this shouln't happen. 

 

An instantiation of the model is:

 
{{{function Modelica.Math.tempInterpol1 ""Temporary function for linear interpolation (will be removed)""

  input Real u ""input value (first column of table)"";

  input Real[:, :] table ""table to be interpolated"";

  input Integer icol ""column of table to be interpolated"";

  output Real y ""interpolated input value (icol column of table)"";

  protected Integer i;

  protected Integer n ""number of rows of table"";

  protected Real u1;

  protected Real u2;

  protected Real y1;

  protected Real y2;

algorithm

  n := size(table,1);

  if n <= 1 then

    y := table[1,icol];

  else

    if u <= table[1,1] then

      i := 1;

    else

      i := 2;

      while i < n and u >= table[i,1] loop

        i := 1 + i;

      end while;

      i := i + -1;

    end if;

    u1 := table[i,1];

    u2 := table[1 + i,1];

    y1 := table[i,icol];

    y2 := table[1 + i,icol];

    assert( u2 > u1, ""Table index must be increasing"");

    y := y1 + (y2 - y1 * (u - u1)) / (u2 - u1);

  end if;

end Modelica.Math.tempInterpol1;
}}}

{{{class TestModel

  input Real simplevehicle1.ThrottlePedal;

  input Real simplevehicle1.BrakePedal;

  input Real simplevehicle1.ClutchPedal;

  input Integer simplevehicle1.Gear;

  Real simplevehicle1.Wheel.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.Wheel.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.Vehicle.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.Vehicle.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  parameter Boolean simplevehicle1.chassis.WheelRadius.useSupportR = false ""= true, if rotational support flange enabled, otherwise implicitly grounded"";

  parameter Boolean simplevehicle1.chassis.WheelRadius.useSupportT = false ""= true, if translational support flange enabled, otherwise implicitly grounded"";

  Real simplevehicle1.chassis.WheelRadius.flangeR.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.WheelRadius.flangeR.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.chassis.WheelRadius.flangeT.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.WheelRadius.flangeT.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  input Real simplevehicle1.chassis.WheelRadius.internalSupportR.tau(quantity = ""Torque"", unit = ""N.m"") = -simplevehicle1.chassis.WheelRadius.flangeR.tau ""External support torque (must be computed via torque balance in model where InternalSupport is used; = flange.tau)"";

  Real simplevehicle1.chassis.WheelRadius.internalSupportR.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""External support angle (= flange.phi)"";

  Real simplevehicle1.chassis.WheelRadius.internalSupportR.flange.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.WheelRadius.internalSupportR.flange.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  input Real simplevehicle1.chassis.WheelRadius.internalSupportT.f(quantity = ""Force"", unit = ""N"") = -simplevehicle1.chassis.WheelRadius.flangeT.f ""External support force (must be computed via force balance in model where InternalSupport is used; = flange.f)"";

  Real simplevehicle1.chassis.WheelRadius.internalSupportT.s(quantity = ""Length"", unit = ""m"") ""External support position (= flange.s)"";

  Real simplevehicle1.chassis.WheelRadius.internalSupportT.flange.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.WheelRadius.internalSupportT.flange.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  parameter Real simplevehicle1.chassis.WheelRadius.ratio(unit = ""rad/m"", start = 1.0) = 3.3333333333333335 ""Transmission ratio (flange_a.phi/flange_b.s)"";

  parameter Real simplevehicle1.chassis.WheelRadius.fixedR.phi0(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") = 0.0 ""Fixed offset angle of housing"";

  Real simplevehicle1.chassis.WheelRadius.fixedR.flange.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.WheelRadius.fixedR.flange.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  parameter Real simplevehicle1.chassis.WheelRadius.fixedT.s0(quantity = ""Length"", unit = ""m"") = 0.0 ""fixed offset position of housing"";

  Real simplevehicle1.chassis.WheelRadius.fixedT.flange.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.WheelRadius.fixedT.flange.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  parameter Real simplevehicle1.chassis.VehicleMass.L(quantity = ""Length"", unit = ""m"", start = 0.0) = 0.0 ""Length of component, from left flange to right flange (= flange_b.s - flange_a.s)"";

  Real simplevehicle1.chassis.VehicleMass.flange_a.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.VehicleMass.flange_a.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  Real simplevehicle1.chassis.VehicleMass.flange_b.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.VehicleMass.flange_b.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  parameter Real simplevehicle1.chassis.VehicleMass.m(quantity = ""Mass"", unit = ""kg"", min = 0.0, start = 1.0) = 1520.0 ""mass of the sliding mass"";

  parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.chassis.VehicleMass.stateSelect = StateSelect.default ""Priority to use s and v as states"";

  Real simplevehicle1.chassis.VehicleMass.a(quantity = ""Acceleration"", unit = ""m/s2"", start = 0.0) ""absolute acceleration of component"";

  Real simplevehicle1.chassis.VehicleMass.s(quantity = ""Length"", unit = ""m"", start = 0.0, StateSelect = StateSelect.default) ""Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)"";

  Real simplevehicle1.chassis.VehicleMass.v(quantity = ""Velocity"", unit = ""m/s"", start = 0.0, StateSelect = StateSelect.default) ""absolute velocity of component"";

  Real simplevehicle1.chassis.Wheel.flange_a.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.Wheel.flange_a.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.chassis.Wheel.flange_b.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.Wheel.flange_b.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  parameter Real simplevehicle1.chassis.Wheel.J(quantity = ""MomentOfInertia"", unit = ""kg.m2"", min = 0.0, start = 1.0) = 0.1 ""Moment of inertia"";

  parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.chassis.Wheel.stateSelect = StateSelect.default ""Priority to use phi and w as states"";

  Real simplevehicle1.chassis.Wheel.a(quantity = ""AngularAcceleration"", unit = ""rad/s2"") ""Absolute angular acceleration of component (= der(w))"";

  Real simplevehicle1.chassis.Wheel.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"", StateSelect = StateSelect.default) ""Absolute rotation angle of component"";

  Real simplevehicle1.chassis.Wheel.w(quantity = ""AngularVelocity"", unit = ""rad/s"", StateSelect = StateSelect.default) ""Absolute angular velocity of component (= der(phi))"";

  parameter Integer simplevehicle1.chassis.speedDependentForce.n = 3;

  Real simplevehicle1.chassis.speedDependentForce.speedSensor.flange.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.speedDependentForce.speedSensor.flange.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  output Real simplevehicle1.chassis.speedDependentForce.speedSensor.v ""Absolute velocity of flange as output signal"";

  Real simplevehicle1.chassis.speedDependentForce.Flange_b.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.speedDependentForce.Flange_b.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  parameter Boolean simplevehicle1.chassis.speedDependentForce.Force.useSupport = false ""= true, if support flange enabled, otherwise implicitly grounded"";

  Real simplevehicle1.chassis.speedDependentForce.Force.s(quantity = ""Length"", unit = ""m"") = simplevehicle1.chassis.speedDependentForce.Force.flange.s - simplevehicle1.chassis.speedDependentForce.Force.s_support ""distance between flange and support (= flange.s - support.s)"";

  Real simplevehicle1.chassis.speedDependentForce.Force.flange.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.speedDependentForce.Force.flange.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  protected Real simplevehicle1.chassis.speedDependentForce.Force.s_support(quantity = ""Length"", unit = ""m"") ""Absolute position of support flange"";

  input Real simplevehicle1.chassis.speedDependentForce.Force.f ""driving force as input signal"";

  parameter Real simplevehicle1.chassis.speedDependentForce.Cpol[1] = 0.0;

  parameter Real simplevehicle1.chassis.speedDependentForce.Cpol[2] = -13.275;

  parameter Real simplevehicle1.chassis.speedDependentForce.Cpol[3] = -0.23328;

  input Real simplevehicle1.chassis.speedDependentForce.speedToForce.u ""Connector of Real input signal"";

  output Real simplevehicle1.chassis.speedDependentForce.speedToForce.y ""Connector of Real output signal"";

  parameter Integer simplevehicle1.chassis.speedDependentForce.speedToForce.n = simplevehicle1.chassis.speedDependentForce.n ""Polynomial order"";

  parameter Real simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[1] = simplevehicle1.chassis.speedDependentForce.Cpol[1] ""Polynomial coefficients for c1 + c2*u + ... + cn * u^(n-1)"";

  parameter Real simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[2] = simplevehicle1.chassis.speedDependentForce.Cpol[2] ""Polynomial coefficients for c1 + c2*u + ... + cn * u^(n-1)"";

  parameter Real simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[3] = simplevehicle1.chassis.speedDependentForce.Cpol[3] ""Polynomial coefficients for c1 + c2*u + ... + cn * u^(n-1)"";

  protected Real simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1];

  protected Real simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2];

  protected Real simplevehicle1.chassis.speedDependentForce.speedToForce.upow[3];

  Real simplevehicle1.chassis.DriveShaft.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.DriveShaft.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.chassis.VehicleChassis.s(quantity = ""Length"", unit = ""m"") ""absolute position of flange"";

  Real simplevehicle1.chassis.VehicleChassis.f(quantity = ""Force"", unit = ""N"") ""cut force directed into flange"";

  parameter Boolean simplevehicle1.chassis.brake.useSupport = false ""= true, if support flange enabled, otherwise implicitly grounded"";

  Real simplevehicle1.chassis.brake.flange_a.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.brake.flange_a.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.chassis.brake.flange_b.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.chassis.brake.flange_b.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  protected Real simplevehicle1.chassis.brake.phi_support(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute angle of support flange"";

  parameter Real simplevehicle1.chassis.brake.w_small(quantity = ""AngularVelocity"", unit = ""rad/s"") = 10000000000.0 ""Relative angular velocity near to zero if jumps due to a reinit(..) of the velocity can occur (set to low value only if such impulses can occur)"";

  Real simplevehicle1.chassis.brake.w_relfric(quantity = ""AngularVelocity"", unit = ""rad/s"") ""Relative angular velocity between frictional surfaces"";

  Real simplevehicle1.chassis.brake.a_relfric(quantity = ""AngularAcceleration"", unit = ""rad/s2"") ""Relative angular acceleration between frictional surfaces"";

  Real simplevehicle1.chassis.brake.tau0(quantity = ""Torque"", unit = ""N.m"") ""Friction torque for w=0 and forward sliding"";

  Real simplevehicle1.chassis.brake.tau0_max(quantity = ""Torque"", unit = ""N.m"") ""Maximum friction torque for w=0 and locked"";

  Boolean simplevehicle1.chassis.brake.free ""true, if frictional element is not active"";

  Real simplevehicle1.chassis.brake.sa(unit = ""1"") ""Path parameter of friction characteristic tau = f(a_relfric)"";

  Boolean simplevehicle1.chassis.brake.startForward(start = false, fixed = true) ""true, if w_rel=0 and start of forward sliding"";

  Boolean simplevehicle1.chassis.brake.startBackward(start = false, fixed = true) ""true, if w_rel=0 and start of backward sliding"";

  Boolean simplevehicle1.chassis.brake.locked(start = false) ""true, if w_rel=0 and not sliding"";

  constant Integer simplevehicle1.chassis.brake.Unknown = 3 ""Value of mode is not known"";

  constant Integer simplevehicle1.chassis.brake.Free = 2 ""Element is not active"";

  constant Integer simplevehicle1.chassis.brake.Forward = 1 ""w_rel > 0 (forward sliding)"";

  constant Integer simplevehicle1.chassis.brake.Stuck = 0 ""w_rel = 0 (forward sliding, locked or backward sliding)"";

  constant Integer simplevehicle1.chassis.brake.Backward = -1 ""w_rel < 0 (backward sliding)"";

  protected constant Real simplevehicle1.chassis.brake.unitAngularAcceleration(quantity = ""AngularAcceleration"", unit = ""rad/s2"") = 1.0;

  protected constant Real simplevehicle1.chassis.brake.unitTorque(quantity = ""Torque"", unit = ""N.m"") = 1.0;

  parameter Real simplevehicle1.chassis.brake.mue_pos[1,1] = 0.0 ""[w,mue] positive sliding friction coefficient (w_rel>=0)"";

  parameter Real simplevehicle1.chassis.brake.mue_pos[1,2] = 0.5 ""[w,mue] positive sliding friction coefficient (w_rel>=0)"";

  parameter Real simplevehicle1.chassis.brake.peak(min = 1.0) = 1.0 ""peak*mue_pos[1,2] = maximum value of mue for w_rel==0"";

  parameter Real simplevehicle1.chassis.brake.cgeo(min = 0.0) = 1.0 ""Geometry constant containing friction distribution assumption"";

  parameter Real simplevehicle1.chassis.brake.fn_max(quantity = ""Force"", unit = ""N"", min = 0.0, start = 1.0) = 30000.0 ""Maximum normal force"";

  Real simplevehicle1.chassis.brake.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Angle between shaft flanges (flange_a, flange_b) and support"";

  Real simplevehicle1.chassis.brake.tau(quantity = ""Torque"", unit = ""N.m"") ""Brake friction torqu"";

  Real simplevehicle1.chassis.brake.w(quantity = ""AngularVelocity"", unit = ""rad/s"") ""Absolute angular velocity of flange_a and flange_b"";

  Real simplevehicle1.chassis.brake.a(quantity = ""AngularAcceleration"", unit = ""rad/s2"") ""Absolute angular acceleration of flange_a and flange_b"";

  Real simplevehicle1.chassis.brake.mue0 ""Friction coefficient for w=0 and forward sliding"";

  Real simplevehicle1.chassis.brake.fn(quantity = ""Force"", unit = ""N"") ""Normal force (=fn_max*f_normalized)"";

  input Real simplevehicle1.chassis.brake.f_normalized ""Normalized force signal 0..1 (normal force = fn_max*f_normalized; brake is active if > 0)"";

  Integer simplevehicle1.chassis.brake.mode(min = -1, max = 3, start = 3, fixed = true);

  input Real simplevehicle1.chassis.BrakePedal;

  parameter Boolean simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.useSupport = false ""= true, if support flange enabled, otherwise implicitly grounded"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  protected Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute angle of support flange"";

  parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[1] = 16.0 ""Transmission ratios (flange_a.phi/flange_b.phi)"";

  parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[2] = 7.5 ""Transmission ratios (flange_a.phi/flange_b.phi)"";

  parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[3] = 4.5 ""Transmission ratios (flange_a.phi/flange_b.phi)"";

  parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[4] = 3.2 ""Transmission ratios (flange_a.phi/flange_b.phi)"";

  parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[5] = 2.5 ""Transmission ratios (flange_a.phi/flange_b.phi)"";

  parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Tg = 0.1 ""Time constant for change of gear ratio."";

  input Integer simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear ""Gear number"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Angle between left shaft flange and support"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_b(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Angle between right shaft flange and support"";

  Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio(start = 1.0, fixed = true);

  Real simplevehicle1.clutchAndGearbox.clutch.a_rel(quantity = ""AngularAcceleration"", unit = ""rad/s2"", start = 0.0) ""Relative angular acceleration (= der(w_rel))"";

  Real simplevehicle1.clutchAndGearbox.clutch.tau(quantity = ""Torque"", unit = ""N.m"") ""Torque between flanges (= flange_b.tau)"";

  Real simplevehicle1.clutchAndGearbox.clutch.flange_a.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.clutchAndGearbox.clutch.flange_a.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.clutchAndGearbox.clutch.flange_b.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.clutchAndGearbox.clutch.flange_b.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  parameter Real simplevehicle1.clutchAndGearbox.clutch.phi_nominal(quantity = ""Angle"", unit = ""rad"", displayUnit = ""rad"") = 0.0001 ""Nominal value of phi_rel (used for scaling)"";

  parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.clutchAndGearbox.clutch.stateSelect = StateSelect.prefer ""Priority to use phi_rel and w_rel as states"";

  parameter Real simplevehicle1.clutchAndGearbox.clutch.w_small(quantity = ""AngularVelocity"", unit = ""rad/s"") = 10000000000.0 ""Relative angular velocity near to zero if jumps due to a reinit(..) of the velocity can occur (set to low value only if such impulses can occur)"";

  Real simplevehicle1.clutchAndGearbox.clutch.w_relfric(quantity = ""AngularVelocity"", unit = ""rad/s"") ""Relative angular velocity between frictional surfaces"";

  Real simplevehicle1.clutchAndGearbox.clutch.a_relfric(quantity = ""AngularAcceleration"", unit = ""rad/s2"") ""Relative angular acceleration between frictional surfaces"";

  Real simplevehicle1.clutchAndGearbox.clutch.tau0(quantity = ""Torque"", unit = ""N.m"") ""Friction torque for w=0 and forward sliding"";

  Real simplevehicle1.clutchAndGearbox.clutch.tau0_max(quantity = ""Torque"", unit = ""N.m"") ""Maximum friction torque for w=0 and locked"";

  Boolean simplevehicle1.clutchAndGearbox.clutch.free ""true, if frictional element is not active"";

  Real simplevehicle1.clutchAndGearbox.clutch.sa(unit = ""1"") ""Path parameter of friction characteristic tau = f(a_relfric)"";

  Boolean simplevehicle1.clutchAndGearbox.clutch.startForward(start = false, fixed = true) ""true, if w_rel=0 and start of forward sliding"";

  Boolean simplevehicle1.clutchAndGearbox.clutch.startBackward(start = false, fixed = true) ""true, if w_rel=0 and start of backward sliding"";

  Boolean simplevehicle1.clutchAndGearbox.clutch.locked(start = false) ""true, if w_rel=0 and not sliding"";

  constant Integer simplevehicle1.clutchAndGearbox.clutch.Unknown = 3 ""Value of mode is not known"";

  constant Integer simplevehicle1.clutchAndGearbox.clutch.Free = 2 ""Element is not active"";

  constant Integer simplevehicle1.clutchAndGearbox.clutch.Forward = 1 ""w_rel > 0 (forward sliding)"";

  constant Integer simplevehicle1.clutchAndGearbox.clutch.Stuck = 0 ""w_rel = 0 (forward sliding, locked or backward sliding)"";

  constant Integer simplevehicle1.clutchAndGearbox.clutch.Backward = -1 ""w_rel < 0 (backward sliding)"";

  protected constant Real simplevehicle1.clutchAndGearbox.clutch.unitAngularAcceleration(quantity = ""AngularAcceleration"", unit = ""rad/s2"") = 1.0;

  protected constant Real simplevehicle1.clutchAndGearbox.clutch.unitTorque(quantity = ""Torque"", unit = ""N.m"") = 1.0;

  parameter Real simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1] = 0.0 ""[w,mue] positive sliding friction coefficient (w_rel>=0)"";

  parameter Real simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2] = 0.5 ""[w,mue] positive sliding friction coefficient (w_rel>=0)"";

  parameter Real simplevehicle1.clutchAndGearbox.clutch.peak(min = 1.0) = 1.0 ""peak*mue_pos[1,2] = maximum value of mue for w_rel==0"";

  parameter Real simplevehicle1.clutchAndGearbox.clutch.cgeo(min = 0.0) = 1.0 ""Geometry constant containing friction distribution assumption"";

  parameter Real simplevehicle1.clutchAndGearbox.clutch.fn_max(quantity = ""Force"", unit = ""N"", min = 0.0, start = 1.0) = 1000.0 ""Maximum normal force"";

  Real simplevehicle1.clutchAndGearbox.clutch.mue0 ""Friction coefficient for w=0 and forward sliding"";

  Real simplevehicle1.clutchAndGearbox.clutch.fn(quantity = ""Force"", unit = ""N"") ""Normal force (fn=fn_max*f_normalized)"";

  input Real simplevehicle1.clutchAndGearbox.clutch.f_normalized ""Normalized force signal 0..1 (normal force = fn_max*f_normalized; clutch is engaged if > 0)"";

  Real simplevehicle1.clutchAndGearbox.clutch.phi_rel(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"", start = 0.0, nominal = simplevehicle1.clutchAndGearbox.clutch.phi_nominal, StateSelect = StateSelect.prefer) ""Relative rotation angle (= flange_b.phi - flange_a.phi)"";

  Real simplevehicle1.clutchAndGearbox.clutch.w_rel(quantity = ""AngularVelocity"", unit = ""rad/s"", start = 0.0, StateSelect = StateSelect.prefer) ""Relative angular velocity (= der(phi_rel))"";

  Integer simplevehicle1.clutchAndGearbox.clutch.mode(min = -1, max = 3, start = 3, fixed = true);

  Real simplevehicle1.clutchAndGearbox.ClutchAxle.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.clutchAndGearbox.ClutchAxle.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.clutchAndGearbox.GearboxAxle.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.clutchAndGearbox.GearboxAxle.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  input Real simplevehicle1.clutchAndGearbox.ClutchPedal;

  input Integer simplevehicle1.clutchAndGearbox.Gear;

  parameter Real simplevehicle1.engine.J(quantity = ""MomentOfInertia"", unit = ""kg.m2"") = 0.1 ""Moment of inertia for the engine"";

  parameter Boolean simplevehicle1.engine.engineTorque.useSupport = false ""= true, if support flange enabled, otherwise implicitly grounded"";

  Real simplevehicle1.engine.engineTorque.flange.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.engine.engineTorque.flange.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  protected Real simplevehicle1.engine.engineTorque.phi_support(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute angle of support flange"";

  input Real simplevehicle1.engine.engineTorque.tau ""Accelerating torque acting at flange (= -flange.tau)"";

  input Real simplevehicle1.engine.ThrottleRef;

  Real simplevehicle1.engine.CrankShaft.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.engine.CrankShaft.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  parameter Real simplevehicle1.engine.torqueMax.k(start = 1.0) = 350.0 ""Gain value multiplied with input signal"";

  input Real simplevehicle1.engine.torqueMax.u ""Input signal connector"";

  output Real simplevehicle1.engine.torqueMax.y ""Output signal connector"";

  Real simplevehicle1.engine.engineInertia.flange_a.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.engine.engineInertia.flange_a.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  Real simplevehicle1.engine.engineInertia.flange_b.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"") ""Absolute rotation angle of flange"";

  Real simplevehicle1.engine.engineInertia.flange_b.tau(quantity = ""Torque"", unit = ""N.m"") ""Cut torque in the flange"";

  parameter Real simplevehicle1.engine.engineInertia.J(quantity = ""MomentOfInertia"", unit = ""kg.m2"", min = 0.0, start = 1.0) = simplevehicle1.engine.J ""Moment of inertia"";

  parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.engine.engineInertia.stateSelect = StateSelect.default ""Priority to use phi and w as states"";

  Real simplevehicle1.engine.engineInertia.a(quantity = ""AngularAcceleration"", unit = ""rad/s2"") ""Absolute angular acceleration of component (= der(w))"";

  Real simplevehicle1.engine.engineInertia.phi(quantity = ""Angle"", unit = ""rad"", displayUnit = ""deg"", StateSelect = StateSelect.default) ""Absolute rotation angle of component"";

  Real simplevehicle1.engine.engineInertia.w(quantity = ""AngularVelocity"", unit = ""rad/s"", StateSelect = StateSelect.default) ""Absolute angular velocity of component (= der(phi))"";

  output Real Throttle.y ""Connector of Real output signal"";

  parameter Real Throttle.k(start = 1.0) = 0.3 ""Constant output value"";

  output Real Clutch.y ""Connector of Real output signal"";

  parameter Real Clutch.k(start = 1.0) = 1.0 ""Constant output value"";

  output Real Break.y ""Connector of Real output signal"";

  parameter Real Break.k(start = 1.0) = 0.0 ""Constant output value"";

  output Integer Gear.y ""Connector of Integer output signal"";

  parameter Integer Gear.offset = 1 ""Offset of output signal y"";

  parameter Real Gear.startTime(quantity = ""Time"", unit = ""s"") = 5.0 ""Output y = offset for time < startTime"";

  parameter Integer Gear.height = 1 ""Height of step"";

equation

  simplevehicle1.chassis.WheelRadius.internalSupportR.flange.tau = simplevehicle1.chassis.WheelRadius.internalSupportR.tau;

  simplevehicle1.chassis.WheelRadius.internalSupportR.flange.phi = simplevehicle1.chassis.WheelRadius.internalSupportR.phi;

  simplevehicle1.chassis.WheelRadius.internalSupportT.flange.f = simplevehicle1.chassis.WheelRadius.internalSupportT.f;

  simplevehicle1.chassis.WheelRadius.internalSupportT.flange.s = simplevehicle1.chassis.WheelRadius.internalSupportT.s;

  simplevehicle1.chassis.WheelRadius.fixedR.flange.phi = simplevehicle1.chassis.WheelRadius.fixedR.phi0;

  simplevehicle1.chassis.WheelRadius.fixedT.flange.s = simplevehicle1.chassis.WheelRadius.fixedT.s0;

  simplevehicle1.chassis.WheelRadius.flangeR.phi - simplevehicle1.chassis.WheelRadius.internalSupportR.phi = simplevehicle1.chassis.WheelRadius.ratio * (simplevehicle1.chassis.WheelRadius.flangeT.s - simplevehicle1.chassis.WheelRadius.internalSupportT.s);

  0.0 = simplevehicle1.chassis.WheelRadius.ratio * simplevehicle1.chassis.WheelRadius.flangeR.tau + simplevehicle1.chassis.WheelRadius.flangeT.f;

  simplevehicle1.chassis.VehicleMass.v = der(simplevehicle1.chassis.VehicleMass.s);

  simplevehicle1.chassis.VehicleMass.a = der(simplevehicle1.chassis.VehicleMass.v);

  simplevehicle1.chassis.VehicleMass.m * simplevehicle1.chassis.VehicleMass.a = simplevehicle1.chassis.VehicleMass.flange_a.f + simplevehicle1.chassis.VehicleMass.flange_b.f;

  simplevehicle1.chassis.VehicleMass.flange_a.s = simplevehicle1.chassis.VehicleMass.s + (-simplevehicle1.chassis.VehicleMass.L) / 2.0;

  simplevehicle1.chassis.VehicleMass.flange_b.s = simplevehicle1.chassis.VehicleMass.s + simplevehicle1.chassis.VehicleMass.L / 2.0;

  simplevehicle1.chassis.Wheel.phi = simplevehicle1.chassis.Wheel.flange_a.phi;

  simplevehicle1.chassis.Wheel.phi = simplevehicle1.chassis.Wheel.flange_b.phi;

  simplevehicle1.chassis.Wheel.w = der(simplevehicle1.chassis.Wheel.phi);

  simplevehicle1.chassis.Wheel.a = der(simplevehicle1.chassis.Wheel.w);

  simplevehicle1.chassis.Wheel.J * simplevehicle1.chassis.Wheel.a = simplevehicle1.chassis.Wheel.flange_a.tau + simplevehicle1.chassis.Wheel.flange_b.tau;

  simplevehicle1.chassis.speedDependentForce.speedSensor.v = der(simplevehicle1.chassis.speedDependentForce.speedSensor.flange.s);

  0.0 = simplevehicle1.chassis.speedDependentForce.speedSensor.flange.f;

  simplevehicle1.chassis.speedDependentForce.Force.flange.f = -simplevehicle1.chassis.speedDependentForce.Force.f;

  simplevehicle1.chassis.speedDependentForce.Force.s_support = 0.0;

  simplevehicle1.chassis.speedDependentForce.speedToForce.y = simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1] * simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[1] + (simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2] * simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[2] + simplevehicle1.chassis.speedDependentForce.speedToForce.upow[3] * simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[3]);

  simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1] = 1.0;

  simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2] = simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1] * simplevehicle1.chassis.speedDependentForce.speedToForce.u;

  simplevehicle1.chassis.speedDependentForce.speedToForce.upow[3] = simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2] * simplevehicle1.chassis.speedDependentForce.speedToForce.u;

  simplevehicle1.chassis.brake.mue0 = Modelica.Math.tempInterpol1(0.0,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2);

  simplevehicle1.chassis.brake.phi = simplevehicle1.chassis.brake.flange_a.phi - simplevehicle1.chassis.brake.phi_support;

  simplevehicle1.chassis.brake.flange_b.phi = simplevehicle1.chassis.brake.flange_a.phi;

  simplevehicle1.chassis.brake.w = der(simplevehicle1.chassis.brake.phi);

  simplevehicle1.chassis.brake.a = der(simplevehicle1.chassis.brake.w);

  simplevehicle1.chassis.brake.w_relfric = simplevehicle1.chassis.brake.w;

  simplevehicle1.chassis.brake.a_relfric = simplevehicle1.chassis.brake.a;

  simplevehicle1.chassis.brake.flange_a.tau + (simplevehicle1.chassis.brake.flange_b.tau - simplevehicle1.chassis.brake.tau) = 0.0;

  simplevehicle1.chassis.brake.fn = simplevehicle1.chassis.brake.fn_max * simplevehicle1.chassis.brake.f_normalized;

  simplevehicle1.chassis.brake.tau0 = simplevehicle1.chassis.brake.mue0 * (simplevehicle1.chassis.brake.cgeo * simplevehicle1.chassis.brake.fn);

  simplevehicle1.chassis.brake.tau0_max = simplevehicle1.chassis.brake.peak * simplevehicle1.chassis.brake.tau0;

  simplevehicle1.chassis.brake.free = simplevehicle1.chassis.brake.fn <= 0.0;

  simplevehicle1.chassis.brake.tau = if simplevehicle1.chassis.brake.locked then simplevehicle1.chassis.brake.sa else if simplevehicle1.chassis.brake.free then 0.0 else simplevehicle1.chassis.brake.cgeo * (simplevehicle1.chassis.brake.fn * (if simplevehicle1.chassis.brake.startForward then Modelica.Math.tempInterpol1(simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2) else if simplevehicle1.chassis.brake.startBackward then -Modelica.Math.tempInterpol1(-simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2) else if pre(simplevehicle1.chassis.brake.mode) == 1 then Modelica.Math.tempInterpol1(simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2) else -Modelica.Math.tempInterpol1(-simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2)));

  simplevehicle1.chassis.brake.phi_support = 0.0;

  simplevehicle1.chassis.brake.startForward = pre(simplevehicle1.chassis.brake.mode) == 0 and (simplevehicle1.chassis.brake.sa > simplevehicle1.chassis.brake.tau0_max or pre(simplevehicle1.chassis.brake.startForward) and simplevehicle1.chassis.brake.sa > simplevehicle1.chassis.brake.tau0) or pre(simplevehicle1.chassis.brake.mode) == -1 and simplevehicle1.chassis.brake.w_relfric > simplevehicle1.chassis.brake.w_small or initial() and simplevehicle1.chassis.brake.w_relfric > 0.0;

  simplevehicle1.chassis.brake.startBackward = pre(simplevehicle1.chassis.brake.mode) == 0 and (simplevehicle1.chassis.brake.sa < -simplevehicle1.chassis.brake.tau0_max or pre(simplevehicle1.chassis.brake.startBackward) and simplevehicle1.chassis.brake.sa < -simplevehicle1.chassis.brake.tau0) or pre(simplevehicle1.chassis.brake.mode) == 1 and simplevehicle1.chassis.brake.w_relfric < -simplevehicle1.chassis.brake.w_small or initial() and simplevehicle1.chassis.brake.w_relfric < 0.0;

  simplevehicle1.chassis.brake.locked = not simplevehicle1.chassis.brake.free and not (pre(simplevehicle1.chassis.brake.mode) == 1 or simplevehicle1.chassis.brake.startForward or pre(simplevehicle1.chassis.brake.mode) == -1 or simplevehicle1.chassis.brake.startBackward);

  simplevehicle1.chassis.brake.a_relfric = if simplevehicle1.chassis.brake.locked then 0.0 else if simplevehicle1.chassis.brake.free then simplevehicle1.chassis.brake.sa else if simplevehicle1.chassis.brake.startForward then simplevehicle1.chassis.brake.sa - simplevehicle1.chassis.brake.tau0_max else if simplevehicle1.chassis.brake.startBackward then simplevehicle1.chassis.brake.sa + simplevehicle1.chassis.brake.tau0_max else if pre(simplevehicle1.chassis.brake.mode) == 1 then simplevehicle1.chassis.brake.sa - simplevehicle1.chassis.brake.tau0_max else simplevehicle1.chassis.brake.sa + simplevehicle1.chassis.brake.tau0_max;

  simplevehicle1.chassis.brake.mode = if simplevehicle1.chassis.brake.free then 2 else if (pre(simplevehicle1.chassis.brake.mode) == 1 or pre(simplevehicle1.chassis.brake.mode) == 2 or simplevehicle1.chassis.brake.startForward) and simplevehicle1.chassis.brake.w_relfric > 0.0 then 1 else if (pre(simplevehicle1.chassis.brake.mode) == -1 or pre(simplevehicle1.chassis.brake.mode) == 2 or simplevehicle1.chassis.brake.startBackward) and simplevehicle1.chassis.brake.w_relfric < 0.0 then -1 else 0;

  der(simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio) = ((if simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear == 0 then 1.0 else simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear]) - simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio) / simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Tg;

  der(simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a) = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio * der(simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_b);

  simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.phi - simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support;

  simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_b = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.phi - simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support;

  0.0 = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio * simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.tau + simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.tau;

  simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support = 0.0;

  simplevehicle1.clutchAndGearbox.clutch.mue0 = Modelica.Math.tempInterpol1(0.0,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2);

  simplevehicle1.clutchAndGearbox.clutch.w_relfric = simplevehicle1.clutchAndGearbox.clutch.w_rel;

  simplevehicle1.clutchAndGearbox.clutch.a_relfric = simplevehicle1.clutchAndGearbox.clutch.a_rel;

  simplevehicle1.clutchAndGearbox.clutch.fn = simplevehicle1.clutchAndGearbox.clutch.fn_max * simplevehicle1.clutchAndGearbox.clutch.f_normalized;

  simplevehicle1.clutchAndGearbox.clutch.free = simplevehicle1.clutchAndGearbox.clutch.fn <= 0.0;

  simplevehicle1.clutchAndGearbox.clutch.tau0 = simplevehicle1.clutchAndGearbox.clutch.mue0 * (simplevehicle1.clutchAndGearbox.clutch.cgeo * simplevehicle1.clutchAndGearbox.clutch.fn);

  simplevehicle1.clutchAndGearbox.clutch.tau0_max = simplevehicle1.clutchAndGearbox.clutch.peak * simplevehicle1.clutchAndGearbox.clutch.tau0;

  simplevehicle1.clutchAndGearbox.clutch.tau = if simplevehicle1.clutchAndGearbox.clutch.locked then simplevehicle1.clutchAndGearbox.clutch.sa else if simplevehicle1.clutchAndGearbox.clutch.free then 0.0 else simplevehicle1.clutchAndGearbox.clutch.cgeo * (simplevehicle1.clutchAndGearbox.clutch.fn * (if simplevehicle1.clutchAndGearbox.clutch.startForward then Modelica.Math.tempInterpol1(simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2) else if simplevehicle1.clutchAndGearbox.clutch.startBackward then -Modelica.Math.tempInterpol1(-simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2) else if pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 then Modelica.Math.tempInterpol1(simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2) else -Modelica.Math.tempInterpol1(-simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2)));

  simplevehicle1.clutchAndGearbox.clutch.phi_rel = simplevehicle1.clutchAndGearbox.clutch.flange_b.phi - simplevehicle1.clutchAndGearbox.clutch.flange_a.phi;

  simplevehicle1.clutchAndGearbox.clutch.w_rel = der(simplevehicle1.clutchAndGearbox.clutch.phi_rel);

  simplevehicle1.clutchAndGearbox.clutch.a_rel = der(simplevehicle1.clutchAndGearbox.clutch.w_rel);

  simplevehicle1.clutchAndGearbox.clutch.flange_b.tau = simplevehicle1.clutchAndGearbox.clutch.tau;

  simplevehicle1.clutchAndGearbox.clutch.flange_a.tau = -simplevehicle1.clutchAndGearbox.clutch.tau;

  simplevehicle1.clutchAndGearbox.clutch.startForward = pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 0 and (simplevehicle1.clutchAndGearbox.clutch.sa > simplevehicle1.clutchAndGearbox.clutch.tau0_max or pre(simplevehicle1.clutchAndGearbox.clutch.startForward) and simplevehicle1.clutchAndGearbox.clutch.sa > simplevehicle1.clutchAndGearbox.clutch.tau0) or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == -1 and simplevehicle1.clutchAndGearbox.clutch.w_relfric > simplevehicle1.clutchAndGearbox.clutch.w_small or initial() and simplevehicle1.clutchAndGearbox.clutch.w_relfric > 0.0;

  simplevehicle1.clutchAndGearbox.clutch.startBackward = pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 0 and (simplevehicle1.clutchAndGearbox.clutch.sa < -simplevehicle1.clutchAndGearbox.clutch.tau0_max or pre(simplevehicle1.clutchAndGearbox.clutch.startBackward) and simplevehicle1.clutchAndGearbox.clutch.sa < -simplevehicle1.clutchAndGearbox.clutch.tau0) or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 and simplevehicle1.clutchAndGearbox.clutch.w_relfric < -simplevehicle1.clutchAndGearbox.clutch.w_small or initial() and simplevehicle1.clutchAndGearbox.clutch.w_relfric < 0.0;

  simplevehicle1.clutchAndGearbox.clutch.locked = not simplevehicle1.clutchAndGearbox.clutch.free and not (pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 or simplevehicle1.clutchAndGearbox.clutch.startForward or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == -1 or simplevehicle1.clutchAndGearbox.clutch.startBackward);

  simplevehicle1.clutchAndGearbox.clutch.a_relfric = if simplevehicle1.clutchAndGearbox.clutch.locked then 0.0 else if simplevehicle1.clutchAndGearbox.clutch.free then simplevehicle1.clutchAndGearbox.clutch.sa else if simplevehicle1.clutchAndGearbox.clutch.startForward then simplevehicle1.clutchAndGearbox.clutch.sa - simplevehicle1.clutchAndGearbox.clutch.tau0_max else if simplevehicle1.clutchAndGearbox.clutch.startBackward then simplevehicle1.clutchAndGearbox.clutch.sa + simplevehicle1.clutchAndGearbox.clutch.tau0_max else if pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 then simplevehicle1.clutchAndGearbox.clutch.sa - simplevehicle1.clutchAndGearbox.clutch.tau0_max else simplevehicle1.clutchAndGearbox.clutch.sa + simplevehicle1.clutchAndGearbox.clutch.tau0_max;

  simplevehicle1.clutchAndGearbox.clutch.mode = if simplevehicle1.clutchAndGearbox.clutch.free then 2 else if (pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 2 or simplevehicle1.clutchAndGearbox.clutch.startForward) and simplevehicle1.clutchAndGearbox.clutch.w_relfric > 0.0 then 1 else if (pre(simplevehicle1.clutchAndGearbox.clutch.mode) == -1 or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 2 or simplevehicle1.clutchAndGearbox.clutch.startBackward) and simplevehicle1.clutchAndGearbox.clutch.w_relfric < 0.0 then -1 else 0;

  simplevehicle1.engine.engineTorque.flange.tau = -simplevehicle1.engine.engineTorque.tau;

  simplevehicle1.engine.engineTorque.phi_support = 0.0;

  simplevehicle1.engine.torqueMax.y = simplevehicle1.engine.torqueMax.k * simplevehicle1.engine.torqueMax.u;

  simplevehicle1.engine.engineInertia.phi = simplevehicle1.engine.engineInertia.flange_a.phi;

  simplevehicle1.engine.engineInertia.phi = simplevehicle1.engine.engineInertia.flange_b.phi;

  simplevehicle1.engine.engineInertia.w = der(simplevehicle1.engine.engineInertia.phi);

  simplevehicle1.engine.engineInertia.a = der(simplevehicle1.engine.engineInertia.w);

  simplevehicle1.engine.engineInertia.J * simplevehicle1.engine.engineInertia.a = simplevehicle1.engine.engineInertia.flange_a.tau + simplevehicle1.engine.engineInertia.flange_b.tau;

  Throttle.y = Throttle.k;

  Clutch.y = Clutch.k;

  Break.y = Break.k;

  Gear.y = Gear.offset + (if time < Gear.startTime then 0 else Gear.height);

  simplevehicle1.Wheel.tau = 0.0;

  simplevehicle1.Vehicle.f = 0.0;

  simplevehicle1.chassis.WheelRadius.flangeR.tau + simplevehicle1.chassis.brake.flange_b.tau = 0.0;

  simplevehicle1.chassis.WheelRadius.flangeT.f + simplevehicle1.chassis.VehicleMass.flange_a.f = 0.0;

  simplevehicle1.chassis.WheelRadius.internalSupportR.flange.tau + simplevehicle1.chassis.WheelRadius.fixedR.flange.tau = 0.0;

  simplevehicle1.chassis.WheelRadius.internalSupportT.flange.f + simplevehicle1.chassis.WheelRadius.fixedT.flange.f = 0.0;

  simplevehicle1.chassis.WheelRadius.fixedR.flange.phi = simplevehicle1.chassis.WheelRadius.internalSupportR.flange.phi;

  simplevehicle1.chassis.WheelRadius.fixedT.flange.s = simplevehicle1.chassis.WheelRadius.internalSupportT.flange.s;

  simplevehicle1.chassis.VehicleMass.flange_b.f + simplevehicle1.chassis.speedDependentForce.Flange_b.f + -simplevehicle1.chassis.VehicleChassis.f = 0.0;

  simplevehicle1.chassis.Wheel.flange_a.tau + -simplevehicle1.chassis.DriveShaft.tau = 0.0;

  simplevehicle1.chassis.Wheel.flange_b.tau + simplevehicle1.chassis.brake.flange_a.tau = 0.0;

  simplevehicle1.chassis.speedDependentForce.speedSensor.flange.f + -simplevehicle1.chassis.speedDependentForce.Flange_b.f + simplevehicle1.chassis.speedDependentForce.Force.flange.f = 0.0;

  simplevehicle1.chassis.speedDependentForce.Flange_b.s = simplevehicle1.chassis.speedDependentForce.Force.flange.s;

  simplevehicle1.chassis.speedDependentForce.Flange_b.s = simplevehicle1.chassis.speedDependentForce.speedSensor.flange.s;

  simplevehicle1.chassis.speedDependentForce.Force.f = simplevehicle1.chassis.speedDependentForce.speedToForce.y;

  simplevehicle1.chassis.speedDependentForce.speedSensor.v = simplevehicle1.chassis.speedDependentForce.speedToForce.u;

  -simplevehicle1.Wheel.tau + simplevehicle1.chassis.DriveShaft.tau + simplevehicle1.clutchAndGearbox.GearboxAxle.tau = 0.0;

  -simplevehicle1.Vehicle.f + simplevehicle1.chassis.VehicleChassis.f = 0.0;

  simplevehicle1.chassis.VehicleMass.flange_a.s = simplevehicle1.chassis.WheelRadius.flangeT.s;

  simplevehicle1.chassis.Wheel.flange_b.phi = simplevehicle1.chassis.brake.flange_a.phi;

  simplevehicle1.chassis.WheelRadius.flangeR.phi = simplevehicle1.chassis.brake.flange_b.phi;

  simplevehicle1.chassis.BrakePedal = simplevehicle1.chassis.brake.f_normalized;

  simplevehicle1.chassis.DriveShaft.phi = simplevehicle1.chassis.Wheel.flange_a.phi;

  simplevehicle1.chassis.VehicleChassis.s = simplevehicle1.chassis.VehicleMass.flange_b.s;

  simplevehicle1.chassis.VehicleChassis.s = simplevehicle1.chassis.speedDependentForce.Flange_b.s;

  simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.tau + simplevehicle1.clutchAndGearbox.clutch.flange_b.tau = 0.0;

  simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.tau + -simplevehicle1.clutchAndGearbox.GearboxAxle.tau = 0.0;

  simplevehicle1.clutchAndGearbox.clutch.flange_a.tau + -simplevehicle1.clutchAndGearbox.ClutchAxle.tau = 0.0;

  simplevehicle1.clutchAndGearbox.ClutchAxle.tau + simplevehicle1.engine.CrankShaft.tau = 0.0;

  simplevehicle1.clutchAndGearbox.clutch.flange_b.phi = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.phi;

  simplevehicle1.clutchAndGearbox.ClutchAxle.phi = simplevehicle1.clutchAndGearbox.clutch.flange_a.phi;

  simplevehicle1.clutchAndGearbox.GearboxAxle.phi = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.phi;

  simplevehicle1.clutchAndGearbox.Gear = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear;

  simplevehicle1.clutchAndGearbox.ClutchPedal = simplevehicle1.clutchAndGearbox.clutch.f_normalized;

  simplevehicle1.engine.engineTorque.flange.tau + simplevehicle1.engine.engineInertia.flange_a.tau = 0.0;

  -simplevehicle1.engine.CrankShaft.tau + simplevehicle1.engine.engineInertia.flange_b.tau = 0.0;

  simplevehicle1.engine.engineTorque.tau = simplevehicle1.engine.torqueMax.y;

  simplevehicle1.engine.ThrottleRef = simplevehicle1.engine.torqueMax.u;

  simplevehicle1.engine.engineInertia.flange_a.phi = simplevehicle1.engine.engineTorque.flange.phi;

  simplevehicle1.engine.CrankShaft.phi = simplevehicle1.engine.engineInertia.flange_b.phi;

  simplevehicle1.ThrottlePedal = simplevehicle1.engine.ThrottleRef;

  simplevehicle1.clutchAndGearbox.ClutchAxle.phi = simplevehicle1.engine.CrankShaft.phi;

  simplevehicle1.Gear = simplevehicle1.clutchAndGearbox.Gear;

  simplevehicle1.Wheel.phi = simplevehicle1.chassis.DriveShaft.phi;

  simplevehicle1.Wheel.phi = simplevehicle1.clutchAndGearbox.GearboxAxle.phi;

  simplevehicle1.ClutchPedal = simplevehicle1.clutchAndGearbox.ClutchPedal;

  simplevehicle1.BrakePedal = simplevehicle1.chassis.BrakePedal;

  simplevehicle1.Vehicle.s = simplevehicle1.chassis.VehicleChassis.s;

  Gear.y = simplevehicle1.Gear;

  Break.y = simplevehicle1.BrakePedal;

  Clutch.y = simplevehicle1.ClutchPedal;

  Throttle.y = simplevehicle1.ThrottlePedal;

end TestModel;}}}"	defect	new	high		Simulation Code Generation	trunk			perob88
