Skip to content

1.6 SDI or... TDI #457

@pablos1rvent

Description

@pablos1rvent

Just got the 1.6 TDI or SDI but I can accelerate... only remains on hold but it's going well...

This is my approach

I think 2 of 4 cylinders are not working...

2025-06-22.02-36-38.mp4
import "engine_sim.mr"

units units()
constants constants()
impulse_response_library ir_lib()

label cycle(2 * 360 * units.deg)

public node tdi_distributor {
    input wires;
    input timing_curve;
    input rev_limit: 4800 * units.rpm;
    alias output __out:
        ignition_module(timing_curve: timing_curve, rev_limit: rev_limit)
            .connect_wire(wires.wire1, (0.0/4.0) * cycle)
            .connect_wire(wires.wire3, (2.0/4.0) * cycle)
            .connect_wire(wires.wire4, (3.0/4.0) * cycle)
            .connect_wire(wires.wire2, (1.0/4.0) * cycle);
}

private node wires {
    output wire1: ignition_wire();
    output wire2: ignition_wire();
    output wire3: ignition_wire();
    output wire4: ignition_wire();
}

private node add_flow_sample {
    input lift;
    input flow;
    input this;
    alias output __out: this;

    this.add_sample(lift * units.mm, k_28inH2O(flow))
}

public node tdi_16_lobe_profile_int {
    alias output __out:
        harmonic_cam_lobe(
            duration_at_50_thou: 200 * units.deg,
            gamma: 1.5,
            lift: 8.0 * units.mm,
            steps: 100
        );
}

public node tdi_16_lobe_profile_exh {
    alias output __out:
        harmonic_cam_lobe(
            duration_at_50_thou: 190 * units.deg,
            gamma: 1.5,
            lift: 7.5 * units.mm,
            steps: 100
        );
}

public node tdi_camshaft_builder {
    input lobe_profile: tdi_16_lobe_profile_int();
    input ex_lobe_profile: tdi_16_lobe_profile_exh();
    input intake_lobe_profile: lobe_profile;
    input exhaust_lobe_profile: ex_lobe_profile;
    input lobe_separation: 110 * units.deg;
    input intake_lobe_center: lobe_separation;
    input exhaust_lobe_center: lobe_separation;
    input advance: 0 * units.deg;
    input base_radius: 0.75 * units.inch;

    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 rot90(90 * units.deg)
    label rot180(180 * units.deg)
    label rot360(360 * units.deg)

    // firing order: 1-3-4-2
    _intake_cam_0
        .add_lobe(rot360 + intake_lobe_center + (0.0 / 4.0) * cycle)
        .add_lobe(rot360 + intake_lobe_center + (2.0 / 4.0) * cycle)
        .add_lobe(rot360 + intake_lobe_center + (3.0 / 4.0) * cycle)
        .add_lobe(rot360 + intake_lobe_center + (1.0 / 4.0) * cycle)

    _exhaust_cam_0
        .add_lobe(rot360 - exhaust_lobe_center + (0.0 / 4.0) * cycle)
        .add_lobe(rot360 - exhaust_lobe_center + (2.0 / 4.0) * cycle)
        .add_lobe(rot360 - exhaust_lobe_center + (3.0 / 4.0) * cycle)
        .add_lobe(rot360 - exhaust_lobe_center + (1.0 / 4.0) * cycle)
}

