openphys 0.1.3

OpenPhys is a simple physics engine library written in Rust.
Documentation
# Heat transfer

The heat transfer function is designed to simulate heat transfer between two objects. It takes the mass, temperature and specific heat capacity of the objects into account. *\*Note that later the list of factors being taken into account will be expanded.*

## Files related to the heat transfer function

The heat transfer function's main code is located in the `src/modules/heat_transfer.rs` source file. You can also find a unit test of the function at `tests/heat_transfer_simulation_test.rs`.

## Usage of the heat transfer function

### Parts of the heat transfer function

You can import these parts of the heat transfer function:

  - `simulate_heat_transfer` — The function that does most of the work and processes the calculations
  - `HeatTransferResult` — The part of the heat transfer function that gives you the ability to return specific values
  - `Object` — The part of the heat transfer function that gives you the ability to create new objects

You can import all of those simply with:
```rs
use openphys::{simulate_heat_transfer, HeatTransferResult, Object};
```

### Returnable values from the heat transfer function

These are the returnable values from the `heat_transfer` function:

  - `time_steps` — The current amount of time steps, counting from `0`
  - `total_time` — The total amount of time elapsed since the start of the heat transfer
  - `total_heat_transferred` — Total heat transferred between the two objects in *Jules*
  - `final_temp_of_obj1` — The final temperature of `obj1`
  - `final_temp_of_obj2` — The final temperature of `obj2`

Here's an example of how you could return one of these values:
```rs
println!("Total time: {:.2} seconds", result.total_time);
```

### Creating new objects

You can create new objects with `Object::new(mass, temperature, specific_heat_capacity)`.

  - `mass` — The mass of the object in kilograms (*kg*)
  - `temperature` — The temperature of the object in Kelvin (*K*)
  - `specific_heat_capacity` — The amount of energy required to change the temperature of the object by 1K (*J/kg\*K*)

An example of a new object is:
```rs
let mut obj1 = Object::new(1.0, 273.15, 4186.0); // 1kg of water at its freezing point
```
The variable is mutable because the `simulate_heat_transfer` function changes the temperature of the objects (`obj1` in this case).

### Setting up some other variables

Before we can begin using the `simulate_heat_transfer` function we need to specify some variables.

  - `time_step` — The frequency we want the `simulate_heat_transfer` to update the temperature of an objects (1 `time_step` = 1 second) - adjust based on the accuracy you want, the *recommended* value is `0.1`
  - `equilibrium_threshold` — Once the difference between two objects' temperatures fall into this threshold, no further changes are made to the objects' temperatures, thus assuming balance between the two objects' temperatures - the temperature difference between the two objects doesn't have to be exactly 0, just low enough that they don't affect each other anymore - adjust based on the accuracy you want, the *recommended* value is *10^-6* but anything lower than *10^-2* will do

An example of specifying these two variable is:
```rs
let time_step = 0.1; // 0.1 seconds
let equilibrium_threshold = 1e-6; // 10^-6
```

### Using the `simulate_heat_transfer` function

We can pass the two objects and the other variables we made into the `simulate_heat_transfer` as parameters like this: `simulate_heat_transfer(&mut obj1, &mut obj2, time_step, equilibrium_threshold)`.

Here's an example of using the `simulate_heat_transfer` function with the variables we specified:
```rs
let result = simulate_heat_transfer(&mut obj1, &mut obj2, time_step, equilibrium_threshold);
```