// 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: 19/01/2007 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: gérer les conditions limites linéaires en I/O * * en particulier comme conteneur. * * informations: pour l'instant on considère une conditions * * linéaires entre les ddl d'une même famille d'un noeud. * * Une instance de I_O_Condilineaire peut générer un grand nombres * * de conditions linéaires particulières, en fait autant que de * * noeuds appartenant à la référence principal. Ces conditions * * particulières ne sont pas stockées dans I_O_Condilineaire !! * * par contre, elles peuvent être générées par I_O_Condilineaire. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef I_O_CONDILINEAIRE_H #define I_O_CONDILINEAIRE_H #include "Condilineaire.h" #include "Plan.h" #include "Droite.h" /// @addtogroup Les_classes_relatives_aux_conditions_limites /// @{ /// class I_O_Condilineaire : public Condilineaire { // surcharge de l'operator de lecture // les informations sont typées friend istream & operator >> (istream &, I_O_Condilineaire &); // surcharge de l'operator d'ecriture typée friend ostream & operator << (ostream &, const I_O_Condilineaire &); public : // CONSTRUCTEURS : // par défaut I_O_Condilineaire(); // de copie I_O_Condilineaire(const I_O_Condilineaire& nd); // DESTRUCTEUR : ~I_O_Condilineaire(); // METHODES PUBLIQUES : // Retourne la reference attache à la condition linéaire const string& NomRef () const { return refe; }; // retourne un pointeur de string donnant le nom du maillage associé // = NULL si aucun maillage const string* NomMaillage() const {return nom_maillage;}; // retourne le tableau des références associées (peut-être vide !) const Tableau & ReferenceAssociees() const {return refs_associe;}; // retourne le tableau des nom de maillage associées aux noms de ref (peut être = 0) // tail = 0 si il n'y a pas de nom de maillage sur la ref principale const Tableau & NomMaillageAssociees() const {return nom_mail_associe;}; // examine si la condition passée en argument possède les mêmes cibles que this // mais que les data associés sont différents // ramène true si c'est vrai, false sinon bool MemeCibleMaisDataDifferents(I_O_Condilineaire& d); // Affiche les donnees void Affiche () const ; // Realise l'egalite I_O_Condilineaire& operator= (const I_O_Condilineaire& d); //Surcharge d'operateur logique: ne concerne que la condition initiale (pas la condition actuelle, // c-a-d les coeff actuelles et les noeuds actuellement en cause etc.) bool operator == ( I_O_Condilineaire& a) const ; bool operator != ( I_O_Condilineaire& a) const { return !(*this == a);}; // lecture de la condition linéaire sur le fichier d'entree void Lecture(UtilLecture & entreePrinc); // retourne si la condition est relative ou pas // une condition relative signifie que la condition s'effectue par rapport au pas de temps // précédent i.e. t=t // une condition non relative, donc absolue signifie que la condition s'effectue par rapport à // t = 0 bool ConditionRelative() const {return condition_relative;}; //--- cas des conditions linéaires type plan ou droite --------------------------------------------- // ramène true si on a effectivement une condi linéaire type plan ou droite bool PlanDroite() const {return def_auto_par_rotation;}; // indique si le blocage qui existe déjà sur les noeuds à projeter, est cohérent // avec la projection: // typiquement si la direction de blocage est normale au plan de rotation // ramène true si on peut concerver la condition de projection // en entrée: indi qui donne la direction déjà bloquée bool Coherence_condi_PlanDroite(int indi)const; // ramène true si on a effectivement une condi linéaire type stricte_egalite bool StricteEgalite() const {return stricte_egalite;}; // le nom du maillage éventuellement et le numéro du noeud s'il y a un noeud rotation // sinon ramène un pointeur null const String_et_entier* RefNoeudRotation() const {if (type_centre==1){return NULL;} else {return &mailEtNumCentreNoeud;};}; // definition du noeud: centre rotation void ChangeCentreNoeudRotation( Noeud* noe); // définition de la direction actuelle ou normale pour plan droite void ActualiseDirectionPlanDroite(); // projection (normale) du point M sur le plan ou droite, ramène le point M à la place du // projeté, et calcul de la condition linéaire correspondant à la projection Coordonnee& ProjectionSurPlanDroite_et_calValCondiLin(Coordonnee& M ); // --- fin des condi linéaires types plan droite --------------------------------------------------- // Construction de la condition : en particulier les pointeurs de ddl permettant d'imposer la condition // et def des coefficients en fonction éventuellement du temps ou de l'incrément du temps selon // le paramètre condition_relative // pour cela // 1) on doit renseigner les fonctions de charge si elles existent // a) retour du nombre de fonction de charge int ExisteFonctionChargeCoef()const {return tab_co_charge.Taille();}; // b) le nom de la courbe const string & NomFctch(int i) const {return tab_co_charge(i);}; // b) on renseigne les valeurs des fonctions de charge void Valeur_fonctionChargeCoef(const Vecteur & fctch_,const Vecteur & delta_fctch_) {fctch = fctch_;delta_fctch = delta_fctch_;}; // 2) // Construction de la condition : 1) mise en place d'une valeur imposée due à la condition linéaire // def des coefficients en fonction éventuellement des fonctions de charges et du paramètre condition_relative // NB: pour les conditions correspondant à une projection sur un plan ou une droite, il faut que la direction du plan // ou de la droite ait déjà été affecté auparavant // !! la condition sur le ddl n'est pas imposée à ce niveau, par contre elle est stockée dans Condilineaire Condilineaire& ConstructionCondition(Tableau & t_noe,Condilineaire& condi_actuelle); // affichage des commandes particulières à la définition d'une condition linéaire void Info_commande_conditionLineaire(ofstream & sort,bool plusieurs_maillages); // récupération de l'énuméré du type de ddl considéré par la condition limite linéaire Enum_ddl TypeEnu() const {return enu;}; // retourne un booléen qui indique si oui ou non le temps passé en paramètre // est situé entre le temps min et maxi de la condition linéaire bool Temps_actif(const double& temps) const {if ((t_min < temps) && (temps <= t_max)) return true; else return false; }; // ramène vrai si le temps est inférieur au temps actif, ou supérieur au temps max // ou si d'une part le temps n'est pas actif et qu'au pas précédent // il n'était pas également actif bool Pas_a_prendre_en_compte(const double& temps) const {if ((temps <= t_min) || ((temps > t_max) && !precedent)) return true; else return false; }; // ramène vrai si le temps est inférieur ou égale au temps actif, ou supérieur au temps max bool Pas_a_prendre_en_compte_dans_intervalle(const double& temps) const {if ((temps <= t_min) || (temps > t_max)) return true; else return false; }; // Validation on non de l'activité de la charge void Validation(const double& temps) {precedent = Temps_actif(temps); valeur_precedente_t = beta;}; // retour du statut de validation // vrai signifie que l'état enregistré est actif bool Etat_validation() const {return precedent;}; // initialisation des grandeurs de travail void Initialisation_condil(); protected : // informations: pour l'instant on considère une conditions linéaires entre les ddl d'une même // famille d'un noeud. // données string* nom_maillage; // nom de maillage associé, éventuellement! string refe; // reference principale attachee aux ddl Tableau refs_associe; // dans le cas où il y a une condition linéaire entre plusieurs // noeuds, la méthode retenue est la suivante: à chaque noeud de refe on associe un noeuds // de chaque référence du tableau refs_associe, et on prend les ddl de type enu de chaque ref // et on a une combinaison linéaire entre chacun. Dans ce cas, il faut donc que toutes les // référence aient le même nombre de noeuds Tableau nom_mail_associe; // dans le cas où nom_maillage est non null // il faut que toutes les références associées aient un nom de maillage associé double t_min,t_max; // temps mini et maxi de durée des ddl imposés double echelle; // échelle globale éventuelle Enum_ddl enu; // identificateur du premier ddl de la famille pour laquelle on a une condition linéaire // les ddl s'appliques d'abord à suivre à chaque noeud int nbddlfamille; // nombre de ddl de la famille associée à enu int condition_relative; // indique si oui ou non la condition à t+dt s'effectue // par rapport à t ou par rapport à 0 int precedent; // pour la description de l'évolution d'un temps à l'autre double valeur_precedente_t; // valeur à t Tableau tab_co_charge; // même dimension que (le nombre de ddl de type enu) * (1+le nombre // de ref associé) s'il y a des courbes de charge // Permet d'avoir des coefficients qui varient. S'il y a une courbe de charge // alors toutes existent sinon aucune Vecteur fctch,delta_fctch; // vecteur de travail qui contient les valeurs des fonctions de charge // et leur acroissment entre t et t+deltat //--- variables particulières pour la définition automatique d'une condition linéaire sur plan ou droite bool def_auto_par_rotation;// signale le cas particulier du condition linéaire automatique int type_centre; // = 1 on a un centre fixe c-a-d: centre_rotation, =2 le centre est centre_noeud à t=0 // =3 le centre est centre_noeud à t Coordonnee centre_rotation; // position du centre de rotation fixe String_et_entier mailEtNumCentreNoeud; // maillage et numéro du centre noeud s'il existe Noeud* centre_noeud; Plan pl; Droite dr; //--- variables particulières pour la condition particulière d'égalité exacte, pour tous les ddl // du type enu, -> traitement particulier bool stricte_egalite; // 1) cas simple: pas de ref associe cela signifie que la condition linéaire concerne uniquement // des ddl de chaque noeud de la ref principal. Pour chaque noeud on applique la même condition (au // mvt solide près). La taille de val // 1) cas où l'on a des références secondaire, celle-ci doivent avoir tous le même nombre de noeud, // identique à la ref principal. Supposons qu'il y a na liste associé. La condition linéaire relie // les ddl de na+1 noeud, chacun étant pris dans une ref associé + 1 sur la ref principal. Pour chaque // noeud la liste des enu_ddl du même type que enu est parcouru: soit t_enu leur nombre. Donc au final, // la taille de val (qui contient les coeff de la condition linéaire = (na+1)*t_enu }; /// @} // end of group #endif