Showing preview only (1,039K chars total). Download the full file or copy to clipboard to get everything.
Repository: ange-yaghi/engine-sim
Branch: master
Commit: 85f7c3b959a9
Files: 273
Total size: 971.4 KB
Directory structure:
gitextract_1h23g_5j/
├── .github/
│ └── workflows/
│ └── cmake.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── art/
│ └── assets.blend
├── assets/
│ ├── assets.dia
│ ├── assets.ysce
│ ├── engines/
│ │ ├── atg-video-1/
│ │ │ ├── 01_honda_trx520.mr
│ │ │ ├── 02_kohler_ch750.mr
│ │ │ ├── 03_harley_davidson_shovelhead.mr
│ │ │ ├── 04_hayabusa.mr
│ │ │ ├── 05_honda_vtec.mr
│ │ │ ├── 06_subaru_ej25.mr
│ │ │ ├── 07_audi_i5.mr
│ │ │ ├── 08_radial_5.mr
│ │ │ ├── README.md
│ │ │ └── radial.mr
│ │ ├── atg-video-2/
│ │ │ ├── 01_subaru_ej25_eh.mr
│ │ │ ├── 02_subaru_ej25_uh.mr
│ │ │ ├── 03_2jz.mr
│ │ │ ├── 04_60_degree_v6.mr
│ │ │ ├── 05_odd_fire_v6.mr
│ │ │ ├── 06_even_fire_v6.mr
│ │ │ ├── 07_gm_ls.mr
│ │ │ ├── 08_ferrari_f136_v8.mr
│ │ │ ├── 09_radial_9.mr
│ │ │ ├── 10_lfa_v10.mr
│ │ │ ├── 11_merlin_v12.mr
│ │ │ ├── 12_ferrari_412_t2.mr
│ │ │ ├── README.md
│ │ │ └── radial.mr
│ │ ├── audi/
│ │ │ └── i5.mr
│ │ ├── bmw/
│ │ │ └── M52B28.mr
│ │ ├── chevrolet/
│ │ │ ├── chev_truck_454.mr
│ │ │ └── engine_03_for_e1.mr
│ │ └── kohler/
│ │ └── kohler_ch750.mr
│ ├── main.mr
│ ├── part-library/
│ │ ├── part_library.mr
│ │ └── parts/
│ │ ├── cam_lobes.mr
│ │ ├── camshafts.mr
│ │ ├── heads.mr
│ │ ├── ignition_modules.mr
│ │ └── intakes.mr
│ └── themes/
│ ├── amateur.mr
│ ├── bubble_gum.mr
│ ├── default.mr
│ ├── minimalistic.mr
│ ├── night_vision.mr
│ └── paper.mr
├── configuration/
│ └── delta.conf
├── dependencies/
│ ├── CMakeLists.txt
│ ├── discord/
│ │ ├── CMakeLists.txt
│ │ ├── Discord.cpp
│ │ ├── Discord.h
│ │ ├── LICENSE
│ │ ├── discord_register.h
│ │ ├── discord_rpc.h
│ │ └── lib/
│ │ └── discord-rpc.lib
│ └── submodules/
│ └── CMakeLists.txt
├── es/
│ ├── actions/
│ │ └── actions.mr
│ ├── constants/
│ │ ├── constants.mr
│ │ └── units.mr
│ ├── engine_sim.mr
│ ├── infrastructure/
│ │ └── infrastructure.mr
│ ├── objects/
│ │ └── objects.mr
│ ├── part-library/
│ │ ├── part_library.mr
│ │ └── parts/
│ │ ├── cam_lobes.mr
│ │ ├── camshafts.mr
│ │ ├── heads.mr
│ │ ├── ignition_modules.mr
│ │ └── intakes.mr
│ ├── settings/
│ │ └── application_settings.mr
│ ├── sound-library/
│ │ └── impulse_responses.mr
│ ├── types/
│ │ ├── atomic_types.mr
│ │ ├── conversions.mr
│ │ └── operations.mr
│ └── utilities/
│ └── utilities.mr
├── include/
│ ├── adaptive_volume_filter.h
│ ├── afr_cluster.h
│ ├── application_settings.h
│ ├── audio_buffer.h
│ ├── butterworth_low_pass_filter.h
│ ├── camshaft.h
│ ├── combustion_chamber.h
│ ├── combustion_chamber_object.h
│ ├── connecting_rod.h
│ ├── connecting_rod_object.h
│ ├── constants.h
│ ├── convolution_filter.h
│ ├── crankshaft.h
│ ├── crankshaft_object.h
│ ├── csv_io.h
│ ├── cylinder_bank.h
│ ├── cylinder_bank_object.h
│ ├── cylinder_head.h
│ ├── cylinder_head_object.h
│ ├── cylinder_pressure_gauge.h
│ ├── cylinder_temperature_gauge.h
│ ├── delay_filter.h
│ ├── delta.h
│ ├── derivative_filter.h
│ ├── direct_throttle_linkage.h
│ ├── dtv.h
│ ├── dynamometer.h
│ ├── engine.h
│ ├── engine_sim_application.h
│ ├── engine_view.h
│ ├── exhaust_system.h
│ ├── feedback_comb_filter.h
│ ├── filter.h
│ ├── firing_order_display.h
│ ├── fuel.h
│ ├── fuel_cluster.h
│ ├── function.h
│ ├── gas_system.h
│ ├── gauge.h
│ ├── gaussian_filter.h
│ ├── geometry_generator.h
│ ├── governor.h
│ ├── ignition_module.h
│ ├── impulse_response.h
│ ├── info_cluster.h
│ ├── intake.h
│ ├── jitter_filter.h
│ ├── labeled_gauge.h
│ ├── leveling_filter.h
│ ├── load_simulation_cluster.h
│ ├── low_pass_filter.h
│ ├── mixer_cluster.h
│ ├── oscilloscope.h
│ ├── oscilloscope_cluster.h
│ ├── part.h
│ ├── performance_cluster.h
│ ├── piston.h
│ ├── piston_engine_simulator.h
│ ├── piston_object.h
│ ├── preemphasis_filter.h
│ ├── right_gauge_cluster.h
│ ├── ring_buffer.h
│ ├── scs.h
│ ├── shaders.h
│ ├── simulation_object.h
│ ├── simulator.h
│ ├── standard_valvetrain.h
│ ├── starter_motor.h
│ ├── synthesizer.h
│ ├── throttle.h
│ ├── throttle_display.h
│ ├── transmission.h
│ ├── ui_button.h
│ ├── ui_element.h
│ ├── ui_manager.h
│ ├── ui_math.h
│ ├── ui_utilities.h
│ ├── units.h
│ ├── utilities.h
│ ├── valvetrain.h
│ ├── vehicle.h
│ ├── vehicle_drag_constraint.h
│ └── vtec_valvetrain.h
├── scripting/
│ ├── include/
│ │ ├── actions.h
│ │ ├── camshaft_node.h
│ │ ├── channel_types.h
│ │ ├── compiler.h
│ │ ├── connecting_rod_node.h
│ │ ├── crankshaft_node.h
│ │ ├── cylinder_bank_node.h
│ │ ├── cylinder_head_node.h
│ │ ├── engine_context.h
│ │ ├── engine_node.h
│ │ ├── engine_sim.h
│ │ ├── exhaust_system_node.h
│ │ ├── fuel_node.h
│ │ ├── function_node.h
│ │ ├── ignition_module_node.h
│ │ ├── ignition_wire_node.h
│ │ ├── impulse_response_node.h
│ │ ├── intake_node.h
│ │ ├── language_rules.h
│ │ ├── node.h
│ │ ├── object_reference_node.h
│ │ ├── object_reference_node_output.h
│ │ ├── piranha.h
│ │ ├── piston_node.h
│ │ ├── rod_journal_node.h
│ │ ├── standard_valvetrain_node.h
│ │ ├── throttle_nodes.h
│ │ ├── transmission_node.h
│ │ ├── valvetrain_node.h
│ │ ├── vehicle_node.h
│ │ └── vtec_valvetrain_node.h
│ └── src/
│ ├── channel_types.cpp
│ ├── compiler.cpp
│ ├── engine_context.cpp
│ └── language_rules.cpp
├── src/
│ ├── afr_cluster.cpp
│ ├── audio_buffer.cpp
│ ├── camshaft.cpp
│ ├── combustion_chamber.cpp
│ ├── combustion_chamber_object.cpp
│ ├── connecting_rod.cpp
│ ├── connecting_rod_object.cpp
│ ├── convolution_filter.cpp
│ ├── crankshaft.cpp
│ ├── crankshaft_object.cpp
│ ├── cylinder_bank.cpp
│ ├── cylinder_bank_object.cpp
│ ├── cylinder_head.cpp
│ ├── cylinder_head_object.cpp
│ ├── cylinder_pressure_gauge.cpp
│ ├── cylinder_temperature_gauge.cpp
│ ├── delay_filter.cpp
│ ├── derivative_filter.cpp
│ ├── direct_throttle_linkage.cpp
│ ├── dynamometer.cpp
│ ├── engine.cpp
│ ├── engine_sim_application.cpp
│ ├── engine_view.cpp
│ ├── exhaust_system.cpp
│ ├── feedback_comb_filter.cpp
│ ├── filter.cpp
│ ├── firing_order_display.cpp
│ ├── fuel.cpp
│ ├── fuel_cluster.cpp
│ ├── function.cpp
│ ├── gas_system.cpp
│ ├── gauge.cpp
│ ├── gaussian_filter.cpp
│ ├── geometry_generator.cpp
│ ├── governor.cpp
│ ├── ignition_module.cpp
│ ├── impulse_response.cpp
│ ├── info_cluster.cpp
│ ├── intake.cpp
│ ├── jitter_filter.cpp
│ ├── labeled_gauge.cpp
│ ├── leveling_filter.cpp
│ ├── load_simulation_cluster.cpp
│ ├── low_pass_filter.cpp
│ ├── main.cpp
│ ├── mixer_cluster.cpp
│ ├── oscilloscope.cpp
│ ├── oscilloscope_cluster.cpp
│ ├── part.cpp
│ ├── performance_cluster.cpp
│ ├── piston.cpp
│ ├── piston_engine_simulator.cpp
│ ├── piston_object.cpp
│ ├── right_gauge_cluster.cpp
│ ├── shaders.cpp
│ ├── simulation_object.cpp
│ ├── simulator.cpp
│ ├── standard_valvetrain.cpp
│ ├── starter_motor.cpp
│ ├── synthesizer.cpp
│ ├── throttle.cpp
│ ├── throttle_display.cpp
│ ├── transmission.cpp
│ ├── ui_button.cpp
│ ├── ui_element.cpp
│ ├── ui_manager.cpp
│ ├── ui_math.cpp
│ ├── ui_utilities.cpp
│ ├── utilities.cpp
│ ├── valvetrain.cpp
│ ├── vehicle.cpp
│ ├── vehicle_drag_constraint.cpp
│ └── vtec_valvetrain.cpp
└── test/
├── function_test.cpp
├── gas_system_tests.cpp
└── synthesizer_tests.cpp
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/cmake.yml
================================================
name: CMake
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
BUILD_TYPE: Release
jobs:
build:
# The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac.
# You can convert this to a matrix build if you need cross-platform coverage.
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
runs-on: windows-latest
env:
# Set your boost version
BOOST_VERSION: 1.78.0
# Set you boost path to the default one (I don't know if you can use variables here)
BOOST_PATH: ${{github.workspace}}/boost/
steps:
- uses: actions/checkout@v3
- name: Checkout submodules
run: git submodule update --init --recursive
# Retrieve the cache, uses cache@v2
- name: Cache boost
uses: actions/cache@v2
id: cache-boost
with:
# Set the path to cache
path: ${{env.BOOST_PATH}}
# Use the version as the key to only cache the correct version
key: boost-${{env.BOOST_VERSION}}
# Actual install step (only runs if the cache is empty)
- name: Install boost
if: steps.cache-boost.outputs.cache-hit != 'true'
uses: MarkusJx/install-boost@v2.3.0
with:
# Set the boost version (required)
boost_version: ${{env.BOOST_VERSION}}
# Set the install directory
boost_install_dir: ${{env.BOOST_PATH}}
# Set your platform version
platform_version: 2022
# Set the toolset
toolset: msvc
- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
env:
BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }}
- name: Build
# Build your program with the given configuration
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
================================================
FILE: .gitignore
================================================
# Ignore user's workspace
workspace/
# Build directory
build/
# clangd cache and code completion files
.cache
compile_commands.json
# Blender temporary files
*.blend1
================================================
FILE: .gitmodules
================================================
[submodule "dependencies/submodules/delta-studio"]
path = dependencies/submodules/delta-studio
url = https://github.com/ange-yaghi/delta-studio
[submodule "dependencies/submodules/simple-2d-constraint-solver"]
path = dependencies/submodules/simple-2d-constraint-solver
url = https://github.com/ange-yaghi/simple-2d-constraint-solver
[submodule "dependencies/submodules/direct-to-video"]
path = dependencies/submodules/direct-to-video
url = https://github.com/ange-yaghi/direct-to-video
[submodule "dependencies/submodules/csv-io"]
path = dependencies/submodules/csv-io
url = https://github.com/ange-yaghi/csv-io
[submodule "dependencies/submodules/piranha"]
path = dependencies/submodules/piranha
url = https://github.com/ange-yaghi/piranha.git
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.10)
option(DTV "Enable video output" OFF)
option(PIRANHA_ENABLED "Enable scripting input" ON)
option(DISCORD_ENABLED "Enable Discord Rich Presence" ON)
if (DTV)
add_compile_definitions(ATG_ENGINE_SIM_VIDEO_CAPTURE)
endif (DTV)
if (PIRANHA_ENABLED)
add_compile_definitions(ATG_ENGINE_SIM_PIRANHA_ENABLED)
endif (PIRANHA_ENABLED)
if (DISCORD_ENABLED)
add_compile_definitions(ATG_ENGINE_SIM_DISCORD_ENABLED)
endif (DISCORD_ENABLED)
# Enable group projects in folders
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "cmake")
project(engine-sim)
set(CMAKE_CXX_STANDARD 17)
# ========================================================
# GTEST
include(FetchContent)
FetchContent_Declare(
googletest
URL
https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
set_property(TARGET gmock PROPERTY FOLDER "gtest")
set_property(TARGET gmock_main PROPERTY FOLDER "gtest")
set_property(TARGET gtest PROPERTY FOLDER "gtest")
set_property(TARGET gtest_main PROPERTY FOLDER "gtest")
# ========================================================
add_library(engine-sim STATIC
# Source files
src/audio_buffer.cpp
src/camshaft.cpp
src/crankshaft.cpp
src/combustion_chamber.cpp
src/connecting_rod.cpp
src/convolution_filter.cpp
src/cylinder_bank.cpp
src/cylinder_head.cpp
src/delay_filter.cpp
src/derivative_filter.cpp
src/direct_throttle_linkage.cpp
src/dynamometer.cpp
src/engine.cpp
src/exhaust_system.cpp
src/feedback_comb_filter.cpp
src/filter.cpp
src/fuel.cpp
src/function.cpp
src/gas_system.cpp
src/gaussian_filter.cpp
src/governor.cpp
src/ignition_module.cpp
src/impulse_response.cpp
src/intake.cpp
src/jitter_filter.cpp
src/leveling_filter.cpp
src/low_pass_filter.cpp
src/part.cpp
src/piston.cpp
src/piston_engine_simulator.cpp
src/simulator.cpp
src/standard_valvetrain.cpp
src/starter_motor.cpp
src/synthesizer.cpp
src/throttle.cpp
src/transmission.cpp
src/utilities.cpp
src/valvetrain.cpp
src/vehicle.cpp
src/vehicle_drag_constraint.cpp
src/vtec_valvetrain.cpp
# Include files
include/audio_buffer.h
include/application_settings.h
include/camshaft.h
include/crankshaft.h
include/combustion_chamber.h
include/connecting_rod.h
include/convolution_filter.h
include/cylinder_bank.h
include/cylinder_head.h
include/delay_filter.h
include/derivative_filter.h
include/direct_throttle_linkage.h
include/dynamometer.h
include/engine.h
include/exhaust_system.h
include/feedback_comb_filter.h
include/filter.h
include/fuel.h
include/function.h
include/gas_system.h
include/gaussian_filter.h
include/governor.h
include/ignition_module.h
include/impulse_response.h
include/intake.h
include/jitter_filter.h
include/leveling_filter.h
include/low_pass_filter.h
include/part.h
include/piston.h
include/piston_engine_simulator.h
include/simulator.h
include/standard_valvetrain.h
include/starter_motor.h
include/synthesizer.h
include/throttle.h
include/transmission.h
include/units.h
include/utilities.h
include/valvetrain.h
include/vehicle.h
include/vehicle_drag_constraint.h
include/vtec_valvetrain.h
)
target_link_libraries(engine-sim
simple-2d-constraint-solver
csv-io
delta-basic)
target_include_directories(engine-sim
PUBLIC dependencies/submodules)
if (PIRANHA_ENABLED)
add_library(engine-sim-script-interpreter STATIC
# Source files
scripting/src/channel_types.cpp
scripting/src/compiler.cpp
scripting/src/engine_context.cpp
scripting/src/language_rules.cpp
# Include files
scripting/include/actions.h
scripting/include/camshaft_node.h
scripting/include/channel_types.h
scripting/include/compiler.h
scripting/include/connecting_rod_node.h
scripting/include/crankshaft_node.h
scripting/include/cylinder_bank_node.h
scripting/include/cylinder_head_node.h
scripting/include/engine_context.h
scripting/include/engine_node.h
scripting/include/engine_sim.h
scripting/include/exhaust_system_node.h
scripting/include/intake_node.h
scripting/include/function_node.h
scripting/include/ignition_module_node.h
scripting/include/ignition_wire_node.h
scripting/include/impulse_response_node.h
scripting/include/intake_node.h
scripting/include/language_rules.h
scripting/include/node.h
scripting/include/object_reference_node.h
scripting/include/object_reference_node_output.h
scripting/include/piranha.h
scripting/include/piston_node.h
scripting/include/rod_journal_node.h
scripting/include/standard_valvetrain_node.h
scripting/include/transmission_node.h
scripting/include/valvetrain_node.h
scripting/include/vtec_valvetrain_node.h
scripting/include/vehicle_node.h
)
target_include_directories(engine-sim-script-interpreter
PUBLIC dependencies/submodules)
target_link_libraries(engine-sim-script-interpreter
csv-io
piranha)
endif (PIRANHA_ENABLED)
if (DISCORD_ENABLED)
add_library(discord STATIC
# Source files
dependencies/discord/Discord.cpp
# Include files
dependencies/discord/Discord.h
dependencies/discord/discord_register.h
dependencies/discord/discord_rpc.h
)
endif (DISCORD_ENABLED)
add_executable(engine-sim-app WIN32
# Source files
src/main.cpp
src/engine_sim_application.cpp
src/geometry_generator.cpp
src/simulation_object.cpp
src/piston_object.cpp
src/connecting_rod_object.cpp
src/ui_element.cpp
src/ui_manager.cpp
src/cylinder_pressure_gauge.cpp
src/ui_math.cpp
src/gauge.cpp
src/crankshaft_object.cpp
src/cylinder_bank_object.cpp
src/cylinder_head_object.cpp
src/ui_button.cpp
src/ui_utilities.cpp
src/combustion_chamber_object.cpp
src/oscilloscope.cpp
src/shaders.cpp
src/engine_view.cpp
src/right_gauge_cluster.cpp
src/cylinder_temperature_gauge.cpp
src/labeled_gauge.cpp
src/throttle_display.cpp
src/afr_cluster.cpp
src/fuel_cluster.cpp
src/oscilloscope_cluster.cpp
src/performance_cluster.cpp
src/firing_order_display.cpp
src/load_simulation_cluster.cpp
src/mixer_cluster.cpp
src/info_cluster.cpp
# Include files
include/delta.h
include/dtv.h
include/engine_sim_application.h
include/geometry_generator.h
include/simulation_object.h
include/piston_object.h
include/connecting_rod_object.h
include/ui_element.h
include/ui_manager.h
include/cylinder_pressure_gauge.h
include/ui_math.h
include/units.h
include/crankshaft_object.h
include/cylinder_bank_object.h
include/cylinder_head_object.h
include/ui_button.h
include/ui_utilities.h
include/combustion_chamber_object.h
include/oscilloscope.h
include/shaders.h
include/engine_view.h
include/right_gauge_cluster.h
include/cylinder_temperature_gauge.h
include/labeled_gauge.h
include/throttle_display.h
include/afr_cluster.h
include/fuel_cluster.h
include/oscilloscope_cluster.h
include/performance_cluster.h
include/firing_order_display.h
include/load_simulation_cluster.h
include/mixer_cluster.h
include/info_cluster.h
)
target_link_libraries(engine-sim-app
engine-sim
)
if (DTV)
target_link_libraries(engine-sim-app
direct-to-video)
endif (DTV)
if (PIRANHA_ENABLED)
target_link_libraries(engine-sim-app
engine-sim-script-interpreter)
endif (PIRANHA_ENABLED)
if (DISCORD_ENABLED)
add_library(discord-rpc STATIC IMPORTED)
set_property(TARGET discord-rpc PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/dependencies/discord/lib/discord-rpc.lib)
target_link_libraries(engine-sim-app
discord
discord-rpc)
endif (DISCORD_ENABLED)
target_include_directories(engine-sim-app
PUBLIC dependencies/submodules)
add_subdirectory(dependencies)
# GTEST
enable_testing()
add_executable(engine-sim-test
# Source files
test/gas_system_tests.cpp
test/function_test.cpp
test/synthesizer_tests.cpp
)
target_link_libraries(engine-sim-test
gtest_main
engine-sim
)
include(GoogleTest)
gtest_discover_tests(engine-sim-test)
================================================
FILE: LICENSE
================================================
Copyright 2022 AngeTheGreat (Ange Yaghi)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
# Engine Simulator

---
# Engine Simulator has moved!
To get the newest releases of the game, [click here](https://github.com/Engine-Simulator/engine-sim-community-edition).
---
## What is this?
This is a real-time internal combustion engine simulation **designed specifically to produce engine audio and simulate engine response characteristics.** It is NOT a scientific tool and cannot be expected to provide accurate figures for the purposes of engineering or engine tuning.
## How do I install it?
This is a code repository and might not look like other software that you're used to downloading and installing (if you're not familiar with programming). To download a ready-to-use version of the application, navigate to the [releases page](https://github.com/ange-yaghi/engine-sim/releases), find the most recent release (ex. `v0.1.5a`), click "Assets" and download the .zip file with a name that starts with `engine-sim-build`. Unzip this file, then run `bin/engine-sim-app.exe`. The simulator should then start normally.
Check out [our Frequently Asked Questions](https://github.com/ange-yaghi/engine-sim/wiki/Frequently-Asked-Questions) if you need more details.
## How do I use it?
The UI is extremely minimalistic and there are only a few controls used to interact with the engine:
| Key/Input | Action |
| :---: | :---: |
| A | Toggle ignition |
| S | Hold for starter |
| D | Enable dyno |
| H | Enable RPM hold (see below for instructions) |
| G + Scroll | Change hold speed |
| F | Enter fullscreen mode |
| I | Display dyno stats in the information panel |
| Shift | Clutch (hold spacebar at the same time to slowly engage/disengage) |
| Up Arrow | Up Gear |
| Down Arrow | Down Gear |
| Z + Scroll | Volume |
| X + Scroll | Convolution Level |
| C + Scroll | High frequency gain |
| V + Scroll | Low frequency noise |
| B + Scroll | High frequency noise |
| N + Scroll | Simulation frequency |
| M | Increase view layer |
| , | Decrease view layer |
| Enter | Reload engine script |
| Escape | Exit the program |
| Q, W, E, R | Change throttle position |
| Space + Scroll | Fine throttle adjustment |
| 1, 2, 3, 4, 5 | Simulation time warp |
| Tab | Change screen |
### Using the RPM hold
The RPM hold feature will hold the engine at a specific RPM and also measure the engine's horsepower and torque at that RPM. You can enable RPM hold by pressing the `H` key. **You must then enable the dynomometer** (press the `D` key) in order for the RPM hold to take effect. To change the hold speed, hold the `G` key and scroll with the mouse wheel. The RPM hold will be shown on the `DYNO. SPEED` gauge in the lower left of the screen.
## Why is the code so sloppy?
I wrote this to demo in a [YouTube video](https://youtu.be/RKT-sKtR970), not as a real product. If you would like it to become a usable product please reach out to me or join my Discord (link can be found in the description of the aforementioned YouTube video). I use this codebase for my own purposes and so it might change frequently and without warning.
## How do I build it? (Ignore this section if you're not a developer!)
**Note: this project currently only builds on Windows!**
### Step 1 - Clone the repository
```git clone --recurse-submodules https://github.com/ange-yaghi/engine-sim```
### Step 2 - Install CMake
Install the latest version of CMake [here](https://cmake.org/) if it's not already installed.
### Step 3 - Install Dependencies
You will need to install the following dependencies and CMake will need to be able to locate them (ie. they need to be listed on your PATH):
1. SDL2
2. SDL2_image
3. Boost (make sure to build the optional dependencies)
4. Flex and Bison
### Step 4 - Build and Run
From the root directory of the project, run the following commands:
```
mkdir build
cd build
cmake ..
cmake --build .
```
If these steps are successful, a Visual Studio solution will be generated in ```build```. You can open this project with Visual Studio and then run the ```engine-sim-app``` project. If you encounter an error telling you that you're missing DLLs, you will have to copy those DLLs to your EXE's directory.
## Patreon Supporters
This project was made possible by the generous donations of the following individuals!
### Grease Monkeys
|<!-- -->|<!-- -->|<!-- -->|<!-- -->|<!-- -->|
|-|-|-|-|-|
|Devin@Hondatuningsuite|nut|Devin C Martinez|WelcomeCat|Saints Sasha|
|Ida 8858|Emily|Steelorse |Kruddy|Sgt. Fluff|
|darcuter|FatFluffyFox|Benton1234|Jim C K Flaten|The Zuck|
|Blade Skydancer|Ye' old apple|Hayden Henderson|AlphaX|Lucas Martins Bündchen|
|Jay Dog|damo|IBS-IS-CRAP|Snowy|Noah Greenberg|
|Eisberg|Brendan M.|Alex Layton|Lukas Bartee|Thibaut Dubuisson|
|The Cheeze Ity|JoeJimTom|MichaelB450|Björn|Bartdavy|
|sasha bandelier|Caleb Black|COOKIES|Andrew Cooper|asimo3089|
|Vim Wizard|Kevin Arsenault|Carl Linden|Kele Tappi|Kroklethon|
|labourateur|viperfan7|SlimmyJimmy|Jason Becker|Sascha Kamp|
|ves|Supernalboot |BeamNG|Paul Harrison|Tyler Russell (Nytelife26)|
|nicholas jacobs|DrDotMadness|AVeryPlainTyler|Zach Perez|Paul Schaefer|
|Clay Bauer|CR33DYM0N14|julien nadeau|Patt313|Philip Edwards|
|RegularRuby670|Mateusz Ładosz|FémLol Stúdió|Crazy Yany|Elden|
|Tristan Walker|Matthew McDonald|Jan-Sander Huiting|Mitchell Almstedt|Dylan Lebiedz|
|Name Here|LoganBoi FNAF|Epic Randomness|MrPiThon|mike |
|dung|Alvaro ArroyoZamora|Skinna Godwin|BeppoBarone|レナVA|
|Sabata |Brady Fulham|Powerpuncher |NK10K|Gavin Osowski|
|Orbitstrider|Steven Doyle|Jaksu2696|Toni |Devin Abolins|
### Tuners
|<!-- -->|<!-- -->|<!-- -->|<!-- -->|<!-- -->|
|-|-|-|-|-|
|Boosted Media|Matthew McLennan|Venican|Lyan le Golmuth|Alberto R.|
|BetaToaster|Akira Takemoto|J Anderson|Apolly007|LexLuther|
|xilophor|Robert K|viktor lind|Adrian Kucinski|sarowie .|
|Chris Fischer|Marlod|Chase Hansen|Aidan Szalanski|Andrew Taylor|
|Jason Hwang|Juuso Natunen|Ian Moss|PickleRick |Beljim46|
|RSOFT92|UCD|Sped|OldManJenkins|James Hart|
|Kalle Nilsson|XxBrasta455xX |Colin Sandage|Dakota Mackinnon|Carter Kopp|
|Jakub Kozak|CJ Plessas|Loizeau|Charles Mills|YellowLight|
|Didrik Esbjug|Alessandro Dal Pino|Carter Williams|Robert D|Cadence Plume|
|BLANK|Provenance EMU|Dylan Engler|Nathan Rojas|Cornelius|
|Acid|larsloveslegos|Maxime Desages|GM|BreadForMen|
|Devin Freeman|Lieven RYCKEBOER|Amelia Taylor|Jelle Plukker|sodmo |
|Jimmy Briscoe|Cirithor|Martin .K|DMartland|Lucas Diem|
|Richard Budíček|Jack Sheppeard|Meemen|Anderson Huynh|NPException|
|Mattia Villa|C|AIDAN POWELL|Brenn_the_Otter|Lane Mosier|
|Ceze |oranjest1|Jw|ISON |Mathew Graham|
|MACHINA|John Crowell|Asher Blythe|Cronos Skies|Matt Amott|
|CpTKugelHagel|Simon Krayer|Caleb Bek|Monster Man25|GeneralMoineau|
|EsuKurimu|Caleb Sartin|Jared L.|Hunter Wood|Ben Poole|
|Steven Victoria|Jordan Zondlak|Agelessgod|Christopher Fahs|Jonathan Vincent|
|Dalton Guillot|Simon Stojanovic|Andrew Urbanczyk|deniaL|Tyler Hughes|
|vPam |Justin Kruithof|Curtis C Coomber|Sawyer Clark|Mike Hart|
|Ciro Rancourt|Miles Guo|Rewind |E=mc^2|Keaton Call|
|J.Es|Jeremy B|Chance Hall|Jack Tompkins|Race Sim Studio|
|Quentin ZAOUI|Floyd Henderson|James Haylow|Milkshiekh |Wyatt Todd|
|User 2820|Leon Schutte|CYBERBUG_JR|sebiii|Keegan|
|Victor Cosiuga|Rolly !|Elias Pettersson|Tyson Makovec|Bill McDermott|
|Phontonic|Simon Armstrong|avec |KidozyGAME (Dead)|Stephan Cote|
|Justin Biggerstaff|Jabba Jubba|notD34THNIGHT|Inventor|Wesley Bear|
|Supersonic2510|Pixel|Simon Bernhardt|Bas Vangermeersch|ToyotaCipra|
|kyle crawford|ApatheticWood|Ben Vaughn|Erich Westhoven|Zack Myers|
|Tbjoern|Vetle Høgås|Derek Thom|Aaron Beck||
### Junior Mechanics
|<!-- -->|<!-- -->|<!-- -->|<!-- -->|<!-- -->|
|-|-|-|-|-|
|Karol Szép|Leon Jordan|Nathan Higginson|Patrick F|Samuel Picard|
|Alexander Fritsch|Lucas Scarpi|Jack Humbert|G2Eneko|SweCreations|
|Marius Becker|Cedric Wille|infernap12 |Julian Dinges|Wamuthas|
|Alex Mason|Hawar Karem|Melonenstrauch|Jacek Dębski|Alex Eastman|
|Darren Taing|Po Wang|Giorgio Iannucci|Levis|Eden|
|Alin Chiparatu|Arjun Mandakath|A.M. |Dylan Ryan|Noah Entrekin|
|GT130|Josh D|generic|Henrik Cohrs|Nic Yetter|
|Dan Fredriksen|153AN1MJ|Rasmus|EpicEcho|Kaur Hendrikson|
|Maddox Partridge|L33TIFY_|Zack Fletcher|teiiio|Mike Zaite|
|Evan Sonin|Christopher Zimmerman|PrefacedVase |funtomr|Triton Alabaster|
|appelpie|Julien Ferluc|AnomalousFerret_|Miles Orozco|Spencer Teeter|
|ThatCanadian|Harry Prabowo|Dylan Rogerson|Jaedyn Allen|Zephyr Sefira|
|Alexander Stone|Mason Little|Wojciech Czop|ryzen5 |Kosta Diamantis|
|Karol Stodolak|Tim van der Linde|Loïc Ruttner|jonthefuzz|AsgarK|
|James Morgan|Elijah |1ntl|Tobias Johansson|Mome |
|P|SOPA_|Shingekuro|Sean King|Russell Marsh|
|Alyx Ranas|Naters305 |ChrisakaMrXD |Nic |sean|
|Zach Hagedorn|Jhon lenon|Everett Butts|Kyan|ranger Nation|
|Hiago Oliveira|Texi|MrRhody|Inglorious Bastard|Marty Mitchell|
|Justin Chao|ManuelS|Cornelius Rössing|Pedro Freire|Anthony Stuart|
|Hubba Nubba|Skychii|Joe Underwood|Xander_|Notbigdank|
|Sander D.|Lars Joosten|Danksa|Metrostation |Myles Wommack|
|Derrick Sampson|Corey Hannen|Matteo La Corte|Octothorp Obelus|David Baril|
|Soyuz Kafire|Ivan Coha|BigElbowski|Apolepth|Julian Krad|
|David Soulieres|Eric Huang|Léo Vias|Riccardo Mariani|Vic Viper|
|Shinkaaaa|Mumaransa |Michael Banovsky|Hendrik Voss|Inverted Blackhat|
|skipyC |Tobias Moor|jaky3 .|Clément LEGRAND|Ian C. Simpson|
|Challier|Jan Przemysław Drabik|Dsand23|Smooth DLX|The German Dude|
|CrazyEagle |Jordon Goodman|HenryWithaG .|Oscar Krula|Brayden Moore|
|Steven|Nall Wolfert|papajonk|Andrew|Ben Kingston|
|Julian Vogl|Maxime Lubrano|MrMekouil|Doudimme|Jacob Hultberg|
|Nolan Orloff|Mike|tobi9899 |Danila Frolkin|Xecotcovach|
|Aj|Carcar404|John Martin|Dominik Greinert|Lukas Stadler|
|Oliver Yang|sonax51|Marcel Kliment|Chris|David Rush|
|LethalVenom13|Dave Osterhoff|Anto1709|Ben|Morgan Munroe|
|Ivor Forrest|Sam Hopkins|Atte |Dax |William Bergström|
|homelessmeme|Thanleft|Zaxerg |Robeloox|Maximilian-Lukas Marz|
|Morgn|Seth Monteleone|playfulmean videos|Lanimations LA|Bram G|
|Benoit Fournier|Bernar Lepiller|Nicolas Baur|the |Snekers|
|Darkmount|Tobiasz Michalik|Aidas Ri|Daniel Postler|Skim_Beeblez|
|Impetus|Thunderbird324|Fred Joss|Krzysztof Radowski|Azerrty|
|Harrison Speck|Matt Baker|BigLynch|Markus Pelto|IMBIBE|
|James L Plummer|Rose Giles|Jonas Brekka|HASTRX|Lepoucehumain|
|Naomi Humin|qkrrudgks|Johann Gross|Janis Knappich|WhatTheDuck|
|테루|Glimple Bort|Jacob Tudisco|Tanner|Julian kaspi|
|nathan gould|Randal Rainis Kruus|Beppierre|Craig Martin|Thomas Bukovsky|
|Colaxe|Robert Oram|Matsuy15 L|Kacpe|Alex Sedlic|
|Mark Benson|Mhenn!|Anders Nelson|Dingus|Rustle|
|Marco Schulz|stratum |brochier gabriel|Thomas|brody of hillcountry|
|Thomas Afford|Brody Blaskie|Martien Gaming|Adrien MC|William A Grubbs|
|Trevo Ph.D.|Donovan Gibson|Polish R3t4rd|Keith Price|LAWL CAKE|
|Rhien Schultz|FireThrow13|Seraphim|Titus Standing|Matt Miklos|
|B Dub|Jonathan Ekman|Al Pomeroy|Vestii|Wil|
|adrian|Airatise|TJ Sinkoski|Shotts SilverStone|Reagan Carbaugh|
|WarAestheticsRebooted|Aidan Case|Casey Bryant Goodwin|Konrad|Adam Larcher|
|Kazar Xin Xiao|Riccardo Marcaccio|William S.|Francis Filion|Loïc |
|Kenny Deane|Blackspots|mike |MXT|Joshua Gibson|
|milky boi|Hagen|gunmaster929 |jgvan |Benny 282|
|Sean Wehner|Christian Poole|Ethan|Tsukiyama Shuu|Ooof_uhhh_haah|
|sano ken ch|Diego Martinez|Chuck|GalaxyFrogs|TheGeForce |
|Chriphost|Carthage|Greg L|Chipskate|Muhammed Mehmood|
|Hamilton Sjoberg|Amina Moh|vSiiFT|Jeremy Wren|Esteban Acosta|
|John A Ullenberg|Michael Morozov|Andrew Webberley|Nathaniel Lim|Aaron Ksicinski|
|Apocalypt|Josh batuzich|Ed|Hunter |Gene Brockoff|
|Redheadspellslinger.|Pablo Magariños|Nilz|Jose Manuel Silva Calvo|AJ|
|Ethan Wille |Aurora|Derek Shunia|Jan|Nope Mircea|
|Giancarlo Cestari|Tanner Edge|brad.|Connor Merrick|Martin Scholer|
|Deppy|Dan Smith|Tyson |Jac Comeau|Itemfinder |
|Tischer Games|Pedro Henrique|BeenWashedUp|martin wolff|Kurt Houben|
|Thomas Onslow|Brendan Puglisi|Kai Anquetil|Rudolph Ignatenko|CloudHackIX|
|Zach Carreau|Jonathan Vanderlyn|Krobivnov|ienergy|Leifster|
|Mikael Kaaronen|Glen|H.Helsing|ange|The Nobles|
|Johnathan Johnson|Juha Merentie|Jim Fares|Tom Marshall|Superferrariman|
|Zakary Zisa|JustTy|晟道 杜|Dnialibr Williams|Takumi Fujiwara|
|Koen van Hal|Jonathan Hill|Marco Siciliano|Kevindosenfutter|Angry Prawn|
|Natharic 67|Rafael Monteiro|Jacob Ashline|ChironTheFloof|Caleb Dauphinee|
|Tony |Zac L|AlainMoto FPV|eirik johan johnsen|Elderet|
|Miles Longmore|lemon head|Viccy|Casey|Kajetan Cupa|
|Conejero00|Bill Gricko|A cow wearing a turban|Danni Nowicki|Udo Schmidt|
|Tyler Swords|Constellation Gaming|Manimo|valentine|Jules Schattenberg|
|Brandon Crotts|Philipp Popetschnigg|Tiziano Della Fazia|goodgamer1109|Joshua Thomas|
|Jeff Testa|Avery Snyder|Josh Kern|Triptagram|Bayon Antoine|
|Iván Juárez Núñez|Amery Martinat|ElArGee|Cory Green|lucas Di lorenzo|
|Caleb Sandersier|||||
================================================
FILE: assets/engines/atg-video-1/01_honda_trx520.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
}
public node honda_trx520 {
alias output __out: engine;
engine engine(
name: "Honda TRX520 (ATV)",
starter_torque: 50 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 5000 * units.rpm,
fuel: fuel(
max_burning_efficiency: 1.0
),
hf_gain: 0.00121,
noise: 0.229,
jitter: 0.42,
simulation_frequency: 40000
)
wires wires()
crankshaft c0(
throw: 71.5 * units.mm / 2,
flywheel_mass: 5 * units.lb,
mass: 5 * units.lb,
friction_torque: 5.0 * units.lb_ft,
moment_of_inertia: 0.22986844776863666 * 0.2,
position_x: 0.0,
position_y: 0.0,
tdc: constants.pi / 2
)
rod_journal rj0(angle: 0.0)
c0
.add_rod_journal(rj0)
piston_parameters piston_params(
mass: 100 * units.g,
compression_height: 1.0 * units.inch,
wrist_pin_position: 0.0,
displacement: 0.0
)
connecting_rod_parameters cr_params(
mass: 100.0 * units.g,
moment_of_inertia: 0.0015884918028487504,
center_of_mass: 0.0,
length: 6.0 * units.inch
)
cylinder_bank_parameters bank_params(
bore: 96 * units.mm,
deck_height: 71.5 * units.mm / 2 + 6.0 * units.inch + 1.0 * units.inch
)
intake intake(
plenum_volume: 1.5 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(100.0),
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.993,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(500.0),
primary_tube_length: 20.0 * units.inch,
primary_flow_rate: k_carb(200.0),
velocity_decay: 0.5,
volume: 5.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
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
)
engine
.add_cylinder_bank(b0)
engine.add_crankshaft(c0)
harmonic_cam_lobe lobe(
duration_at_50_thou: 180 * units.deg,
gamma: 1.0,
lift: 200 * units.thou,
steps: 100
)
vtwin90_camshaft_builder camshaft(
lobe_profile: lobe,
lobe_separation: 100 * units.deg,
base_radius: 500 * units.thou
)
b0.set_cylinder_head (
generic_small_engine_head(
chamber_volume: 60 * units.cc,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0,
flow_attenuation: 2.0,
intake_runner_cross_section_area: 9.0 * units.cm2,
exhaust_runner_cross_section_area: 9.0 * units.cm2
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 12 * units.deg)
.add_sample(2000 * units.rpm, 20 * units.deg)
.add_sample(3000 * units.rpm, 35 * units.deg)
.add_sample(4000 * units.rpm, 35 * units.deg)
engine.add_ignition_module(
single_cylinder_distributor(
wires: wires,
timing_curve: timing_curve,
rev_limit: 6000 * units.rpm
))
}
private node honda_trx520_transmission {
alias output __out: transmission;
transmission transmission(
max_clutch_torque: 50 * units.lb_ft
)
transmission.add_gear(4.0)
transmission.add_gear(3.5)
transmission.add_gear(3.0)
transmission.add_gear(2.5)
transmission.add_gear(2.0)
}
private node honda_trx520_vehicle {
alias output __out:
vehicle(
mass: 500 * units.kg,
drag_coefficient: 0.25,
cross_sectional_area: (47 * units.inch) * (47 * units.inch),
diff_ratio: 3.33,
tire_radius: 11 * units.inch,
rolling_resistance: 200 * units.N
);
}
public node main {
set_engine(honda_trx520())
set_transmission(honda_trx520_transmission())
set_vehicle(honda_trx520_vehicle())
}
================================================
FILE: assets/engines/atg-video-1/02_kohler_ch750.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
}
public node kohler_ch750 {
alias output __out: engine;
engine engine(
name: "Kohler CH750",
starter_torque: 50 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 3600 * units.rpm,
throttle:
governor(
min_speed: 1600 * units.rpm,
max_speed: 3500 * units.rpm,
min_v: -5.0,
max_v: 5.0,
k_s: 0.0006,
k_d: 200.0,
gamma: 2.0
),
hf_gain: 0.01,
noise: 1.0,
jitter: 0.5,
simulation_frequency: 30000
)
wires wires()
crankshaft c0(
throw: 69 * units.mm / 2,
flywheel_mass: 5 * units.lb,
mass: 5 * units.lb,
friction_torque: 10.0 * units.lb_ft,
moment_of_inertia: 0.22986844776863666 * 0.5,
position_x: 0.0,
position_y: 0.0,
tdc: constants.pi / 4
)
rod_journal rj0(angle: 0.0)
c0
.add_rod_journal(rj0)
piston_parameters piston_params(
mass: 400 * units.g,
//blowby: k_28inH2O(0.1),
compression_height: 1.0 * units.inch,
wrist_pin_position: 0.0,
displacement: 0.0
)
connecting_rod_parameters cr_params(
mass: 300.0 * units.g,
moment_of_inertia: 0.0015884918028487504,
center_of_mass: 0.0,
length: 4.0 * units.inch
)
cylinder_bank_parameters bank_params(
bore: 83 * units.mm,
deck_height: (4.0 + 1) * units.inch + 69 * units.mm / 2
)
intake intake(
plenum_volume: 1.0 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(50.0),
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.96
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(300.0),
primary_tube_length: 10.0 * units.inch,
primary_flow_rate: k_carb(200.0),
velocity_decay: 1.0,
volume: 20.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 1.0,
impulse_response: ir_lib.default_0
)
cylinder_bank b0(bank_params, angle: -45 * 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
)
cylinder_bank b1(bank_params, angle: 45.0 * units.deg)
b1
.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.wire2
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe lobe(
duration_at_50_thou: 160 * units.deg,
gamma: 1.1,
lift: 200 * units.thou,
steps: 100
)
vtwin90_camshaft_builder camshaft(
lobe_profile: lobe,
lobe_separation: 114 * units.deg,
base_radius: 500 * units.thou
)
b0.set_cylinder_head (
generic_small_engine_head(
chamber_volume: 50 * units.cc,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0
)
)
b1.set_cylinder_head (
generic_small_engine_head(
chamber_volume: 50 * units.cc,
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1,
flip_display: true
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 18 * units.deg)
.add_sample(1000 * units.rpm, 30 * units.deg)
.add_sample(2000 * units.rpm, 50 * units.deg)
.add_sample(3000 * units.rpm, 50 * units.deg)
.add_sample(4000 * units.rpm, 50 * units.deg)
engine.add_ignition_module(
vtwin90_distributor(
wires: wires,
timing_curve: timing_curve,
rev_limit: 5000 * units.rpm
))
}
private node direct_drive {
alias output __out: transmission;
transmission transmission(
max_clutch_torque: 35 * units.lb_ft
)
transmission.add_gear(1.0)
}
private node static_load {
alias output __out:
vehicle(
mass: 563 * units.lb,
drag_coefficient: 0.1,
cross_sectional_area: (20 * units.inch) * (47 * units.inch),
diff_ratio: 2.353,
tire_radius: 8.5 * units.inch,
rolling_resistance: 10000 * units.N
);
}
public node main {
set_engine(kohler_ch750())
set_transmission(direct_drive())
set_vehicle(static_load())
}
================================================
FILE: assets/engines/atg-video-1/03_harley_davidson_shovelhead.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
}
public node harley_distributor {
input wires;
input timing_curve;
input rev_limit: 5500 * units.rpm;
alias output __out:
ignition_module(timing_curve: timing_curve, rev_limit: rev_limit)
.connect_wire(wires.wire1, 0 * units.deg)
.connect_wire(wires.wire2, 315 * units.deg);
}
public node harley_davidson_shovelhead {
alias output __out: engine;
engine engine(
name: "Harley Davidson Shovelhead",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 5000 * units.rpm,
hf_gain: 0.01,
noise: 0.115,
jitter: 0.136,
simulation_frequency: 35000
)
wires wires()
label stroke(4.25 * units.inch)
label bore(3.5 * units.inch)
label rod_length(8 * units.inch)
label compression_height(1.0 * units.inch)
label crank_mass(9.39 * units.kg)
label flywheel_mass(15 * units.kg)
label flywheel_radius(6 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
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: 10 * units.kg, radius: 3.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 5.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: (90 - 0.5 * 45) * units.deg
)
rod_journal rj0(angle: 0.0)
c0
.add_rod_journal(rj0)
piston_parameters piston_params(
mass: 500 * units.g,
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
connecting_rod_parameters cr_params(
mass: 500.0 * units.g,
moment_of_inertia: 0.0015884918028487504,
center_of_mass: 0.0,
length: rod_length
)
intake intake(
plenum_volume: 1.5 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(100.0),
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.991,
throttle_gamma: 1.0,
velocity_decay: 1.0
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(100.0),
primary_tube_length: 70.0 * units.inch,
primary_flow_rate: k_carb(100.0),
velocity_decay: 0.75,
volume: 10.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 1.0 * 0.1,
impulse_response: ir_lib.minimal_muffling_01
)
exhaust_system exhaust1(
es_params,
audio_volume: 2.0 * 0.1,
impulse_response: ir_lib.minimal_muffling_01
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
cylinder_bank b0(bank_params, angle: -0.5 * 45 * units.deg, display_depth: 0.55)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1
)
cylinder_bank b1(bank_params, angle: 0.5 * 45 * units.deg, display_depth: 0.55)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.1)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe lobe(
duration_at_50_thou: 210 * units.deg,
gamma: 0.9,
lift: 400 * units.thou,
steps: 100
)
vtwin_camshaft_builder camshaft(
lobe_profile: lobe,
lobe_separation: 110 * units.deg,
base_radius: 500 * units.thou,
angle: 315 * units.deg
)
b0.set_cylinder_head (
generic_small_engine_head(
chamber_volume: 100 * units.cc,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0,
flow_attenuation: 2.0,
intake_runner_cross_section_area: 20.0 * units.cm2,
exhaust_runner_cross_section_area: 20.0 * units.cm2
)
)
b1.set_cylinder_head (
generic_small_engine_head(
flip_display: true,
chamber_volume: 100 * units.cc,
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1,
flow_attenuation: 1.0,
intake_runner_cross_section_area: 20.0 * units.cm2,
exhaust_runner_cross_section_area: 20.0 * units.cm2
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 18 * units.deg)
.add_sample(1000 * units.rpm, 18 * units.deg)
.add_sample(2000 * units.rpm, 30 * units.deg)
.add_sample(3000 * units.rpm, 40 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
engine.add_ignition_module(
harley_distributor(
wires: wires,
timing_curve: timing_curve,
rev_limit: 5500 * units.rpm
))
}
private node harley_davidson_motorcyle {
alias output __out:
vehicle(
mass: 900 * units.lb,
drag_coefficient: 0.1,
cross_sectional_area: (15 * units.inch) * (47 * units.inch),
diff_ratio: 2.0,
tire_radius: 11 * units.inch,
rolling_resistance: 200 * units.N
);
}
private node harley_davidson_transmission {
alias output __out:
transmission(
max_clutch_torque: 200 * units.lb_ft
)
.add_gear(3.34)
.add_gear(2.30)
.add_gear(1.71)
.add_gear(1.41)
.add_gear(1.18)
.add_gear(1.00);
}
public node main {
set_engine(harley_davidson_shovelhead())
set_vehicle(harley_davidson_motorcyle())
set_transmission(harley_davidson_transmission())
}
================================================
FILE: assets/engines/atg-video-1/04_hayabusa.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
}
private node hayabusa_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 19.2 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 10.0 * units.cm2 * 2.0;
input exhaust_runner_volume: 50.0 * units.cc;
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, 40 * flow_attenuation)
.add_flow_sample(100 * lift_scale, 80 * flow_attenuation)
.add_flow_sample(150 * lift_scale, 125 * flow_attenuation)
.add_flow_sample(200 * lift_scale, 160 * flow_attenuation)
.add_flow_sample(250 * lift_scale, 190 * flow_attenuation)
.add_flow_sample(300 * lift_scale, 210 * flow_attenuation)
.add_flow_sample(350 * lift_scale, 225 * flow_attenuation)
.add_flow_sample(400 * lift_scale, 230 * flow_attenuation)
.add_flow_sample(450 * lift_scale, 240 * 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, 30 * flow_attenuation)
.add_flow_sample(100 * lift_scale, 70 * flow_attenuation)
.add_flow_sample(150 * lift_scale, 100 * flow_attenuation)
.add_flow_sample(200 * lift_scale, 125 * flow_attenuation)
.add_flow_sample(250 * lift_scale, 140 * flow_attenuation)
.add_flow_sample(300 * lift_scale, 150 * flow_attenuation)
.add_flow_sample(350 * lift_scale, 160 * flow_attenuation)
.add_flow_sample(400 * lift_scale, 165 * flow_attenuation)
.add_flow_sample(450 * lift_scale, 170 * flow_attenuation)
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,
intake_camshaft: intake_camshaft,
exhaust_camshaft: exhaust_camshaft,
flip_display: flip_display
)
}
private node hayabusa_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * 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 rot180(180 * units.deg)
label rot360(360 * units.deg)
_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)
_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)
}
public node hayabusa_i4 {
alias output __out: engine;
engine engine(
name: "Suzuki Hayabusa I4",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 11000 * units.rpm,
fuel: fuel(
max_turbulence_effect: 5.5,
max_dilution_effect: 1000.0,
max_burning_efficiency: 1.0,
burning_efficiency_randomness: 0.0
),
throttle_gamma: 2.0,
hf_gain: 0.00407,
noise: 0.292,
jitter: 0.062,
simulation_frequency: 20000
)
wires wires()
label stroke(65 * units.mm)
label bore(81 * units.mm)
label rod_length(4.705 * units.inch)
label compression_height(1.0 * units.inch)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: 10 * units.lb,
mass: 24.8 * units.lb,
friction_torque: 1.0 * units.lb_ft,
moment_of_inertia: 0.22986844776863666 * 0.2,
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: 303.5 * units.g,
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
connecting_rod_parameters cr_params(
mass: 395.837 * units.g,
moment_of_inertia: 0.0015884918028487504,
center_of_mass: 0.0,
length: rod_length
)
intake intake(
plenum_volume: 4.5 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(800.0),
runner_flow_rate: k_carb(300.0),
runner_length: 10.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.999,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 40.0 * units.inch,
primary_flow_rate: k_carb(500.0),
velocity_decay: 1.0,
volume: 10.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 1.0 * 0.25,
impulse_response: ir_lib.minimal_muffling_03
)
exhaust_system exhaust1(
es_params,
audio_volume: 2.0 * 0.25,
impulse_response: ir_lib.minimal_muffling_03
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
cylinder_bank b0(bank_params, angle: 0.0 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2,
sound_attenuation: 0.8
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 1.1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4,
sound_attenuation: 0.9
)
engine
.add_cylinder_bank(b0)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 240 * units.deg,
gamma: 1.2,
lift: 345 * units.thou,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 220 * units.deg,
gamma: 1.2,
lift: 294 * units.thou,
steps: 100
)
hayabusa_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 105 * units.deg,
exhaust_lobe_center: 100 * units.deg,
base_radius: 500 * units.thou
)
b0.set_cylinder_head (
hayabusa_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, 25 * units.deg)
.add_sample(1000 * units.rpm, 25 * units.deg)
.add_sample(2000 * units.rpm, 30 * units.deg)
.add_sample(3000 * units.rpm, 40 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 11500 * units.rpm,
limiter_duration: 0.05)
ignition_module
.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)
engine.add_ignition_module(ignition_module)
}
private node hayabusa_transmission {
alias output __out: transmission;
transmission transmission(
max_clutch_torque: 200 * units.lb_ft
)
transmission.add_gear(2.615)
transmission.add_gear(1.937)
transmission.add_gear(1.526)
transmission.add_gear(1.285)
transmission.add_gear(1.136)
transmission.add_gear(1.043)
}
private node hayabusa {
alias output __out:
vehicle(
mass: 563 * units.lb,
drag_coefficient: 0.1,
cross_sectional_area: (20 * units.inch) * (47 * units.inch),
diff_ratio: 2.353,
tire_radius: 8.5 * units.inch,
rolling_resistance: 100 * units.N
);
}
public node main {
set_engine(hayabusa_i4())
set_transmission(hayabusa_transmission())
set_vehicle(hayabusa())
}
================================================
FILE: assets/engines/atg-video-1/05_honda_vtec.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
}
private node honda_vtec_head {
input camshaft_set;
input chamber_volume: 41.6 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.35 * units.inch * 1.35 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.25 * units.inch * 1.25 * units.inch;
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, 50 * flow_attenuation)
.add_flow_sample(100 * lift_scale, 80 * flow_attenuation)
.add_flow_sample(150 * lift_scale, 125 * flow_attenuation)
.add_flow_sample(200 * lift_scale, 160 * flow_attenuation)
.add_flow_sample(250 * lift_scale, 190 * flow_attenuation)
.add_flow_sample(300 * lift_scale, 210 * flow_attenuation)
.add_flow_sample(350 * lift_scale, 225 * flow_attenuation)
.add_flow_sample(400 * lift_scale, 230 * flow_attenuation)
.add_flow_sample(450 * lift_scale, 250 * 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, 50 * flow_attenuation)
.add_flow_sample(100 * lift_scale, 80 * flow_attenuation)
.add_flow_sample(150 * lift_scale, 110 * flow_attenuation)
.add_flow_sample(200 * lift_scale, 130 * flow_attenuation)
.add_flow_sample(250 * lift_scale, 150 * flow_attenuation)
.add_flow_sample(300 * lift_scale, 160 * flow_attenuation)
.add_flow_sample(350 * lift_scale, 170 * flow_attenuation)
.add_flow_sample(400 * lift_scale, 170 * flow_attenuation)
.add_flow_sample(450 * lift_scale, 170 * 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: vtec_valvetrain(
vtec_intake_camshaft: camshaft_set.vtec_intake_cam,
vtec_exhaust_camshaft: camshaft_set.vtec_exhaust_cam,
intake_camshaft: camshaft_set.intake_cam,
exhaust_camshaft: camshaft_set.exhaust_cam
),
flip_display: flip_display
)
}
private node honda_vtec_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input vtec_lobe_profile;
input vtec_intake_lobe_profile: vtec_lobe_profile;
input vtec_exhaust_lobe_profile: vtec_lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input vtec_lobe_separation: 110 * units.deg;
input vtec_intake_lobe_center: vtec_lobe_separation;
input vtec_exhaust_lobe_center: vtec_lobe_separation;
input advance: 0 * units.deg;
input base_radius: 1.0 * units.inch;
output intake_cam: _intake_cam;
output exhaust_cam: _exhaust_cam;
output vtec_intake_cam: _vtec_intake_cam;
output vtec_exhaust_cam: _vtec_exhaust_cam;
camshaft_parameters params (
advance: advance,
base_radius: base_radius
)
camshaft _intake_cam(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam(params, lobe_profile: exhaust_lobe_profile)
camshaft _vtec_intake_cam(params, lobe_profile: vtec_intake_lobe_profile)
camshaft _vtec_exhaust_cam(params, lobe_profile: vtec_exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
_exhaust_cam
.add_lobe(rot360 + exhaust_lobe_center - (0.0 / 4) * cycle)
.add_lobe(rot360 + exhaust_lobe_center - (3.0 / 4) * cycle)
.add_lobe(rot360 + exhaust_lobe_center - (1.0 / 4) * cycle)
.add_lobe(rot360 + exhaust_lobe_center - (2.0 / 4) * cycle)
_intake_cam
.add_lobe(rot360 - intake_lobe_center - (0.0 / 4) * cycle)
.add_lobe(rot360 - intake_lobe_center - (3.0 / 4) * cycle)
.add_lobe(rot360 - intake_lobe_center - (1.0 / 4) * cycle)
.add_lobe(rot360 - intake_lobe_center - (2.0 / 4) * cycle)
_vtec_exhaust_cam
.add_lobe(rot360 + vtec_exhaust_lobe_center - (0.0 / 4) * cycle)
.add_lobe(rot360 + vtec_exhaust_lobe_center - (3.0 / 4) * cycle)
.add_lobe(rot360 + vtec_exhaust_lobe_center - (1.0 / 4) * cycle)
.add_lobe(rot360 + vtec_exhaust_lobe_center - (2.0 / 4) * cycle)
_vtec_intake_cam
.add_lobe(rot360 - vtec_intake_lobe_center - (0.0 / 4) * cycle)
.add_lobe(rot360 - vtec_intake_lobe_center - (3.0 / 4) * cycle)
.add_lobe(rot360 - vtec_intake_lobe_center - (1.0 / 4) * cycle)
.add_lobe(rot360 - vtec_intake_lobe_center - (2.0 / 4) * cycle)
}
public node honda_vtec_i4 {
alias output __out: engine;
engine engine(
name: "Honda B18C5 [VTEC, I4]",
starter_torque: 70 * units.lb_ft,
starter_speed: -500 * units.rpm,
redline: 8400 * units.rpm,
fuel: fuel(
max_turbulence_effect: 2.5,
max_burning_efficiency: 0.75
),
throttle_gamma: 2.0,
hf_gain: 0.002,
noise: 0.253,
jitter: 0.195,
simulation_frequency: 20000
)
wires wires()
label stroke(87.2 * units.mm)
label bore(81 * units.mm)
label rod_length(5.430 * units.inch)
label compression_height(1.0 * units.inch)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: 10 * units.lb,
mass: 35.5 * units.lb,
friction_torque: 1.0 * units.lb_ft,
moment_of_inertia: 0.22986844776863666 * 0.5,
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: 303.5 * units.g,
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
connecting_rod_parameters cr_params(
mass: 395.837 * units.g,
moment_of_inertia: 0.0015884918028487504,
center_of_mass: 0.0,
length: rod_length
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(800.0),
runner_flow_rate: k_carb(250.0),
runner_length: 7.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.9989,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 10.0 * units.inch,
primary_flow_rate: k_carb(200.0),
velocity_decay: 1.0,
volume: 100.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 8 * 0.75,
impulse_response: ir_lib.mild_exhaust_0
)
exhaust_system exhaust1(
es_params,
audio_volume: 8 * 1.0,
impulse_response: ir_lib.mild_exhaust_0
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
cylinder_bank b0(bank_params, angle: 0.0 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2,
sound_attenuation: 1.1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 0.8
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4,
sound_attenuation: 0.9
)
engine
.add_cylinder_bank(b0)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 210 * units.deg,
gamma: 1.0,
lift: 6.9 * units.mm,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 190 * units.deg,
gamma: 1.0,
lift: 6.5 * units.mm,
steps: 100
)
harmonic_cam_lobe vtec_intake_lobe(
duration_at_50_thou: 240 * units.deg,
gamma: 0.5,
lift: 11.5 * units.mm,
steps: 100
)
harmonic_cam_lobe vtec_exhaust_lobe(
duration_at_50_thou: 232 * units.deg,
gamma: 0.5,
lift: 10.5 * units.mm,
steps: 100
)
honda_vtec_camshaft camshaft(
lobe_profile: "N/A",
vtec_lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
vtec_intake_lobe_profile: vtec_intake_lobe,
vtec_exhaust_lobe_profile: vtec_exhaust_lobe,
intake_lobe_center: 116 * units.deg,
exhaust_lobe_center: 116 * units.deg,
vtec_intake_lobe_center: 100 * units.deg,
vtec_exhaust_lobe_center: 100 * units.deg,
base_radius: 500 * units.thou
)
b0.set_cylinder_head (
honda_vtec_head(
camshaft_set: camshaft
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, -25 * units.deg)
.add_sample(1000 * units.rpm, -25 * units.deg)
.add_sample(2000 * units.rpm, -30 * units.deg)
.add_sample(3000 * units.rpm, -40 * units.deg)
.add_sample(4000 * units.rpm, -40 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 9400 * units.rpm, //43244374
limiter_duration: 0.05)
ignition_module
.connect_wire(wires.wire1, (0.0 / 4.0) * cycle)
.connect_wire(wires.wire3, (3.0 / 4.0) * cycle)
.connect_wire(wires.wire4, (2.0 / 4.0) * cycle)
.connect_wire(wires.wire2, (1.0 / 4.0) * cycle)
engine.add_ignition_module(ignition_module)
}
private node integra_type_r {
alias output __out:
vehicle(
mass: 2400 * units.lb,
drag_coefficient: 0.2,
cross_sectional_area: (66 * units.inch) * (50 * units.inch),
diff_ratio: 3.55,
tire_radius: 10 * units.inch,
rolling_resistance: 300 * units.N
);
}
private node integra_type_r_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.23)
.add_gear(2.105)
.add_gear(1.458)
.add_gear(1.107)
.add_gear(0.848);
}
public node main {
set_engine(honda_vtec_i4())
set_vehicle(integra_type_r())
set_transmission(integra_type_r_transmission())
}
================================================
FILE: assets/engines/atg-video-1/06_subaru_ej25.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
}
private node ej25_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 67 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.35 * units.inch * 1.35 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.25 * units.inch * 1.25 * units.inch;
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)
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)
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
)
}
private node ej25_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 1.0 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (1.0 / 4) * cycle)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (1.0 / 4) * cycle)
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + (2.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (3.0 / 4) * cycle)
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + (2.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (3.0 / 4) * cycle)
}
public node subaru_ej25 {
alias output __out: engine;
engine engine(
name: "Subaru EJ25",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 6500 * units.rpm,
fuel: fuel(
max_turbulence_effect: 2.5,
max_burning_efficiency: 0.75
),
throttle_gamma: 2.0,
hf_gain: 0.01,
noise: 1.0,
jitter: 0.5,
simulation_frequency: 20000
)
wires wires()
label stroke(79 * units.mm)
label bore(99.5 * units.mm)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(9.39 * units.kg)
label flywheel_mass(6.8 * units.kg)
label flywheel_radius(6 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
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: 10 * units.kg, radius: 6.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 1.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: 180 * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: 180.0 * units.deg)
rod_journal rj2(angle: 0.0 * units.deg)
rod_journal rj3(angle: 180.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: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(800.0),
runner_flow_rate: k_carb(250.0),
runner_length: 12.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.9985,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 10.0 * units.inch,
primary_flow_rate: k_carb(200.0),
velocity_decay: 1.0,
volume: 100.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 0.5 * 8,
impulse_response: ir_lib.mild_exhaust_0
)
exhaust_system exhaust1(
es_params,
audio_volume: 1.0 * 8,
impulse_response: ir_lib.mild_exhaust_0
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
cylinder_bank b0(bank_params, angle: 90.0 * units.deg)
cylinder_bank b1(bank_params, angle: -90.0 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3
)
.set_cylinder_head(
ej25_head(
flip_display: true,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0)
)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4
)
.set_cylinder_head(
ej25_head(
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 232 * units.deg,
gamma: 2.0,
lift: 9.78 * units.mm,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 236 * units.deg,
gamma: 2.0,
lift: 9.60 * units.mm,
steps: 100
)
ej25_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 117 * units.deg,
exhaust_lobe_center: 112 * units.deg,
base_radius: (34.0 / 2) * units.mm
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 25 * units.deg)
.add_sample(1000 * units.rpm, 25 * units.deg)
.add_sample(2000 * units.rpm, 30 * units.deg)
.add_sample(3000 * units.rpm, 40 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 6500 * units.rpm,
limiter_duration: 0.08)
ignition_module
.connect_wire(wires.wire1, (0.0 / 4.0) * cycle)
.connect_wire(wires.wire3, (1.0 / 4.0) * cycle)
.connect_wire(wires.wire2, (2.0 / 4.0) * cycle)
.connect_wire(wires.wire4, (3.0 / 4.0) * cycle)
engine.add_ignition_module(ignition_module)
}
private node impreza {
alias output __out:
vehicle(
mass: 2700 * units.lb,
drag_coefficient: 0.2,
cross_sectional_area: (66 * units.inch) * (56 * units.inch),
diff_ratio: 3.9,
tire_radius: 10 * units.inch,
rolling_resistance: 300 * units.N
);
}
private node impreza_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.636)
.add_gear(2.375)
.add_gear(1.761)
.add_gear(1.346)
.add_gear(0.971)
.add_gear(0.756);
}
public node main {
set_engine(subaru_ej25())
set_vehicle(impreza())
set_transmission(impreza_transmission())
}
================================================
FILE: assets/engines/atg-video-1/07_audi_i5.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
}
label cycle(2 * 360 * units.deg)
public node wb_ignition {
input wires;
input timing_curve;
input rev_limit: 7500 * units.rpm;
alias output __out:
ignition_module(
timing_curve: timing_curve,
rev_limit: rev_limit,
limiter_duration: 0.1
)
.connect_wire(wires.wire1, (0.0 / 5.0) * cycle)
.connect_wire(wires.wire2, (1.0 / 5.0) * cycle)
.connect_wire(wires.wire4, (2.0 / 5.0) * cycle)
.connect_wire(wires.wire5, (3.0 / 5.0) * cycle)
.connect_wire(wires.wire3, (4.0 / 5.0) * cycle);
}
public node i5_camshaft_builder {
input lobe_profile: comp_cams_magnum_11_450_8_lobe_profile();
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 110.0 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0.0 * units.deg;
input base_radius: 0.75 * units.inch;
output intake_cam: _intake_cam;
output exhaust_cam: _exhaust_cam;
camshaft_parameters params(
advance: advance,
base_radius: base_radius
)
camshaft _intake_cam(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam(params, lobe_profile: exhaust_lobe_profile)
label rot(2 * (360 / 5.0) * units.deg)
label rot360(360 * units.deg)
_exhaust_cam
.add_lobe(rot360 - exhaust_lobe_center)
.add_lobe((rot360 - exhaust_lobe_center) + 1 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 4 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 2 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 3 * rot)
_intake_cam
.add_lobe(rot360 + intake_lobe_center)
.add_lobe(rot360 + intake_lobe_center + 1 * rot)
.add_lobe(rot360 + intake_lobe_center + 4 * rot)
.add_lobe(rot360 + intake_lobe_center + 2 * rot)
.add_lobe(rot360 + intake_lobe_center + 3 * rot)
}
private node audi_i5_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 50 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.9 * units.inch * 1.9 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.25 * units.inch * 1.25 * units.inch;
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)
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)
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
)
}
public node audi_i5_2_2L {
alias output __out: engine;
wires wires()
engine engine(
name: "Audi 2.3 inline 5",
starter_torque: 200 * units.lb_ft,
redline: 6000 * units.rpm,
fuel: fuel(
max_turbulence_effect: 2.5,
max_burning_efficiency: 0.75),
hf_gain: 0.01,
noise: 1.0,
jitter: 0.299,
simulation_frequency: 17000
)
label stroke(79.5 * units.mm)
label bore(86.4 * units.mm)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(32.8 * units.mm)
label crank_mass(9.39 * units.kg)
label flywheel_mass(6.8 * units.kg)
label flywheel_radius(6 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
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: 20 * units.kg, radius: 8.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 5.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: constants.pi / 2
)
rod_journal rj0(angle: (0.0 / 5.0) * 360 * units.deg)
rod_journal rj1(angle: (2.0 / 5.0) * 360 * units.deg)
rod_journal rj2(angle: (3.0 / 5.0) * 360 * units.deg)
rod_journal rj3(angle: (4.0 / 5.0) * 360 * units.deg)
rod_journal rj4(angle: (1.0 / 5.0) * 360 * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
.add_rod_journal(rj3)
.add_rod_journal(rj4)
piston_parameters piston_params(
mass: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
blowby: 0,
compression_height: compression_height,
wrist_pin_position: 0 * units.mm,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.0 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(350.0),
runner_flow_rate: k_carb(175.0),
runner_length: 5.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.993
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(500.0),
primary_tube_length: 10.0 * units.inch,
primary_flow_rate: k_carb(100.0),
velocity_decay: 1.0,
volume: 50.0 * units.L
)
exhaust_system exhaust0(
es_params, audio_volume: 1.0, impulse_response: ir_lib.mild_exhaust_0)
exhaust_system exhaust1(
es_params, audio_volume: 0.8, impulse_response: ir_lib.mild_exhaust_0)
cylinder_bank b0(bank_params, angle: 0)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.6)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2,
sound_attenuation: 0.8
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.6)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.4)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4,
sound_attenuation: 1.0
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.4)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj4,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire5,
sound_attenuation: 1.1
)
engine
.add_cylinder_bank(b0)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 210 * units.deg,
gamma: 2.0,
lift: 9.78 * units.mm,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 215 * units.deg,
gamma: 2.0,
lift: 9.60 * units.mm,
steps: 100
)
i5_camshaft_builder camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 116 * units.deg,
exhaust_lobe_center: 116 * units.deg,
base_radius: (34.0 / 2) * units.mm
)
b0.set_cylinder_head (
audi_i5_head(
chamber_volume: 50 * units.cc,
intake_camshaft: camshaft.intake_cam,
exhaust_camshaft: camshaft.exhaust_cam,
flow_attenuation: 0.9
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 12 * units.deg)
.add_sample(2000 * units.rpm, 20 * units.deg)
.add_sample(3000 * units.rpm, 26 * units.deg)
.add_sample(4000 * units.rpm, 30 * units.deg)
.add_sample(5000 * units.rpm, 34 * units.deg)
.add_sample(6000 * units.rpm, 38 * units.deg)
.add_sample(7000 * units.rpm, 38 * units.deg)
engine.add_ignition_module(
wb_ignition(
wires: wires,
timing_curve: timing_curve,
rev_limit: 6500 * units.rpm
)
)
}
private node audi_vehicle {
alias output __out:
vehicle(
mass: 2844 * units.lb,
drag_coefficient: 0.3,
cross_sectional_area: (66 * units.inch) * (50 * units.inch),
diff_ratio: 3.55,
tire_radius: 10 * units.inch,
rolling_resistance: 500 * units.N
);
}
private node audi_transmission {
alias output __out:
transmission(
max_clutch_torque: 200 * units.lb_ft
)
.add_gear(3.417)
.add_gear(2.105)
.add_gear(1.429)
.add_gear(1.088)
.add_gear(0.970)
.add_gear(0.912);
}
public node main {
set_engine(audi_i5_2_2L())
set_vehicle(audi_vehicle())
set_transmission(audi_transmission())
}
================================================
FILE: assets/engines/atg-video-1/08_radial_5.mr
================================================
import "engine_sim.mr"
import "radial.mr"
units units()
constants constants()
impulse_response_library ir_lib()
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
}
label cycle(2 * 360 * units.deg)
public node radial_5_distributor {
input wires;
input timing_curve;
input rev_limit: 5500 * units.rpm;
alias output __out:
ignition_module(
timing_curve: timing_curve,
rev_limit: rev_limit,
limiter_duration: 0.2
)
.connect_wire(wires.wire1, (0 / 5.0) * cycle)
.connect_wire(wires.wire3, (1 / 5.0) * cycle)
.connect_wire(wires.wire5, (2 / 5.0) * cycle)
.connect_wire(wires.wire2, (3 / 5.0) * cycle)
.connect_wire(wires.wire4, (4 / 5.0) * cycle);
}
public node radial_5 {
alias output __out: engine;
engine engine(
name: "Radial 5",
starter_torque: 150 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 3000 * units.rpm,
throttle_gamma: 2.0,
hf_gain: 0.00121,
noise: 0.623,
jitter: 0.042,
simulation_frequency: 12000
)
wires wires()
label slave_throw(2.9 * units.inch)
label stroke(5.5 * units.inch)
label bore(5 * units.inch)
label rod_length(12 * units.inch)
label compression_height(1.0 * units.inch)
label rod_mass(535 * units.g)
label crank_mass(20.39 * units.kg)
label flywheel_mass(100 * units.kg)
label flywheel_radius(5 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
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: 10 * units.kg, radius: 2.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: 10 * units.lb,
mass: 10 * units.lb,
friction_torque: 10.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: (90 - 0.5 * 45) * units.deg
)
rod_journal rj0(angle: 0.0)
c0
.add_rod_journal(rj0)
piston_parameters piston_params(
mass: 200 * units.g,
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
connecting_rod_parameters cr_params(
mass: 100.0 * units.g,
moment_of_inertia: 0.0015884918028487504,
center_of_mass: 0.0,
length: rod_length - slave_throw
)
intake intake(
plenum_volume: 10.5 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(1000.0),
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.995,
velocity_decay: 1.0
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 70.0 * units.inch,
primary_flow_rate: k_carb(300.0),
velocity_decay: 0.75,
volume: 10.0 * units.L
)
exhaust_system exhaust0(
es_params,
audio_volume: 1.0,
impulse_response: ir_lib.minimal_muffling_01
)
exhaust_system exhaust1(
es_params,
audio_volume: 0.2,
impulse_response: ir_lib.minimal_muffling_01
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
connecting_rod master(
connecting_rod_parameters(
cr_params,
slave_throw: slave_throw,
length: rod_length
)
)
rod_journal sj0(angle: (0 / 5.0) * 360 * units.deg)
rod_journal sj1(angle: (1 / 5.0) * 360 * units.deg)
rod_journal sj2(angle: (2 / 5.0) * 360 * units.deg)
rod_journal sj3(angle: (3 / 5.0) * 360 * units.deg)
rod_journal sj4(angle: (4 / 5.0) * 360 * units.deg)
master
.add_slave_journal(sj0)
.add_slave_journal(sj1)
.add_slave_journal(sj2)
.add_slave_journal(sj3)
.add_slave_journal(sj4)
cylinder_bank b0(bank_params, angle: (0 / 5.0) * 360 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: master,
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1
)
cylinder_bank b1(bank_params, angle: (1 / 5.0) * 360 * units.deg)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.03)),
connecting_rod: connecting_rod(cr_params),
rod_journal: sj1,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire5
)
cylinder_bank b2(bank_params, angle: (2 / 5.0) * 360 * units.deg)
b2
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.1)),
connecting_rod: connecting_rod(cr_params),
rod_journal: sj2,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4
)
cylinder_bank b3(bank_params, angle: (3 / 5.0) * 360 * units.deg)
b3
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.1)),
connecting_rod: connecting_rod(cr_params),
rod_journal: sj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire3
)
cylinder_bank b4(bank_params, angle: (4 / 5.0) * 360 * units.deg)
b4
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.5)),
connecting_rod: connecting_rod(cr_params),
rod_journal: sj4,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
.add_cylinder_bank(b2)
.add_cylinder_bank(b3)
.add_cylinder_bank(b4)
engine.add_crankshaft(c0)
harmonic_cam_lobe lobe(
duration_at_50_thou: 260 * units.deg,
gamma: 0.9,
lift: 800 * units.thou,
steps: 100
)
b0.set_cylinder_head (
radial_head(
offset: 0 / 5.0,
lobe_profile: lobe
)
)
b1.set_cylinder_head (
radial_head(
offset: 2 / 5.0,
lobe_profile: lobe
)
)
b2.set_cylinder_head (
radial_head(
offset: 4 / 5.0,
lobe_profile: lobe
)
)
b3.set_cylinder_head (
radial_head(
offset: 1 / 5.0,
lobe_profile: lobe
)
)
b4.set_cylinder_head (
radial_head(
offset: 3 / 5.0,
lobe_profile: lobe
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 18 * units.deg)
.add_sample(1000 * units.rpm, 18 * units.deg)
.add_sample(2000 * units.rpm, 30 * units.deg)
.add_sample(3000 * units.rpm, 40 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
engine.add_ignition_module(
radial_5_distributor(
wires: wires,
timing_curve: timing_curve,
rev_limit: 3500 * units.rpm
))
}
private node propellor {
alias output __out:
vehicle(
mass: 100 * units.lb,
drag_coefficient: 0.5,
cross_sectional_area: (15 * units.inch) * (47 * units.inch),
diff_ratio: 1.0,
tire_radius: 1.0,
rolling_resistance: 300 * units.N
);
}
private node direct_drive {
alias output __out:
transmission(
max_clutch_torque: 500 * units.lb_ft
)
.add_gear(1.0);
}
public node main {
set_engine(radial_5())
set_vehicle(propellor())
set_transmission(direct_drive())
}
================================================
FILE: assets/engines/atg-video-1/README.md
================================================
## Engines from *Simulating VTEC, a radial-5 engine and more with my engine simulator (there is sound)*
This folder contains all the engines from [*Simulating VTEC, a radial-5 engine and more with my engine simulator (there is sound)*](https://youtu.be/WPCMNnM6D0k). Each file contains a node called `main` and it can be used in `main.mr` as follows.
```
import "engines/atg-video-1/<insert filename>"
main()
```
The following engines are included:
1. Honda 1-cylinder ATV engine
2. Kohler Command Pro CH750
3. Harley Davidson Shovelhead
4. Hayabusa Inline-4
5. Honda B18C5
6. Subaru EJ25 (version 1)
7. Audi Inline-5
8. Radial-5
================================================
FILE: assets/engines/atg-video-1/radial.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
label cycle(2 * 360 * units.deg)
public node radial_head {
input offset;
input lobe_profile;
input chamber_volume: 290 * units.cc;
alias output __head:
generic_small_engine_head(
chamber_volume: chamber_volume,
intake_camshaft: camshaft.intake_cam,
exhaust_camshaft: camshaft.exhaust_cam,
flow_attenuation: 2.0,
intake_runner_cross_section_area: 20.0 * units.cm2,
exhaust_runner_cross_section_area: 20.0 * units.cm2
);
radial_camshaft camshaft(
lobe_profile: lobe_profile,
offset: offset
)
}
public node radial_camshaft {
input lobe_profile;
input offset;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 1.0 * units.inch;
output intake_cam: _intake_cam;
output exhaust_cam: _exhaust_cam;
camshaft_parameters params (
advance: advance,
base_radius: base_radius
)
camshaft _intake_cam(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
_exhaust_cam
.add_lobe(rot360 - exhaust_lobe_center + offset * cycle)
_intake_cam
.add_lobe(rot360 + intake_lobe_center + offset * cycle)
}
================================================
FILE: assets/engines/atg-video-2/01_subaru_ej25_eh.mr
================================================
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);
}
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
}
private node ej25_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 67 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.75 * units.inch * 1.75 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.25 * units.inch * 1.25 * units.inch;
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)
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)
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
)
}
private node ej25_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 1.0 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (1.0 / 4) * cycle)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (1.0 / 4) * cycle)
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + (2.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (3.0 / 4) * cycle)
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + (2.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (3.0 / 4) * cycle)
}
public node subaru_ej25 {
alias output __out: engine;
engine engine(
name: "Subaru EJ25",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 6500 * units.rpm,
fuel: fuel(
max_burning_efficiency: 0.9,
turbulence_to_flame_speed_ratio: turbulence_to_flame_speed_ratio()
),
throttle_gamma: 2.0,
hf_gain: 0.01,
noise: 1.0,
jitter: 0.5,
simulation_frequency: 20000
)
wires wires()
label stroke(79 * units.mm)
label bore(99.5 * units.mm)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(9.39 * units.kg)
label flywheel_mass(6.8 * units.kg)
label flywheel_radius(6 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
label flywheel_moment(
disk_moment_of_inertia(mass: flywheel_mass, radius: flywheel_radius) * 2
)
label other_moment( // Moment from cams, pulleys, etc [estimated]
disk_moment_of_inertia(mass: 10 * units.kg, radius: 6.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 1.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: 180 * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: 180.0 * units.deg)
rod_journal rj2(angle: 0.0 * units.deg)
rod_journal rj3(angle: 180.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: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(400.0),
runner_flow_rate: k_carb(100.0),
runner_length: 12.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.9978,
velocity_decay: 1.0
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 40.0 * units.inch,
primary_flow_rate: k_carb(400.0),
velocity_decay: 1.0
)
exhaust_system exhaust0(
es_params,
length: 500 * units.mm,
audio_volume: 0.5 * 0.02,
impulse_response: ir_lib.minimal_muffling_02
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
cylinder_bank b0(bank_params, angle: 90.0 * units.deg)
cylinder_bank b1(bank_params, angle: -90.0 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1,
primary_length: 2.0 * units.inch,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
primary_length: 3.0 * units.inch,
sound_attenuation: 1.0
)
.set_cylinder_head(
ej25_head(
flip_display: true,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0)
)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire2,
primary_length: 3.0 * units.inch,
sound_attenuation: 1.1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire4,
primary_length: 5.0 * units.inch,
sound_attenuation: 0.9
)
.set_cylinder_head(
ej25_head(
flip_display: false,
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 232 * units.deg,
gamma: 2.0,
lift: 9.78 * units.mm,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 236 * units.deg,
gamma: 2.0,
lift: 9.60 * units.mm,
steps: 100
)
ej25_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 117 * units.deg,
exhaust_lobe_center: 112 * units.deg,
base_radius: (34.0 / 2) * units.mm
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 25 * units.deg)
.add_sample(1000 * units.rpm, 25 * units.deg)
.add_sample(2000 * units.rpm, 30 * units.deg)
.add_sample(3000 * units.rpm, 40 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 6800 * units.rpm,
limiter_duration: 0.16)
ignition_module
.connect_wire(wires.wire1, (0.0 / 4.0) * cycle)
.connect_wire(wires.wire3, (1.0 / 4.0) * cycle)
.connect_wire(wires.wire2, (2.0 / 4.0) * cycle)
.connect_wire(wires.wire4, (3.0 / 4.0) * cycle)
engine.add_ignition_module(ignition_module)
}
label car_mass(2700 * units.lb)
private node impreza {
alias output __out:
vehicle(
mass: 2700 * units.lb,
drag_coefficient: 0.3,
cross_sectional_area: (72 * units.inch) * (56 * units.inch),
diff_ratio: 3.9,
tire_radius: 10 * units.inch,
rolling_resistance: 0.015 * car_mass * 9.81
);
}
private node impreza_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.636)
.add_gear(2.375)
.add_gear(1.761)
.add_gear(1.346)
.add_gear(0.971)
.add_gear(0.756);
}
public node main {
set_engine(subaru_ej25())
set_vehicle(impreza())
set_transmission(impreza_transmission())
}
================================================
FILE: assets/engines/atg-video-2/02_subaru_ej25_uh.mr
================================================
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);
}
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
}
private node ej25_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 67 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.75 * units.inch * 1.75 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.25 * units.inch * 1.25 * units.inch;
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)
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)
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
)
}
private node ej25_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 1.0 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (1.0 / 4) * cycle)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + (0.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (1.0 / 4) * cycle)
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + (2.0 / 4) * cycle)
.add_lobe(rot360 - exhaust_lobe_center + (3.0 / 4) * cycle)
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + (2.0 / 4) * cycle)
.add_lobe(rot360 + intake_lobe_center + (3.0 / 4) * cycle)
}
public node subaru_ej25 {
alias output __out: engine;
engine engine(
name: "Subaru EJ25",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 6500 * units.rpm,
fuel: fuel(
max_burning_efficiency: 0.9,
turbulence_to_flame_speed_ratio: turbulence_to_flame_speed_ratio()
),
throttle_gamma: 2.0,
hf_gain: 0.01,
noise: 1.0,
jitter: 0.5,
simulation_frequency: 20000
)
wires wires()
label stroke(79 * units.mm)
label bore(99.5 * units.mm)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(9.39 * units.kg)
label flywheel_mass(6.8 * units.kg)
label flywheel_radius(6 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
label flywheel_moment(
disk_moment_of_inertia(mass: flywheel_mass, radius: flywheel_radius) * 2
)
label other_moment( // Moment from cams, pulleys, etc [estimated]
disk_moment_of_inertia(mass: 10 * units.kg, radius: 6.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 1.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: 180 * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: 180.0 * units.deg)
rod_journal rj2(angle: 0.0 * units.deg)
rod_journal rj3(angle: 180.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: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(400.0),
runner_flow_rate: k_carb(100.0),
runner_length: 12.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.9978,
velocity_decay: 1.0
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 24.0 * units.inch,
primary_flow_rate: k_carb(400.0),
velocity_decay: 1.0
)
exhaust_system exhaust0(
es_params,
length: 500 * units.mm,
audio_volume: 0.5 * 0.02,
impulse_response: ir_lib.minimal_muffling_02
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
cylinder_bank b0(bank_params, angle: 90.0 * units.deg)
cylinder_bank b1(bank_params, angle: -90.0 * units.deg)
b0
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire1,
primary_length: 2.0 * units.inch,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
primary_length: 3.0 * units.inch,
sound_attenuation: 1.0
)
.set_cylinder_head(
ej25_head(
flip_display: true,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0)
)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.001)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire2,
primary_length: 500 * units.mm,
sound_attenuation: 1.1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.002)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire4,
primary_length: 550 * units.mm,
sound_attenuation: 0.9
)
.set_cylinder_head(
ej25_head(
flip_display: false,
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 232 * units.deg,
gamma: 2.0,
lift: 9.78 * units.mm,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 236 * units.deg,
gamma: 2.0,
lift: 9.60 * units.mm,
steps: 100
)
ej25_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 117 * units.deg,
exhaust_lobe_center: 112 * units.deg,
base_radius: (34.0 / 2) * units.mm
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 25 * units.deg)
.add_sample(1000 * units.rpm, 25 * units.deg)
.add_sample(2000 * units.rpm, 30 * units.deg)
.add_sample(3000 * units.rpm, 40 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 6800 * units.rpm,
limiter_duration: 0.16)
ignition_module
.connect_wire(wires.wire1, (0.0 / 4.0) * cycle)
.connect_wire(wires.wire3, (1.0 / 4.0) * cycle)
.connect_wire(wires.wire2, (2.0 / 4.0) * cycle)
.connect_wire(wires.wire4, (3.0 / 4.0) * cycle)
engine.add_ignition_module(ignition_module)
}
label car_mass(2700 * units.lb)
private node impreza {
alias output __out:
vehicle(
mass: car_mass,
drag_coefficient: 0.3,
cross_sectional_area: (72 * units.inch) * (56 * units.inch),
diff_ratio: 3.9,
tire_radius: 10 * units.inch,
rolling_resistance: 0.015 * car_mass * 9.81
);
}
private node impreza_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.636)
.add_gear(2.375)
.add_gear(1.761)
.add_gear(1.346)
.add_gear(0.971)
.add_gear(0.756);
}
public node main {
set_engine(subaru_ej25())
set_vehicle(impreza())
set_transmission(impreza_transmission())
}
================================================
FILE: assets/engines/atg-video-2/03_2jz.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
output wire6: ignition_wire();
}
label cycle(2 * 360 * units.deg)
public node wb_ignition {
input wires;
input timing_curve;
input rev_limit: 7500 * units.rpm;
alias output __out:
ignition_module(
timing_curve: timing_curve,
rev_limit: rev_limit,
limiter_duration: 0.1
)
.connect_wire(wires.wire1, (0.0 / 6.0) * cycle)
.connect_wire(wires.wire5, (1.0 / 6.0) * cycle)
.connect_wire(wires.wire3, (2.0 / 6.0) * cycle)
.connect_wire(wires.wire6, (3.0 / 6.0) * cycle)
.connect_wire(wires.wire2, (4.0 / 6.0) * cycle)
.connect_wire(wires.wire4, (5.0 / 6.0) * cycle);
}
public node t2jz_camshaft_builder {
input lobe_profile: comp_cams_magnum_11_450_8_lobe_profile();
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 110.0 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0.0 * units.deg;
input base_radius: 0.75 * units.inch;
output intake_cam: _intake_cam;
output exhaust_cam: _exhaust_cam;
camshaft_parameters params(
advance: advance,
base_radius: base_radius
)
camshaft _intake_cam(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam(params, lobe_profile: exhaust_lobe_profile)
label rot(2 * (360 / 6.0) * units.deg)
label rot360(360 * units.deg)
// 1 5 3 6 2 4
_exhaust_cam
.add_lobe((rot360 - exhaust_lobe_center) + 0 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 4 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 2 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 5 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 1 * rot)
.add_lobe((rot360 - exhaust_lobe_center) + 3 * rot)
_intake_cam
.add_lobe(rot360 + intake_lobe_center + 0 * rot)
.add_lobe(rot360 + intake_lobe_center + 4 * rot)
.add_lobe(rot360 + intake_lobe_center + 2 * rot)
.add_lobe(rot360 + intake_lobe_center + 5 * rot)
.add_lobe(rot360 + intake_lobe_center + 1 * rot)
.add_lobe(rot360 + intake_lobe_center + 3 * rot)
}
private node t2jz_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 50 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.9 * units.inch * 1.9 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.25 * units.inch * 1.25 * units.inch;
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)
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)
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
)
}
public node t2jz {
alias output __out: engine;
wires wires()
engine engine(
name: "2JZ [I6]",
starter_torque: 200 * units.lb_ft,
redline: 6000 * units.rpm,
fuel: fuel(
max_burning_efficiency: 1.0
),
hf_gain: 0.01,
noise: 1.0,
jitter: 0.23,
simulation_frequency: 10000
)
label stroke(86.0 * units.mm)
label bore(86.0 * units.mm)
label rod_length(142 * units.mm)
label rod_mass(500 * units.g)
label compression_height(32.8 * units.mm)
label crank_mass(15 * units.kg)
label flywheel_mass(10 * units.kg)
label flywheel_radius(7 * units.inch)
label crank_moment(
disk_moment_of_inertia(mass: crank_mass, radius: stroke / 2)
)
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: 20 * units.kg, radius: 8.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 5.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: constants.pi / 2
)
// 1 5 3 6 2 4
rod_journal rj0(angle: 0 * units.deg)
rod_journal rj1(angle: 480 * units.deg)
rod_journal rj2(angle: 240 * units.deg)
rod_journal rj3(angle: 600 * units.deg)
rod_journal rj4(angle: 120 * units.deg)
rod_journal rj5(angle: 360 * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
.add_rod_journal(rj3)
.add_rod_journal(rj4)
.add_rod_journal(rj5)
piston_parameters piston_params(
mass: (200 + 50) * units.g,
blowby: 0,
compression_height: compression_height,
wrist_pin_position: 0 * units.mm,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.0 * units.L,
plenum_cross_section_area: 10.0 * units.cm2,
intake_flow_rate: k_carb(500.0),
runner_flow_rate: k_carb(200.0),
runner_length: 40.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.9965
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 40.0 * units.inch,
primary_flow_rate: k_carb(400.0),
velocity_decay: 1.0
)
exhaust_system exhaust0(
es_params,
length: 100.0 * units.inch,
audio_volume: 0.2,
impulse_response: ir_lib.mild_exhaust_0_reverb)
exhaust_system exhaust1(
es_params,
length: 100.0 * units.inch,
audio_volume: 0.2,
impulse_response: ir_lib.mild_exhaust_0_reverb)
label spacing(0.5 * units.inch)
cylinder_bank b0(bank_params, angle: 0)
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,
primary_length: spacing * 5,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.05)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire2,
primary_length: spacing * 4,
sound_attenuation: 0.95
)
.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,
primary_length: spacing * 3,
sound_attenuation: 0.9
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.05)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4,
primary_length: spacing * 3,
sound_attenuation: 0.97
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.1)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj4,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire5,
primary_length: spacing * 4,
sound_attenuation: 0.98
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.05)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj5,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire6,
primary_length: spacing * 5,
sound_attenuation: 0.93
)
engine
.add_cylinder_bank(b0)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 220 * units.deg,
gamma: 1.1,
lift: 9.78 * units.mm,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 220 * units.deg,
gamma: 1.1,
lift: 9.60 * units.mm,
steps: 100
)
t2jz_camshaft_builder camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 116 * units.deg,
exhaust_lobe_center: 116 * units.deg,
base_radius: (34.0 / 2) * units.mm
)
b0.set_cylinder_head (
t2jz_head(
chamber_volume: 50 * units.cc,
intake_camshaft: camshaft.intake_cam,
exhaust_camshaft: camshaft.exhaust_cam,
flow_attenuation: 0.9
)
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 12 * units.deg)
.add_sample(2000 * units.rpm, 20 * units.deg)
.add_sample(3000 * units.rpm, 26 * units.deg)
.add_sample(4000 * units.rpm, 30 * units.deg)
.add_sample(5000 * units.rpm, 34 * units.deg)
.add_sample(6000 * units.rpm, 38 * units.deg)
.add_sample(7000 * units.rpm, 38 * units.deg)
engine.add_ignition_module(
wb_ignition(
wires: wires,
timing_curve: timing_curve,
rev_limit: 6500 * units.rpm
)
)
}
private node supra_vehicle {
alias output __out:
vehicle(
mass: 3400 * units.lb,
drag_coefficient: 0.4,
cross_sectional_area: (66 * units.inch) * (50 * units.inch),
diff_ratio: 3.15,
tire_radius: 10 * units.inch,
rolling_resistance: 500 * units.N
);
}
private node supra_transmission {
alias output __out:
transmission(
max_clutch_torque: 500 * units.lb_ft
)
.add_gear(5.25)
.add_gear(3.36)
.add_gear(2.17)
.add_gear(1.72)
.add_gear(1.32)
.add_gear(1.0);
}
public node main {
set_engine(t2jz())
set_vehicle(supra_vehicle())
set_transmission(supra_transmission())
}
================================================
FILE: assets/engines/atg-video-2/04_60_degree_v6.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
output wire6: ignition_wire();
}
private node v6_60_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 67 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.35 * units.inch * 1.35 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 2.0 * units.inch * 2.0 * units.inch;
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)
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)
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
)
}
private node v6_60_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 0.5 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
// 1 2 3 4 5 6
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + 0 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 240 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 480 * units.deg)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + 0 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 240 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 480 * units.deg)
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + 120 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 360 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 600 * units.deg)
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + 120 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 360 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 600 * units.deg)
}
public node v6_60 {
alias output __out: engine;
engine engine(
name: "Generic 60 deg. V6",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 5500 * units.rpm,
throttle_gamma: 2.0
)
wires wires()
label stroke(3.48 * units.inch)
label bore(3.5 * units.inch)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(50 * units.lb)
label flywheel_mass(30 * units.lb)
label flywheel_radius(7 * units.inch)
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: 10 * units.kg, radius: 1.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 20.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: (90 + 30) * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: (0 + 60) * units.deg)
rod_journal rj2(angle: 240.0 * units.deg)
rod_journal rj3(angle: (240.0 + 60) * units.deg)
rod_journal rj4(angle: 120.0 * units.deg)
rod_journal rj5(angle: (120.0 + 60) * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
.add_rod_journal(rj3)
.add_rod_journal(rj4)
.add_rod_journal(rj5)
piston_parameters piston_params(
mass: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(400.0),
runner_flow_rate: k_carb(250.0),
runner_length: 4.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.994,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 20.0 * units.inch,
primary_flow_rate: k_carb(500.0),
velocity_decay: 1.0,
length: 100.0 * units.inch
)
exhaust_system exhaust0(
es_params,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
exhaust_system exhaust1(
es_params,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
label spacing(5.0 * units.inch)
cylinder_bank b0(bank_params, angle: 30.0 * units.deg)
cylinder_bank b1(bank_params, angle: -30.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: 0.9,
primary_length: spacing * 2
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 0.95,
primary_length: spacing * 1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj4,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire5,
primary_length: spacing * 0
)
.set_cylinder_head(
v6_60_head(
flip_display: true,
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0)
)
b1
.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: 0.95,
primary_length: spacing * 2
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4,
sound_attenuation: 0.9,
primary_length: spacing * 1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj5,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire6,
sound_attenuation: 1.0,
primary_length: spacing * 0
)
.set_cylinder_head(
v6_60_head(
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1,
flip_display: false)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 222 * units.deg,
gamma: 1.0,
lift: 400 * units.thou,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 226 * units.deg,
gamma: 1.0,
lift: 300 * units.thou,
steps: 100
)
v6_60_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 117 * units.deg,
exhaust_lobe_center: 112 * units.deg,
base_radius: 0.75 * units.inch
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 20 * units.deg)
.add_sample(2000 * units.rpm, 25 * units.deg)
.add_sample(3000 * units.rpm, 30 * units.deg)
.add_sample(4000 * units.rpm, 30 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 5600 * units.rpm,
limiter_duration: 0.2)
ignition_module
.connect_wire(wires.wire1, 0 * units.deg)
.connect_wire(wires.wire2, 120 * units.deg)
.connect_wire(wires.wire3, 240 * units.deg)
.connect_wire(wires.wire4, 360 * units.deg)
.connect_wire(wires.wire5, 480 * units.deg)
.connect_wire(wires.wire6, 600 * units.deg)
engine.add_ignition_module(ignition_module)
}
label car_mass(2700 * units.lb)
private node random_car {
alias output __out:
vehicle(
mass: car_mass,
drag_coefficient: 0.3,
cross_sectional_area: (72 * units.inch) * (56 * units.inch),
diff_ratio: 3.9,
tire_radius: 10 * units.inch,
rolling_resistance: 0.015 * car_mass * 9.81
);
}
private node random_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.636)
.add_gear(2.375)
.add_gear(1.761)
.add_gear(1.346)
.add_gear(0.971)
.add_gear(0.756);
}
public node main {
set_engine(v6_60())
set_vehicle(random_car())
set_transmission(random_transmission())
}
================================================
FILE: assets/engines/atg-video-2/05_odd_fire_v6.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
output wire6: ignition_wire();
}
private node odd_fire_v6_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 67 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.35 * units.inch * 1.35 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 2.0 * units.inch * 2.0 * units.inch;
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)
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)
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
)
}
private node odd_fire_v6_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 0.5 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
// 1 6 5 4 3 2
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + 0 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 480 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 240 * units.deg)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + 0 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 480 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 240 * units.deg)
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + 630 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 390 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 150 * units.deg)
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + 630 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 390 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 150 * units.deg)
}
public node odd_fire_v6_90 {
alias output __out: engine;
engine engine(
name: "Generic Odd-fire V6 (Common Rod Jnl.)",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 5500 * units.rpm,
fuel: fuel(
//max_turbulence_effect: 2.5,
//burning_efficiency_randomness: 0.5,
//max_burning_efficiency: 0.75
),
throttle_gamma: 2.0
)
wires wires()
label stroke(3.48 * units.inch)
label bore(3.5 * units.inch)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(50 * units.lb)
label flywheel_mass(30 * units.lb)
label flywheel_radius(6 * units.inch)
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: 10 * units.kg, radius: 1.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 5.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: 45 * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: 120.0 * units.deg)
rod_journal rj2(angle: 240.0 * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
piston_parameters piston_params(
mass: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(400.0),
runner_flow_rate: k_carb(250.0),
runner_length: 4.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.995,
throttle_gamma: 2.0,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 20.0 * units.inch,
primary_flow_rate: k_carb(600.0),
velocity_decay: 1.0
)
exhaust_system exhaust0(
es_params,
length: 100 * units.inch,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
exhaust_system exhaust1(
es_params,
length: 172 * units.inch,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
label spacing(5.0 * units.inch)
cylinder_bank b0(bank_params, angle: -45.0 * units.deg)
cylinder_bank b1(bank_params, angle: 45.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,
primary_length: spacing * 2
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.05)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj1,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 1.0,
primary_length: spacing * 1
)
.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.wire5,
primary_length: spacing * 0
)
.set_cylinder_head(
odd_fire_v6_head(
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0)
)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.1)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2,
sound_attenuation: 1.0,
primary_length: spacing * 2
)
.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.wire4,
sound_attenuation: 1.0,
primary_length: spacing * 1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.1)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire6,
sound_attenuation: 1.0,
primary_length: spacing * 0
)
.set_cylinder_head(
odd_fire_v6_head(
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1,
flip_display: true)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 222 * units.deg,
gamma: 1.0,
lift: 400 * units.thou,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 226 * units.deg,
gamma: 1.0,
lift: 300 * units.thou,
steps: 100
)
odd_fire_v6_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 117 * units.deg,
exhaust_lobe_center: 112 * units.deg,
base_radius: 0.75 * units.inch
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 20 * units.deg)
.add_sample(2000 * units.rpm, 25 * units.deg)
.add_sample(3000 * units.rpm, 30 * units.deg)
.add_sample(4000 * units.rpm, 30 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 5600 * units.rpm,
limiter_duration: 0.2)
ignition_module
.connect_wire(wires.wire1, 0 * units.deg)
.connect_wire(wires.wire6, 150 * units.deg)
.connect_wire(wires.wire5, 240 * units.deg)
.connect_wire(wires.wire4, 390 * units.deg)
.connect_wire(wires.wire3, 480 * units.deg)
.connect_wire(wires.wire2, 630 * units.deg)
engine.add_ignition_module(ignition_module)
}
label car_mass(2700 * units.lb)
private node random_car {
alias output __out:
vehicle(
mass: car_mass,
drag_coefficient: 0.3,
cross_sectional_area: (72 * units.inch) * (56 * units.inch),
diff_ratio: 3.9,
tire_radius: 10 * units.inch,
rolling_resistance: 0.015 * car_mass * 9.81
);
}
private node random_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.636)
.add_gear(2.375)
.add_gear(1.761)
.add_gear(1.346)
.add_gear(0.971)
.add_gear(0.756);
}
public node main {
set_engine(odd_fire_v6_90())
set_vehicle(random_car())
set_transmission(random_transmission())
}
================================================
FILE: assets/engines/atg-video-2/06_even_fire_v6.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
output wire6: ignition_wire();
}
private node even_fire_v6_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 67 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 1.35 * units.inch * 1.35 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 2.0 * units.inch * 2.0 * units.inch;
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)
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)
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
)
}
private node even_fire_v6_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 0.5 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot180(180 * units.deg)
label rot360(360 * units.deg)
// 1 6 5 4 3 2
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + 0 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 480 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 240 * units.deg)
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + 0 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 480 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 240 * units.deg)
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + 600 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 360 * units.deg)
.add_lobe(rot360 - exhaust_lobe_center + 120 * units.deg)
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + 600 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 360 * units.deg)
.add_lobe(rot360 + intake_lobe_center + 120 * units.deg)
}
public node even_fire_v6_90 {
alias output __out: engine;
engine engine(
name: "Generic Even-fire V6 (Split Rod Jnl.)",
starter_torque: 70 * units.lb_ft,
starter_speed: 500 * units.rpm,
redline: 5500 * units.rpm,
fuel: fuel(
//max_turbulence_effect: 2.5,
//burning_efficiency_randomness: 0.5,
//max_burning_efficiency: 0.75
),
throttle_gamma: 2.0
)
wires wires()
label stroke(3.48 * units.inch)
label bore(3.5 * units.inch)
label rod_length(5.142 * units.inch)
label rod_mass(535 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(50 * units.lb)
label flywheel_mass(30 * units.lb)
label flywheel_radius(6 * units.inch)
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: 10 * units.kg, radius: 1.0 * units.cm)
)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 5.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: 45 * units.deg
)
rod_journal rj0(angle: 0.0 * units.deg)
rod_journal rj1(angle: (0.0 - 30) * units.deg)
rod_journal rj2(angle: 120.0 * units.deg)
rod_journal rj3(angle: (120.0 - 30) * units.deg)
rod_journal rj4(angle: 240.0 * units.deg)
rod_journal rj5(angle: (240.0 - 30) * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
.add_rod_journal(rj3)
.add_rod_journal(rj4)
.add_rod_journal(rj5)
piston_parameters piston_params(
mass: (414 + 152) * units.g, // 414 - piston mass, 152 - pin weight
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(400.0),
runner_flow_rate: k_carb(250.0),
runner_length: 4.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(1000.0),
primary_tube_length: 20.0 * units.inch,
primary_flow_rate: k_carb(300.0),
velocity_decay: 1.0,
length: 100.0 * units.inch
)
exhaust_system exhaust0(
es_params,
length: 100.0 * units.inch,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
exhaust_system exhaust1(
es_params,
length: 172.0 * units.inch,
audio_volume: 1.0,
impulse_response: ir_lib.mild_exhaust_0_reverb
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
label spacing(5.0 * units.inch)
cylinder_bank b0(bank_params, angle: -45.0 * units.deg)
cylinder_bank b1(bank_params, angle: 45.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: 0.8,
primary_length: spacing * 2
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj2,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire3,
sound_attenuation: 0.9,
primary_length: spacing * 1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj4,
intake: intake,
exhaust_system: exhaust0,
ignition_wire: wires.wire5,
primary_length: spacing * 0
)
.set_cylinder_head(
even_fire_v6_head(
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0)
)
b1
.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: 0.6,
primary_length: spacing * 2
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj3,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire4,
sound_attenuation: 0.3,
primary_length: spacing * 1
)
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.2)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj5,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire6,
sound_attenuation: 1.1,
primary_length: spacing * 0
)
.set_cylinder_head(
even_fire_v6_head(
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1,
flip_display: true)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 222 * units.deg,
gamma: 1.0,
lift: 400 * units.thou,
steps: 100
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 226 * units.deg,
gamma: 1.0,
lift: 300 * units.thou,
steps: 100
)
even_fire_v6_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 117 * units.deg,
exhaust_lobe_center: 112 * units.deg,
base_radius: 0.75 * units.inch
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 20 * units.deg)
.add_sample(2000 * units.rpm, 25 * units.deg)
.add_sample(3000 * units.rpm, 30 * units.deg)
.add_sample(4000 * units.rpm, 30 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 5600 * units.rpm,
limiter_duration: 0.2)
ignition_module
.connect_wire(wires.wire1, 0 * units.deg)
.connect_wire(wires.wire6, 120 * units.deg)
.connect_wire(wires.wire5, 240 * units.deg)
.connect_wire(wires.wire4, 360 * units.deg)
.connect_wire(wires.wire3, 480 * units.deg)
.connect_wire(wires.wire2, 600 * units.deg)
engine.add_ignition_module(ignition_module)
}
label car_mass(2700 * units.lb)
private node random_car {
alias output __out:
vehicle(
mass: car_mass,
drag_coefficient: 0.3,
cross_sectional_area: (72 * units.inch) * (56 * units.inch),
diff_ratio: 3.9,
tire_radius: 10 * units.inch,
rolling_resistance: 0.015 * car_mass * 9.81
);
}
private node random_transmission {
alias output __out:
transmission(
max_clutch_torque: 300 * units.lb_ft
)
.add_gear(3.636)
.add_gear(2.375)
.add_gear(1.761)
.add_gear(1.346)
.add_gear(0.971)
.add_gear(0.756);
}
public node main {
set_engine(even_fire_v6_90())
set_vehicle(random_car())
set_transmission(random_transmission())
}
================================================
FILE: assets/engines/atg-video-2/07_gm_ls.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
output wire6: ignition_wire();
output wire7: ignition_wire();
output wire8: ignition_wire();
}
private node ls_v8_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 90 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 2.2 * units.inch * 2.2 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.75 * units.inch * 1.75 * units.inch;
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, 1 * 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)
function exhaust_flow(50 * units.thou)
exhaust_flow
.add_flow_sample(0 * lift_scale, 0 * flow_attenuation)
.add_flow_sample(50 * lift_scale, 1 * 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)
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
)
}
private node ls_v8_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 0.5 * units.inch;
output intake_cam_0: _intake_cam_0;
output exhaust_cam_0: _exhaust_cam_0;
output intake_cam_1: _intake_cam_1;
output exhaust_cam_1: _exhaust_cam_1;
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)
camshaft _intake_cam_1(params, lobe_profile: intake_lobe_profile)
camshaft _exhaust_cam_1(params, lobe_profile: exhaust_lobe_profile)
label rot(90 * units.deg)
label rot360(360 * units.deg)
// 1 8 7 2 6 5 4 3
_exhaust_cam_0
.add_lobe(rot360 - exhaust_lobe_center + 0 * rot) // 1
.add_lobe(rot360 - exhaust_lobe_center + 7 * rot) // 3
.add_lobe(rot360 - exhaust_lobe_center + 5 * rot) // 5
.add_lobe(rot360 - exhaust_lobe_center + 2 * rot) // 7
_intake_cam_0
.add_lobe(rot360 + intake_lobe_center + 0 * rot) // 1
.add_lobe(rot360 + intake_lobe_center + 7 * rot) // 3
.add_lobe(rot360 + intake_lobe_center + 5 * rot) // 5
.add_lobe(rot360 + intake_lobe_center + 2 * rot) // 7
_exhaust_cam_1
.add_lobe(rot360 - exhaust_lobe_center + 3 * rot) // 2
.add_lobe(rot360 - exhaust_lobe_center + 6 * rot) // 4
.add_lobe(rot360 - exhaust_lobe_center + 4 * rot) // 6
.add_lobe(rot360 - exhaust_lobe_center + 1 * rot) // 8
_intake_cam_1
.add_lobe(rot360 + intake_lobe_center + 3 * rot) // 2
.add_lobe(rot360 + intake_lobe_center + 6 * rot) // 4
.add_lobe(rot360 + intake_lobe_center + 4 * rot) // 6
.add_lobe(rot360 + intake_lobe_center + 1 * rot) // 8
}
private node turbulence_to_flame_speed_ratio {
alias output __out:
function(5.0)
.add_sample(0.0, 3.0)
.add_sample(5.0, 1.5 * 5.0)
.add_sample(10.0, 1.75 * 10.0)
.add_sample(15.0, 2.0 * 15.0)
.add_sample(20.0, 2.0 * 20.0)
.add_sample(25.0, 2.0 * 25.0)
.add_sample(30.0, 2.0 * 30.0)
.add_sample(35.0, 2.0 * 35.0)
.add_sample(40.0, 2.0 * 40.0)
.add_sample(45.0, 2.0 * 45.0);
}
public node ls_v8 {
alias output __out: engine;
engine engine(
name: "GM LS",
starter_torque: 200 * units.lb_ft,
starter_speed: 200 * units.rpm,
redline: 6500 * units.rpm,
throttle_gamma: 2.0,
fuel: fuel(
//max_turbulence_effect: 10.0,
//max_dilution_effect: 20.0,R
//burning_efficiency_randomness: 0.5,
max_burning_efficiency: 1.0,
turbulence_to_flame_speed_ratio: turbulence_to_flame_speed_ratio()
),
hf_gain: 0.01,
noise: 1.0,
jitter: 0.6,
simulation_frequency: 10000
)
wires wires()
label stroke(3.622 * units.inch)
label bore(3.78 * units.inch)
label rod_length(160 * units.mm)
label rod_mass(50 * units.g)
label compression_height(1.0 * units.inch)
label crank_mass(60 * units.lb)
label flywheel_mass(30 * units.lb)
label flywheel_radius(8 * units.inch)
label crank_moment(
1.5 * 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 * units.kg, radius: 1.0 * units.cm)
)
label v_angle(90 * units.deg)
crankshaft c0(
throw: stroke / 2,
flywheel_mass: flywheel_mass,
mass: crank_mass,
friction_torque: 20.0 * units.lb_ft,
moment_of_inertia:
crank_moment + flywheel_moment + other_moment,
position_x: 0.0,
position_y: 0.0,
tdc: 90 * units.deg - (v_angle / 2.0)
)
// 1 8 7 2 6 5 4 3
rod_journal rj0(angle: 0 * units.deg)
rod_journal rj1(angle: 270 * units.deg)
rod_journal rj2(angle: 90 * units.deg)
rod_journal rj3(angle: 180 * units.deg)
c0
.add_rod_journal(rj0)
.add_rod_journal(rj1)
.add_rod_journal(rj2)
.add_rod_journal(rj3)
piston_parameters piston_params(
// 414 - piston mass, 152 - pin weight
mass: (100) * units.g,
compression_height: compression_height,
wrist_pin_position: 0.0,
displacement: 0.0
)
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
)
intake intake(
plenum_volume: 1.325 * units.L,
plenum_cross_section_area: 20.0 * units.cm2,
intake_flow_rate: k_carb(700.0),
runner_flow_rate: k_carb(100.0),
runner_length: 12.0 * units.inch,
idle_flow_rate: k_carb(0.0),
idle_throttle_plate_position: 0.996,
velocity_decay: 0.5
)
exhaust_system_parameters es_params(
outlet_flow_rate: k_carb(1000.0),
primary_tube_length: 29.0 * units.inch,
primary_flow_rate: k_carb(500.0),
velocity_decay: 1.0
)
exhaust_system exhaust0(
es_params,
audio_volume: 4.0,
length: 100 * units.inch,
impulse_response: ir_lib.default_0
)
exhaust_system exhaust1(
es_params,
audio_volume: 4.0,
length: 172 * units.inch,
impulse_response: ir_lib.default_0
)
cylinder_bank_parameters bank_params(
bore: bore,
deck_height: stroke / 2 + rod_length + compression_height
)
label spacing(2 * units.inch)
cylinder_bank b0(bank_params, angle: -v_angle / 2.0)
cylinder_bank b1(bank_params, angle: v_angle / 2.0)
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: 1.0,
primary_length: 3 * spacing + 2 * 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.wire3,
sound_attenuation: 1.0,
primary_length: 2 * spacing + 1 * 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.wire5,
sound_attenuation: 1.0,
primary_length: 1 * spacing + 3 * 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.wire7,
sound_attenuation: 1.0,
primary_length: 0 * spacing + 5 * units.cm
)
.set_cylinder_head(
ls_v8_head(
intake_camshaft: camshaft.intake_cam_0,
exhaust_camshaft: camshaft.exhaust_cam_0,
flip_display: false,
flow_attenuation: 1.0)
)
b1
.add_cylinder(
piston: piston(piston_params, blowby: k_28inH2O(0.0)),
connecting_rod: connecting_rod(cr_params),
rod_journal: rj0,
intake: intake,
exhaust_system: exhaust1,
ignition_wire: wires.wire2,
sound_attenuation: 1.0,
primary_length: 3 * spacing + 1 * 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: exhaust1,
ignition_wire: wires.wire4,
sound_attenuation: 1.0,
primary_length: 2 * spacing + 5 * 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: exhaust1,
ignition_wire: wires.wire6,
sound_attenuation: 1.0,
primary_length: 1 * spacing + 7 * 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: exhaust1,
ignition_wire: wires.wire8,
sound_attenuation: 1.0,
primary_length: 0 * spacing + 0 * units.cm
)
.set_cylinder_head(
ls_v8_head(
intake_camshaft: camshaft.intake_cam_1,
exhaust_camshaft: camshaft.exhaust_cam_1,
flow_attenuation: 1.0,
flip_display: true)
)
engine
.add_cylinder_bank(b0)
.add_cylinder_bank(b1)
engine.add_crankshaft(c0)
harmonic_cam_lobe intake_lobe(
duration_at_50_thou: 234 * units.deg,
gamma: 1.1,
lift: 551 * units.thou,
steps: 256
)
harmonic_cam_lobe exhaust_lobe(
duration_at_50_thou: 235 * units.deg,
gamma: 1.1,
lift: 551 * units.thou,
steps: 256
)
ls_v8_camshaft camshaft(
lobe_profile: "N/A",
intake_lobe_profile: intake_lobe,
exhaust_lobe_profile: exhaust_lobe,
intake_lobe_center: 116 * units.deg,
exhaust_lobe_center: 116 * units.deg,
base_radius: 1.0 * units.inch
)
function timing_curve(1000 * units.rpm)
timing_curve
.add_sample(0000 * units.rpm, 12 * units.deg)
.add_sample(1000 * units.rpm, 12 * units.deg)
.add_sample(2000 * units.rpm, 20 * units.deg)
.add_sample(3000 * units.rpm, 30 * units.deg)
.add_sample(4000 * units.rpm, 40 * units.deg)
.add_sample(5000 * units.rpm, 40 * units.deg)
.add_sample(6000 * units.rpm, 40 * units.deg)
.add_sample(7000 * units.rpm, 40 * units.deg)
.add_sample(8000 * units.rpm, 40 * units.deg)
ignition_module ignition_module(
timing_curve: timing_curve,
rev_limit: 6800 * units.rpm,
limiter_duration: 0.2)
ignition_module
.connect_wire(wires.wire1, 0 * 90 * units.deg)
.connect_wire(wires.wire8, 1 * 90 * units.deg)
.connect_wire(wires.wire7, 2 * 90 * units.deg)
.connect_wire(wires.wire2, 3 * 90 * units.deg)
.connect_wire(wires.wire6, 4 * 90 * units.deg)
.connect_wire(wires.wire5, 5 * 90 * units.deg)
.connect_wire(wires.wire4, 6 * 90 * units.deg)
.connect_wire(wires.wire3, 7 * 90 * units.deg)
engine.add_ignition_module(ignition_module)
}
private node corvette {
alias output __out:
vehicle(
mass: 1614 * units.kg,
drag_coefficient: 0.3,
cross_sectional_area: (72 * units.inch) * (50 * units.inch),
diff_ratio: 3.42,
tire_radius: 10 * units.inch,
rolling_resistance: 200 * units.N
);
}
private node corvette_transmission {
alias output __out:
transmission(
max_clutch_torque: 500 * units.lb_ft
)
.add_gear(2.97)
.add_gear(2.07)
.add_gear(1.43)
.add_gear(1.00)
.add_gear(0.71)
.add_gear(0.57);
}
public node main {
set_engine(ls_v8())
set_vehicle(corvette())
set_transmission(corvette_transmission())
}
================================================
FILE: assets/engines/atg-video-2/08_ferrari_f136_v8.mr
================================================
import "engine_sim.mr"
units units()
constants constants()
impulse_response_library ir_lib()
label cycle(2 * 360 * units.deg)
private node wires {
output wire1: ignition_wire();
output wire2: ignition_wire();
output wire3: ignition_wire();
output wire4: ignition_wire();
output wire5: ignition_wire();
output wire6: ignition_wire();
output wire7: ignition_wire();
output wire8: ignition_wire();
}
private node f136_head {
input intake_camshaft;
input exhaust_camshaft;
input chamber_volume: 90 * units.cc;
input intake_runner_volume: 149.6 * units.cc;
input intake_runner_cross_section_area: 2.2 * units.inch * 2.2 * units.inch;
input exhaust_runner_volume: 50.0 * units.cc;
input exhaust_runner_cross_section_area: 1.75 * units.inch * 1.75 * units.inch;
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)
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)
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
)
}
private node f136_camshaft {
input lobe_profile;
input intake_lobe_profile: lobe_profile;
input exhaust_lobe_profile: lobe_profile;
input lobe_separation: 114 * units.deg;
input intake_lobe_center: lobe_separation;
input exhaust_lobe_center: lobe_separation;
input advance: 0 * units.deg;
input base_radius: 0.5 * units.inch;
output intake_cam_0: _intake_cam_0;
gitextract_1h23g_5j/
├── .github/
│ └── workflows/
│ └── cmake.yml
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── LICENSE
├── README.md
├── art/
│ └── assets.blend
├── assets/
│ ├── assets.dia
│ ├── assets.ysce
│ ├── engines/
│ │ ├── atg-video-1/
│ │ │ ├── 01_honda_trx520.mr
│ │ │ ├── 02_kohler_ch750.mr
│ │ │ ├── 03_harley_davidson_shovelhead.mr
│ │ │ ├── 04_hayabusa.mr
│ │ │ ├── 05_honda_vtec.mr
│ │ │ ├── 06_subaru_ej25.mr
│ │ │ ├── 07_audi_i5.mr
│ │ │ ├── 08_radial_5.mr
│ │ │ ├── README.md
│ │ │ └── radial.mr
│ │ ├── atg-video-2/
│ │ │ ├── 01_subaru_ej25_eh.mr
│ │ │ ├── 02_subaru_ej25_uh.mr
│ │ │ ├── 03_2jz.mr
│ │ │ ├── 04_60_degree_v6.mr
│ │ │ ├── 05_odd_fire_v6.mr
│ │ │ ├── 06_even_fire_v6.mr
│ │ │ ├── 07_gm_ls.mr
│ │ │ ├── 08_ferrari_f136_v8.mr
│ │ │ ├── 09_radial_9.mr
│ │ │ ├── 10_lfa_v10.mr
│ │ │ ├── 11_merlin_v12.mr
│ │ │ ├── 12_ferrari_412_t2.mr
│ │ │ ├── README.md
│ │ │ └── radial.mr
│ │ ├── audi/
│ │ │ └── i5.mr
│ │ ├── bmw/
│ │ │ └── M52B28.mr
│ │ ├── chevrolet/
│ │ │ ├── chev_truck_454.mr
│ │ │ └── engine_03_for_e1.mr
│ │ └── kohler/
│ │ └── kohler_ch750.mr
│ ├── main.mr
│ ├── part-library/
│ │ ├── part_library.mr
│ │ └── parts/
│ │ ├── cam_lobes.mr
│ │ ├── camshafts.mr
│ │ ├── heads.mr
│ │ ├── ignition_modules.mr
│ │ └── intakes.mr
│ └── themes/
│ ├── amateur.mr
│ ├── bubble_gum.mr
│ ├── default.mr
│ ├── minimalistic.mr
│ ├── night_vision.mr
│ └── paper.mr
├── configuration/
│ └── delta.conf
├── dependencies/
│ ├── CMakeLists.txt
│ ├── discord/
│ │ ├── CMakeLists.txt
│ │ ├── Discord.cpp
│ │ ├── Discord.h
│ │ ├── LICENSE
│ │ ├── discord_register.h
│ │ ├── discord_rpc.h
│ │ └── lib/
│ │ └── discord-rpc.lib
│ └── submodules/
│ └── CMakeLists.txt
├── es/
│ ├── actions/
│ │ └── actions.mr
│ ├── constants/
│ │ ├── constants.mr
│ │ └── units.mr
│ ├── engine_sim.mr
│ ├── infrastructure/
│ │ └── infrastructure.mr
│ ├── objects/
│ │ └── objects.mr
│ ├── part-library/
│ │ ├── part_library.mr
│ │ └── parts/
│ │ ├── cam_lobes.mr
│ │ ├── camshafts.mr
│ │ ├── heads.mr
│ │ ├── ignition_modules.mr
│ │ └── intakes.mr
│ ├── settings/
│ │ └── application_settings.mr
│ ├── sound-library/
│ │ └── impulse_responses.mr
│ ├── types/
│ │ ├── atomic_types.mr
│ │ ├── conversions.mr
│ │ └── operations.mr
│ └── utilities/
│ └── utilities.mr
├── include/
│ ├── adaptive_volume_filter.h
│ ├── afr_cluster.h
│ ├── application_settings.h
│ ├── audio_buffer.h
│ ├── butterworth_low_pass_filter.h
│ ├── camshaft.h
│ ├── combustion_chamber.h
│ ├── combustion_chamber_object.h
│ ├── connecting_rod.h
│ ├── connecting_rod_object.h
│ ├── constants.h
│ ├── convolution_filter.h
│ ├── crankshaft.h
│ ├── crankshaft_object.h
│ ├── csv_io.h
│ ├── cylinder_bank.h
│ ├── cylinder_bank_object.h
│ ├── cylinder_head.h
│ ├── cylinder_head_object.h
│ ├── cylinder_pressure_gauge.h
│ ├── cylinder_temperature_gauge.h
│ ├── delay_filter.h
│ ├── delta.h
│ ├── derivative_filter.h
│ ├── direct_throttle_linkage.h
│ ├── dtv.h
│ ├── dynamometer.h
│ ├── engine.h
│ ├── engine_sim_application.h
│ ├── engine_view.h
│ ├── exhaust_system.h
│ ├── feedback_comb_filter.h
│ ├── filter.h
│ ├── firing_order_display.h
│ ├── fuel.h
│ ├── fuel_cluster.h
│ ├── function.h
│ ├── gas_system.h
│ ├── gauge.h
│ ├── gaussian_filter.h
│ ├── geometry_generator.h
│ ├── governor.h
│ ├── ignition_module.h
│ ├── impulse_response.h
│ ├── info_cluster.h
│ ├── intake.h
│ ├── jitter_filter.h
│ ├── labeled_gauge.h
│ ├── leveling_filter.h
│ ├── load_simulation_cluster.h
│ ├── low_pass_filter.h
│ ├── mixer_cluster.h
│ ├── oscilloscope.h
│ ├── oscilloscope_cluster.h
│ ├── part.h
│ ├── performance_cluster.h
│ ├── piston.h
│ ├── piston_engine_simulator.h
│ ├── piston_object.h
│ ├── preemphasis_filter.h
│ ├── right_gauge_cluster.h
│ ├── ring_buffer.h
│ ├── scs.h
│ ├── shaders.h
│ ├── simulation_object.h
│ ├── simulator.h
│ ├── standard_valvetrain.h
│ ├── starter_motor.h
│ ├── synthesizer.h
│ ├── throttle.h
│ ├── throttle_display.h
│ ├── transmission.h
│ ├── ui_button.h
│ ├── ui_element.h
│ ├── ui_manager.h
│ ├── ui_math.h
│ ├── ui_utilities.h
│ ├── units.h
│ ├── utilities.h
│ ├── valvetrain.h
│ ├── vehicle.h
│ ├── vehicle_drag_constraint.h
│ └── vtec_valvetrain.h
├── scripting/
│ ├── include/
│ │ ├── actions.h
│ │ ├── camshaft_node.h
│ │ ├── channel_types.h
│ │ ├── compiler.h
│ │ ├── connecting_rod_node.h
│ │ ├── crankshaft_node.h
│ │ ├── cylinder_bank_node.h
│ │ ├── cylinder_head_node.h
│ │ ├── engine_context.h
│ │ ├── engine_node.h
│ │ ├── engine_sim.h
│ │ ├── exhaust_system_node.h
│ │ ├── fuel_node.h
│ │ ├── function_node.h
│ │ ├── ignition_module_node.h
│ │ ├── ignition_wire_node.h
│ │ ├── impulse_response_node.h
│ │ ├── intake_node.h
│ │ ├── language_rules.h
│ │ ├── node.h
│ │ ├── object_reference_node.h
│ │ ├── object_reference_node_output.h
│ │ ├── piranha.h
│ │ ├── piston_node.h
│ │ ├── rod_journal_node.h
│ │ ├── standard_valvetrain_node.h
│ │ ├── throttle_nodes.h
│ │ ├── transmission_node.h
│ │ ├── valvetrain_node.h
│ │ ├── vehicle_node.h
│ │ └── vtec_valvetrain_node.h
│ └── src/
│ ├── channel_types.cpp
│ ├── compiler.cpp
│ ├── engine_context.cpp
│ └── language_rules.cpp
├── src/
│ ├── afr_cluster.cpp
│ ├── audio_buffer.cpp
│ ├── camshaft.cpp
│ ├── combustion_chamber.cpp
│ ├── combustion_chamber_object.cpp
│ ├── connecting_rod.cpp
│ ├── connecting_rod_object.cpp
│ ├── convolution_filter.cpp
│ ├── crankshaft.cpp
│ ├── crankshaft_object.cpp
│ ├── cylinder_bank.cpp
│ ├── cylinder_bank_object.cpp
│ ├── cylinder_head.cpp
│ ├── cylinder_head_object.cpp
│ ├── cylinder_pressure_gauge.cpp
│ ├── cylinder_temperature_gauge.cpp
│ ├── delay_filter.cpp
│ ├── derivative_filter.cpp
│ ├── direct_throttle_linkage.cpp
│ ├── dynamometer.cpp
│ ├── engine.cpp
│ ├── engine_sim_application.cpp
│ ├── engine_view.cpp
│ ├── exhaust_system.cpp
│ ├── feedback_comb_filter.cpp
│ ├── filter.cpp
│ ├── firing_order_display.cpp
│ ├── fuel.cpp
│ ├── fuel_cluster.cpp
│ ├── function.cpp
│ ├── gas_system.cpp
│ ├── gauge.cpp
│ ├── gaussian_filter.cpp
│ ├── geometry_generator.cpp
│ ├── governor.cpp
│ ├── ignition_module.cpp
│ ├── impulse_response.cpp
│ ├── info_cluster.cpp
│ ├── intake.cpp
│ ├── jitter_filter.cpp
│ ├── labeled_gauge.cpp
│ ├── leveling_filter.cpp
│ ├── load_simulation_cluster.cpp
│ ├── low_pass_filter.cpp
│ ├── main.cpp
│ ├── mixer_cluster.cpp
│ ├── oscilloscope.cpp
│ ├── oscilloscope_cluster.cpp
│ ├── part.cpp
│ ├── performance_cluster.cpp
│ ├── piston.cpp
│ ├── piston_engine_simulator.cpp
│ ├── piston_object.cpp
│ ├── right_gauge_cluster.cpp
│ ├── shaders.cpp
│ ├── simulation_object.cpp
│ ├── simulator.cpp
│ ├── standard_valvetrain.cpp
│ ├── starter_motor.cpp
│ ├── synthesizer.cpp
│ ├── throttle.cpp
│ ├── throttle_display.cpp
│ ├── transmission.cpp
│ ├── ui_button.cpp
│ ├── ui_element.cpp
│ ├── ui_manager.cpp
│ ├── ui_math.cpp
│ ├── ui_utilities.cpp
│ ├── utilities.cpp
│ ├── valvetrain.cpp
│ ├── vehicle.cpp
│ ├── vehicle_drag_constraint.cpp
│ └── vtec_valvetrain.cpp
└── test/
├── function_test.cpp
├── gas_system_tests.cpp
└── synthesizer_tests.cpp
SYMBOL INDEX (257 symbols across 125 files)
FILE: dependencies/discord/Discord.h
function class (line 20) | class CDiscord
function CDiscord (line 76) | static CDiscord* GetDiscordManager()
FILE: dependencies/discord/discord_rpc.h
type DiscordRichPresence (line 25) | typedef struct DiscordRichPresence {
type DiscordUser (line 43) | typedef struct DiscordUser {
type DiscordEventHandlers (line 50) | typedef struct DiscordEventHandlers {
FILE: include/adaptive_volume_filter.h
function class (line 6) | class AdaptiveVolumeFilter : public Filter {
FILE: include/afr_cluster.h
function class (line 13) | class AfrCluster : public UiElement {
FILE: include/application_settings.h
type ApplicationSettings (line 5) | struct ApplicationSettings {
FILE: include/audio_buffer.h
function class (line 8) | class AudioBuffer {
function readSample (line 44) | inline int16_t readSample(int offset, int index) const {
function commitBlock (line 48) | inline void commitBlock(int length) {
function copyBuffer (line 56) | inline void copyBuffer(int16_t *dest, int offset, int length) {
FILE: include/butterworth_low_pass_filter.h
function virtual (line 24) | virtual ~ButterworthLowPassFilter() {
function T_Real (line 28) | __forceinline T_Real fast_f(T_Real sample) {
function setCutoffFrequency (line 56) | inline void setCutoffFrequency(T_Real f_c, T_Real sampleRate) {
FILE: include/camshaft.h
function class (line 10) | class Camshaft : public Part {
FILE: include/combustion_chamber.h
function class (line 13) | class CombustionChamber : public atg_scs::ForceGenerator {
FILE: include/combustion_chamber_object.h
function class (line 9) | class CombustionChamberObject : public SimulationObject {
FILE: include/connecting_rod.h
function class (line 9) | class ConnectingRod : public Part {
FILE: include/connecting_rod_object.h
function class (line 9) | class ConnectingRodObject : public SimulationObject {
FILE: include/constants.h
function namespace (line 4) | namespace constants {
FILE: include/convolution_filter.h
function class (line 6) | class ConvolutionFilter : public Filter {
FILE: include/crankshaft.h
function class (line 6) | class Crankshaft : public Part {
FILE: include/crankshaft_object.h
function class (line 9) | class CrankshaftObject : public SimulationObject {
FILE: include/cylinder_bank.h
function class (line 8) | class CylinderBank {
FILE: include/cylinder_bank_object.h
function class (line 10) | class CylinderBankObject : public SimulationObject {
FILE: include/cylinder_head.h
function class (line 13) | class CylinderHead : public Part {
FILE: include/cylinder_head_object.h
function class (line 10) | class CylinderHeadObject : public SimulationObject {
FILE: include/cylinder_pressure_gauge.h
function class (line 9) | class CylinderPressureGauge : public UiElement {
FILE: include/cylinder_temperature_gauge.h
function class (line 9) | class CylinderTemperatureGauge : public UiElement {
FILE: include/delay_filter.h
function class (line 10) | class DelayFilter : public Filter {
FILE: include/derivative_filter.h
function class (line 6) | class DerivativeFilter : public Filter {
FILE: include/direct_throttle_linkage.h
function class (line 6) | class DirectThrottleLinkage : public Throttle {
FILE: include/dynamometer.h
function class (line 8) | class Dynamometer : public atg_scs::Constraint {
FILE: include/engine.h
function class (line 23) | class Engine : public Part {
FILE: include/engine_sim_application.h
function class (line 31) | class EngineSimApplication {
FILE: include/engine_view.h
function class (line 6) | class EngineView : public UiElement {
FILE: include/exhaust_system.h
function class (line 9) | class ExhaustSystem : public Part {
FILE: include/feedback_comb_filter.h
function class (line 6) | class FeedbackCombFilter : public Filter {
FILE: include/filter.h
function class (line 4) | class Filter {
FILE: include/firing_order_display.h
function class (line 9) | class FiringOrderDisplay : public UiElement {
FILE: include/fuel.h
function class (line 10) | class Fuel {
FILE: include/fuel_cluster.h
function class (line 9) | class FuelCluster : public UiElement {
FILE: include/function.h
function class (line 6) | class Function {
FILE: include/gas_system.h
function class (line 10) | class GasSystem {
function n (line 152) | inline double GasSystem::n(double V) const {
function kineticEnergy (line 160) | inline double GasSystem::kineticEnergy(double n) const {
function bulkKineticEnergy (line 186) | inline double GasSystem::bulkKineticEnergy() const {
function mass (line 235) | inline double GasSystem::mass() const {
function volume (line 265) | inline double GasSystem::volume(double n) const {
FILE: include/gauge.h
function class (line 8) | class Gauge : public UiElement {
FILE: include/gaussian_filter.h
function class (line 8) | class GaussianFilter {
FILE: include/geometry_generator.h
function class (line 10) | class GeometryGenerator {
FILE: include/governor.h
function class (line 6) | class Governor : public Throttle {
FILE: include/ignition_module.h
function class (line 10) | class IgnitionModule : public Part {
FILE: include/impulse_response.h
function class (line 6) | class ImpulseResponse {
FILE: include/info_cluster.h
function class (line 10) | class InfoCluster : public UiElement {
FILE: include/intake.h
function class (line 8) | class Intake : public Part {
FILE: include/jitter_filter.h
function class (line 11) | class JitterFilter : public Filter {
function setJitterScale (line 49) | inline void setJitterScale(float jitterScale) { m_jitterScale = jitterSc...
FILE: include/labeled_gauge.h
function class (line 10) | class LabeledGauge : public UiElement {
FILE: include/leveling_filter.h
function class (line 8) | class LevelingFilter : public Filter {
FILE: include/load_simulation_cluster.h
function class (line 9) | class LoadSimulationCluster : public UiElement {
FILE: include/low_pass_filter.h
function class (line 8) | class LowPassFilter : public Filter {
FILE: include/mixer_cluster.h
function class (line 14) | class MixerCluster : public UiElement {
FILE: include/oscilloscope.h
function class (line 6) | class Oscilloscope : public UiElement {
FILE: include/oscilloscope_cluster.h
function class (line 9) | class OscilloscopeCluster : public UiElement {
FILE: include/part.h
function class (line 6) | class Part {
FILE: include/performance_cluster.h
function class (line 14) | class PerformanceCluster : public UiElement {
FILE: include/piston.h
function class (line 8) | class Piston : public Part {
function setCylinderConstraint (line 55) | void Piston::setCylinderConstraint(atg_scs::LineConstraint *constraint) {
FILE: include/piston_engine_simulator.h
function class (line 21) | class PistonEngineSimulator : public Simulator {
FILE: include/piston_object.h
function class (line 9) | class PistonObject : public SimulationObject {
FILE: include/preemphasis_filter.h
function class (line 10) | class PreemphasisFilter : public Filter {
FILE: include/right_gauge_cluster.h
function class (line 15) | class RightGaugeCluster : public UiElement {
FILE: include/ring_buffer.h
function initialize (line 22) | void initialize(size_t capacity) {
function destroy (line 29) | void destroy() {
function write (line 40) | inline void write(T_Data data) {
function overwrite (line 48) | inline void overwrite(T_Data data, size_t index) {
function index (line 57) | inline size_t index(size_t base, int offset) {
function T_Data (line 72) | inline T_Data read(size_t index) const {
function read (line 78) | inline void read(size_t n, T_Data *target) {
function readAndRemove (line 94) | inline void readAndRemove(size_t n, T_Data *target) {
function setWriteIndex (line 115) | inline void setWriteIndex(size_t writeIndex) {
function removeBeginning (line 119) | inline void removeBeginning(size_t n) {
function setStartIndex (line 126) | inline void setStartIndex(size_t startIndex) {
FILE: include/shaders.h
function class (line 8) | class Shaders : public dbasic::ShaderBase {
FILE: include/simulation_object.h
function class (line 10) | class SimulationObject {
FILE: include/simulator.h
function class (line 17) | class Simulator {
FILE: include/standard_valvetrain.h
function class (line 6) | class StandardValvetrain : public Valvetrain {
FILE: include/starter_motor.h
function class (line 8) | class StarterMotor : public atg_scs::Constraint {
FILE: include/synthesizer.h
function class (line 18) | class Synthesizer {
FILE: include/throttle.h
function class (line 7) | class Throttle {
FILE: include/throttle_display.h
function class (line 9) | class ThrottleDisplay : public UiElement {
FILE: include/transmission.h
function class (line 8) | class Transmission {
FILE: include/ui_button.h
function class (line 6) | class UiButton : public UiElement {
FILE: include/ui_element.h
function class (line 11) | class UiElement {
FILE: include/ui_manager.h
function class (line 9) | class UiManager {
FILE: include/ui_math.h
type Point (line 6) | struct Point {
function Point (line 101) | Point componentMin(const Point &b) const {
function m1 (line 106) | struct Bounds {
function Bounds (line 131) | Bounds add(const Bounds &b) const {
function Bounds (line 135) | Bounds move(const Point &delta) {
function Bounds (line 162) | Bounds inset(float amount) const {
function Bounds (line 166) | Bounds grow(float amount) const {
function Bounds (line 170) | Bounds verticalSplit(float s0, float s1) const {
function Bounds (line 179) | Bounds horizontalSplit(float s0, float s1) const {
type Grid (line 189) | struct Grid {
FILE: include/units.h
function namespace (line 6) | namespace units {
FILE: include/valvetrain.h
function class (line 5) | class Valvetrain {
FILE: include/vehicle.h
function class (line 6) | class Vehicle {
FILE: include/vehicle_drag_constraint.h
function class (line 7) | class VehicleDragConstraint : public atg_scs::Constraint {
FILE: include/vtec_valvetrain.h
function class (line 7) | class VtecValvetrain : public Valvetrain {
FILE: scripting/include/actions.h
function namespace (line 20) | namespace es_script {
function class (line 44) | class AddRodJournalNode : public Node {
function virtual (line 57) | virtual void _evaluate() {
function class (line 68) | class AddSlaveJournalNode : public Node {
function virtual (line 81) | virtual void _evaluate() {
function class (line 92) | class AddCrankshaftNode : public Node {
function virtual (line 105) | virtual void _evaluate() {
function class (line 116) | class AddCylinderBankNode : public Node {
function virtual (line 129) | virtual void _evaluate() {
function class (line 140) | class AddCylinderNode : public Node {
function virtual (line 160) | virtual void _evaluate() {
function class (line 187) | class AddSampleNode : public Node {
function virtual (line 201) | virtual void _evaluate() {
function class (line 213) | class AddLobeNode : public Node {
function virtual (line 226) | virtual void _evaluate() {
function class (line 237) | class SetCylinderHeadNode : public Node {
function virtual (line 250) | virtual void _evaluate() {
function class (line 271) | class k_28inH2ONode : public Node {
function virtual (line 304) | virtual void registerOutputs() {
function virtual (line 310) | virtual void _evaluate() {
function class (line 321) | class k_CarbNode : public Node {
function virtual (line 354) | virtual void registerOutputs() {
function virtual (line 360) | virtual void _evaluate() {
function class (line 371) | class ConnectIgnitionWireNode : public Node {
function virtual (line 385) | virtual void _evaluate() {
function class (line 397) | class AddIgnitionModuleNode : public Node {
function virtual (line 410) | virtual void _evaluate() {
function class (line 421) | class GenerateHarmonicCamLobeNode : public Node {
function virtual (line 437) | virtual void _evaluate() {
function class (line 473) | class AddGearNode : public Node {
function virtual (line 486) | virtual void _evaluate() {
function class (line 497) | class SetTransmissionNode : public Node {
function virtual (line 509) | virtual void _evaluate() {
function class (line 521) | class SetVehicleNode : public piranha::Node {
function virtual (line 533) | virtual void _evaluate() {
function class (line 545) | class SetApplicationSettingsNode : public Node {
function virtual (line 574) | virtual void _evaluate() {
FILE: scripting/include/camshaft_node.h
function namespace (line 14) | namespace es_script {
FILE: scripting/include/channel_types.h
function namespace (line 6) | namespace es_script {
FILE: scripting/include/compiler.h
function namespace (line 11) | namespace es_script {
FILE: scripting/include/connecting_rod_node.h
function virtual (line 18) | virtual ~ConnectingRodNode() { /* void */ }
function addRodJournal (line 20) | void addRodJournal(RodJournalNode *rodJournal) {
FILE: scripting/include/crankshaft_node.h
function namespace (line 14) | namespace es_script {
FILE: scripting/include/cylinder_bank_node.h
function namespace (line 17) | namespace es_script {
FILE: scripting/include/cylinder_head_node.h
function namespace (line 16) | namespace es_script {
FILE: scripting/include/engine_context.h
function namespace (line 8) | namespace es_script {
FILE: scripting/include/engine_node.h
function namespace (line 18) | namespace es_script {
function addCrankshaft (line 134) | void addCrankshaft(CrankshaftNode *crankshaft) {
function addCylinderBank (line 138) | void addCylinderBank(CylinderBankNode *bank) {
function addIgnitionModule (line 148) | void addIgnitionModule(IgnitionModuleNode *ignitionModule) {
function virtual (line 171) | virtual void _evaluate() {
FILE: scripting/include/exhaust_system_node.h
function namespace (line 11) | namespace es_script {
FILE: scripting/include/fuel_node.h
function namespace (line 14) | namespace es_script {
FILE: scripting/include/function_node.h
type Sample (line 14) | struct Sample {
function virtual (line 20) | virtual ~FunctionNode() { /* void */ }
function addSample (line 22) | void addSample(double x, double y) {
function setFilterRadius (line 26) | void setFilterRadius(double filterRadius) {
FILE: scripting/include/ignition_module_node.h
type Post (line 17) | struct Post {
function virtual (line 24) | virtual ~IgnitionModuleNode() { /* void */ }
FILE: scripting/include/ignition_wire_node.h
function namespace (line 13) | namespace es_script {
FILE: scripting/include/impulse_response_node.h
function namespace (line 14) | namespace es_script {
FILE: scripting/include/intake_node.h
function namespace (line 14) | namespace es_script {
FILE: scripting/include/language_rules.h
function namespace (line 6) | namespace es_script {
FILE: scripting/include/node.h
type InputTarget (line 13) | struct InputTarget {
FILE: scripting/include/object_reference_node.h
function namespace (line 8) | namespace es_script {
function virtual (line 32) | virtual void _evaluate() {
function setOutput (line 36) | void setOutput(Type *output) { m_output.setReference(output); }
FILE: scripting/include/object_reference_node_output.h
function namespace (line 8) | namespace es_script {
FILE: scripting/include/piston_node.h
function namespace (line 14) | namespace es_script {
FILE: scripting/include/rod_journal_node.h
function namespace (line 10) | namespace es_script {
FILE: scripting/include/standard_valvetrain_node.h
function namespace (line 10) | namespace es_script {
FILE: scripting/include/throttle_nodes.h
function namespace (line 8) | namespace es_script {
function class (line 24) | class DirectThrottleLinkageNode : public ThrottleNode {
function class (line 46) | class GovernorNode : public ThrottleNode {
FILE: scripting/include/transmission_node.h
function namespace (line 10) | namespace es_script {
FILE: scripting/include/valvetrain_node.h
function namespace (line 8) | namespace es_script {
FILE: scripting/include/vehicle_node.h
function namespace (line 8) | namespace es_script {
FILE: scripting/include/vtec_valvetrain_node.h
function namespace (line 10) | namespace es_script {
FILE: scripting/src/engine_context.cpp
function CylinderHead (line 17) | CylinderHead *es_script::EngineContext::getHead(CylinderHeadNode *head) {
function CylinderBank (line 29) | CylinderBank *es_script::EngineContext::getBank(CylinderBankNode *bank) ...
function Intake (line 53) | Intake *es_script::EngineContext::getIntake(IntakeNode *intake) const {
function ExhaustSystem (line 68) | ExhaustSystem *es_script::EngineContext::getExhaust(ExhaustSystemNode *e...
function Function (line 80) | Function *es_script::EngineContext::getFunction(FunctionNode *exhaust) c...
function ImpulseResponse (line 95) | ImpulseResponse *es_script::EngineContext::getImpulseResponse(
function Crankshaft (line 112) | Crankshaft *es_script::EngineContext::getCrankshaft(CrankshaftNode *node...
function ConnectingRod (line 127) | ConnectingRod *es_script::EngineContext::getConnectingRod(
FILE: src/cylinder_head.cpp
function Camshaft (line 103) | Camshaft *CylinderHead::getExhaustCamshaft() {
function Camshaft (line 107) | Camshaft *CylinderHead::getIntakeCamshaft() {
FILE: src/engine.cpp
function Crankshaft (line 135) | Crankshaft *Engine::getOutputCrankshaft() const {
function placeRod (line 163) | bool placeRod(
function Simulator (line 386) | Simulator *Engine::createSimulator(Vehicle *vehicle, Transmission *trans...
FILE: src/engine_view.cpp
function Point (line 59) | Point EngineView::getCenter() const {
function Point (line 63) | Point EngineView::getCameraPosition() const {
FILE: src/geometry_generator.cpp
function ysVector (line 1003) | ysVector GeometryGenerator::findOrthogonal(const ysVector &v) {
FILE: src/main.cpp
function WinMain (line 5) | int WINAPI WinMain(
FILE: src/oscilloscope.cpp
function Point (line 146) | Point Oscilloscope::dataPointToRenderPosition(
FILE: src/shaders.cpp
function ysError (line 21) | ysError Shaders::Initialize(
function ysError (line 82) | ysError Shaders::UseMaterial(dbasic::Material *material) {
FILE: src/simulation_object.cpp
function Piston (line 36) | Piston *SimulationObject::getForemostPiston(CylinderBank *bank, int laye...
function ysVector (line 82) | ysVector SimulationObject::tintByLayer(const ysVector &col, int layers) ...
FILE: src/standard_valvetrain.cpp
function Camshaft (line 27) | Camshaft *StandardValvetrain::getActiveIntakeCamshaft() {
function Camshaft (line 31) | Camshaft *StandardValvetrain::getActiveExhaustCamshaft() {
FILE: src/ui_element.cpp
function UiElement (line 84) | UiElement *UiElement::mouseOver(const Point &mouseLocal) {
function Point (line 101) | Point UiElement::getWorldPosition() const {
function Point (line 141) | Point UiElement::pixelsToUnits(const Point &p) const {
function Point (line 149) | Point UiElement::unitsToPixels(const Point &p) const {
function Point (line 153) | Point UiElement::getRenderPoint(const Point &p) const {
function Bounds (line 162) | Bounds UiElement::getRenderBounds(const Bounds &b) const {
function Bounds (line 166) | Bounds UiElement::unitsToPixels(const Bounds &b) const {
FILE: src/ui_utilities.cpp
function ysVector (line 3) | ysVector mix(const ysVector &c1, const ysVector &c2, float s) {
FILE: src/utilities.cpp
function modularDistance (line 5) | double modularDistance(double a0, double b0, double mod) {
function positiveMod (line 19) | double positiveMod(double x, double mod) {
function erfApproximation (line 27) | double erfApproximation(double x) {
FILE: src/vtec_valvetrain.cpp
function Camshaft (line 49) | Camshaft *VtecValvetrain::getActiveIntakeCamshaft() {
function Camshaft (line 55) | Camshaft *VtecValvetrain::getActiveExhaustCamshaft() {
FILE: test/function_test.cpp
function TEST (line 7) | TEST(FunctionTests, FunctionSanityCheck) {
function TEST (line 13) | TEST(FunctionTests, FunctionTriangleFilterTest) {
function TEST (line 30) | TEST(FunctionTests, FunctionClosestTest) {
function TEST (line 46) | TEST(FunctionTests, FunctionRandomAddTest) {
function TEST (line 59) | TEST(FunctionTests, FunctionGaussianTest) {
FILE: test/gas_system_tests.cpp
function TEST (line 9) | TEST(GasSystemTests, GasSystemSanity) {
function TEST (line 14) | TEST(GasSystemTests, AdiabaticEnergyConservation) {
function TEST (line 50) | TEST(GasSystemTests, PressureEqualizationEnergyConservation) {
function TEST (line 93) | TEST(GasSystemTests, PressureEquilibriumMaxFlow) {
function TEST (line 124) | TEST(GasSystemTests, PressureEquilibriumMaxFlowInfinite) {
function TEST (line 143) | TEST(GasSystemTests, PressureEquilibriumMaxFlowInfiniteOverpressure) {
function TEST (line 161) | TEST(GasSystemTests, FlowVariableVolume) {
function TEST (line 185) | TEST(GasSystemTests, PowerStrokeTest) {
function TEST (line 200) | TEST(GasSystemTests, IntakeStrokeTest) {
function TEST (line 251) | TEST(GasSystemTests, FlowLimit) {
function TEST (line 268) | TEST(GasSystemTests, IdealGasLaw) {
function TEST (line 282) | TEST(GasSystemTests, CompositionSanityCheck) {
function TEST (line 331) | TEST(GasSystemTests, ChokedFlowTest) {
function TEST (line 372) | TEST(GasSystemTests, CfmConversions) {
function TEST (line 394) | TEST(GasSystemTests, FlowRateConstant) {
function TEST (line 417) | TEST(GasSystemTests, GasVelocityReducesStaticPressure) {
function TEST (line 500) | TEST(GasSystemTests, GasVelocityProducesScavengingEffect) {
function TEST (line 632) | TEST(GasSystemTests, GasVelocityProducesRamEffect) {
function TEST (line 778) | TEST(GasSystemTests, GasVelocityStabilizesInClosedSystem) {
FILE: test/synthesizer_tests.cpp
function setupStandardSynthesizer (line 9) | void setupStandardSynthesizer(Synthesizer &synth) {
function setupSynchronizedSynthesizer (line 28) | void setupSynchronizedSynthesizer(Synthesizer &synth) {
function TEST (line 47) | TEST(SynthesizerTests, SynthesizerSanityCheck) {
function TEST (line 110) | TEST(SynthesizerTests, SynthesizerSystemTestSingleThread) {
function TEST (line 150) | TEST(SynthesizerTests, SynthesizerSystemTest) {
Condensed preview — 273 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,045K chars).
[
{
"path": ".github/workflows/cmake.yml",
"chars": 2322,
"preview": "name: CMake\non:\n push:\n branches: [ \"master\" ]\n pull_request:\n branches: [ \"master\" ]\n\n\nenv:\n # Customize the C"
},
{
"path": ".gitignore",
"chars": 170,
"preview": "# Ignore user's workspace\nworkspace/\n\n# Build directory\nbuild/\n\n# clangd cache and code completion files\n.cache\ncompile_"
},
{
"path": ".gitmodules",
"chars": 755,
"preview": "[submodule \"dependencies/submodules/delta-studio\"]\n\tpath = dependencies/submodules/delta-studio\n\turl = https://github.co"
},
{
"path": "CMakeLists.txt",
"chars": 8780,
"preview": "cmake_minimum_required(VERSION 3.10)\n\noption(DTV \"Enable video output\" OFF)\noption(PIRANHA_ENABLED \"Enable scripting inp"
},
{
"path": "LICENSE",
"chars": 1065,
"preview": "Copyright 2022 AngeTheGreat (Ange Yaghi)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy o"
},
{
"path": "README.md",
"chars": 12925,
"preview": "# Engine Simulator\n\n---\n# Engine Simulator has moved!\n\nT"
},
{
"path": "assets/engines/atg-video-1/01_honda_trx520.mr",
"chars": 4626,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/atg-video-1/02_kohler_ch750.mr",
"chars": 5118,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/atg-video-1/03_harley_davidson_shovelhead.mr",
"chars": 6610,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/atg-video-1/04_hayabusa.mr",
"chars": 10668,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-1/05_honda_vtec.mr",
"chars": 12402,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-1/06_subaru_ej25.mr",
"chars": 11654,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-1/07_audi_i5.mr",
"chars": 12184,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/atg-video-1/08_radial_5.mr",
"chars": 8254,
"preview": "import \"engine_sim.mr\"\n\nimport \"radial.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\npriva"
},
{
"path": "assets/engines/atg-video-1/README.md",
"chars": 634,
"preview": "## Engines from *Simulating VTEC, a radial-5 engine and more with my engine simulator (there is sound)*\n\nThis folder con"
},
{
"path": "assets/engines/atg-video-1/radial.mr",
"chars": 1609,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nlabel cycle(2 * 360 * units.deg)\n\npublic node radial_head {\n"
},
{
"path": "assets/engines/atg-video-2/01_subaru_ej25_eh.mr",
"chars": 12553,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/02_subaru_ej25_uh.mr",
"chars": 12542,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/03_2jz.mr",
"chars": 13057,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/atg-video-2/04_60_degree_v6.mr",
"chars": 13157,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/05_odd_fire_v6.mr",
"chars": 13160,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/06_even_fire_v6.mr",
"chars": 13424,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/07_gm_ls.mr",
"chars": 15514,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/08_ferrari_f136_v8.mr",
"chars": 15273,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/09_radial_9.mr",
"chars": 11624,
"preview": "import \"engine_sim.mr\"\n\nimport \"radial.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\npriva"
},
{
"path": "assets/engines/atg-video-2/10_lfa_v10.mr",
"chars": 15801,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/11_merlin_v12.mr",
"chars": 16879,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/12_ferrari_412_t2.mr",
"chars": 18080,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\nlabel cycle(2 * 360 * unit"
},
{
"path": "assets/engines/atg-video-2/README.md",
"chars": 746,
"preview": "## Engines from *Simulating an F1 V12, cross-plane and flat-plane V8s, unequal length headers and more*\n\nThis folder con"
},
{
"path": "assets/engines/atg-video-2/radial.mr",
"chars": 1609,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nlabel cycle(2 * 360 * units.deg)\n\npublic node radial_head {\n"
},
{
"path": "assets/engines/audi/i5.mr",
"chars": 7054,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/bmw/M52B28.mr",
"chars": 10984,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nlabel cycle(2 * 360 * uni"
},
{
"path": "assets/engines/chevrolet/chev_truck_454.mr",
"chars": 6923,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/chevrolet/engine_03_for_e1.mr",
"chars": 6127,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/engines/kohler/kohler_ch750.mr",
"chars": 4110,
"preview": "import \"engine_sim.mr\"\n\nunits units()\nconstants constants()\nimpulse_response_library ir_lib()\n\nprivate node wires {\n "
},
{
"path": "assets/main.mr",
"chars": 128,
"preview": "import \"engine_sim.mr\"\nimport \"themes/default.mr\"\nimport \"engines/atg-video-2/01_subaru_ej25_eh.mr\"\n\nuse_default_theme()"
},
{
"path": "assets/part-library/part_library.mr",
"chars": 176,
"preview": "public import \"parts/cam_lobes.mr\"\npublic import \"parts/camshafts.mr\"\npublic import \"parts/heads.mr\"\npublic import \"part"
},
{
"path": "assets/part-library/parts/cam_lobes.mr",
"chars": 1264,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\nprivate node add_sym_sample {\n input angle;\n input lift;\n input "
},
{
"path": "assets/part-library/parts/camshafts.mr",
"chars": 4365,
"preview": "private import \"cam_lobes.mr\"\n\nprivate import \"engine_sim.mr\"\n\nunits units()\n\npublic node chevy_bbc_camshaft_builder {\n "
},
{
"path": "assets/part-library/parts/heads.mr",
"chars": 6754,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\nprivate node add_flow_sample {\n input lift;\n input flow;\n input "
},
{
"path": "assets/part-library/parts/ignition_modules.mr",
"chars": 1373,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\nlabel cycle(2 * 360 * units.deg)\n\npublic node chevy_bbc_distributor {\n "
},
{
"path": "assets/part-library/parts/intakes.mr",
"chars": 1358,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\npublic node chevy_bbc_stock_intake {\n input carburetor_cfm: 650.0;\n "
},
{
"path": "assets/themes/amateur.mr",
"chars": 880,
"preview": "import \"engine_sim.mr\"\n\nunit_names units()\npublic node use_amateur_theme {\n input start_fullscreen: false;\n input "
},
{
"path": "assets/themes/bubble_gum.mr",
"chars": 883,
"preview": "import \"engine_sim.mr\"\n\nunit_names units()\npublic node use_bubble_gum_theme {\n input start_fullscreen: false;\n inp"
},
{
"path": "assets/themes/default.mr",
"chars": 881,
"preview": "import \"engine_sim.mr\"\n\nunit_names units()\npublic node use_default_theme {\n input start_fullscreen: false;\n input "
},
{
"path": "assets/themes/minimalistic.mr",
"chars": 885,
"preview": "import \"engine_sim.mr\"\n\nunit_names units()\npublic node use_minimalistic_theme {\n input start_fullscreen: false;\n i"
},
{
"path": "assets/themes/night_vision.mr",
"chars": 885,
"preview": "import \"engine_sim.mr\"\n\nunit_names units()\npublic node use_night_vision_theme {\n input start_fullscreen: false;\n i"
},
{
"path": "assets/themes/paper.mr",
"chars": 878,
"preview": "import \"engine_sim.mr\"\n\nunit_names units()\npublic node use_paper_theme {\n input start_fullscreen: false;\n input sp"
},
{
"path": "configuration/delta.conf",
"chars": 14,
"preview": "/delta\n/assets"
},
{
"path": "dependencies/CMakeLists.txt",
"chars": 90,
"preview": "add_subdirectory(submodules)\n\nif (DISCORD_ENABLED)\n add_subdirectory(discord)\nendif ()\n"
},
{
"path": "dependencies/discord/CMakeLists.txt",
"chars": 55,
"preview": "set_property(TARGET discord PROPERTY FOLDER \"discord\")\n"
},
{
"path": "dependencies/discord/Discord.cpp",
"chars": 2788,
"preview": "#include \"Discord.h\"\n#include <stdio.h>\n#include <time.h>\n\n\nconst char* DISCORD_APPLICATION_ID = \"1008609936256811038\";"
},
{
"path": "dependencies/discord/Discord.h",
"chars": 1575,
"preview": "/*****************************************************************************\n*\n* File\t\t\t: Discord.h\n* Author\t\t: SanGa"
},
{
"path": "dependencies/discord/LICENSE",
"chars": 1053,
"preview": "Copyright 2017 Discord, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis softw"
},
{
"path": "dependencies/discord/discord_register.h",
"chars": 603,
"preview": "#pragma once\n\n#if defined(DISCORD_DYNAMIC_LIB)\n# if defined(_WIN32)\n# if defined(DISCORD_BUILDING_SDK)\n# defin"
},
{
"path": "dependencies/discord/discord_rpc.h",
"chars": 2678,
"preview": "#pragma once\n\n// clang-format off\n\n#if defined(DISCORD_DYNAMIC_LIB)\n# if defined(_WIN32)\n# if defined(DISCORD_BUILD"
},
{
"path": "dependencies/submodules/CMakeLists.txt",
"chars": 1061,
"preview": "add_subdirectory(delta-studio)\n\nset_property(TARGET delta-basic PROPERTY FOLDER \"delta\")\nset_property(TARGET delta-basic"
},
{
"path": "es/actions/actions.mr",
"chars": 5518,
"preview": "module {\n @name: \"Actions\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n}\n\npr"
},
{
"path": "es/constants/constants.mr",
"chars": 256,
"preview": "module {\n @name: \"Units\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n}\n\npriv"
},
{
"path": "es/constants/units.mr",
"chars": 2628,
"preview": "module {\n @name: \"Units\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n}\n\npriv"
},
{
"path": "es/engine_sim.mr",
"chars": 740,
"preview": "module {\n @name: \"Engine Simulator Library\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, "
},
{
"path": "es/infrastructure/infrastructure.mr",
"chars": 188,
"preview": "module {\n @name: \"Infrastructure\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi"
},
{
"path": "es/objects/objects.mr",
"chars": 20805,
"preview": "module {\n @name: \"Objects\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n}\n\npr"
},
{
"path": "es/part-library/part_library.mr",
"chars": 176,
"preview": "public import \"parts/cam_lobes.mr\"\npublic import \"parts/camshafts.mr\"\npublic import \"parts/heads.mr\"\npublic import \"part"
},
{
"path": "es/part-library/parts/cam_lobes.mr",
"chars": 1264,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\nprivate node add_sym_sample {\n input angle;\n input lift;\n input "
},
{
"path": "es/part-library/parts/camshafts.mr",
"chars": 5381,
"preview": "private import \"cam_lobes.mr\"\n\nprivate import \"engine_sim.mr\"\n\nunits units()\n\npublic node chevy_bbc_camshaft_builder {\n "
},
{
"path": "es/part-library/parts/heads.mr",
"chars": 6753,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\npublic node add_flow_sample {\n input lift;\n input flow;\n input t"
},
{
"path": "es/part-library/parts/ignition_modules.mr",
"chars": 1657,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\nlabel cycle(2 * 360 * units.deg)\n\npublic node chevy_bbc_distributor {\n "
},
{
"path": "es/part-library/parts/intakes.mr",
"chars": 1358,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\npublic node chevy_bbc_stock_intake {\n input carburetor_cfm: 650.0;\n "
},
{
"path": "es/settings/application_settings.mr",
"chars": 804,
"preview": "private import \"engine_sim.mr\"\n\nunits units()\n\npublic node set_application_settings => __engine_sim__set_application_set"
},
{
"path": "es/sound-library/impulse_responses.mr",
"chars": 1179,
"preview": "private import \"engine_sim.mr\"\n\npublic node impulse_response_library {\n output default_0: impulse_response(filename: "
},
{
"path": "es/types/atomic_types.mr",
"chars": 2059,
"preview": "module {\n @name: \"Atomic Types\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n"
},
{
"path": "es/types/conversions.mr",
"chars": 569,
"preview": "module {\n @name: \"Conversions\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n}"
},
{
"path": "es/types/operations.mr",
"chars": 1700,
"preview": "module {\n @name: \"Operations\"\n @author: \"ATG (Ange Yaghi)\"\n @copyright: \"Copyright 2022, Ange Yaghi\"\n}\n"
},
{
"path": "es/utilities/utilities.mr",
"chars": 307,
"preview": "private import \"engine_sim.mr\"\n\nnode rod_moment_of_inertia {\n input mass;\n input length;\n alias output __moment"
},
{
"path": "include/adaptive_volume_filter.h",
"chars": 517,
"preview": "#ifndef ATG_ENGINE_SIM_ADAPTIVE_VOLUME_FILTER_H\n#define ATG_ENGINE_SIM_ADAPTIVE_VOLUME_FILTER_H\n\n#include \"filter.h\"\n\ncl"
},
{
"path": "include/afr_cluster.h",
"chars": 711,
"preview": "#ifndef ATG_ENGINE_SIM_AFR_CLUSTER_H\n#define ATG_ENGINE_SIM_AFR_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#include \"engine.h\"\n"
},
{
"path": "include/application_settings.h",
"chars": 776,
"preview": "#ifndef ATG_ENGINE_SIM_APPLICATION_SETTINGS_H\n#define ATG_ENGINE_SIM_APPLICATION_SETTINGS_H\n#include <string>\n\nstruct Ap"
},
{
"path": "include/audio_buffer.h",
"chars": 2472,
"preview": "#ifndef ATG_ENGINE_SIM_AUDIO_BUFFER_H\n#define ATG_ENGINE_SIM_AUDIO_BUFFER_H\n\n#include \"scs.h\"\n\n#include <stdint.h>\n\nclas"
},
{
"path": "include/butterworth_low_pass_filter.h",
"chars": 2297,
"preview": "#ifndef ATG_ENGINE_SIM_BUTTERWORTH_LOW_PASS_FILTER_H\n#define ATG_ENGINE_SIM_BUTTERWORTH_LOW_PASS_FILTER_H\n\n#include \"fil"
},
{
"path": "include/camshaft.h",
"chars": 1473,
"preview": "#ifndef ATG_ENGINE_SIM_CAMSHAFT_H\n#define ATG_ENGINE_SIM_CAMSHAFT_H\n\n#include \"part.h\"\n\n#include \"function.h\"\n#include \""
},
{
"path": "include/combustion_chamber.h",
"chars": 3647,
"preview": "#ifndef ATG_ENGINE_SIM_COMBUSTION_CHAMBER_H\n#define ATG_ENGINE_SIM_COMBUSTION_CHAMBER_H\n\n#include \"scs.h\"\n\n#include \"pis"
},
{
"path": "include/combustion_chamber_object.h",
"chars": 689,
"preview": "#ifndef ATG_ENGINE_SIM_COMBUSTION_CHAMBER_OBJECT_H\n#define ATG_ENGINE_SIM_COMBUSTION_CHAMBER_OBJECT_H\n\n#include \"simulat"
},
{
"path": "include/connecting_rod.h",
"chars": 2276,
"preview": "#ifndef ATG_ENGINE_CONNECTING_ROD_H\n#define ATG_ENGINE_CONNECTING_ROD_H\n\n#include \"part.h\"\n\n#include \"crankshaft.h\"\n\ncla"
},
{
"path": "include/connecting_rod_object.h",
"chars": 705,
"preview": "#ifndef ATG_ENGINE_SIM_CONNECTING_ROD_OBJECT_H\n#define ATG_ENGINE_SIM_CONNECTING_ROD_OBJECT_H\n\n#include \"simulation_obje"
},
{
"path": "include/constants.h",
"chars": 454,
"preview": "#ifndef ATG_ENGINE_SIM_CONSTANTS_H\n#define ATG_ENGINE_SIM_CONSTANTS_H\n\nnamespace constants {\n\n extern constexpr doubl"
},
{
"path": "include/convolution_filter.h",
"chars": 668,
"preview": "#ifndef ATG_ENGINE_SIM_CONVOLUTION_FILTER_H\n#define ATG_ENGINE_SIM_CONVOLUTION_FILTER_H\n\n#include \"filter.h\"\n\nclass Conv"
},
{
"path": "include/crankshaft.h",
"chars": 1885,
"preview": "#ifndef ATG_ENGINE_SIM_CRANKSHAFT_H\n#define ATG_ENGINE_SIM_CRANKSHAFT_H\n\n#include \"part.h\"\n\nclass Crankshaft : public Pa"
},
{
"path": "include/crankshaft_object.h",
"chars": 562,
"preview": "#ifndef ATG_ENGINE_SIM_CRANKSHAFT_OBJECT_H\n#define ATG_ENGINE_SIM_CRANKSHAFT_OBJECT_H\n\n#include \"simulation_object.h\"\n\n#"
},
{
"path": "include/csv_io.h",
"chars": 167,
"preview": "#ifndef ATG_ENGINE_SIM_CSV_IO_H\n#define ATG_ENGINE_SIM_CSV_IO_H\n\n#include \"../dependencies/submodules/csv-io/include/csv"
},
{
"path": "include/cylinder_bank.h",
"chars": 1611,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_BANK_H\n#define ATG_ENGINE_SIM_CYLINDER_BANK_H\n\n#include \"part.h\"\n\n#include \"crankshaft.h"
},
{
"path": "include/cylinder_bank_object.h",
"chars": 685,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_BANK_OBJECT_H\n#define ATG_ENGINE_SIM_CYLINDER_BANK_OBJECT_H\n\n#include \"simulation_object"
},
{
"path": "include/cylinder_head.h",
"chars": 3332,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_HEAD_H\n#define ATG_ENGINE_SIM_CYLINDER_HEAD_H\n\n#include \"part.h\"\n\n#include \"function.h\"\n"
},
{
"path": "include/cylinder_head_object.h",
"chars": 820,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_HEAD_OBJECT_H\n#define ATG_ENGINE_SIM_CYLINDER_HEAD_OBJECT_H\n\n#include \"simulation_object"
},
{
"path": "include/cylinder_pressure_gauge.h",
"chars": 613,
"preview": "#ifndef ATG_ENGINE_SIM_UI_CYLINDER_PRESSURE_GAUGE_H\n#define ATG_ENGINE_SIM_UI_CYLINDER_PRESSURE_GAUGE_H\n\n#include \"ui_el"
},
{
"path": "include/cylinder_temperature_gauge.h",
"chars": 633,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_TEMPERATURE_GAUGE_H\n#define ATG_ENGINE_SIM_CYLINDER_TEMPERATURE_GAUGE_H\n\n#include \"ui_el"
},
{
"path": "include/delay_filter.h",
"chars": 1110,
"preview": "#ifndef ATG_ENGINE_SIM_DELAY_FILTER_H\n#define ATG_ENGINE_SIM_DELAY_FILTER_H\n\n#include \"filter.h\"\n\n#include \"ring_buffer."
},
{
"path": "include/delta.h",
"chars": 237,
"preview": "#ifndef DELTA_TEMPLATE_DELTA_INCLUDES_H\n#define DELTA_TEMPLATE_DELTA_INCLUDES_H\n\n#include <delta-studio/include/yds_core"
},
{
"path": "include/derivative_filter.h",
"chars": 390,
"preview": "#ifndef ATG_ENGINE_SIM_DERIVATIVE_FILTER_H\n#define ATG_ENGINE_SIM_DERIVATIVE_FILTER_H\n\n#include \"filter.h\"\n\nclass Deriva"
},
{
"path": "include/direct_throttle_linkage.h",
"chars": 573,
"preview": "#ifndef ATG_ENGINE_SIM_DIRECT_THROTTLE_LINKAGE_H\n#define ATG_ENGINE_SIM_DIRECT_THROTTLE_LINKAGE_H\n\n#include \"throttle.h\""
},
{
"path": "include/dtv.h",
"chars": 162,
"preview": "#ifndef ATG_ENGINE_SIM_DTV_H\n#define ATG_ENGINE_SIM_DTV_H\n\n#include \"../dependencies/submodules/direct-to-video/include/"
},
{
"path": "include/dynamometer.h",
"chars": 597,
"preview": "#ifndef ATG_ENGINE_SIM_DYNAMOMETER_H\n#define ATG_ENGINE_SIM_DYNAMOMETER_H\n\n#include \"scs.h\"\n\n#include \"crankshaft.h\"\n\ncl"
},
{
"path": "include/engine.h",
"chars": 5311,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_H\n#define ATG_ENGINE_SIM_ENGINE_H\n\n#include \"part.h\"\n\n#include \"piston.h\"\n#include \"connec"
},
{
"path": "include/engine_sim_application.h",
"chars": 6118,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_SIM_APPLICATION_H\n#define ATG_ENGINE_SIM_ENGINE_SIM_APPLICATION_H\n\n#include \"geometry_gene"
},
{
"path": "include/engine_view.h",
"chars": 854,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_VIEW_H\n#define ATG_ENGINE_SIM_ENGINE_VIEW_H\n\n#include \"ui_element.h\"\n\nclass EngineView : p"
},
{
"path": "include/exhaust_system.h",
"chars": 1934,
"preview": "#ifndef ATG_ENGINE_SIM_EXHAUST_SYSTEM_H\n#define ATG_ENGINE_SIM_EXHAUST_SYSTEM_H\n\n#include \"part.h\"\n\n#include \"gas_system"
},
{
"path": "include/feedback_comb_filter.h",
"chars": 515,
"preview": "#ifndef ATG_ENGINE_SIM_FEEDBACK_COMB_FILTER_H\n#define ATG_ENGINE_SIM_FEEDBACK_COMB_FILTER_H\n\n#include \"filter.h\"\n\nclass "
},
{
"path": "include/filter.h",
"chars": 250,
"preview": "#ifndef ATG_ENGINE_SIM_FILTER_H\n#define ATG_ENGINE_SIM_FILTER_H\n\nclass Filter {\n public:\n Filter();\n vi"
},
{
"path": "include/firing_order_display.h",
"chars": 606,
"preview": "#ifndef ATG_ENGINE_SIM_FIRING_ORDER_DISPLAY_H\n#define ATG_ENGINE_SIM_FIRING_ORDER_DISPLAY_H\n\n#include \"ui_element.h\"\n\n#i"
},
{
"path": "include/fuel.h",
"chars": 2458,
"preview": "#ifndef ATG_ENGINE_FUEL_H\n#define ATG_ENGINE_FUEL_H\n\n#include \"units.h\"\n\n#include \"function.h\"\n\n#include <string>\n\nclass"
},
{
"path": "include/fuel_cluster.h",
"chars": 587,
"preview": "#ifndef ATG_ENGINE_SIM_FUEL_CLUSTER_H\n#define ATG_ENGINE_SIM_FUEL_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#include \"engine.h"
},
{
"path": "include/function.h",
"chars": 1200,
"preview": "#ifndef ATG_ENGINE_SIM_FUNCTION_H\n#define ATG_ENGINE_SIM_FUNCTION_H\n\n#include \"gaussian_filter.h\"\n\nclass Function {\n "
},
{
"path": "include/gas_system.h",
"chars": 8608,
"preview": "#ifndef ATG_ENGINE_SIM_GAS_SYSTEM_H\n#define ATG_ENGINE_SIM_GAS_SYSTEM_H\n\n#include \"constants.h\"\n#include \"units.h\"\n\n#inc"
},
{
"path": "include/gauge.h",
"chars": 1600,
"preview": "#ifndef ATG_ENGINE_SIM_GAUGE_H\n#define ATG_ENGINE_SIM_GAUGE_H\n\n#include \"ui_element.h\"\n\n#include <string>\n\nclass Gauge :"
},
{
"path": "include/gaussian_filter.h",
"chars": 742,
"preview": "#ifndef ATG_ENGINE_SIM_GUASSIAN_FILTER_H\n#define ATG_ENGINE_SIM_GUASSIAN_FILTER_H\n\n#include \"scs.h\"\n\n#include \"crankshaf"
},
{
"path": "include/geometry_generator.h",
"chars": 5287,
"preview": "#ifndef ATG_ENGINE_SIM_GEOMETRY_GENERATOR_H\n#define ATG_ENGINE_SIM_GEOMETRY_GENERATOR_H\n\n#include \"delta.h\"\n\n#include \"."
},
{
"path": "include/governor.h",
"chars": 819,
"preview": "#ifndef ATG_ENGINE_SIM_GOVERNOR_H\n#define ATG_ENGINE_SIM_GOVERNOR_H\n\n#include \"throttle.h\"\n\nclass Governor : public Thro"
},
{
"path": "include/ignition_module.h",
"chars": 1385,
"preview": "#ifndef ATG_ENGINE_SIM_IGNITION_MODULE_H\n#define ATG_ENGINE_SIM_IGNITION_MODULE_H\n\n#include \"part.h\"\n\n#include \"cranksha"
},
{
"path": "include/impulse_response.h",
"chars": 478,
"preview": "#ifndef ATG_ENGINE_SIM_IMPULSE_RESPONSE_H\n#define ATG_ENGINE_SIM_IMPULSE_RESPONSE_H\n\n#include <string>\n\nclass ImpulseRes"
},
{
"path": "include/info_cluster.h",
"chars": 703,
"preview": "#ifndef ATG_ENGINE_SIM_INFO_CLUSTER_H\n#define ATG_ENGINE_SIM_INFO_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#include \"engine.h"
},
{
"path": "include/intake.h",
"chars": 2025,
"preview": "#ifndef ATG_ENGINE_SIM_INTAKE_H\n#define ATG_ENGINE_SIM_INTAKE_H\n\n#include \"part.h\"\n\n#include \"gas_system.h\"\n\nclass Intak"
},
{
"path": "include/jitter_filter.h",
"chars": 1829,
"preview": "#ifndef ATG_ENGINE_SIM_JITTER_FILTER_H\n#define ATG_ENGINE_SIM_JITTER_FILTER_H\n\n#include \"filter.h\"\n\n#include \"butterwort"
},
{
"path": "include/labeled_gauge.h",
"chars": 721,
"preview": "#ifndef ATG_ENGINE_SIM_LABELED_GAUGE_H\n#define ATG_ENGINE_SIM_LABELED_GAUGE_H\n\n#include \"ui_element.h\"\n\n#include \"gauge."
},
{
"path": "include/leveling_filter.h",
"chars": 548,
"preview": "#ifndef ATG_ENGINE_SIM_LEVELING_FILTER_H\n#define ATG_ENGINE_SIM_LEVELING_FILTER_H\n\n#include \"filter.h\"\n\n#include \"functi"
},
{
"path": "include/load_simulation_cluster.h",
"chars": 1505,
"preview": "#ifndef ATG_ENGINE_SIM_LOAD_SIMULATION_CLUSTER_H\n#define ATG_ENGINE_SIM_LOAD_SIMULATION_CLUSTER_H\n\n#include \"ui_element."
},
{
"path": "include/low_pass_filter.h",
"chars": 742,
"preview": "#ifndef ATG_ENGINE_SIM_LOW_PASS_FILTER_H\n#define ATG_ENGINE_SIM_LOW_PASS_FILTER_H\n\n#include \"filter.h\"\n\n#include \"consta"
},
{
"path": "include/mixer_cluster.h",
"chars": 967,
"preview": "#ifndef ATG_ENGINE_SIM_MIXER_CLUSTER_H\n#define ATG_ENGINE_SIM_MIXER_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#include \"engine"
},
{
"path": "include/oscilloscope.h",
"chars": 1194,
"preview": "#ifndef ATG_ENGINE_SIM_OSCILLOSCOPE_H\n#define ATG_ENGINE_SIM_OSCILLOSCOPE_H\n\n#include \"ui_element.h\"\n\nclass Oscilloscope"
},
{
"path": "include/oscilloscope_cluster.h",
"chars": 2600,
"preview": "#ifndef ATG_ENGINE_SIM_OSCILLOSCOPE_CLUSTER_H\n#define ATG_ENGINE_SIM_OSCILLOSCOPE_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#i"
},
{
"path": "include/part.h",
"chars": 253,
"preview": "#ifndef ATG_ENGINE_SIM_PART_H\n#define ATG_ENGINE_SIM_PART_H\n\n#include \"scs.h\"\n\nclass Part {\n public:\n Part();\n"
},
{
"path": "include/performance_cluster.h",
"chars": 1344,
"preview": "#ifndef ATG_ENGINE_SIM_PERFORMANCE_CLUSTER_H\n#define ATG_ENGINE_SIM_PERFORMANCE_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#inc"
},
{
"path": "include/piston.h",
"chars": 1853,
"preview": "#ifndef ATG_ENGINE_SIM_PISTON_H\n#define ATG_ENGINE_SIM_PISTON_H\n\n#include \"part.h\"\n\nclass ConnectingRod;\nclass CylinderB"
},
{
"path": "include/piston_engine_simulator.h",
"chars": 2206,
"preview": "#ifndef ATG_ENGINE_SIM_PISTON_ENGINE_SIMULATOR_H\n#define ATG_ENGINE_SIM_PISTON_ENGINE_SIMULATOR_H\n\n#include \"simulator.h"
},
{
"path": "include/piston_object.h",
"chars": 613,
"preview": "#ifndef ATG_ENGINE_SIM_PISTON_OBJECT_H\n#define ATG_ENGINE_SIM_PISTON_OBJECT_H\n\n#include \"simulation_object.h\"\n\n#include "
},
{
"path": "include/preemphasis_filter.h",
"chars": 611,
"preview": "#ifndef ATG_ENGINE_SIM_PREEMPHASIS_FILTER_H\n#define ATG_ENGINE_SIM_PREEMPHASIS_FILTER_H\n\n#include \"filter.h\"\n\n#include \""
},
{
"path": "include/right_gauge_cluster.h",
"chars": 1610,
"preview": "#ifndef ATG_ENGINE_SIM_RIGHT_GAUGE_CLUSTER_H\n#define ATG_ENGINE_SIM_RIGHT_GAUGE_CLUSTER_H\n\n#include \"ui_element.h\"\n\n#inc"
},
{
"path": "include/ring_buffer.h",
"chars": 3740,
"preview": "#ifndef ATG_ENGINE_SIM_RING_BUFFER_H\n#define ATG_ENGINE_SIM_RING_BUFFER_H\n\n#include \"part.h\"\n\n#include <cstring>\n\ntempla"
},
{
"path": "include/scs.h",
"chars": 174,
"preview": "#ifndef ATG_ENGINE_SIM_SCS_H\n#define ATG_ENGINE_SIM_SCS_H\n\n#include \"../dependencies/submodules/simple-2d-constraint-sol"
},
{
"path": "include/shaders.h",
"chars": 1611,
"preview": "#ifndef ATG_ENGINE_SIM_SHADERS_H\n#define ATG_ENGINE_SIM_SHADERS_H\n\n#include \"delta.h\"\n\n#include \"ui_math.h\"\n\nclass Shade"
},
{
"path": "include/simulation_object.h",
"chars": 1144,
"preview": "#ifndef ATG_ENGINE_SIM_SIMULATION_OBJECT_H\n#define ATG_ENGINE_SIM_SIMULATION_OBJECT_H\n\n#include \"scs.h\"\n#include \"delta."
},
{
"path": "include/simulator.h",
"chars": 3520,
"preview": "#ifndef ATG_ENGINE_SIM_SIMULATOR_H\n#define ATG_ENGINE_SIM_SIMULATOR_H\n\n#include \"engine.h\"\n#include \"transmission.h\"\n#in"
},
{
"path": "include/standard_valvetrain.h",
"chars": 760,
"preview": "#ifndef ATG_ENGINE_SIM_STANDARD_VALVETRAIN_H\n#define ATG_ENGINE_SIM_STANDARD_VALVETRAIN_H\n\n#include \"valvetrain.h\"\n\nclas"
},
{
"path": "include/starter_motor.h",
"chars": 510,
"preview": "#ifndef ATG_ENGINE_SIM_STARTER_MOTOR_H\n#define ATG_ENGINE_SIM_STARTER_MOTOR_H\n\n#include \"scs.h\"\n\n#include \"crankshaft.h\""
},
{
"path": "include/synthesizer.h",
"chars": 3597,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_SYNTHESIZER_H\n#define ATG_ENGINE_SIM_ENGINE_SYNTHESIZER_H\n\n#include \"convolution_filter.h\""
},
{
"path": "include/throttle.h",
"chars": 417,
"preview": "#ifndef ATG_ENGINE_SIM_THROTTLE_H\n#define ATG_ENGINE_SIM_THROTTLE_H\n\n#include \"part.h\"\n\nclass Engine;\nclass Throttle {\np"
},
{
"path": "include/throttle_display.h",
"chars": 645,
"preview": "#ifndef ATG_ENGINE_SIM_THROTTLE_DISPLAY_H\n#define ATG_ENGINE_SIM_THROTTLE_DISPLAY_H\n\n#include \"ui_element.h\"\n\n#include \""
},
{
"path": "include/transmission.h",
"chars": 1244,
"preview": "#ifndef ATG_ENGINE_SIM_TRANSMISSION_H\n#define ATG_ENGINE_SIM_TRANSMISSION_H\n\n#include \"vehicle.h\"\n#include \"engine.h\"\n#i"
},
{
"path": "include/ui_button.h",
"chars": 363,
"preview": "#ifndef ATG_ENGINE_SIM_UI_BUTTON_H\n#define ATG_ENGINE_SIM_UI_BUTTON_H\n\n#include \"ui_element.h\"\n\nclass UiButton : public "
},
{
"path": "include/ui_element.h",
"chars": 4290,
"preview": "#ifndef ATG_ENGINE_SIM_UI_ELEMENT_H\n#define ATG_ENGINE_SIM_UI_ELEMENT_H\n\n#include \"ui_math.h\"\n\n#include \"delta.h\"\n\n#incl"
},
{
"path": "include/ui_manager.h",
"chars": 684,
"preview": "#ifndef ATG_ENGINE_SIM_UI_MANAGER_H\n#define ATG_ENGINE_SIM_UI_MANAGER_H\n\n#include \"ui_element.h\"\n\n#include <vector>\n\ncla"
},
{
"path": "include/ui_math.h",
"chars": 5025,
"preview": "#ifndef ATG_ENGINE_SIM_UI_MATH_H\n#define ATG_ENGINE_SIM_UI_MATH_H\n\n#include <cmath>\n\nstruct Point {\n float x, y;\n\n "
},
{
"path": "include/ui_utilities.h",
"chars": 204,
"preview": "#ifndef ATG_ENGINE_SIM_UI_UTILITIES_H\n#define ATG_ENGINE_SIM_UI_UTILITIES_H\n\n#include \"delta.h\"\n\nysVector mix(const ysVe"
},
{
"path": "include/units.h",
"chars": 5003,
"preview": "#ifndef ATG_ENGINE_SIM_UNITS_H\n#define ATG_ENGINE_SIM_UNITS_H\n\n#include \"constants.h\"\n\nnamespace units {\n // Force\n "
},
{
"path": "include/utilities.h",
"chars": 434,
"preview": "#ifndef ATG_ENGINE_SIM_UTILITIES_H\n#define ATG_ENGINE_SIM_UTILITIES_H\n\ndouble modularDistance(double a, double b, double"
},
{
"path": "include/valvetrain.h",
"chars": 424,
"preview": "#ifndef ATG_ENGINE_SIM_VALVETRAIN_H\n#define ATG_ENGINE_SIM_VALVETRAIN_H\n\nclass Camshaft;\nclass Valvetrain {\npublic:\n "
},
{
"path": "include/vehicle.h",
"chars": 1592,
"preview": "#ifndef ATG_ENGINE_SIM_VEHICLE_H\n#define ATG_ENGINE_SIM_VEHICLE_H\n\n#include \"scs.h\"\n\nclass Vehicle {\n public:\n "
},
{
"path": "include/vehicle_drag_constraint.h",
"chars": 542,
"preview": "#ifndef ATG_ENGINE_SIM_VEHICLE_DRAG_CONSTRAINT_H\n#define ATG_ENGINE_SIM_VEHICLE_DRAG_CONSTRAINT_H\n\n#include \"scs.h\"\n\ncla"
},
{
"path": "include/vtec_valvetrain.h",
"chars": 1234,
"preview": "#ifndef ATG_ENGINE_SIM_VTEC_STANDARD_VALVETRAIN_H\n#define ATG_ENGINE_SIM_VTEC_STANDARD_VALVETRAIN_H\n\n#include \"valvetrai"
},
{
"path": "scripting/include/actions.h",
"chars": 16921,
"preview": "#ifndef ATG_ENGINE_SIM_ACTIONS_H\n#define ATG_ENGINE_SIM_ACTIONS_H\n\n#include \"piranha.h\"\n\n#include \"compiler.h\"\n#include "
},
{
"path": "scripting/include/camshaft_node.h",
"chars": 1792,
"preview": "#ifndef ATG_ENGINE_SIM_CAMSHAFT_NODE_H\n#define ATG_ENGINE_SIM_CAMSHAFT_NODE_H\n\n#include \"object_reference_node.h\"\n\n#incl"
},
{
"path": "scripting/include/channel_types.h",
"chars": 2922,
"preview": "#ifndef ATG_ENGINE_SIM_CHANNEL_TYPES_H\n#define ATG_ENGINE_SIM_CHANNEL_TYPES_H\n\n#include \"piranha.h\"\n\nnamespace es_script"
},
{
"path": "scripting/include/compiler.h",
"chars": 1105,
"preview": "#ifndef ATG_ENGINE_SIM_COMPILER_H\n#define ATG_ENGINE_SIM_COMPILER_H\n\n#include \"language_rules.h\"\n\n#include \"engine_sim.h"
},
{
"path": "scripting/include/connecting_rod_node.h",
"chars": 2460,
"preview": "#ifndef ATG_ENGINE_SIM_CONNECTING_ROD_NODE_H\n#define ATG_ENGINE_SIM_CONNECTING_ROD_NODE_H\n\n#include \"object_reference_no"
},
{
"path": "scripting/include/crankshaft_node.h",
"chars": 2192,
"preview": "#ifndef ATG_ENGINE_SIM_CRANKSHAFT_NODE_H\n#define ATG_ENGINE_SIM_CRANKSHAFT_NODE_H\n\n#include \"object_reference_node.h\"\n\n#"
},
{
"path": "scripting/include/cylinder_bank_node.h",
"chars": 5868,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_BANK_NODE_H\n#define ATG_ENGINE_SIM_CYLINDER_BANK_NODE_H\n\n#include \"object_reference_node"
},
{
"path": "scripting/include/cylinder_head_node.h",
"chars": 2874,
"preview": "#ifndef ATG_ENGINE_SIM_CYLINDER_HEAD_NODE_H\n#define ATG_ENGINE_SIM_CYLINDER_HEAD_NODE_H\n\n#include \"object_reference_node"
},
{
"path": "scripting/include/engine_context.h",
"chars": 2813,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_CONTEXT_H\n#define ATG_ENGINE_SIM_ENGINE_CONTEXT_H\n\n#include \"engine_sim.h\"\n\n#include <map>"
},
{
"path": "scripting/include/engine_node.h",
"chars": 6820,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_NODE_H\n#define ATG_ENGINE_SIM_ENGINE_NODE_H\n\n#include \"object_reference_node.h\"\n\n#include "
},
{
"path": "scripting/include/engine_sim.h",
"chars": 788,
"preview": "#ifndef ATG_ENGINE_SIM_ENGINE_SIM_H\n#define ATG_ENGINE_SIM_ENGINE_SIM_H\n\n#include \"../../include/engine.h\"\n#include \"../"
},
{
"path": "scripting/include/exhaust_system_node.h",
"chars": 1835,
"preview": "#ifndef ATG_ENGINE_SIM_EXHAUST_SYSTEM_NODE_H\n#define ATG_ENGINE_SIM_EXHAUST_SYSTEM_NODE_H\n\n#include \"object_reference_no"
},
{
"path": "scripting/include/fuel_node.h",
"chars": 2027,
"preview": "#ifndef ATG_ENGINE_SIM_FUEL_NODE_H\n#define ATG_ENGINE_SIM_FUEL_NODE_H\n\n#include \"object_reference_node.h\"\n\n#include \"eng"
},
{
"path": "scripting/include/function_node.h",
"chars": 1742,
"preview": "#ifndef ATG_ENGINE_SIM_FUNCTION_NODE_H\n#define ATG_ENGINE_SIM_FUNCTION_NODE_H\n\n#include \"object_reference_node.h\"\n\n#incl"
},
{
"path": "scripting/include/ignition_module_node.h",
"chars": 2422,
"preview": "#ifndef ATG_ENGINE_SIM_IGNITION_MODULE_NODE_H\n#define ATG_ENGINE_SIM_IGNITION_MODULE_NODE_H\n\n#include \"object_reference_"
},
{
"path": "scripting/include/ignition_wire_node.h",
"chars": 1054,
"preview": "#ifndef ATG_ENGINE_SIM_IGNITION_WIRE_NODE_H\n#define ATG_ENGINE_SIM_IGNITION_WIRE_NODE_H\n\n#include \"object_reference_node"
},
{
"path": "scripting/include/impulse_response_node.h",
"chars": 1784,
"preview": "#ifndef ATG_ENGINE_SIM_IMPULSE_RESPONSE_NODE_H\n#define ATG_ENGINE_SIM_IMPULSE_RESPONSE_NODE_H\n\n#include \"object_referenc"
},
{
"path": "scripting/include/intake_node.h",
"chars": 1840,
"preview": "#ifndef ATG_ENGINE_SIM_INTAKE_NODE_H\n#define ATG_ENGINE_SIM_INTAKE_NODE_H\n\n#include \"object_reference_node.h\"\n\n#include "
},
{
"path": "scripting/include/language_rules.h",
"chars": 394,
"preview": "#ifndef ATG_ENGINE_SIM_LANGUAGE_RULES_H\n#define ATG_ENGINE_SIM_LANGUAGE_RULES_H\n\n#include \"piranha.h\"\n\nnamespace es_scri"
},
{
"path": "scripting/include/node.h",
"chars": 1814,
"preview": "#ifndef ATG_ENGINE_SIM_NODE_H\n#define ATG_ENGINE_SIM_NODE_H\n\n#include \"piranha.h\"\n\n#include <map>\n#include <string>\n\nnam"
},
{
"path": "scripting/include/object_reference_node.h",
"chars": 1082,
"preview": "#ifndef ATG_ENGINE_SIM_OBJECT_REFERENCE_H\n#define ATG_ENGINE_SIM_OBJECT_REFERENCE_H\n\n#include \"node.h\"\n\n#include \"object"
},
{
"path": "scripting/include/object_reference_node_output.h",
"chars": 1025,
"preview": "#ifndef ATG_ENGINE_SIM_OBJECT_REFERENCE_NODE_OUTPUT_H\n#define ATG_ENGINE_SIM_OBJECT_REFERENCE_NODE_OUTPUT_H\n\n#include \"p"
},
{
"path": "scripting/include/piranha.h",
"chars": 143,
"preview": "#ifndef ATG_ENGINE_SIM_PIRANHA_H\n#define ATG_ENGINE_SIM_PIRANHA_H\n\n#include <piranha/include/piranha.h>\n\n#endif /* ATG_E"
},
{
"path": "scripting/include/piston_node.h",
"chars": 1649,
"preview": "#ifndef ATG_ENGINE_SIM_PISTON_NODE_H\n#define ATG_ENGINE_SIM_PISTON_NODE_H\n\n#include \"object_reference_node.h\"\n\n#include "
},
{
"path": "scripting/include/rod_journal_node.h",
"chars": 1239,
"preview": "#ifndef ATG_ENGINE_SIM_ROD_JOURNAL_NODE_H\n#define ATG_ENGINE_SIM_ROD_JOURNAL_NODE_H\n\n#include \"object_reference_node.h\"\n"
},
{
"path": "scripting/include/standard_valvetrain_node.h",
"chars": 1557,
"preview": "#ifndef ATG_ENGINE_SIM_STANDARD_VALVETRAIN_NODE_H\n#define ATG_ENGINE_SIM_STANDARD_VALVETRAIN_NODE_H\n\n#include \"valvetrai"
},
{
"path": "scripting/include/throttle_nodes.h",
"chars": 2154,
"preview": "#ifndef ATG_ENGINE_SIM_THROTTLE_NODES_H\n#define ATG_ENGINE_SIM_THROTTLE_NODES_H\n\n#include \"object_reference_node.h\"\n\n#in"
},
{
"path": "scripting/include/transmission_node.h",
"chars": 1274,
"preview": "#ifndef ATG_ENGINE_SIM_TRANSMISSION_NODE_H\n#define ATG_ENGINE_SIM_TRANSMISSION_NODE_H\n\n#include \"object_reference_node.h"
},
{
"path": "scripting/include/valvetrain_node.h",
"chars": 750,
"preview": "#ifndef ATG_ENGINE_SIM_VALVETRAIN_NODE_H\n#define ATG_ENGINE_SIM_VALVETRAIN_NODE_H\n\n#include \"object_reference_node.h\"\n\n#"
},
{
"path": "scripting/include/vehicle_node.h",
"chars": 1235,
"preview": "#ifndef ATG_ENGINE_SIM_VEHICLE_NODE_H\n#define ATG_ENGINE_SIM_VEHICLE_NODE_H\n\n#include \"object_reference_node.h\"\n\n#includ"
},
{
"path": "scripting/include/vtec_valvetrain_node.h",
"chars": 2789,
"preview": "#ifndef ATG_ENGINE_SIM_VTEC_VALVETRAIN_NODE_H\n#define ATG_ENGINE_SIM_VTEC_VALVETRAIN_NODE_H\n\n#include \"valvetrain_node.h"
},
{
"path": "scripting/src/channel_types.cpp",
"chars": 820,
"preview": "#include \"../include/channel_types.h\"\n\n#define DEFINE_CHANNEL(channel_type) const piranha::ChannelType es_script::Object"
},
{
"path": "scripting/src/compiler.cpp",
"chars": 3097,
"preview": "#include \"../include/compiler.h\"\n\nes_script::Compiler::Output *es_script::Compiler::s_output = nullptr;\n\nes_script::Comp"
},
{
"path": "scripting/src/engine_context.cpp",
"chars": 3677,
"preview": "#include \"../include/engine_context.h\"\n\n#include \"../include/cylinder_bank_node.h\"\n\nes_script::EngineContext::EngineCont"
},
{
"path": "scripting/src/language_rules.cpp",
"chars": 13919,
"preview": "#include \"../include/language_rules.h\"\n\n#include \"../include/channel_types.h\"\n#include \"../include/engine_node.h\"\n#inclu"
},
{
"path": "src/afr_cluster.cpp",
"chars": 2915,
"preview": "#include \"../include/afr_cluster.h\"\n\n#include \"../include/units.h\"\n#include \"../include/gauge.h\"\n#include \"../include/co"
},
{
"path": "src/audio_buffer.cpp",
"chars": 1030,
"preview": "#include \"../include/audio_buffer.h\"\n\n#include <assert.h>\n\nAudioBuffer::AudioBuffer() {\n m_writePointer = 0;\n m_sa"
},
{
"path": "src/camshaft.cpp",
"chars": 1484,
"preview": "#include \"../include/camshaft.h\"\n\n#include \"../include/crankshaft.h\"\n#include \"../include/constants.h\"\n#include \"../incl"
},
{
"path": "src/combustion_chamber.cpp",
"chars": 16191,
"preview": "#include \"../include/combustion_chamber.h\"\n\n#include \"../include/constants.h\"\n#include \"../include/units.h\"\n#include \".."
},
{
"path": "src/combustion_chamber_object.cpp",
"chars": 2015,
"preview": "#include \"../include/combustion_chamber_object.h\"\n\n#include \"../include/cylinder_bank.h\"\n#include \"../include/engine_sim"
},
{
"path": "src/connecting_rod.cpp",
"chars": 2060,
"preview": "#include \"..\\include\\connecting_rod.h\"\n#include \"../include/connecting_rod.h\"\n\n#include <cmath>\n\nConnectingRod::Connecti"
},
{
"path": "src/connecting_rod_object.cpp",
"chars": 3641,
"preview": "#include \"../include/connecting_rod_object.h\"\n\n#include \"../include/engine_sim_application.h\"\n#include \"../include/units"
}
]
// ... and 73 more files (download for full content)
About this extraction
This page contains the full source code of the ange-yaghi/engine-sim GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 273 files (971.4 KB), approximately 276.3k tokens, and a symbol index with 257 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.