flavio 0.5.0

flavio welcomes you
Documentation
macro_rules! test_linear_localization_element {
    ($element: ident) => {
        crate::fem::block::element::test::setup_for_localization_elements!($element);
        crate::fem::block::element::linear::test::test_linear_element_inner!($element);
        crate::fem::block::element::linear::surface::test::test_linear_surface_element_inner!(
            $element
        );
        fn get_coordinates_unrotated() -> NodalCoordinates<N> {
            let jump = get_jump();
            let mut coordinates = get_deformation_gradient_surface() * get_reference_coordinates();
            coordinates
                .iter_mut()
                .skip(O)
                .for_each(|coordinate_top_a| *coordinate_top_a += &jump);
            coordinates
        }
        fn get_velocities_unrotated() -> NodalVelocities<N> {
            let jump_rate = get_jump_rate();
            let mut velocities =
                get_deformation_gradient_rate_surface() * get_reference_coordinates();
            velocities
                .iter_mut()
                .skip(O)
                .for_each(|velocity_top_a| *velocity_top_a += &jump_rate);
            velocities
        }
    };
}
pub(crate) use test_linear_localization_element;

macro_rules! setup_for_test_linear_surface_element_with_constitutive_model
{
    ($element: ident, $constitutive_model: ident, $constitutive_model_parameters: ident) =>
    {
        fn get_basis(is_deformed: bool, is_transformed: bool) -> Basis<1>
        {
            if is_transformed
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_basis(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_coordinates())
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_basis(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_reference_configuration() * get_reference_coordinates())
                        ).into()
                    )
                }
            }
            else
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_basis(
                        &$element::<$constitutive_model>::calculate_midplane(&get_coordinates())
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_basis(
                        &$element::<$constitutive_model>::calculate_midplane(&get_reference_coordinates()).into()
                    )
                }
            }
        }
        fn get_dual_basis(is_deformed: bool, is_transformed: bool) -> Basis<1>
        {
            if is_transformed
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_dual_basis(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_coordinates())
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_dual_basis(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_reference_configuration() * get_reference_coordinates())
                        ).into()
                    )
                }
            }
            else
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_dual_basis(
                        &$element::<$constitutive_model>::calculate_midplane(&get_coordinates())
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_dual_basis(
                        &$element::<$constitutive_model>::calculate_midplane(&get_reference_coordinates()).into()
                    )
                }
            }
        }
        fn get_normal(is_deformed: bool, is_transformed: bool) -> Normal
        {
            if is_transformed
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_coordinates())
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_reference_configuration() * get_reference_coordinates())
                        ).into()
                    )
                }
            }
            else
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &get_coordinates()
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &get_reference_coordinates()
                        ).into()
                    )
                }
            }
        }
        fn get_normal_gradients(is_deformed: bool, is_transformed: bool) -> NormalGradients<O>
        {
            if is_transformed
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal_gradients(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_coordinates())
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal_gradients(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_reference_configuration() * get_reference_coordinates())
                        ).into()
                    )
                }
            }
            else
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal_gradients(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &get_coordinates()
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal_gradients(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &get_reference_coordinates()
                        ).into()
                    )
                }
            }
        }
        fn get_normal_gradients_from_finite_difference(is_deformed: bool) -> NormalGradients<O>
        {
            let mut finite_difference = 0.0;
            (0..O).map(|a|
                (0..3).map(|i|
                    (0..3).map(|j|{
                        let mut nodal_coordinates =
                        if is_deformed
                        {
                            $element::<$constitutive_model>::calculate_midplane(
                                &get_coordinates()
                            )
                        }
                        else
                        {
                            $element::<$constitutive_model>::calculate_midplane(
                                &get_reference_coordinates()
                            ).into()
                        };
                        nodal_coordinates[a][i] += 0.5 * EPSILON;
                        finite_difference = $element::<$constitutive_model>::calculate_normal(
                            &nodal_coordinates
                        )[j];
                        nodal_coordinates[a][i] -= EPSILON;
                        finite_difference -= $element::<$constitutive_model>::calculate_normal(
                            &nodal_coordinates
                        )[j];
                        finite_difference/EPSILON
                    }).collect()
                ).collect()
            ).collect()
        }
        fn get_normal_rate(is_deformed: bool, is_transformed: bool) -> NormalRate
        {
            if is_transformed
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal_rate(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_coordinates())
                        ),
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_velocities() + get_rotation_rate_current_configuration() * get_coordinates())
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal_rate(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_reference_configuration() * get_reference_coordinates())
                        ).into(),
                        &NodalVelocities::zero()
                    )
                }
            }
            else
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal_rate(
                        &$element::<$constitutive_model>::calculate_midplane(&get_coordinates()),
                        &$element::<$constitutive_model>::calculate_midplane(&get_velocities())
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal_rate(
                        &$element::<$constitutive_model>::calculate_midplane(&get_reference_coordinates()).into(),
                        &NodalVelocities::zero()
                    )
                }
            }
        }
        fn get_normal_rate_from_finite_difference(is_deformed: bool) -> NormalRate
        {
            let mut finite_difference = 0.0;
            (0..3).map(|i|
                $element::<$constitutive_model>::calculate_midplane(&get_velocities()).iter().enumerate()
                .map(|(a, velocity_a)|
                    velocity_a.iter().enumerate()
                    .map(|(k, velocity_a_k)|{
                        let mut nodal_coordinates =
                        if is_deformed
                        {
                            $element::<$constitutive_model>::calculate_midplane(&get_coordinates())
                        }
                        else
                        {
                            $element::<$constitutive_model>::calculate_midplane(&get_reference_coordinates()).into()
                        };
                        nodal_coordinates[a][k] += 0.5 * EPSILON;
                        finite_difference = $element::<$constitutive_model>::calculate_normal(
                            &nodal_coordinates
                        )[i];
                        nodal_coordinates[a][k] -= EPSILON;
                        finite_difference -= $element::<$constitutive_model>::calculate_normal(
                            &nodal_coordinates
                        )[i];
                        finite_difference/EPSILON * velocity_a_k
                    }).sum::<Scalar>()
                ).sum()
            ).collect()
        }
        fn get_normal_tangents(is_deformed: bool, is_transformed: bool) -> NormalTangents<O>
        {
            if is_transformed
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal_tangents(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_current_configuration() * get_coordinates())
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal_tangents(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &(get_rotation_reference_configuration() * get_reference_coordinates())
                        ).into()
                    )
                }
            }
            else
            {
                if is_deformed
                {
                    $element::<$constitutive_model>::calculate_normal_tangents(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &get_coordinates()
                        )
                    )
                }
                else
                {
                    $element::<$constitutive_model>::calculate_normal_tangents(
                        &$element::<$constitutive_model>::calculate_midplane(
                            &get_reference_coordinates()
                        ).into()
                    )
                }
            }
        }
        fn get_normal_tangents_from_finite_difference(is_deformed: bool) -> NormalTangents<O>
        {
            let mut finite_difference = 0.0;
            (0..O).map(|a|
                (0..O).map(|b|
                    (0..3).map(|m|
                        (0..3).map(|n|
                            (0..3).map(|i|{
                                let mut nodal_coordinates =
                                if is_deformed
                                {
                                    $element::<$constitutive_model>::calculate_midplane(
                                        &get_coordinates()
                                    )
                                }
                                else
                                {
                                    $element::<$constitutive_model>::calculate_midplane(
                                        &get_reference_coordinates()
                                    ).into()
                                };
                                nodal_coordinates[b][n] += 0.5 * EPSILON;
                                finite_difference = $element::<$constitutive_model>::calculate_normal_gradients(
                                    &nodal_coordinates
                                )[a][m][i];
                                nodal_coordinates[b][n] -= EPSILON;
                                finite_difference -= $element::<$constitutive_model>::calculate_normal_gradients(
                                    &nodal_coordinates
                                )[a][m][i];
                                finite_difference/EPSILON
                            }).collect()
                        ).collect()
                    ).collect()
                ).collect()
            ).collect()
        }
        #[test]
        fn size()
        {
            assert_eq!(
                std::mem::size_of::<$element::<$constitutive_model>>(),
                std::mem::size_of::<$constitutive_model>()
                + std::mem::size_of::<GradientVectors<N>>()
                + std::mem::size_of::<ReferenceNormal>()
                + std::mem::size_of::<Scalar>()
            )
        }
        #[test]
        #[should_panic]
        fn calculate_gradient_vectors()
        {
            $element::<$constitutive_model>::calculate_gradient_vectors(
                &$element::<$constitutive_model>::calculate_midplane(
                    &get_reference_coordinates()
                ).into()
            );
        }
    }
}
pub(crate) use setup_for_test_linear_surface_element_with_constitutive_model;