16 个版本

0.9.3 2023 年 4 月 6 日
0.9.2 2023 年 3 月 27 日
0.9.1 2023 年 2 月 18 日
0.4.11 2022 年 2 月 19 日
0.4.2 2021 年 11 月 30 日

#4 in #方向

Download history 8/week @ 2024-03-09 13/week @ 2024-03-16 155/week @ 2024-03-30 32/week @ 2024-04-06

每月下载量 67

MIT/Apache

170KB
4K SLoC

描述

有限元方法

一个有限元方法模块。

示例

#[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);

依赖项

~155KB