1. Introduction

The calculator accepts as input the vehicle-specifications and parameters for modifying the execution of the WLTC cycle and spits-out the it gear-shifts of the vehicle, the attained speed-profile, and any warnings. It certainly does not calculate any CO2 emissions or other metrics.

An “execution” or a “run” of an experiment is depicted in the following diagram:

     .-------------------.    ______________        .-------------------.
    /        Model      /    | Experiment   |       / Model(augmented)  /
   /-------------------/     |--------------|      /-------------------/
  / +--vehicle        /  ==> |  .----------.| ==> / +...              /
 /  +--params        /       | / WLTC-data/ |    /  +--cycle_run     /
/                   /        |'----------'  |   /                   /
'------------------'         |______________|  '-------------------'

1.1. Install

Requires Python 3.3+.

Tip

WinPython and Anaconda python distributions for Windows and OS X, respectively.

You can install the project directly from the PyPI repository with pip. Notice that --pre is required, since all realeased packages so far were pre-release (-alpha) versions:

$ pip3 install wltp

Or you can build it from the latest sources (assuming you have a working installation of git):

$ git clone https://github.com/ankostis/wltp.git wltp
$ cd wltp
$ python3 setup.py install .

That way you get the complete source-tree of the project:

+--wltp/            ## (package) The python-code of the calculator
|   +--cycles/      ## (package) The python-code for the WLTC data
|   +--test/        ## (package) Test-cases and the wltp_db
|   +--model        ## (module) Describes the data for the calculation
|   +--experiment   ## (module) The calculator
+--docs/            ## Documentation folder
+--util/            ## Scripts for preprocessing WLTC data and the wltp_db
+--wltp.py          ## (script) The cmd-line entry-point script for the calculator
+--README.rst
+--CHANGES.rst
+--LICENSE.txt

1.2. Python usage

Here is a quick-start example:

>>> from wltp import model
>>> from wltp.experiment import Experiment
>>> import json                  ## Just for pretty-printing model

>>> mdl = {
    "vehicle": {
        "mass":     1500,
        "v_max":    195,
        "p_rated":  100,
        "n_rated":  5450,
        "n_idle":   950,
        "n_min":    None, # Can be overriden by manufacturer.
        "gear_ratios":      [120.5, 75, 50, 43, 37, 32],
        "resistance_coeffs":[100, 0.5, 0.04],
    }
}

>>> processor = Experiment(mdl)
>>> mdl = processor.run()
>>> print(json.dumps(mdl['params'], indent=2))
{
  "f_n_min_gear2": 0.9,
  "v_stopped_threshold": 1,
  "wltc_class": "class3b",
  "f_n_min": 0.125,
  "f_n_max": 1.2,
  "f_downscale": 0,
  "f_inertial": 1.1,
  "f_n_clutch_gear2": [
    1.15,
    0.03
  ],
  "f_safety_margin": 0.9
}

To access the time-based cycle-results it is better to use a pandas.DataFrame:

>>> import pandas as pd
>>> df = pd.DataFrame(mdl['cycle_run'])
>>> df.columns
Index(['clutch', 'driveability', 'gears', 'gears_orig', 'p_available', 'p_required', 'rpm', 'rpm_norm', 'v_class', 'v_real', 'v_target'], dtype='object')
>>> df.index.name = 't'
>>> print('Mean engine_speed: ', df.rpm.mean())
Mean engine_speed:  1917.0407829

>>> print(df.head())
  clutch driveability  gears  gears_orig  p_available  p_required  rpm  \
t
0  False                   0           0            9           0  950
1  False                   0           0            9           0  950
2  False                   0           0            9           0  950
3  False                   0           0            9           0  950
4  False                   0           0            9           0  950

   rpm_norm  v_class   v_real  v_target
t
0         0        0  29.6875         0
1         0        0  29.6875         0
2         0        0  29.6875         0
3         0        0  29.6875         0
4         0        0  29.6875         0

[5 rows x 11 columns]

>>> print(processor.driveability_report())
...
  12: (a: X-->0)
  13: g1: Revolutions too low!
  14: g1: Revolutions too low!
...
  30: (b2(2): 5-->4)
...
  38: (c1: 4-->3)
  39: (c1: 4-->3)
  40: Rule e or g missed downshift(40: 4-->3) in acceleration?
...
  42: Rule e or g missed downshift(42: 3-->2) in acceleration?
...

For information on the model-data, check the schema:

>>> print(json.dumps(model.model_schema(), indent=2))
{
  "properties": {
    "params": {
      "properties": {
        "f_n_min_gear2": {
          "description": "Gear-2 is invalid when N :< f_n_min_gear2 * n_idle.",
          "type": [
            "number",
            "null"
          ],
          "default": 0.9
        },
        "v_stopped_threshold": {
          "description": "Velocity (Km/h) under which (<=) to idle gear-shift (Annex 2-3.3, p71).",
          "type": [
...

For more examples, download the sources and check the test-cases found at /wltp/test.

1.3. Cmd-line usage

Note

Not implemented in yet.

To get help:

$ python wltp --help          ## to get generic help for cmd-line syntax
$ python wltp -M /vehicle     ## to get help for specific model-paths

and then, assuming vehicle.csv is a CSV file with the vehicle parameters for which you want to override the n_idle only, run the following:

$ python wltp -v \
    -I vehicle.csv file_frmt=SERIES model_path=/params header@=None \
    -m /vehicle/n_idle:=850 \
    -O cycle.csv model_path=/cycle_run

1.4. IPython usage

Note

Not implemented in yet.