# building_materials
Rust library providing types and normative material properties for concrete and rebar,
based on Russian construction standards.
## Installation
```toml
[dependencies]
building_materials = "0.1"
```
With serde support:
```toml
[dependencies]
building_materials = { version = "0.1", features = ["serde"] }
```
## Feature flags
- `serde` — enables `Serialize`/`Deserialize` for all types.
---
## `concrete`
### `Concrete`
Concrete with its classification characteristics. Built via the `bon` builder.
Compression class is mandatory; all other fields are optional.
```rust
use building_materials::concrete::{
Concrete, ConcreteClassForCompression, ConcreteClassForAxialTension,
ConcreteGradeForFrostResistanceByFirstMethod, ConcreteGradeForWaterResistance,
};
let c = Concrete::builder()
.class_for_compression(ConcreteClassForCompression::B25)
.class_for_axial_tension(ConcreteClassForAxialTension::B2_0)
.grade_for_frost_resistance_by_first_method(ConcreteGradeForFrostResistanceByFirstMethod::F200)
.grade_for_water_resistance(ConcreteGradeForWaterResistance::W6)
.build();
let class = c.class_for_compression();
let axial = c.class_for_axial_tension(); // Option<_>
```
| `class_for_compression()` | `ConcreteClassForCompression` |
| `class_for_axial_tension()` | `Option<ConcreteClassForAxialTension>` |
| `class_for_flexural_tension()` | `Option<ConcreteClassForFlexuralTension>` |
| `grade_for_frost_resistance_by_first_method()` | `Option<ConcreteGradeForFrostResistanceByFirstMethod>` |
| `grade_for_frost_resistance_by_second_method()` | `Option<ConcreteGradeForFrostResistanceBySecondMethod>` |
| `grade_for_water_resistance()` | `Option<ConcreteGradeForWaterResistance>` |
### Enums
| `ConcreteClassForCompression` | `B1_5` … `B120` |
| `ConcreteClassForAxialTension` | `B0_8` … `B4_8` |
| `ConcreteClassForFlexuralTension` | `B1_2` … `B10_0` |
| `ConcreteGradeForFrostResistanceByFirstMethod` | `F50` … `F1000` |
| `ConcreteGradeForFrostResistanceBySecondMethod` | `F100` … `F500` |
| `ConcreteGradeForWaterResistance` | `W2` … `W20` |
---
## `rebar`
### `Rebar`
A reinforcing bar. Built via the `bon` builder.
Rebar class is mandatory; configuration profile is optional.
```rust
use building_materials::rebar::{Rebar, RebarClass, RebarConfigurationProfile};
let r = Rebar::builder()
.rebar_class(RebarClass::A400)
.configuration_profile(RebarConfigurationProfile::F1)
.build();
let class = r.rebar_class();
let profile = r.configuration_profile(); // Option<_>
```
| `rebar_class()` | `RebarClass` |
| `configuration_profile()` | `Option<RebarConfigurationProfile>` |
### Enums
| `RebarClass` | `A240`, `A400`, `A500`, `A600`, `Ap600`, `A800`, `A1000`, `B500`, `Br500`, `Br1200`…`Br1600`, `K1400`…`K1900` |
| `RebarConfigurationProfile` | `F1`, `F2`, `F3`, `F4` |
---
## `standard::sp_63_13330_2018`
### `ConcreteBySp63_13330_2018`
Provides design and normative resistances for a concrete material.
Takes a `Concrete` and a `ConcreteType`. All methods return `Option<f64>` in **Pa** —
`None` if the class/type combination is not covered by the standard.
```rust
use building_materials::concrete::{Concrete, ConcreteClassForCompression};
use building_materials::standard::sp_63_13330_2018::{ConcreteBySp63_13330_2018, ConcreteType};
let c = ConcreteBySp63_13330_2018::new(
Concrete::builder()
.class_for_compression(ConcreteClassForCompression::B25)
.build(),
ConcreteType::Heavy,
);
let rb = c.rb(); // or c.calculated_axial_compression_by_first_group()
let rbn = c.rbn(); // or c.normative_axial_compression_resistance()
let rbt = c.rbt(); // or c.calculated_axial_tension_by_first_group()
```
#### `ConcreteType`
| `Heavy` | — |
| `Finegrained { fineness_modulus: f64 }` | Tension resistance multiplied by 0.8 when `fineness_modulus ≤ 2.0` |
| `Prestressed` | Tension resistance multiplied by 1.2 |
| `Lightweight` | — |
| `Cellular` | — |
#### Methods
| `normative_axial_compression_resistance()` | `rbn()` | Rbn / Rb,ser |
| `calculated_axial_compression_by_second_group()` | `rbser()` | equals `rbn()` |
| `calculated_axial_compression_by_first_group()` | `rb()` | Rb |
| `normative_axial_tension_resistance()` | `rbtn()` | Rbtn / Rbt,ser |
| `calculated_axial_tension_by_second_group()` | `rbtser()` | equals `rbtn()` |
| `calculated_axial_tension_by_first_group()` | `rbt()` | Rbt; uses axial tension class when set |
---
### `RebarBySp63_13330_2018`
Provides design and normative resistances for a rebar material.
Takes a `Rebar`. All methods return `Option<f64>` in **Pa** —
`None` if the rebar class is not covered by the standard.
```rust
use building_materials::rebar::{Rebar, RebarClass};
use building_materials::standard::sp_63_13330_2018::RebarBySp63_13330_2018;
let r = RebarBySp63_13330_2018::new(
Rebar::builder().rebar_class(RebarClass::A400).build(),
);
let rs = r.rs(); // or r.calculated_tension_resistance_by_first_group()
let rsn = r.rsn(); // or r.normative_tension_resistance()
let es = r.es(); // or r.elastic_modulus()
```
#### Methods
| `elastic_modulus()` | `es()` | Es |
| `normative_tension_resistance()` | `rsn()` | Rsn / Rs,ser |
| `calculated_tension_resistance_by_second_group()` | `rsser()` | equals `rsn()` |
| `calculated_tension_resistance_by_first_group()` | `rs()` | Rs = Rsn / 1.15 |
| `calculated_compression_resistance_by_long_term()` | `rs_long_term()` | Rs' under long-term load |
| `calculated_compression_resistance_by_short_term()` | `rs_short_term()` | Rs' under short-term load |
| `calculated_axial_tension_by_first_group_for_clamp_and_bent_rod()` | `rsw()` | Rsw for clamps and bent bars |