16 releases

0.9.3 Apr 6, 2023
0.9.2 Mar 27, 2023
0.9.1 Feb 18, 2023
0.4.11 Feb 19, 2022
0.4.2 Nov 30, 2021

#2 in #direction

23 downloads per month

MIT/Apache

170KB
4K SLoC

Description

Finite element method

A finite element method module.

Example

#[macro_use]
extern crate finite_element_method;

use finite_element_method::{FEM, DOFParameter, ElementForceComponent};

const REL_TOL: f32 = 1e-4;
const ABS_TOL: f32 = 1e-12;


let mut model = FEM::create(REL_TOL, ABS_TOL, 10);

model.add_node(1, 0.0, 0.0, 0.0)?;
model.add_node(2, 0.0, 30.0, 0.0)?;

model.add_truss(1, 1, 2, 1e6, 2.0, None)?;

model.add_displacement(1, DOFParameter::X, 0.0)?;

model.add_concentrated_load(2, DOFParameter::Y, 100.0)?;

let separated_stiffness_matrix = model.separate_stiffness_matrix()?;
let r_a_vector = model.compose_r_a_vector(separated_stiffness_matrix.get_k_aa_indexes())?;
let u_b_vector = model.compose_u_b_vector(separated_stiffness_matrix.get_k_bb_indexes())?;

let u_a_vector = model.find_ua_vector(
    &separated_stiffness_matrix, &r_a_vector, &u_b_vector,
)?;
let r_r_vector = model.find_r_r_vector(
    &separated_stiffness_matrix, &u_a_vector, &u_b_vector,
)?;

model.compose_global_analysis_result(
    separated_stiffness_matrix.get_k_aa_indexes(), 
    separated_stiffness_matrix.get_k_bb_indexes(), 
    &u_a_vector,
    &r_r_vector,
)?;

let mut global_analysis_result = model.extract_global_analysis_result()?;
global_analysis_result.sort_by(
    |(n_1, dof_1, _, _), (n_2, dof_2, _, _)| 
    (n_1, dof_1).partial_cmp(&(n_2, dof_2)).unwrap()
);
let global_analysis_result_expected = vec![
    (1, DOFParameter::X, 0.0, -100.0),
    (1, DOFParameter::Y, 0.0, 0.0),
    (1, DOFParameter::Z, 0.0, 0.0),
    (1, DOFParameter::ThX, 0.0, 0.0),
    (1, DOFParameter::ThY, 0.0, 0.0),
    (1, DOFParameter::ThZ, 0.0, 0.0),
    (2, DOFParameter::X, 0.0014999999, 100.0),
    (2, DOFParameter::Y, 0.0, 0.0),
    (2, DOFParameter::Z, 0.0, 0.0),
    (2, DOFParameter::ThX, 0.0, 0.0),
    (2, DOFParameter::ThY, 0.0, 0.0),
    (2, DOFParameter::ThZ, 0.0, 0.0),
];

let elements_analysis_result = model.extract_elements_analysis_result()?;
let elements_analysis_result_expected = vec![
    (1, vec![(ElementForceComponent::ForceR, 100.0)]),
];

assert_eq!(global_analysis_result, global_analysis_result_expected);
assert_eq!(elements_analysis_result, elements_analysis_result_expected);

Dependencies

~155KB