// 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: Frontiere : segment lineaire avec un pt d'integ. * * On considère aussi le cas ou il s'agit de segment * * axisymétrique. Dans ce cas, le support géométrique est 1D * * mais l'élément réel est 2D. A priori-cela n'influe pas * * les différentes méthodes, sauf la définition de la * * métrique. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef FRONTSEGLINE_H #define FRONTSEGLINE_H #include "ElFrontiere.h" #include "GeomSeg.h" /// @addtogroup Les_Elements_de_frontiere /// @{ /// class FrontSegLine : public ElFrontiere { public : // CONSTRUCTEURS : //par defaut FrontSegLine (); // fonction du tableau des noeuds sommets FrontSegLine ( const Tableau & tab, const DdlElement& ddlElem); FrontSegLine( const FrontSegLine& a); // de copie // DESTRUCTEUR : ~FrontSegLine (); // METHODES PUBLIQUES : // surcharge de l'affectation ElFrontiere& operator = ( const ElFrontiere& a); // retourne le type de l'element frontiere string TypeFrontiere() const ; // retourne l'élément géométrique attaché à l'élément frontière ElemGeomC0 & ElementGeometrique() const {return segment;}; // creation d'un nouvelle element frontiere du type FrontSegLine ElFrontiere * NevezElemFront() const ; // creation d'un nouvelle element frontiere du type FrontSegLine // avec des donnees differentes ElFrontiere * NevezElemFront( const Tableau & tab, const DdlElement& ddlElem)const ; // ramene les coordonnees du point de reference de l'element Coordonnee Ref() ; // ramene une droite tangente au point de reference // si indic = 1 -> une droite // ces infos sont stocke et sauvegardees dans l'element void TangentRef(Droite& dr, Plan& pl, int& indic); // M est un point de la derniere droite tangente sauvegarde dans l'element // - calcul du point M1 correspondant sur la courbe , M1 est stocke // _ calul et retour de la droite tangente au point M1 // si indic = 1 -> une droite // ces infos sont stocke et sauvegardees dans l'element void Tangent(const Coordonnee& M,Coordonnee& M1, Droite& dr, Plan& pl, int& indic); // ramene une autre droite tangente genere de maniere pseudo aleatoire // si indic = 1 -> une droite, // ces infos sont stocke et sauvegardees dans l'element void AutreTangent(Droite& dr, Plan& pl, int& indic); // ramene true si le dernier point M1 est dans l'element , sinon false // le calcul est fait à eps relatif près bool InSurf(const double& eps) const ; // actualise et ramene le dernier plan tangent (ou droite tangente) calcule // si indic = 1 -> une droite, =2 -> un plan // ramène éventuellement la variation du vecteur normale pour un plan en 3D ou une ligne en 2D // dans le cas d'une ligne en 3D ramène la variation du vecteur tangent: si var_normale = true, sinon ramène NULL Tableau * DernierTangent(Droite& dr, Plan& pl, int& indic,bool avec_var=false); // test si la position d'un point est du bon cote ( c-a-d hors matiere) ou non // si le point est sur la surface, ramène false // ramene true si hors matiere, sinon false // le test sur a est executer uniquement dans les cas suivants : // dimension 3D et frontiere 2D // dimension 3D axi et frontière 1D // dimension 2D et frontiere 1D // ->>> dimension 3D et frontiere 1D, pas de verif // ->>> autre cas ne doivent pas arriver normalement !! // retour de r = distance du point à la surface, ligne bool BonCote_t( const Coordonnee& a,double& r) const ; // cas ou on utilise la frontiere a t bool BonCote_tdt( const Coordonnee& a,double& r) const ; // cas ou on utilise la frontiere a tdt // calcul les fonctions d'interpolation au dernier point de projection sauvegarde const Vecteur& Phi(); // affichage des infos de l'elements void Affiche(Enum_dure temp = TEMPS_tdt) const ; // creation et ramene des pointeurs sur les frontieres de l'element frontiere // au premier appel il y a construction, ensuite on ne fait que ramener le tableau // à moins qu'il soit effacé Tableau & Frontiere(); // ramène la métrique associée à l'élément Met_abstraite * Metrique() {return met;}; // cas d'un élément frontière ligne: // ramène, une longueur approximative de l'élément (toujours > 0) : calculée à l'aide // de la ligne représentée par une suite de segments rejoignants les noeuds // ramène une valeur nulle, s'il n'y a pas de ligne double LongueurApprox(); //----- lecture écriture de restart ----- // ceci concerne uniquement les informations spécifiques // dans le cas de l'utilisation de la frontière pour la projection d'un point sur la frontière // il s'agit donc d'un cas particulier void Lecture_base_info_ElFrontiere_pour_projection(ifstream& ent) ; void Ecriture_base_info_ElFrontiere_pour_projection(ofstream& sort) ; private : // VARIABLES PROTEGEES : static GeomSeg segment; // le segment de reference static Met_abstraite * met; // une metrique associee // de type Met_biellette ou MetAxisymetrique2D static Vecteur phi; // interpolation au point courant static Mat_pleine dphi; // derivees de l'interpolation au point courant Coordonnee refP; // Point de reference de l'element Droite droite; // droite tangente ici c'est l'element, à la longueur près Tableau d_T; // variation du vecteur tangent Coordonnee Mp; // coordonnees du point courant projete static BaseB giB; // base naturelle de travail static BaseH giH; // base duale de travail Coordonnee theta; // coordonnees du point courant projete Coordonnee theta_repere; // le point où l'on calcul le repère // METHODES PROTEGEES : // methodes propres a l'element inline Coordonnee MP() const { return Mp;}; inline Droite DR() const { return droite; }; inline Coordonnee Theta() const { return theta;}; // definition de la metrique void DefMetrique(); }; /// @} // end of group #endif