// This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . /************************************************************************ * DATE: 23/01/97 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Fonctions utilitaires. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * $ * ************************************************************************/ #ifndef UTIL_H #define UTIL_H #include "Vecteur.h" #include "Tableau_T.h" #include "Enum_ddl.h" #include "Ddl.h" #include "Base.h" #include "PtTabRel.h" /// @addtogroup Classes_utilitaires_sur_vecteurs_et_matrices /// @{ /// /// Util: divers utilitaires sur vecteurs, coordonnées, matrices ... class Util { public : /// PRODUIT VECTORIEL DE DEUX VECTEURS EN COORDONNEES ASBOLUS /// on supprime la fonction relative aux vecteurs, car elle "doit" être remplacée par celle sur les coordonnées /// static Vecteur ProdVec( const Vecteur & v1, const Vecteur & v2); /// idem en coordonnées absolues avec le type Coordonnee static Coordonnee ProdVec_coor( const Coordonnee & v1, const Coordonnee & v2); /// idem en coordonnées contravariantes avec le type CoordonneeH static CoordonneeH ProdVec_coorH( const CoordonneeH & v1, const CoordonneeH & v2); /// idem en coordonnées covariantes avec le type CoordonneeB static CoordonneeB ProdVec_coorB( const CoordonneeB & v1, const CoordonneeB & v2); /// idem en coordonnées covariantes avec le type CoordonneeB, et en retour un coordonnee normal static Coordonnee ProdVec_coorBN( const CoordonneeB & v1, const CoordonneeB & v2); /// CALCUL DU DETERMINANT DE TROIS VECTEURS /// on supprime la fonction relative aux vecteurs, car elle "doit" être remplacée par celle sur les coordonnées /// static double Determinant( const Vecteur & v1, const Vecteur & v2, const Vecteur & v3); /// idem en coordonnées covariantes static double DeterminantB( const CoordonneeB & v1, const CoordonneeB & v2, const CoordonneeB & v3); /// idem en coordonnées absolues avec le type Coordonnee static double Determinant( const Coordonnee & v1, const Coordonnee & v2, const Coordonnee & v3); /// CALCUL DU DETERMINANT DE DEUX VECTEURS /// on supprime la fonction relative aux vecteurs, car elle "doit" être remplacée par celle sur les coordonnées /// static double Determinant( const Vecteur & v1, const Vecteur & v2); /// idem en coordonnées covariantes static double DeterminantB( const CoordonneeB & v1, const CoordonneeB & v2); /// idem en coordonnées absolues avec le type Coordonnee static double Determinant( const Coordonnee & v1, const Coordonnee & v2); /// CALCUL DU DETERMINANT DE UN VECTEUR /// on supprime la fonction relative aux vecteurs, car elle "doit" être remplacée par celle sur les coordonnées /// static double Determinant( const Vecteur & v1); /// idem en coordonnées covariantes static double DeterminantB( const CoordonneeB & v1); /// idem en coordonnées absolues avec le type Coordonnee static double Determinant( const Coordonnee & v1); /// calcul de la variation d'un vecteur unitaire connaissant la variation du /// vecteur non norme /// v : le vecteur non norme, Dv : la variation de v, nor : la norme de v /// en retour : la variation de vecteur : le vecteur peut-être de dimension > 3 ///!!!!!!!!!!!!! très important: il doit s'agir de vecteur exprimé dans un repère orthonormé /// ceci est vrai quelque soit la variance affichée: car ici on ne prend pas en compte la variation /// d'une métrique associée à un repère non orthonormé /// ex: les variations des gi sont ok car en fait les gi représentent les coorddonées dans un repère absolu static Vecteur VarUnVect( const Vecteur & v, const Vecteur & Dv, double nor); /// idem avec des coordonnées, donc dim <= 3 static Coordonnee VarUnVect_coor( const Coordonnee & v, const Coordonnee & Dv, double nor); /// idem avec des coordonnéesB, donc dim <= 3 static CoordonneeB VarUnVect_coorB( const CoordonneeB & v, const CoordonneeB & Dv, double nor); /// idem avec des coordonnéesH, donc dim <= 3 static CoordonneeH VarUnVect_coorH( const CoordonneeH & v, const CoordonneeH & Dv, double nor); /// calcul du tableau de variation d'un vecteur unitaire connaissant le tableau de variation du /// vecteur non norme /// v : le vecteur non norme, Dv : la variation de v, nor : la norme de v /// en retour : le tableau de variation static Tableau VarUnVect( const Vecteur & v, const Tableau & Dv, double nor); static Tableau VarUnVect_coor( const Coordonnee & v, const Tableau & Dv, double nor); static Tableau VarUnVect_coorB( const CoordonneeB & v, const Tableau & Dv, double nor); /// idem et le tableau de retour passé en paramètre static Tableau & VarUnVect( const Vecteur & v, const Tableau & Dv, double nor, Tableau & retour); static Tableau & VarUnVect_coor( const Coordonnee & v, const Tableau & Dv, double nor, Tableau & retour ); static Tableau & VarUnVect_coorB( const CoordonneeB & v, const Tableau & Dv, double nor,Tableau & retour); /// la variation du vecteur est supposé se trouver dans le premier vecteur de la base static Tableau & VarUnVect_coorBN( const CoordonneeB & v, const Tableau & Dv, double nor,Tableau & retour); /// calcul de la variation d'un produit vectoriel /// vi et Dvi les vecteurs du produit vectoriel et leurs variations /// on supprime la fonction relative aux vecteurs, car elle "doit" être remplacée par celle sur les coordonnées /// static Tableau VarProdVect( const Vecteur & v1, const Vecteur & v2, /// const Tableau & Dv1, const Tableau & Dv2); static Tableau VarProdVect_coor( const Coordonnee & v1, const Coordonnee & v2, const Tableau & Dv1, const Tableau & Dv2); /// on supprime la fonction relative aux vecteurs, car elle "doit" être remplacée par celle sur les coordonnées /// // idem que le précédent module mais avec Dv qui est la référence des vecteurs Dv1 et Dv2 /// static Tableau VarProdVect( const Vecteur & v1, const Vecteur & v2, /// const Tableau & Dv); /// idem que le précédent module mais avec un retour en coordonnée, et un tableau de BaseB static Tableau VarProdVect_coor(const Coordonnee & v1, const Coordonnee & v2, const Tableau & Dv); /// idem que le précédent module mais avec in-out en coordonnéeB, et un tableau de BaseB static Tableau VarProdVect_coorB(const CoordonneeB & v1, const CoordonneeB & v2, const Tableau & Dv); /// idem avec le tableau de retour passé en paramètre static Tableau & VarProdVect_coor( const Coordonnee & v1, const Coordonnee & v2, const Tableau & Dv1, const Tableau & Dv2 ,Tableau & retour); static Tableau & VarProdVect_coor(const Coordonnee & v1, const Coordonnee & v2, const Tableau & Dv,Tableau & retour); static Tableau & VarProdVect_coorB(const CoordonneeB & v1, const CoordonneeB & v2, const Tableau & Dv,Tableau & retour); static Tableau & VarProdVect_coorBN(const CoordonneeB & v1, const CoordonneeB & v2, const Tableau & Dv,Tableau & retour); /// calcul de la variation de la norme d'un vecteur, connaissant la variation du vecteur, /// le vecteur, et sa norme, si la norme est trop petite on met à 0 la variation static Tableau VarNorme( const Tableau & Dv,const Coordonnee& V,const double& norme); /// ici le vecteur peut-être de dimension quelconque > 3 par exemple static Tableau VarNorme( const Tableau & Dv,const Vecteur& V,const double& norme); /// retourne le numero du ddl recherche identifie par en, dans le tableau passé en paramètre /// s'il existe sinon 0 static int Existe(const Tableau& tab_ddl,Enum_ddl en); /// calcul du produit mixte des vecteurs d'une base en coordonnées covariantes static double ProduitMixte(const BaseB & tab_v ); /// calcul de l'inverse d'une matrice 3x3 donnée par ces coordonnées, en retour la matrice /// d'entrée est remplacée par la matrice inverse /// 1) cas d'une matrice non symétrique (quelconque), rangement des valeurs: /// (1,1) ; (1,2) ; (1,3) ; (2,1) ; (2,2) ; (2,3) ; (3,1) ; (3,2) ; (3,3) static void Inverse_mat3x3(listdouble9Iter & i9Iter); /// 2) cas d'une matrice symétrique , rangement des valeurs: /// (1,1) ; (2,2) ; (3,3) ; (2,1) = (1,2) ; (3,2) = (2,3) ; (3,1) = (1,3) ; static void Inverse_mat3x3(listdouble6Iter & i6Iter); /// calcul de l'inverse d'une matrice 2x2 donnée par ces coordonnées, en retour la matrice /// d'entrée est remplacée par la matrice inverse /// 1) cas d'une matrice non symétrique (quelconque), rangement des valeurs: /// (1,1) ; (2,2) ; (2,1) ; (1,2) ; static void Inverse_mat2x2(listdouble4Iter & i4Iter); /// 2) cas d'une matrice symétrique , rangement des valeurs: /// (1,1) ; (2,2) ; (2,1) = (1,2) ; static void Inverse_mat2x2(listdouble3Iter & i3Iter); }; /// @} // end of group #ifndef MISE_AU_POINT #include "Util.cc" #define Util_H_deja_inclus #endif #endif