// 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: . #include "LesLoisDeComp.h" #include "Prandtl_Reuss.h" #include "Prandtl_Reuss2D_D.h" #include "Prandtl_Reuss1D.h" #include "Loi_iso_elas3D.h" #include "Loi_iso_elas1D.h" #include "Loi_iso_elas2D_D.h" #include "Loi_iso_elas2D_C.h" #include "Iso_elas_expo1D.h" #include "Iso_elas_expo3D.h" #include "Iso_elas_SE1D.h" #include "IsoHyper3DFavier3.h" #include "IsoHyper3DOrgeas1.h" #include "IsoHyper3DOrgeas2.h" #include "IsoHyperBulk3.h" #include "TreloarN.h" #include "Loi_newton1D.h" #include "Loi_newton3D.h" #include "Loi_newton2D_D.h" #include "Loi_maxwell1D.h" #include "Loi_maxwell2D_D.h" #include "Loi_maxwell2D_C.h" #include "Loi_maxwell3D.h" #include "LoiAdditiveEnSigma.h" #include "LoiDesMelangesEnSigma.h" #include "LoiContraintesPlanes.h" #include "LoiContraintesPlanesDouble.h" #include "LoiDeformationsPlanes.h" #include "Hysteresis1D.h" #include "Hysteresis3D.h" #include "Hysteresis_bulk.h" #include "Loi_iso_thermo.h" #include "Loi_de_Tait.h" #include "MooneyRivlin1D.h" #include "MooneyRivlin3D.h" #include "Hart_Smith3D.h" #include "Poly_hyper3D.h" #include "Hypo_hooke3D.h" #include "Hypo_hooke2D_C.h" #include "Hypo_hooke1D.h" #include "Loi_Umat.h" #include "CompFrotCoulomb.h" #include "Loi_rien1D.h" #include "Loi_rien2D_D.h" #include "Loi_rien2D_C.h" #include "Loi_rien3D.h" #include "CharUtil.h" #include "IsoHyperBulk_gene.h" #include "LoiCritere.h" #include "Maheo_hyper.h" #include "Hyper_externe_W.h" #include "Loi_ortho3D_entrainee.h" #include "Projection_anisotrope_3D.h" #include "Hypo_ortho3D_entrainee.h" #include "Loi_ortho2D_C_entrainee.h" // grandeurs statiques list LesLoisDeComp::list_de_loi; LesLoisDeComp::LesLoisDeComp () : // constructeur par defaut tabRefLoi(),tabLoi(),list_de_umat() {// on remplit la liste de loi LoiAbstraiteGeneral * pt; pt = new Loi_iso_elas3D ();list_de_loi.push_back(pt); // ISOELAS pt = new Loi_iso_elas1D ();list_de_loi.push_back(pt); // ISOELAS1D pt = new Loi_iso_elas2D_D ();list_de_loi.push_back(pt); // ISOELAS2D_D pt = new Loi_iso_elas2D_C ();list_de_loi.push_back(pt); // ISOELAS2D_C pt = new Iso_elas_expo1D ();list_de_loi.push_back(pt); // ISO_ELAS_ESPO1D pt = new Iso_elas_expo3D ();list_de_loi.push_back(pt); // ISO_ELAS_ESPO3D pt = new Iso_elas_SE1D ();list_de_loi.push_back(pt); // ISO_ELAS_SE1D pt = new IsoHyper3DFavier3 ();list_de_loi.push_back(pt); // ISOHYPER3DFAVIER3 pt = new IsoHyper3DOrgeas1 ();list_de_loi.push_back(pt); // ISOHYPER3DORGEAS1 pt = new IsoHyper3DOrgeas2 ();list_de_loi.push_back(pt); // ISOHYPER3DORGEAS2 pt = new IsoHyperBulk3 ();list_de_loi.push_back(pt); // ISOHYPERBULK3 pt = new IsoHyperBulk_gene ();list_de_loi.push_back(pt); // ISOHYPERBULK_GENE pt = new Prandtl_Reuss ();list_de_loi.push_back(pt); // PRANDTL_REUSS pt = new Prandtl_Reuss2D_D ();list_de_loi.push_back(pt); // PRANDTL_REUSS2D_D pt = new Prandtl_Reuss1D ();list_de_loi.push_back(pt); // PRANDTL_REUSS1D pt = new TreloarN ();list_de_loi.push_back(pt); // TRELOAR pt = new Loi_newton1D ();list_de_loi.push_back(pt); // NEWTON1D pt = new Loi_newton2D_D ();list_de_loi.push_back(pt); // NEWTON2D_D pt = new Loi_newton3D ();list_de_loi.push_back(pt); // NEWTON3D pt = new Loi_maxwell1D ();list_de_loi.push_back(pt); // MAXWELL1D pt = new Loi_maxwell2D_D ();list_de_loi.push_back(pt); // MAXWELL2D_D pt = new Loi_maxwell2D_C ();list_de_loi.push_back(pt); // MAXWELL2D_C pt = new Loi_maxwell3D ();list_de_loi.push_back(pt); // MAXWELL3D pt = new LoiAdditiveEnSigma ();list_de_loi.push_back(pt); // LOI_ADDITIVE_EN_SIGMA pt = new LoiCritere ();list_de_loi.push_back(pt); // LOI_CRITERE pt = new LoiDesMelangesEnSigma ();list_de_loi.push_back(pt); // LOI_DES_MELANGES_EN_SIGMA pt = new LoiContraintesPlanes ();list_de_loi.push_back(pt); // LOI_CONTRAINTES_PLANES pt = new LoiContraintesPlanesDouble ();list_de_loi.push_back(pt); // LOI_CONTRAINTES_PLANES_DOUBLE pt = new LoiDeformationsPlanes ();list_de_loi.push_back(pt); // LOI_DEFORMATIONSS_PLANES pt = new Hysteresis1D ();list_de_loi.push_back(pt); // HYSTERESIS_1D pt = new Hysteresis3D ();list_de_loi.push_back(pt); // HYSTERESIS_3D pt = new Hysteresis_bulk ();list_de_loi.push_back(pt); // HYSTERESIS_BULK pt = new Loi_iso_thermo ();list_de_loi.push_back(pt); // LOI_ISO_THERMO pt = new Loi_de_Tait ();list_de_loi.push_back(pt); // LOI_DE_TAIT pt = new MooneyRivlin1D ();list_de_loi.push_back(pt); // MOONEY_RIVLIN_1D pt = new MooneyRivlin3D ();list_de_loi.push_back(pt); // MOONEY_RIVLIN_3D pt = new Hart_Smith3D ();list_de_loi.push_back(pt); // HART_SMITH3D pt = new Poly_hyper3D ();list_de_loi.push_back(pt); // POLY_HYPER3D pt = new Maheo_hyper ();list_de_loi.push_back(pt); // MAHEO_HYPER pt = new Hyper_externe_W ();list_de_loi.push_back(pt); // HYPER_EXTERNE_W pt = new Hypo_hooke3D ();list_de_loi.push_back(pt); // HYPO_ELAS3D pt = new Hypo_hooke2D_C ();list_de_loi.push_back(pt); // HYPO_ELAS2D_C pt = new Hypo_hooke1D ();list_de_loi.push_back(pt); // HYPO_ELAS1D // en dimension 3, on peut avoir des Umat, mais pas dans les autres dimensions if (ParaGlob::Dimension() == 3) {pt = new Loi_Umat ();list_de_loi.push_back(pt); // LOI_VIA_UMAT pt = new Loi_Umat (LOI_VIA_UMAT_CP);list_de_loi.push_back(pt); // LOI_VIA_UMAT_CP }; pt = new CompFrotCoulomb ();list_de_loi.push_back(pt); // LOI_COULOMB pt = new Loi_rien1D ();list_de_loi.push_back(pt); // LOI_rien1D pt = new Loi_rien2D_C ();list_de_loi.push_back(pt); // LOI_rien2D_C pt = new Loi_rien2D_D ();list_de_loi.push_back(pt); // LOI_rien2D_D pt = new Loi_rien3D ();list_de_loi.push_back(pt); // LOI_rien3D pt = new Loi_ortho_elas3D ();list_de_loi.push_back(pt); // Loi_ortho_elas3D pt = new Loi_ortho2D_C_entrainee ();list_de_loi.push_back(pt); // Loi_ortho_elas2D_C pt = new Projection_anisotrope_3D ();list_de_loi.push_back(pt); // Loi_ortho_elas3D pt = new Hypo_ortho3D_entrainee(); list_de_loi.push_back(pt); // loi hypo-elas3D anisotrope }; // lecture des lois de comportement void LesLoisDeComp::LecturelesLoisDeComp(UtilLecture& entreePrinc,LesReferences& lesRef ,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD) { if (ParaGlob::NiveauImpression() >= 4) cout << " debut de la lecture des lois de comportement " << endl; // lecture des references de materiaux if (ParaGlob::NiveauImpression() >= 6) cout << " lecture des references de materiaux " << endl; LecRef(entreePrinc,lesRef); if (ParaGlob::NiveauImpression() >= 6) cout << " lecture des materiaux " << endl; // lecture des materiaux LecMateriaux(entreePrinc,lesRef,lesCourbes1D,lesFonctionsnD); // -------- vérification des doublons ------------ // on verifie que l'on n'utilise pas deux fois la meme reference // pour deux loi differentes de la même catégorie int taille = tabRefLoi.Taille(); for (int i=1;i<=taille;i++) for (int j= i+1;j<=taille;j++) if ((tabRefLoi(i).st1 == tabRefLoi(j).st1) // la référence && (tabRefLoi(i).st2 != tabRefLoi(j).st2) // le nom de la loi de comp && ((tabRefLoi(i).nom_maillage == tabRefLoi(j).nom_maillage) // le maillage || (*(tabRefLoi(i).nom_maillage) == *(tabRefLoi(j).nom_maillage)))) // éventuelle { // cas ou l'on a 2 fois la même référence et deux lois différentes LoiAbstraiteGeneral * pt1 = PtLoi_abstraite(tabRefLoi(i).st2); LoiAbstraiteGeneral * pt2 = PtLoi_abstraite(tabRefLoi(j).st2); if (MemeCategorie(pt1->Id_categorie(),pt2->Id_categorie())) { cout << "\n erreur , un meme nom de reference est utilisee pour" << " deux lois de materiaux de categories differentes \n"; if (tabRefLoi(i).nom_maillage != NULL) cout << "nom du maillage " << *(tabRefLoi(i).nom_maillage); cout << " nom de la ref = " << tabRefLoi(i).st1 << ", nom des deux lois de materiaux =" << tabRefLoi(i).st2 <<", "<< tabRefLoi(j).st2 ; cout << " LesLoisDeComp::LecRef(UtilLecture& entreePrinc," << "LesReferences& lesRef) " << endl; entreePrinc.MessageBuffer("**** lecture des lois de comportement ***** "); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); } }; if (ParaGlob::NiveauImpression() >= 4) cout << " fin de la lecture des lois de comportement " << endl; }; // affichage et definition interactive des commandes void LesLoisDeComp::Info_commande_lesLoisDeComp(UtilLecture& entreePrinc,LesReferences& ) {cout << "\n# ----- definition des lois de comportements ----- "; bool plusieurs_maillages = false; string rep="_"; list l_elem_loi; // liste des : nom de loi, nom de ref d'éléments, nom de maillage éventuel ofstream & sort = *(entreePrinc.Commande_pointInfo()); // pour simplifier try {cout << "\n cas d'un seul maillage (par defaut) : rep o " << "\n cas de plusieurs maillages : rep n "; // procédure de lecture avec prise en charge d'un retour chariot rep = lect_return_defaut(true,"o"); if (rep == "n") { plusieurs_maillages = true;}; rep="_"; // init // tout d'abord la définition des listes d'éléments associés à des noms de lois while ((Minuscules(rep) != "f")&&(Minuscules(rep) != "0")) { cout << "\n -- definition des ref d'elements associes a des noms de lois -- " << "\n (0 ou f) (fin) " << "\n (1) def d'une ref d'elements associe a un nom de loi " << "\n (2 ou ? ) exemple - informations ! " << "\n (3) grandeurs types disponibles pour les fct nD utilisees dans les lois " << "\n "; // procédure de lecture avec prise en charge d'un retour chariot rep = lect_return_defaut(false,"f"); if ((Minuscules(rep) == "f") || (Minuscules(rep) == "0"))// sortie directe break; int num = ChangeEntier(rep); if (Minuscules(rep) == "?") num = 3; bool choix_valide=false; if ((num >= 0)&&(num<=3)) { choix_valide=true; } else { cout << "\n Erreur on attendait un entier entre 0 et 3 !!, " << "\n redonnez une bonne valeur" << "\n ou taper f ou 0 pour arreter le programme"; choix_valide=false; }; switch (num) { case 0: // sortie { break;} // normalement cela a déjà été filtré avant case 1: // def d'une liste d'elements associe a un nom de loi { Trois_String t_str; t_str.nom3="_"; // init if (plusieurs_maillages) { cout << "\n nom du maillage ? "; t_str.nom3= lect_chaine(); cout << " nom lu = "<< t_str.nom3; }; cout << "\n nom de la reference d'element ? "; t_str.nom2= lect_chaine(); cout << " ref lu = "<< t_str.nom2; if (t_str.nom2[0] != 'E') {cout << "\n Erreur on attendait un identificateur avec une premiere lettre = E !!, " << "\n recommencer" << "\n ou taper f ou 0 pour arreter le programme"; choix_valide=false; }; cout << "\n nom de la loi associee a "<::iterator il,ilfin=l_elem_loi.end(); // suppression des doublons l_elem_loi.sort(); l_elem_loi.unique(); tabRefLoi.Change_taille(l_elem_loi.size()); int iii = 1; for (il = l_elem_loi.begin();il != ilfin; il++,iii++) { Trois_String& t_str = (*il); // pour simplifier sort << "\n"; if (t_str.nom3 != "_") {sort << "nom_mail= "<< t_str.nom3 << " "; tabRefLoi(iii).Change_nom_maillage(t_str.nom3); }; sort << t_str.nom2 << " "<< t_str.nom1 << " "; tabRefLoi(iii).st1=t_str.nom2;tabRefLoi(iii).st2=t_str.nom1; }; // -- maintenant on va s'occuper de définir les lois // sortie des lois de comportements // affichage de l'entête sort << "\n" << "\n materiaux #----------\n"; cout << "\n \n definition des lois de comportement associee au(x) materiau(x) precedemment definit"; // on commence par définir une liste de loi qui ont la bonne dimension int dim = ParaGlob::Dimension(); list list_de_loi_dim; list ::iterator ilit,ilifint = list_de_loi.end(); for(ilit=list_de_loi.begin();ilit != ilifint;ilit++) { if (((*ilit)->Dimension_loi() <= dim) || ((*ilit)->Dimension_loi() == 4)) list_de_loi_dim.push_back(*ilit);} // maintenant on parcourt les noms de lois bool choix_valide = false; list ::iterator im,imfin=l_elem_loi.end(); for (im=l_elem_loi.begin();im!=imfin;im++) {choix_valide = false; Trois_String& t_str = (*im); // pour simplifier while (!choix_valide) {int nbloi = list_de_loi_dim.size(); try { // affichage des différentes lois de comportement list ::iterator ili,ilifin = list_de_loi_dim.end(); int undeux=0; int num=0; Tableau tab_ili(nbloi); cout << "\n (0) fin \n"; int i=1; for(ili=list_de_loi_dim.begin();ili != ilifin;ili++,i++) { cout << " (" << i << ") " << setw(nbmax_caractere_Enum_comp+3) << (*ili)->Nom_comport() <<" "; undeux++; if (undeux==2) {cout << "\n";undeux=0;} tab_ili(i) = (*ili); }; cout << "\n donnez la loi de comportement pour le materiau: " << t_str.nom1 << " (un numero): "; rep = lect_chaine(); if (rep == "fin_prog") Sortie(1); num = ChangeEntier(rep); choix_valide=false; if (num == 0) { choix_valide=true;} else if ((num > 0)&&(num<=nbloi)) { // affichage de la loi sort << "\n#------------------------------------------" << "\n# Nom Materiau | Type loi |" << "\n#------------------------------------------" << "\n " << t_str.nom1 << " " << tab_ili(num)->Nom_comport(); // affichage particulier à la loi tab_ili(num)->Info_commande_LoisDeComp(entreePrinc); choix_valide=true; } else { cout << "\n Erreur on attendait un entier entre 0 et "<< nbloi <<" !!, " << "\n redonnez une bonne valeur" << "\n ou taper fin_prog pour arreter le programme"; } } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch (...)//(UtilLecture::ErrNouvelleDonnee erreur) { cout << "\n Erreur on attendait un entier entre 0 et "<< nbloi <<" !!, " << "\n redonnez une bonne valeur" << "\n ou taper fin_prog pour arreter le programme"; choix_valide=false; } }; //-- fin du while }; // fin de la définition des loi sort << "\n#--------------------------------------- fin def des lois de comportement ------------------------" << endl; sort << flush; }; // affichage des lois de comportement void LesLoisDeComp::Affiche() const { cout << "\n *** loi de comportement ******** \n"; cout << tabRefLoi.Taille() << " references de loi de comp lu \n"; cout << " reference elements : nom du materiau : \n"; for (int i = 1;i<=tabRefLoi.Taille();i++) cout << tabRefLoi(i).st1 << " " << tabRefLoi(i).st2 << '\n'; cout << tabLoi.Taille() << " loi(s) de comp lu \n"; for (int i = 1;i<=tabLoi.Taille();i++) { cout << " nom de la loi = " << (tabLoi(i)).st1 ; (tabLoi(i)).pt->Affiche(); cout << '\n'; } }; //------------------------------------ protegees ---------------------- // lecture des references de materiaux void LesLoisDeComp::LecRef(UtilLecture& entreePrinc,LesReferences& lesRef) { if (strstr(entreePrinc.tablcar,"choix_materiaux")!=NULL) { // lecture des references de materiaux list lili; entreePrinc.NouvelleDonnee(); MotCle motCle; while (!motCle.SimotCle(entreePrinc.tablcar)) { // on commence par regarder si le nom du maillage est définit pour le matériau string* nom_mail=NULL; string nom; if (strstr(entreePrinc.tablcar,"nom_mail=")!=NULL) { *(entreePrinc.entree) >> nom >> nom; nom_mail = & nom;} // st1 = nom d'une reference, st2 = nom d'une loi string st1,st2; *(entreePrinc.entree) >> st1 >> st2; // on regarde si st1 correspond bien a une reference lue if (!lesRef.Existe(st1,nom_mail)) { cout << "\n erreur, la ref de materiau = " << st1 <<" , ne correspond a aucun element" << " de la liste de reference lue !! \n"; cout << " LesLoisDeComp::LecRef(UtilLecture& entreePrinc," << "LesReferences& lesRef) " << endl; entreePrinc.MessageBuffer("lecture des references de materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); } // stockage LesLoisDeComp::RefLoi ref(nom_mail,st1,st2); lili.push_back(ref); entreePrinc.NouvelleDonnee(); } if (lili.size() == 0) { cout << "\n erreur, aucune reference de loi de comportement" << " n est defini !! \n"; cout << " LesLoisDeComp::LecRef(UtilLecture& entreePrinc," << "LesReferences& lesRef) " << endl; entreePrinc.MessageBuffer("lecture des references de materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); } else { // enregistrement des infos tabRefLoi.Change_taille((int)lili.size()); list ::iterator i; int j; for (i=lili.begin(),j=1 ; i != lili.end(); i++,j++) tabRefLoi(j) = *i; } } else { cout << "\n erreur, le mot cle choix_materiaux n'existe pas !! \n"; cout << " LesLoisDeComp::LecRef(UtilLecture& entreePrinc," << "LesReferences& lesRef) " << endl; entreePrinc.MessageBuffer("lecture des references de materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); } }; // lecture des materiaux void LesLoisDeComp::LecMateriaux(UtilLecture& entreePrinc,LesReferences& ,LesCourbes1D& lesCourbes1D,LesFonctions_nD& lesFonctionsnD) {try { if (strstr(entreePrinc.tablcar,"materiaux")!=NULL) { // lecture des materiaux list lili; entreePrinc.NouvelleDonnee(); MotCle motCle; while (!motCle.SimotCle(entreePrinc.tablcar)) { // st1 = nom d'une reference de materiau, st2 = nom du type de loi string st1,st2; *(entreePrinc.entree) >> st1 >> st2; // verif que st1 correspond a quelque chose d'utilisable bool ex = false; for (int i=1;i<= tabRefLoi.Taille(); i++) if(tabRefLoi(i).st2 == st1) ex = true; // definition de la loi LoiAbstraiteGeneral * pt = Def_loi(st2); // on verifie que l'on n'utilise pas deux fois la meme reference // pour deux lois d'une même catégorie list ::iterator ii; for (ii=lili.begin() ; ii != lili.end(); ii++) if ((*ii).st1 == st1) //&& (MemeCategorie((*ii).pt->Id_categorie(),pt->Id_categorie()))) { cout << "\n erreur , une meme reference est utilisee deux fois" << " nom de la ref = " << st1 << " pour une meme categorie de loi: " << Nom_categorie_loi_comp(pt->Id_categorie()); cout << "\n LesLoisDeComp::LecMateriaux(UtilLecture& " << "entreePrinc,LesReferences& lesRef) " << endl; entreePrinc.MessageBuffer("lecture des materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); } // lecture des informations particulières propres à la loi entreePrinc.NouvelleDonnee(); // prepa du flot de lecture pt->LectureDonneesParticulieres (&entreePrinc,lesCourbes1D,lesFonctionsnD); // on enregistre et on signale si la loi est inutilisée via un warning #ifdef UTILISATION_MPI if (ParaGlob::Monde()->rank()==0) // seule le proc 0 afficher #endif if (!ex && (ParaGlob::NiveauImpression()>1)) { cout << "\n Warning, le nom de materiau = " << st1 << " , ne correspond pas a une" << " reference de la liste des ref de materiau!! "; if (ParaGlob::NiveauImpression()>4) {cout << "\n LesLoisDeComp::LecMateriaux(UtilLecture& " << "entreePrinc,LesReferences& lesRef) " << endl; entreePrinc.MessageBuffer("lecture des materiaux"); }; }; // enregistrement lili.push_back(LesLoisDeComp::Loi(st1,pt)); // --- on regarde si la loi est à associer avec un critère particulier // par exemple un critère de rupture, ou de l'endommagement etc. // appelé : un Critere_Loi }; if (lili.size() == 0) { cout << "\n erreur, aucune loi de comportement" << " n est defini !! \n"; cout << " LesLoisDeComp::LecMateriaux(UtilLecture& entreePrinc) " << endl; entreePrinc.MessageBuffer("lecture des materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); } else { // enregistrement des infos tabLoi.Change_taille((int)lili.size()); list ::iterator i; int j; for (i=lili.begin(),j=1 ; i != lili.end(); i++,j++) tabLoi(j) = *i; } } else { cout << "\n erreur, le mot cle materiaux n'existe pas !! \n"; cout << " LesLoisDeComp::LecMateriaux(UtilLecture& entreePrinc) " << endl; entreePrinc.MessageBuffer("lecture des materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); }; // -- cas particulier de l'utilisation de lois Umat int nbloi=tabLoi.Taille(); for (int i=1; i<= nbloi; i++) {if ((tabLoi(i).pt->Id_comport()==LOI_VIA_UMAT) || (tabLoi(i).pt->Id_comport()==LOI_VIA_UMAT_CP) ) { Loi_Umat* loi = (Loi_Umat*) tabLoi(i).pt; // cas particulier des umat interne on "branche" if (loi->Utilise_une_umat_interne()) {// récup du nom de la loi associée const string& nom_loi_associe = loi->NomDeLaLoi(); // récup de la loi LoiAbstraiteGeneral * loi_ext = PtLoi_abstraite(nom_loi_associe); // association avec la loi définit loi->DefLoiExt(loi_ext); }; // sauvegarde de la liste des lois umat list_de_umat.push_back(tabLoi(i).pt); }; }; // --- dans le cas où les lois on besoins de grandeurs particulières qui doivent // provenir des autres lois on va créer une liste de ces grandeurs //Besoin_de_grandeurs_particuliere //une fois que l'on a lue toutes les lois //Activation_stockage_grandeurs_quelconques } catch (ErrSortieFinale) // cas d'une direction voulue vers la sortie // on relance l'interuption pour le niveau supérieur { ErrSortieFinale toto; throw (toto); } catch ( ... ) { cout << "\n **** erreur dans la lecture des materiaux ****" << '\n'; entreePrinc.MessageBuffer("lecture des materiaux"); throw (UtilLecture::ErrNouvelleDonnee(-1)); Sortie (1); }; }; // ramene le pointeur de LoiAbstraiteGeneral en fonction // 1) du nom de la loi, 2) du nom d'une reference // ou null si la recherche n'abouti pas LoiAbstraiteGeneral * LesLoisDeComp::PtLoi_abstraite(const string& st) const { int nbloi=tabLoi.Taille(); for (int i=1; i<= nbloi; i++) if ( st == tabLoi(i).st1) return tabLoi(i).pt; // normalement la suite ne devrait pas être utilisé !! int nbRefLoi= tabRefLoi.Taille(); for (int j=1; j<= nbRefLoi; j++) if (st == tabRefLoi(j).st1) for (int i=1; i<= nbloi; i++) if ( tabRefLoi(j).st2 == tabLoi(i).st1) {// dans ce cas l'utilisateur a mis une référence attachée à la loi // ce qui n'est pas correct, néanmoins on a trouvé la loi associée // on met une info correspondant à la loi cout << "\n *** Warning : la syntaxe de l'entree de la loi n'est pas correct (cf. documentation)" << " \n a priori, la loi voulue (et celle qui sera retenue) est $$ "<< tabLoi(i).st1 << " $$ au lieu du nom: "<< st << " !! "; return tabLoi(i).pt; }; // si l'on n'a pas trouvé de loi de comportement on met un warning if (ParaGlob::NiveauImpression() > 0) {cout << "\n *** Warning : on n'a pas trouve de loi de comportement du nom: " << st << " peut-etre pb par la suite !! " << endl ; if (ParaGlob::NiveauImpression() > 5) cout << "\n LesLoisDeComp::PtLoi_abstraite( ... "; }; return NULL; }; // indique aux différentes loi que l'on doit utiliser une loi tangente simplifiée // ou non suivant la valeur du paramètre de passage void LesLoisDeComp::Loi_simplifie(bool ordre) { int tabloitaille = tabLoi.Taille(); for (int i=1; i<= tabloitaille; i++) tabLoi(i).pt->Modif_comp_tangent_simplifie(ordre); }; // récup du type de loi: simplifiée ou non bool LesLoisDeComp::Test_loi_simplife() { bool test = true; int tabloitaille = tabLoi.Taille(); for (int i=1; i<= tabloitaille; i++) test = test && tabLoi(i).pt->Test_loi_simplife(); return test; }; //indique aux lois Umat éventuelles le numéro d'itération void LesLoisDeComp::MiseAJour_umat_nbiter(const int& num_iter) { if (list_de_umat.size()!= 0) {list ::iterator il,ilfin=list_de_umat.end(); for (il=list_de_umat.begin();il!=ilfin;il++) ((Loi_Umat*) (*il))->Mise_a_jour_num_iteration(num_iter); }; }; // ou le numéro d'incrément void LesLoisDeComp::MiseAJour_umat_nbincr(const int& num_incr) { if (list_de_umat.size()!= 0) {list ::iterator il,ilfin=list_de_umat.end(); for (il=list_de_umat.begin();il!=ilfin;il++) ((Loi_Umat*) (*il))->Mise_a_jour_num_increment(num_incr); }; }; //----- lecture écriture de restart ----- // cas donne le niveau de la récupération // = 1 : on récupère tout // = 2 : on récupère uniquement les données variables (supposées comme telles) void LesLoisDeComp::Lecture_base_info (ifstream& ent,const int cas,LesReferences& lesRef,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD) { // deux choses sont a récupérer : 1) la liste des références de loi, 2) les lois // tout d'abord la liste des références de loi switch (cas) { case 1 : // ------- on récupère la liste de référence de loi ------------------------- { // tout d'abord la taille string titi; ent >> titi; // lecture entête int tabRefLoitaille; ent >> titi >> tabRefLoitaille ; tabRefLoi.Change_taille(tabRefLoitaille); for (int i=1; i<= tabRefLoitaille; i++) {int num; ent >> titi >> num; // num n'est pas utilisé tabRefLoi(i).Lecture_base_info(ent,cas); }; // puis les lois elles même // tout d'abord la taille int tabLoitaille; ent >> titi >> tabLoitaille ; tabLoi.Change_taille(tabLoitaille); // on parcours la liste des lois de comportement et chaque loi se récupère for (int i=1; i<= tabLoitaille; i++) {int num; ent >> titi >> num; // num n'est pas utilisé tabLoi(i).Lecture_base_info(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); }; // -- cas particulier de l'utilisation de lois Umat int nbloi=tabLoi.Taille(); list_de_umat.erase(list_de_umat.begin(),list_de_umat.end()); for (int i=1; i<= nbloi; i++) {if ((tabLoi(i).pt->Id_comport()==LOI_VIA_UMAT) || (tabLoi(i).pt->Id_comport()==LOI_VIA_UMAT_CP) ) { Loi_Umat* loi = (Loi_Umat*) tabLoi(i).pt; // cas particulier des umat interne on "branche" if (loi->Utilise_une_umat_interne()) {// récup du nom de la loi associée const string& nom_loi_associe = loi->NomDeLaLoi(); // récup de la loi LoiAbstraiteGeneral * loi_ext = PtLoi_abstraite(nom_loi_associe); // association avec la loi définit loi->DefLoiExt(loi_ext); }; // sauvegarde de la liste des lois umat list_de_umat.push_back(tabLoi(i).pt); }; }; break; } case 2 : // ----------- on passe en revue toutes les lois -------------------- { string titi; ent >> titi; // lecture entête // puis les lois elles même: ici il s'agit uniquement des données génériques mais pas spécifiques aux pti int tabLoitaille= tabLoi.Taille(); // on parcours la liste des lois de comportement et chaque loi se lit elle même int itruc; for (int i=1; i<= tabLoitaille; i++) {ent >> titi >> itruc; tabLoi(i).Lecture_base_info(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); }; break; } default : { cout << "\nErreur : valeur incorrecte du type de sauvegarde !\n"; cout << "LesLoisDeComp::Lecture_base_info(ifstream& ent,const int cas)" << " cas= " << cas << endl; Sortie(1); } }; }; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void LesLoisDeComp::Ecriture_base_info(ofstream& sort,const int cas) { // deux choses sont a sauvegarder : 1) la liste des références de loi, 2) les lois // tout d'abord la liste des références de loi switch (cas) { case 1 : // ------- on sauvegarde la liste de référence de loi ------------------------- { int tabRefLoitaille = tabRefLoi.Taille(); // tout d'abord la taille sort << "\n ****lesLoisDeComp_: " << "\n 1)--nombre_de_ref_de_loi " << tabRefLoitaille ; for (int i=1; i<= tabRefLoitaille; i++) {sort << "\n ref: "< tps_total_loi " << "("<< std::setw(nbdigit) << total_cpu/1000. << " ) "; for (int i=1; i<= tabLoitaille; i++) {// on fait un cast pour récupérer la loi particulière Loi_comp_abstraite* pt_loi = (Loi_comp_abstraite*) tabLoi(i).pt; double temps_loi = pt_loi->Temp_CPU_loi().Temps_CPU_User(); sort_cpu << "\n tps_loi: "<< pt_loi->Nom_comport() << " " << "("<< std::setw(nbdigit) << (100*pt_loi->Temp_CPU_loi().Temps_CPU_User()/total_cpu) << " % ) " << pt_loi->Temp_CPU_loi().Temps_CPU_User_milli(); }; sort_cpu << "\n"; }; //--------------- def des lectures/écritures pour les classes loi et refloi ------ //========= cas de refloi==================== //----- lecture écriture de restart ----- // cas donne le niveau de la récupération // = 1 : on récupère tout // = 2 : on récupère uniquement les données variables (supposées comme telles) void LesLoisDeComp::RefLoi::Lecture_base_info(ifstream& ent,const int cas) { string toto; if (cas==1) ent >> toto >> st1 >> toto >> st2; }; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void LesLoisDeComp::RefLoi::Ecriture_base_info(ofstream& sort,const int cas) const { if (cas==1) sort << "\n nom_de_la_reference " << st1 <<" nom_de_loi "<< st2; }; LesLoisDeComp::RefLoi& LesLoisDeComp::RefLoi::operator = (const RefLoi & a) { if (a.nom_maillage == NULL) { if (nom_maillage != NULL) {delete nom_maillage;nom_maillage=NULL;}} else { if (nom_maillage == NULL) nom_maillage = new string(*(a.nom_maillage)); else *nom_maillage = *(a.nom_maillage); }; st1 = a.st1; st2 = a.st2; return *this; }; // changement de nom de maillage void LesLoisDeComp::RefLoi::Change_nom_maillage(const string& nouveau) { if (nouveau.length() == 0) { cout << "\nErreur : reference de nom de maillage non valide car de longueur nulle ! " << " nom_mail= " << nouveau << "\n"; cout << "LesLoisDeComp::RefLoi::Change_nom_maillage(....) \n"; Sortie(1); } if (nom_maillage == NULL) { nom_maillage = new string(nouveau);} else { *nom_maillage = nouveau;}; }; // surcharge de l'operateur de lecture typée istream & operator >> (istream & entree, LesLoisDeComp::RefLoi & refloi) { // vérification du type string type; entree >> type; if (type != "LesLoisDeComp::RefLoi") {Sortie (1); return entree; } // puis les données entree >> refloi.st1 >> refloi.st2 ; return entree; }; // surcharge de l'operateur d'ecriture typée ostream & operator << ( ostream & sort,const LesLoisDeComp::RefLoi & refloi) { // un indicateur donnant le type puis les datas sort << "LesLoisDeComp::RefLoi " << refloi.st1 << " " << refloi.st2 << "\n" ; return sort; }; //========= cas de loi ===================== //----- lecture écriture de restart ----- // cas donne le niveau de la récupération // = 1 : on récupère tout // = 2 : on récupère uniquement les données variables (supposées comme telles) void LesLoisDeComp::Loi::Lecture_base_info (ifstream& ent,const int cas,LesReferences& lesRef,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD) { if (cas==1) { cout << "== lecture des lois de comportement \n"; // la référence de la loi, et son identificateur string toto,st2; ent >> toto >> st1 >> st2 ; // la loi elle même pt = LesLoisDeComp::Def_loi(st2); // lecture des informations particulières propres à la loi pt->Lecture_base_info_loi(ent,cas,lesRef,lesCourbes1D,lesFonctionsnD); } }; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void LesLoisDeComp::Loi::Ecriture_base_info(ofstream& sort,const int cas) { if (cas==1) { // la référence de la loi sort << "\n nom_de_la_reference_de_la_loi " << st1 << " " ; // la loi elle même pt->Ecriture_base_info_loi(sort,cas); } }; // définition d'un pointeur de loi en fonction d'une chaine de caractères LoiAbstraiteGeneral * LesLoisDeComp::Def_loi(string & nom) { LoiAbstraiteGeneral * pt; switch (Id_nom_comp (nom)) { case ISOELAS : pt = new Loi_iso_elas3D (); break; case ISOELAS1D : pt = new Loi_iso_elas1D (); break; case ISOELAS2D_D : pt = new Loi_iso_elas2D_D (); break; case ISOELAS2D_C : pt = new Loi_iso_elas2D_C (); break; case ISO_ELAS_ESPO1D : pt = new Iso_elas_expo1D (); break; case ISO_ELAS_ESPO3D : pt = new Iso_elas_expo3D (); break; case ISO_ELAS_SE1D : pt = new Iso_elas_SE1D (); break; case ISOHYPER3DFAVIER3 : pt = new IsoHyper3DFavier3 (); break; case ISOHYPER3DORGEAS1 : pt = new IsoHyper3DOrgeas1 (); break; case ISOHYPER3DORGEAS2 : pt = new IsoHyper3DOrgeas2 (); break; case ISOHYPERBULK3 : pt = new IsoHyperBulk3 (); break; case ISOHYPERBULK_GENE : pt = new IsoHyperBulk_gene (); break; case PRANDTL_REUSS : pt = new Prandtl_Reuss(); break; case PRANDTL_REUSS2D_D : pt = new Prandtl_Reuss2D_D(); break; case PRANDTL_REUSS1D : pt = new Prandtl_Reuss1D(); break; case TRELOAR : pt = new TreloarN(); break; case NEWTON1D : pt = new Loi_newton1D(); break; case NEWTON2D_D : pt = new Loi_newton2D_D(); break; case NEWTON3D : pt = new Loi_newton3D(); break; case MAXWELL1D : pt = new Loi_maxwell1D(); break; case MAXWELL2D_D : pt = new Loi_maxwell2D_D(); break; case MAXWELL2D_C : pt = new Loi_maxwell2D_C(); break; case MAXWELL3D : pt = new Loi_maxwell3D(); break; case LOI_ADDITIVE_EN_SIGMA : pt = new LoiAdditiveEnSigma(); break; case LOI_CRITERE : pt = new LoiCritere(); break; case LOI_DES_MELANGES_EN_SIGMA : pt = new LoiDesMelangesEnSigma(); break; case LOI_CONTRAINTES_PLANES : pt = new LoiContraintesPlanes(); break; case LOI_CONTRAINTES_PLANES_DOUBLE : pt = new LoiContraintesPlanesDouble(); break; case LOI_DEFORMATIONS_PLANES : pt = new LoiDeformationsPlanes(); break; case HYSTERESIS_1D : pt = new Hysteresis1D(); break; case HYSTERESIS_3D : pt = new Hysteresis3D(); break; case HYSTERESIS_BULK : pt = new Hysteresis_bulk(); break; case LOI_ISO_THERMO : pt = new Loi_iso_thermo(); break; case LOI_DE_TAIT : pt = new Loi_de_Tait(); break; case MOONEY_RIVLIN_1D : pt = new MooneyRivlin1D(); break; case MOONEY_RIVLIN_3D : pt = new MooneyRivlin3D(); break; case HART_SMITH3D : pt = new Hart_Smith3D(); break; case POLY_HYPER3D : pt = new Poly_hyper3D(); break; case MAHEO_HYPER : pt = new Maheo_hyper(); break; case HYPER_EXTERNE_W : pt = new Hyper_externe_W(); break; case HYPO_ELAS3D : pt = new Hypo_hooke3D(); break; case HYPO_ELAS2D_C : pt = new Hypo_hooke2D_C(); break; case HYPO_ELAS1D : pt = new Hypo_hooke1D(); break; // en dimension 3, on peut avoir des Umat, mais pas dans les autres dimensions case LOI_VIA_UMAT : { if (ParaGlob::Dimension() == 3) {pt = new Loi_Umat();} else {cout << "\n erreur dans la definition de la loi de comportement = " << nom << '\n'; cout << " les loi via umat ne sont disponibles qu'en 3D " << endl; Sortie (1); } break; } case LOI_VIA_UMAT_CP : { if (ParaGlob::Dimension() == 3) {pt = new Loi_Umat(LOI_VIA_UMAT_CP); } else {cout << "\n erreur dans la definition de la loi de comportement = " << nom << '\n'; cout << " les loi via umat cp ne sont disponibles qu'en 3D " << endl; Sortie (1); } break; } case LOI_COULOMB : pt = new CompFrotCoulomb(); break; case LOI_RIEN1D : pt = new Loi_rien1D(); break; case LOI_RIEN2D_C : pt = new Loi_rien2D_C(); break; case LOI_RIEN2D_D : pt = new Loi_rien2D_D(); break; case LOI_RIEN3D : pt = new Loi_rien3D(); break; case ORTHOELA3D : pt = new Loi_ortho_elas3D(); break; case ORTHOELA2D_C : pt = new Loi_ortho2D_C_entrainee(); break; case PROJECTION_ANISOTROPE_3D : pt = new Projection_anisotrope_3D(); break; case HYPO_ORTHO3D : pt = new Hypo_ortho3D_entrainee(); break; default : { cout << "\n erreur dans la definition de la loi de comportement = " << nom << '\n'; cout << " LesLoisDeComp::Def_loi(string & nom) " << endl; Sortie (1); } }; return pt; }; // surcharge de l'operateur de lecture typée istream & operator >> (istream & entree, LesLoisDeComp::Loi & loi) { // vérification du type string type; entree >> type; if (type != "LesLoisDeComp::Loi") {Sortie (1); return entree; } // puis les données entree >> loi.st1; loi.pt=NULL; return entree; }; // surcharge de l'operateur d'ecriture typée ostream & operator << ( ostream & sort,const LesLoisDeComp::Loi & loi) { // un indicateur donnant le type puis les datas // il n'y a pas sauvegarde du pointeur de loi sort << "LesLoisDeComp::Loi " << loi.st1 << "\n" ; return sort; };