diff --git a/src/lib.rs b/src/lib.rs index 37bfe92..4c80049 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,3 +6,5 @@ pub use fem:: is_points_of_quadrilateral_on_the_same_plane, convex_hull_on_four_points_on_plane, ElementForceComponent, }; + +mod tests; diff --git a/src/tests/fem/mod.rs b/src/tests/fem/mod.rs new file mode 100644 index 0000000..931ea15 --- /dev/null +++ b/src/tests/fem/mod.rs @@ -0,0 +1 @@ +mod test_fem; diff --git a/src/tests/fem/test_fem.rs b/src/tests/fem/test_fem.rs new file mode 100644 index 0000000..df733ac --- /dev/null +++ b/src/tests/fem/test_fem.rs @@ -0,0 +1,71 @@ +#![allow(unused_imports)] + +use crate::fem::{FEM, DOFParameter, ElementForceComponent}; + + +#[test] +fn test_integration_simple() -> Result<(), String> +{ + const REL_TOL: f32 = 1e-4; + const ABS_TOL: f32 = 1e-12; + + let mut model = FEM::create(REL_TOL, ABS_TOL, 2); + + model.add_node(1, 0.0, 0.0, 0.0)?; + model.add_node(2, 30.0, 0.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::X, 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); + + Ok(()) +} diff --git a/src/tests/mod.rs b/src/tests/mod.rs new file mode 100644 index 0000000..24a3768 --- /dev/null +++ b/src/tests/mod.rs @@ -0,0 +1 @@ +mod fem; \ No newline at end of file