public node tdi_16_head {
    input intake_camshaft;
    input exhaust_camshaft;
    input chamber_volume: 40.0 * units.cc;
    input flip_display: false;
    
    input flow_attenuation: 1.0;
    input lift_scale: 1.0;
    alias output __out: head;

    function intake_flow(1 * units.mm)
    intake_flow
        .add_flow_sample(0 * lift_scale, 0 * flow_attenuation)
        .add_flow_sample(1 * lift_scale, 45 * flow_attenuation)
        .add_flow_sample(2 * lift_scale, 85 * flow_attenuation)
        .add_flow_sample(3 * lift_scale, 130 * flow_attenuation)
        .add_flow_sample(4 * lift_scale, 180 * flow_attenuation)
        .add_flow_sample(5 * lift_scale, 205 * flow_attenuation)
        .add_flow_sample(6 * lift_scale, 220 * flow_attenuation)
        .add_flow_sample(7 * lift_scale, 225 * flow_attenuation)
        .add_flow_sample(8 * lift_scale, 230 * flow_attenuation)
        .add_flow_sample(9 * lift_scale, 235 * flow_attenuation)

    function exhaust_flow(1 * units.mm)
    exhaust_flow
        .add_flow_sample(0 * lift_scale, 0 * flow_attenuation)
        .add_flow_sample(1 * lift_scale, 35 * flow_attenuation)
        .add_flow_sample(2 * lift_scale, 70 * flow_attenuation)
        .add_flow_sample(3 * lift_scale, 100 * flow_attenuation)
        .add_flow_sample(4 * lift_scale, 130 * flow_attenuation)
        .add_flow_sample(5 * lift_scale, 150 * flow_attenuation)
        .add_flow_sample(6 * lift_scale, 160 * flow_attenuation)
        .add_flow_sample(7 * lift_scale, 165 * flow_attenuation)
        .add_flow_sample(8 * lift_scale, 170 * flow_attenuation)
        .add_flow_sample(9 * lift_scale, 175 * flow_attenuation)

    cylinder_head head(
        chamber_volume: chamber_volume,
        intake_runner_volume: 149.6 * units.cc,
        intake_runner_cross_section_area: 2.0 * units.inch * 2.0 * units.inch,
        exhaust_runner_volume: 50.0 * units.cc,
        exhaust_runner_cross_section_area: 1.5 * units.inch * 1.5 * units.inch,

        intake_port_flow: intake_flow,
        exhaust_port_flow: exhaust_flow,
        intake_camshaft: intake_camshaft,
        exhaust_camshaft: exhaust_camshaft,
        flip_display: flip_display
    )
}

