Engine can't maintain idle after revving to rev limit
yvesJotres opened this issue · 0 comments
yvesJotres commented
So after I updated the simulator to the newest build, all my old engines don't work as it was, every time I rev it till the limiter, it cant maintain idle no more
Here the Example
/*
My work is using come calculation in the background,
so you can just slap the numbers in and my code will do the job
*/
//Inputs
// Engines
label cylinder_count (4.0)
// The cylinder-bank count of the engine, just for the airflow calculation
label rpm_v (10500.0)
label redline (10000.0)
// Ddetermines rev-limiter
label bore_v (79.0)
// Individual cylinder-bank diameter
label stroke_v (58.0)
// Stroke length
label compression_height(20.6)
// Compression height.
// This number is already the optimum height
label v_angle (0.0)
// To set the angle between banks for the engine of V or W configuration. For inline or straight engines set the value to 0
label splay_angle (0.0 * units.deg)
// If applicable. Otherwise set the value 0
// Ratios
label compression_ratio (11.0)
// Refers to the ratio of the volume being compressed in each cylinder-bank
// 91+ octane works best with 14:1, but try to experiment on it, good luck!
label airfuel_ratio (14.5)
// 12:1 for maximum power, 14.7:1 for perfect balance, 15.4 for best fuel economy
// Best to only use airfuel in the range of 12:1 to 15.4:1
label rod_ratio (2.0)
// The ratio between the conrod and stroke lenght
// The "ideal" rod ratio is 1.75:1
// For low RPM city cars set to 1.5 - 1.6
// For performance engines and motorbikes set to 1.7 - 2.2
// Dimensions: Affects the drag coefficient
label vehicle_mass (223 * units.kg)
// Heavier vehicles have more momentum, hence harder to accelerate and stop
label vehicle_lenght (220.5 * units.cm)
// Lenght
label vehicle_width (72.0 * units.cm)
// Width
label vehicle_height (118.5)
// Height
// Tyres
label tyre_width (180.0)
// The width of your tire
label tyre_aspect_ratio (55.0)
// The ratio between the tire's height and width, in percent
label rim_size (17.0)
// The diameter of the wheel rim
//HOW TO READ TYRES SIZE
//Ex: 295/35/R30
//295 is the tire width, 35 is the tire aspect ratio, R30 is the rim size
// Cams and Valves
label lobe_separation_angle (107.0 * units.deg)
// The average centerline between both lobes
// LSA ranging from 95 - 120 degrees
// Lower LSA for higher maximum torque, and moves peak torque to lower RPM, and vice versa
label advances (25.0 * units.deg)
// Offset from the centerline, don't go too crazy with the numbers, 0-5 degrees is enough
label intake_cam_lift (10.3 * units.mm)
// Dictates how far the intake cams will lift the intake valves, the more lift more air gets into the chamber
// and more air means more BOOM!
label exhaust_cam_lift (10.3 * units.mm)
// Dictates how far the exhaust cams will lift the exhaust valves, more lift more air can be pushed out from the chamber
label cam_duration (236 * units.deg)
// How long the cam holds the valves open
// Performance ranging from 220 upto 280, for best performance around 240
// Higher duration generates more peak power, but rougher idle
label cam_base_radius (16 * units.mm)
// The base radius of the cam
// Materials and Mass
label piston_density (2500.0) // Kg/m3
// The density of the material (aluminum alloys) used for the current piston
label rod_mass (424.0 * units.g)
// The mass of the conrods (connecting rods)
label flywheel_mass (1.8 * units.kg)
// The mass of the flywheel
label flywheel_radius (115 * units.mm)
// The radius of the flywheel
label crank_mass (2.2 * units.kg)
// The mass of the crankshaft
// Airflow/Intakes/Exhausts
label idle_throttle_plate_position(0.9972)
// For tuning the idle throttle plate position
label ve_value(100.0)
// Volumetric efficiency: 85 - 115 (recommended)
label ambient_psi(14.7)
// The ambient atmospheric pressure at sea level is 14.7psi
// Increase in Altitude results in a decrease in atmospheric pressure
label boost_psi(0.0)
// To set how much additional pressure is added to the engine. If your engine is naturally aspirated set to 0
//Calculations lines: you do not need to input anything here
//Geometry Calculation
label engine_cc(((0.7854 * (bore_v * bore_v) * stroke_v * cylinder_count) / 1000.0))
// Calculates the Engine Displacement volume in CC
// (0.7854 x (Bore x Bore) x Stroke Lenght x cylinder bank counts / 1000)
label chamber_cc((engine_cc/cylinder_count)/compression_ratio * units.cc)
// Calculate the volume of each combustion chamber
//(Engine displacement / cylinder bank counts / compression ratio)
label piston_radius(bore_v/2)
// Calculate the radius of the Pistone head radius
//(bore/2)
label piston_volume(constants.pi * (piston_radius * piston_radius) * compression_height)
// Calculate the volume of a cylinder
//(3.14 x (Piston head radius x Piston head radius) x Compression height)
label piston_mass(piston_volume * piston_density * 0.000001 * units.g)
// Calculate the mass of a Piston's head
//(Volume x Density)
label rod_length(stroke_v * rod_ratio * units.mm)
// Calculate the length of a Conrod
//(Stroke Lenght x Rod ratio)
//Unit Conversion
// Adding units
label stroke(stroke_v * units.mm)
label bore(bore_v * units.mm)
label rpm(rpm_v * units.rpm)
label engine_ci(engine_cc * 0.061023744094732)
// Convert the unit of the Engine Displacement from CC to Cubic Inch, used for calculating the total CFM required
// (Engine Displacements x 0.061)
//Airflow/Intakes/Exhausts
label stock_cfm((engine_ci * rpm_v * (ve_value/100)) / 6456.3253)
// Calculates the amount of airflow generated in Cubic Feet per meter (CFM) // Calculate
// (Displacements in CI x Redline x Volumetric efficiency / 6456.3253)
// Forced Induction Air Flows
label boost_ratio(boost_psi/ambient_psi)
// The ratio between Compressed air pressure with ambient atmospheric pressure
label boost_cfm((ve_value/100) * rpm_v * boost_ratio * (engine_cc / 1000) / 2000)
// Calculates the additional amount of airflow generated in Cubic Feet per meter (CFM)
// (Volumetric efficientcy x Redline x Boost Ratio x (Displacements / 1000) / 2000)
label cfm_value((stock_cfm + boost_cfm))
// Total amount of airflow get into the engine
//.......
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node turbulence_to_flame_speed_ratio {
alias output __out:
function(5.0)
.add_sample(0.0, 1.0 * 3.0)
.add_sample(5.0, 1.0 * 1.5 * 5.0)
.add_sample(10.0, 1.0 * 1.5 * 10.0)
.add_sample(15.0, 1.1 * 1.5 * 15.0)
.add_sample(20.0, 1.25 * 1.5 * 20.0)
.add_sample(25.0, 1.25 * 1.5 * 25.0)
.add_sample(30.0, 1.25 * 1.5 * 30.0)
.add_sample(35.0, 1.25 * 1.5 * 35.0)
.add_sample(40.0, 1.25 * 1.5 * 40.0)
.add_sample(45.0, 1.25 * 1.5 * 45.0)
.add_sample(50.0, 1.55 * 1.5 * 50.0)
.add_sample(55.0, 1.55 * 1.5 * 55.0)
.add_sample(60.0, 1.55 * 1.5 * 60.0)
.add_sample(65.0, 1.55 * 1.5 * 65.0);
}
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
}
public node cbr1100xx_distributor {
input wires;
input timing_curve;
input rev_limit;
alias output __out:
ignition_module(timing_curve: timing_curve, rev_limit: rev_limit, limiter_duration: 0.08 * units.sec)
.connect_wire(wires.wire1, (0.0 / 4.0) * cycle)
.connect_wire(wires.wire2, (1.0 / 4.0) * cycle)
.connect_wire(wires.wire4, (2.0 / 4.0) * cycle)
.connect_wire(wires.wire3, (3.0 / 4.0) * cycle);
}
public node cbr1100xx_intake_lobe_profile {
alias output __out:
harmonic_cam_lobe(
duration_at_50_thou: cam_duration,
lift: intake_cam_lift,
steps: 256
);
}
public node cbr1100xx_exhaust_lobe_profile {
alias output __out:
harmonic_cam_lobe(
duration_at_50_thou: cam_duration,
lift: exhaust_cam_lift,
steps: 256
);
}
public node cbr1100xx_camshaft_builder {
input lobe_profile: cbr1100xx_intake_lobe_profile();
input ex_lobe_profile: cbr1100xx_exhaust_lobe_profile();
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: ex_lobe_profile;
input lobe_separation: lobe_separation_angle;
input intake_lobe_center: lobe_separation_angle;
input exhaust_lobe_center: lobe_separation_angle;
input advance: advances;
input base_radius: cam_base_radius;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
camshaft_parameters params(
advance: advance,
base_radius: base_radius
)
camshaft _intake_cam_0(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_0(params, lobe_profile: exhaust_lobe_profile)
label rot(90 * units.deg)
label rot360(360 * units.deg)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (1.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (3.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (2.0 / 4) * cycle)
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (1.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (3.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (2.0 / 4) * cycle)
}
private node add_flow_sample {
input lift;
input flow;
input this;
alias output __out: this;
this.add_sample(lift * units.thou, k_28inH2O(flow))
}
label intake_runner_volume_cc(149.0 * units.cc)
public node cbr1100xx_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: chamber_cc;
input intake_runner_volume: intake_runner_volume_cc;
input intake_runner_cross_section_area: 10.0 * units.cm2 * 2.0;
input exhaust_runner_volume: intake_runner_volume * 2;
input exhaust_runner_cross_section_area: 15.0 * units.cm2 * 2.0;
input flow_attenuation: 1.0;
input lift_scale: 1.0;
input flip_display: false;
alias output __out: head;
function intake_flow(50 * units.thou)
intake_flow
.add_flow_sample(0 * lift_scale, 0 * flow_attenuation)
.add_flow_sample(50 * lift_scale, 58 * flow_attenuation)
.add_flow_sample(100 * lift_scale, 103 * flow_attenuation)
.add_flow_sample(150 * lift_scale, 156 * flow_attenuation)
.add_flow_sample(200 * lift_scale, 214 * flow_attenuation)
.add_flow_sample(250 * lift_scale, 249 * flow_attenuation)
.add_flow_sample(300 * lift_scale, 268 * flow_attenuation)
.add_flow_sample(350 * lift_scale, 280 * flow_attenuation)
.add_flow_sample(400 * lift_scale, 280 * flow_attenuation)
.add_flow_sample(450 * lift_scale, 281 * flow_attenuation)
.add_flow_sample(500 * lift_scale, 301 * flow_attenuation)
function exhaust_flow(50 * units.thou)
exhaust_flow
.add_flow_sample(0 * lift_scale, 0 * flow_attenuation)
.add_flow_sample(50 * lift_scale, 37 * flow_attenuation)
.add_flow_sample(100 * lift_scale, 72 * flow_attenuation)
.add_flow_sample(150 * lift_scale, 113 * flow_attenuation)
.add_flow_sample(200 * lift_scale, 160 * flow_attenuation)
.add_flow_sample(250 * lift_scale, 196 * flow_attenuation)
.add_flow_sample(300 * lift_scale, 222 * flow_attenuation)
.add_flow_sample(350 * lift_scale, 235 * flow_attenuation)
.add_flow_sample(400 * lift_scale, 245 * flow_attenuation)
.add_flow_sample(450 * lift_scale, 246 * flow_attenuation)
.add_flow_sample(500 * lift_scale, 251 * flow_attenuation)
generic_cylinder_head head(
chamber_volume: chamber_volume,
intake_runner_volume: intake_runner_volume,
intake_runner_cross_section_area: intake_runner_cross_section_area,
exhaust_runner_volume: exhaust_runner_volume,
exhaust_runner_cross_section_area: exhaust_runner_cross_section_area,
intake_port_flow: intake_flow,
exhaust_port_flow: exhaust_flow,
valvetrain: standard_valvetrain(
intake_camshaft: intake_camshaft,
exhaust_camshaft: exhaust_camshaft
),
flip_display: flip_display
)
}
label hf_gain(0.012)
label lf_noise(1.0)
label hf_noise(0.025)
label simulation_frequency(15000)
public node cbr1100xx {
alias output __out: engine;
engine engine(
name: "Honda CBR1100XX",
starter_torque: 100 * units.lb_ft,
starter_speed: 2500 * units.rpm,
redline: redline * units.rpm,
fuel: fuel(
max_turbulence_effect: 1.0,
max_dilution_effect: 100.0,
burning_efficiency_randomness: 0.1,
turbulence_to_flame_speed_ratio: turbulence_to_flame_speed_ratio(),
max_burning_efficiency: cfm_value * 0.05
),
throttle_gamma: 1.0,
hf_gain: hf_gain,
noise: lf_noise,
jitter: hf_noise,
simulation_frequency: simulation_frequency
)
wires wires()
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke)
)
label flywheel_moment(
disk_moment_of_inertia(mass: flywheel_mass, radius: flywheel_radius)
)
label other_moment( // Moment from cams, pulleys, etc [estimated]
disk_moment_of_inertia(mass: 1.0 * units.kg, radius: 1.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 0.01 * units.Nm,
moment_of_inertia:
(crank_moment + flywheel_moment + other_moment),
position_x: 0.0,
position_y: 0.0,
tdc: 90 * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: 180.0 * units.deg)
rod_journal rj2(angle: 180.0 * units.deg)
rod_journal rj3(angle: 0.0 * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
.add_rod_journal(rj3)
piston_parameters piston_params(
mass: piston_mass,
compression_height: (compression_height * units.mm),
wrist_pin_position: 0.0,
displacement: 0.0 * units.cc
)
connecting_rod_parameters cr_params(
mass: rod_mass,
moment_of_inertia: rod_moment_of_inertia(
mass: rod_mass,
length: rod_length
),
center_of_mass: 0.0,
length: rod_length
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: (stroke / 2 + rod_length + (compression_height * units.mm))
)
intake intake(
plenum_volume: 1.4 * units.L,
plenum_cross_section_area: 16.0 * units.cm2,
intake_flow_rate: k_carb(cfm_value),
runner_flow_rate: k_carb(cfm_value),
runner_length: 18.00 * units.cm,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: idle_throttle_plate_position,
molecular_afr: airfuel_ratio,
velocity_decay: 1.0,
throttle_gamma: 1.0
)
label exhaust_count(1.0)
label outlet_flow_rate(((cfm_value) * 100 / exhaust_count))
label primary_flow_rate((outlet_flow_rate))
exhaust_system_parameters es_params0(
outlet_flow_rate: k_carb(outlet_flow_rate),
primary_tube_length: (600 * units.mm),
primary_flow_rate: k_carb(primary_flow_rate),
velocity_decay: 0.5, //0.5
volume: 100.0 * units.L
)
exhaust_system exhaust0(
es_params0,
audio_volume: 2.0 * 0.1,
length: 100 * units.inch,
impulse_response: ir_lib.minimal_muffling_03
)
label spacing(5 * units.inch)
cylinder_bank b0(bank_params, angle: 0.0 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.0)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1,
sound_attenuation: 0.95,
primary_length: 10 * units.cm
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.0)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire2,
sound_attenuation: 0.97,
primary_length: 10 * units.cm
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.0)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 0.94,
primary_length: 10 * units.cm
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.0)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire4,
sound_attenuation: 0.92,
primary_length: 10 * units.cm
)
.set_cylinder_head(
cbr1100xx_head(
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0,
flip_display: false,
flow_attenuation: 1.0)
)
engine.add_cylinder_bank(b0)
engine.add_crankshaft(c0)
cbr1100xx_camshaft_builder camshaft(
lobe_profile: cbr1100xx_intake_lobe_profile(),
ex_lobe_profile: cbr1100xx_exhaust_lobe_profile()
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0 * units.rpm, 0 * units.deg)
.add_sample(1000 * units.rpm, 14 * units.deg)
.add_sample(2000 * units.rpm, 22 * units.deg)
.add_sample(3000 * units.rpm, 26 * units.deg)
.add_sample(4000 * units.rpm, 33 * units.deg)
.add_sample(5000 * units.rpm, 34 * units.deg)
.add_sample(6000 * units.rpm, 35 * units.deg)
.add_sample(7000 * units.rpm, 36 * units.deg)
.add_sample(8000 * units.rpm, 40 * units.deg)
.add_sample(9000 * units.rpm, 45 * units.deg)
.add_sample(10000 * units.rpm, 50 * units.deg)
.add_sample(11000 * units.rpm, 55 * units.deg)
.add_sample(12000 * units.rpm, 60 * units.deg)
engine.add_ignition_module(
cbr1100xx_distributor(
wires: wires,
timing_curve: timing_curve,
rev_limit: rpm_v * units.rpm
)
)
}
label diff_ratio(4.8)
public node cbr1100xx_vehicle {
alias output __out: vehicle;
input tire_size: ((tyre_width * tyre_aspect_ratio / 2540.0 * 2.0) + rim_size) * 2.54;
input tyre_radius: tire_size/2.0 * units.cm;
vehicle vehicle(
mass: vehicle_mass,
drag_coefficient: vehicle_height / vehicle_mass * 0.8,
cross_sectional_area: vehicle_lenght * vehicle_width,
diff_ratio: diff_ratio,
tire_radius: tyre_radius,
rolling_resistance: 0.015 * vehicle_mass * 9.81
)
}
public node cbr1100xx_transmission {
alias output __out: trans;
transmission trans(
max_clutch_torque: 500 * units.lb_ft
)
trans
.add_gear(2.375)
.add_gear(1.647)
.add_gear(1.285)
.add_gear(1.066)
.add_gear(0.936)
.add_gear(0.851)
}
public node main {
set_engine(cbr1100xx())
set_transmission(cbr1100xx_transmission())
set_vehicle(cbr1100xx_vehicle())
}
main()