use crate::numerical::physics_fea;
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_material_steel_shear_modulus() -> f64 {
physics_fea::Material::steel().shear_modulus()
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_material_aluminum_shear_modulus() -> f64 {
physics_fea::Material::aluminum().shear_modulus()
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_material_copper_shear_modulus() -> f64 {
physics_fea::Material::copper().shear_modulus()
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_shear_modulus(
youngs_modulus: f64,
poissons_ratio: f64,
) -> f64 {
youngs_modulus / (2.0 * (1.0 + poissons_ratio))
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_bulk_modulus(
youngs_modulus: f64,
poissons_ratio: f64,
) -> f64 {
youngs_modulus / (3.0 * 2.0f64.mul_add(-poissons_ratio, 1.0))
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_linear_element_1d_stiffness(
length: f64,
youngs_modulus: f64,
area: f64,
) -> f64 {
youngs_modulus * area / length
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_von_mises_stress(
sx: f64,
sy: f64,
txy: f64,
) -> f64 {
physics_fea::TriangleElement2D::von_mises_stress(&[sx, sy, txy])
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_max_shear_stress(
sigma1: f64,
sigma2: f64,
) -> f64 {
physics_fea::max_shear_stress(sigma1, sigma2)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_num_fea_principal_stresses(
sx: f64,
sy: f64,
txy: f64,
out_sigma1: *mut f64,
out_sigma2: *mut f64,
out_angle: *mut f64,
) -> i32 {
unsafe {
if out_sigma1.is_null() || out_sigma2.is_null() || out_angle.is_null() {
return -1;
}
let (s1, s2, angle) = physics_fea::principal_stresses(&[sx, sy, txy]);
*out_sigma1 = s1;
*out_sigma2 = s2;
*out_angle = angle;
0
}
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_safety_factor_von_mises(
sx: f64,
sy: f64,
txy: f64,
yield_strength: f64,
) -> f64 {
physics_fea::safety_factor_von_mises(&[sx, sy, txy], yield_strength)
}
#[unsafe(no_mangle)]
pub extern "C" fn rssn_num_fea_thermal_element_1d_conductivity(
length: f64,
conductivity: f64,
area: f64,
) -> f64 {
conductivity * area / length
}