public node audi_16_tdi {
    alias output __out: engine;

    wires wires()

    engine engine(
        name: "Audi 1.6 TDI",
        starter_torque: 150 * units.lb_ft,
        starter_speed: 500 * units.rpm,
        redline: 4500 * units.rpm,
        fuel: fuel(
            max_turbulence_effect: 6.0,
            burning_efficiency_randomness: 0.2,
            max_burning_efficiency: 0.95
        ),
        throttle_gamma: 1.0,
        simulation_frequency: 6000,
        hf_gain: 0.005,
        noise: 1.0,
        jitter: 0.5
    )

    crankshaft c0(
        throw: 79.5 * units.mm / 2,
        flywheel_mass: 8.0 * units.kg,
        mass: 5.0 * units.kg,
        friction_torque: 10.0 * units.lb_ft,
        moment_of_inertia: 0.22986844776863666 * 0.9,
        position_x: 0.0,
        position_y: 0.0,
        tdc: 90 * units.deg
    )

    rod_journal rj0(angle: 0.0)
    rod_journal rj1(angle: 180 * units.deg)
    rod_journal rj2(angle: 180 * units.deg)
    rod_journal rj3(angle: 0.0)

    c0
        .add_rod_journal(rj0)
        .add_rod_journal(rj1)
        .add_rod_journal(rj2)
        .add_rod_journal(rj3)

    piston_parameters piston_params(
        mass: 400 * units.g,
        compression_height: 37.3 * units.mm,
        wrist_pin_position: 0.0,
        displacement: 0.0
    )

    connecting_rod_parameters cr_params(
        mass: 500 * units.g,
        moment_of_inertia: rod_moment_of_inertia(
            mass: 500 * units.g,
            length: 144 * units.mm
        ),
        center_of_mass: 0.0,
        length: 144 * units.mm
    )

    cylinder_bank_parameters bank_params(
        bore: 79.5 * units.mm,
        deck_height: (79.5/2 + 144 + 37.3) * units.mm
    )

    intake intake(
        plenum_volume: 1.0 * units.L,
        plenum_cross_section_area: 50.0 * units.cm2,
        intake_flow_rate: k_carb(500.0),
        runner_flow_rate: k_carb(400.0),
        runner_length: 8.0 * units.inch,
        idle_flow_rate: k_carb(0.0),
        idle_throttle_plate_position: 0.995,
        velocity_decay: 0.5
    )

    exhaust_system_parameters es_params(
        outlet_flow_rate: k_carb(600.0),
        primary_tube_length: 12.0 * units.inch,
        primary_flow_rate: k_carb(400.0),
        velocity_decay: 1.0,
        volume: 50.0 * units.L
    )

    exhaust_system exhaust0(es_params, audio_volume: 1.0, impulse_response: ir_lib.default_0)
    exhaust_system exhaust1(es_params, audio_volume: 0.8, impulse_response: ir_lib.default_0)

    cylinder_bank b0(bank_params, angle: 0 * units.deg)
    b0
        .add_cylinder(
            piston: piston(piston_params, blowby: k_28inH2O(0.1)),
            connecting_rod: connecting_rod(cr_params),
            rod_journal: rj0,
            intake: intake,
            exhaust_system: exhaust0,
            ignition_wire: wires.wire1,
            sound_attenuation: 1.0
        )
        .add_cylinder(
            piston: piston(piston_params, blowby: k_28inH2O(0.1)),
            connecting_rod: connecting_rod(cr_params),
            rod_journal: rj1,
            intake: intake,
            exhaust_system: exhaust1,
            ignition_wire: wires.wire2,
            sound_attenuation: 1.0
        )
        .add_cylinder(
            piston: piston(piston_params, blowby: k_28inH2O(0.1)),
            connecting_rod: connecting_rod(cr_params),
            rod_journal: rj2,
            intake: intake,
            exhaust_system: exhaust0,
            ignition_wire: wires.wire3,
            sound_attenuation: 1.0
        )
        .add_cylinder(
            piston: piston(piston_params, blowby: k_28inH2O(0.1)),
            connecting_rod: connecting_rod(cr_params),
            rod_journal: rj3,
            intake: intake,
            exhaust_system: exhaust1,
            ignition_wire: wires.wire4,
            sound_attenuation: 1.0
        )

    engine.add_cylinder_bank(b0)
    engine.add_crankshaft(c0)

    tdi_camshaft_builder camshaft(
        lobe_profile: tdi_16_lobe_profile_int(),
        ex_lobe_profile: tdi_16_lobe_profile_exh()
    )

    b0.set_cylinder_head(
        tdi_16_head(
            intake_camshaft: camshaft.intake_cam_0,
            exhaust_camshaft: camshaft.exhaust_cam_0
        )
    )

    function timing_curve(1000 * units.rpm)
    timing_curve
		.add_sample(0000 * units.rpm, 10 * units.deg)
		.add_sample(1000 * units.rpm, 14 * units.deg)
		.add_sample(2000 * units.rpm, 18 * units.deg)
		.add_sample(3000 * units.rpm, 20 * units.deg)
		.add_sample(4000 * units.rpm, 22 * units.deg)

    engine.add_ignition_module(
        tdi_distributor(
            wires: wires,
            timing_curve: timing_curve,
            rev_limit: 4800 * units.rpm
        ))
}

private node audi_tdi_vehicle {
    alias output __out:
        vehicle(
            mass: 1500 * units.kg,
            drag_coefficient: 0.3,
            cross_sectional_area: (70 * units.inch) * (55 * units.inch),
            diff_ratio: 3.45,
            tire_radius: 10 * units.inch,
            rolling_resistance: 400 * units.N
        );
}

private node audi_tdi_transmission {
    alias output __out:
        transmission(
            max_clutch_torque: 400 * units.lb_ft
        )
        .add_gear(3.77)
        .add_gear(2.09)
        .add_gear(1.32)
        .add_gear(0.92)
        .add_gear(0.71);
}

public node main {
    set_engine(audi_16_tdi())
    set_vehicle(audi_tdi_vehicle())
    set_transmission(audi_tdi_transmission())
}

main() 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions