<commit_before>Change Log
==========

- [Unreleased (development version)](#unreleased-development-branch)
  - [Enhancements to Chrono::FSI](#changed-enhancements-to-chronofsi)
  - [New Chrono::Sensor module](#added-new-chronosensor-module)
  - [Setting OpenMP number of threads](#changed-setting-openmp-number-of-threads)
  - [Redesigned SCM deformable terrain](#changed-redesigned-scm-deformable-terrain)
  - [Tracked vehicle support in PyChrono](#added-tracked-vehicle-support-in-pychrono)
  - [Constitutive models for Euler beams](#changed-constitutive-models-for-euler-beams)
  - [Constitutive models for IGA beams](#changed-constitutive-models-for-iga-beams)
  - [Obtaining body applied forces](#added-obtaining-body-applied-forces)
  - [Chrono::Vehicle simulation world frame](#added-chronovehicle-simulation-world-frame)
  - [CASCADE module](#changed-cascade-module)
  - [Collision shapes and contact materials](#changed-collision-shapes-and-contact-materials)
- [Release 5.0.1](#release-501---2020-02-29)
- [Release 5.0.0](#release-500---2020-02-24)
  - [Eigen dense linear algebra](#changed-refactoring-of-dense-linear-algebra)
  - [Eigen sparse matrices](#changed-eigen-sparse-matrices-and-updates-to-direct-sparse-linear-solvers)
- [Release 4.0.0](#release-400---2019-02-22)

## Unreleased (development branch)

### [Changed] Enhancements to Chrono::FSI

TODO

### [Added] New Chrono::Sensor module

TODO

### [Changed] Setting OpenMP number of threads

The mechanism for setting the number of OpenMP threads used in various parts of Chrono has been modified and unified. The API is common to Chrono and Chrono::Parallel; however, the number of OpenMP threads is set differently for the two classes of systems.

- ChSystem: ChSystemNSC and ChSystemSMC

  OpenMP (enabled by default) may be used in three different places. The number of threads used for each can be set separately and independently, using:
  ```cpp
      my_system.SetNumThreads(nthreads_chrono, nthreads_collision, nthreads_eigen);
  ```
  If passing a value of 0 for either `nthreads_collision` or `nthreads_eigen` these values are set to be equal to `nthreads_chrono`. 

  - Currently, Chrono itself uses OpenMP for the parallel evaluation of internal forces and Jacobians for FEA and for parallel ray-casting in SCM deformable terrain. In both cases, the value `nthreads_chrono` is used in a **num_threads** clause for the OpenMP parallel for loops.<commit_msg>Add change log note on support for wheeled trailers in Chrono::Vehicle<commit_after>Change Log
==========

- [Unreleased (development version)](#unreleased-development-branch)
  - [Support for modelling wheeled trailers](#added-support-for-modelling-wheeled-trailers)
  - [Enhancements to Chrono::FSI](#changed-enhancements-to-chronofsi)
  - [New Chrono::Sensor module](#added-new-chronosensor-module)
  - [Setting OpenMP number of threads](#changed-setting-openmp-number-of-threads)
  - [Redesigned SCM deformable terrain](#changed-redesigned-scm-deformable-terrain)
  - [Tracked vehicle support in PyChrono](#added-tracked-vehicle-support-in-pychrono)
  - [Constitutive models for Euler beams](#changed-constitutive-models-for-euler-beams)
  - [Constitutive models for IGA beams](#changed-constitutive-models-for-iga-beams)
  - [Obtaining body applied forces](#added-obtaining-body-applied-forces)
  - [Chrono::Vehicle simulation world frame](#added-chronovehicle-simulation-world-frame)
  - [CASCADE module](#changed-cascade-module)
  - [Collision shapes and contact materials](#changed-collision-shapes-and-contact-materials)
- [Release 5.0.1](#release-501---2020-02-29)
- [Release 5.0.0](#release-500---2020-02-24)
  - [Eigen dense linear algebra](#changed-refactoring-of-dense-linear-algebra)
  - [Eigen sparse matrices](#changed-eigen-sparse-matrices-and-updates-to-direct-sparse-linear-solvers)
- [Release 4.0.0](#release-400---2019-02-22)

## Unreleased (development branch)

### [Added] Support for modelling wheeled trailers

New templates were added to Chrono::Vehicle to allow creating wheeled trailers.  A trailer is an assembly consisting of a "rear chassis" (see `ChChassisRear`), an arbitrary number of `ChAxle` subsystems (each including a suspension subsystem, 2 or 4 wheels, and optionally brake subsystems), and a hitch connector (see `ChChassisConnectorHitch`) for attaching the trailer to a vehicle chassis.

Similar to a wheeled vehicle, a concrete trailer system can be implemented in concrete C++ classes (see the Kraz semi-trailer truck model and `demo_VEH_Kraz_OpenLoop`), or else through JSON specification files (see the files in `data/vehicle/ultra_tow` and `demo_VEH_WheeledJSON`).

A concrete wheeled trailer system class implements the abstract class `ChWheeledTrailer`. A trailer can be attached to any vehicle chassis and is initialized based on the vehicle pose, the hitch location on the vehicle chassis (see `ChChassis::GetLocalPosRearConnector`), and the hitch location on the trailer chassis (see `ChChassisRear::GetLocalPosFrontConnector`):

```cpp
    WheeledTrailer trailer(vehicle.GetSystem(), trailer_JSON_file);
    trailer.Initialize(vehicle.GetChassis());
    trailer.SetChassisVisualizationType(VisualizationType::PRIMITIVES);
    trailer.SetSuspensionVisualizationType(VisualizationType::PRIMITIVES);
    trailer.SetWheelVisualizationType(VisualizationType::NONE);
    for (auto& axle : trailer.GetAxles()) {
        for (auto& wheel : axle->GetWheels()) {
            auto tire = ReadTireJSON(trailer_tire_JSON_file);
            trailer.InitializeTire(tire, wheel, VisualizationType::PRIMITIVES);
        }
    }
```

### [Changed] Enhancements to Chrono::FSI

TODO

### [Added] New Chrono::Sensor module

TODO

### [Changed] Setting OpenMP number of threads

The mechanism for setting the number of OpenMP threads used in various parts of Chrono has been modified and unified. The API is common to Chrono and Chrono::Parallel; however, the number of OpenMP threads is set differently for the two classes of systems.

- ChSystem: ChSystemNSC and ChSystemSMC

  OpenMP (enabled by default) may be used in three different places. The number of threads used for each can be set separately and independently, using:
  ```cpp
      my_system.SetNumThreads(nthreads_chrono, nthreads_collision, nthreads_eigen);
  ```
  If passing a value of 0 for either `nthreads_collision` or `nthreads_eigen` these values are set to be equal to `nthreads_chrono`. 

  - Currently, Chrono itself uses OpenMP for the parallel evaluation of internal forces and Jacobians for FEA and for parallel ray-casting in SCM deformable terrain. In both cases, the value `nthreads_chrono` is used in a **num_threads** clause for the OpenMP parallel for loops.
{'fraction_non_alphanumeric': 0.10370480583246541, 'fraction_numerical': 0.01309328968903437, 'mean_word_length': 5.0341113105924595, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2673798', 'n_tokens_mistral': 2139, 'n_tokens_neox': 1967, 'n_words': 622}