Crates.io | gemlab |
lib.rs | gemlab |
version | 1.1.0 |
source | src |
created_at | 2021-10-23 05:02:36.033838 |
updated_at | 2024-05-01 01:17:14.909159 |
description | Geometry and meshes laboratory for finite element analyses |
homepage | https://github.com/cpmech/gemlab |
repository | https://github.com/cpmech/gemlab |
max_upload_size | |
id | 469755 |
size | 10,014,344 |
This crate contains structures and functions for geometry computations, generate meshes, and perform numerical integration for finite element analyses (FEM/FEA).
At this moment, Gemlab works on Linux (Debian/Ubuntu; and maybe Arch).
First:
sudo apt-get install -y --no-install-recommends \
g++ \
gdb \
gfortran \
liblapacke-dev \
libmumps-seq-dev \
libopenblas-dev \
libsuitesparse-dev
Then:
cargo add gemlab
This crates depends on russell_lab
and, hence, needs some external libraries. See the installation of required dependencies on russell_lab
.
👆 Check the crate version and update your Cargo.toml accordingly:
[dependencies]
gemlab = "*"
use gemlab::integ;
use gemlab::mesh::{At, Features, Mesh};
use gemlab::shapes::Scratchpad;
use gemlab::StrError;
use std::collections::HashSet;
fn main() -> Result<(), StrError> {
// Input the raw mesh data using a text file
//
// 1.0 5------,6.------7
// | [3],' `.[4] |
// | ,' `. |
// |,' `.|
// 0.5 3 [2] 4
// |`. .'|
// | `. .' |
// | [0]`. .'[1] |
// 0.0 0------`1'------2
// 0.0 0.5 1.0
let path = "./data/meshes/four_tri3_one_qua4.msh";
let mesh = Mesh::from_text_file(path)?;
// Extract features such boundary edges and faces.
// Search entities along the boundary of the mesh given coordinates.
// The `At` enum provides an easy way to define the type of the
// constraint such as line, plane, circle, etc.
let feat = Features::new(&mesh, false);
assert_eq!(feat.search_point_ids(At::Y(0.5), |_| true)?, &[3, 4]);
assert_eq!(feat.search_edge_keys(At::X(1.0), |_| true)?, &[(2, 4), (4, 7)]);
// Perform numerical integration to compute
// the area of cell # 2
let ndim = 2;
let cell_2 = &mesh.cells[2];
let mut pad = Scratchpad::new(ndim, cell_2.kind)?;
mesh.set_pad(&mut pad, &cell_2.points);
let ips = integ::default_points(cell_2.kind);
let mut area = 0.0;
for p in 0..ips.len() {
let iota = &ips[p];
let weight = ips[p][3];
let det_jac = pad.calc_jacobian(iota)?;
area += weight * det_jac;
}
assert_eq!(area, 0.5);
Ok(())
}
Implement read/write mesh functions
Add tests for the numerical integrations
Implement triangle and tetrahedron generators
Implement drawing functions
The following table shows what combinations of geometry-number-of-dimensions (geo_ndim
) and
space-number-of-dimensions (space_ndim
) are possible. There are three cases:
CABLE
-- geo_ndim = 1
and space_ndim = 2 or 3
; e.g., line in 2D or 3D (cables and rods)SHELL
-- geo_ndim = 2
and space_ndim = 3
; e.g. Tri or Qua in 3D (shells and surfaces)SOLID
-- geo_ndim = space_ndim
; e.g., Tri and Qua in 2D or Tet and Hex in 3Dgeo_ndim |
space_ndim = 2 |
space_ndim = 3 |
---|---|---|
1 | CABLE |
CABLE |
2 | SOLID |
SHELL |
3 | impossible | SOLID |