MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mg_maillage_algos.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
2 //####//------------------------------------------------------------
3 //####// MAGiC
4 //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5 //####// Departement de Genie Mecanique - UQTR
6 //####//------------------------------------------------------------
7 //####// MAGIC est un projet de recherche de l equipe ERICCA
8 //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9 //####// http://www.uqtr.ca/ericca
10 //####// http://www.uqtr.ca/
11 //####//------------------------------------------------------------
12 //####//------------------------------------------------------------
13 //####//
14 //####// mg_maillage_algos.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include <math.h>
23 
24 #include "gestionversion.h"
25 
26 #include "mg_solution.h"
27 #include "mg_gestionnaire.h"
28 #include "fct_taille.h"
29 #include "mg_maillage_algos.h"
30 #include "ot_mathematique.h"
31 
33 {
34 if (mai->get_nb_mg_tetra()!=0) calcule_caracteristiques3(mai,nom,carte);
35 else if (mai->get_nb_mg_triangle()!=0) calcule_caracteristiques2(mai,nom,carte);
36 else if (mai->get_nb_mg_segment()!=0) calcule_caracteristiques1(mai,nom,carte);
37 }
38 
40 {
41 std::string nomsol=nom+"_tet.sol";
42 MG_SOLUTION* sol=new MG_SOLUTION(mai,1,(char*)nomsol.c_str(),mai->get_nb_mg_tetra(),"Qualite",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3);
44 sol->change_legende(0,"Gamma");
45 LISTE_MG_TETRA::iterator it;int i=0;
46 for (MG_TETRA* tet=mai->get_premier_tetra(it);tet!=NULL;tet=mai->get_suivant_tetra(it))
47  {
48  MG_NOEUD *no1=tet->get_noeud1();
49  MG_NOEUD *no2=tet->get_noeud2();
50  MG_NOEUD *no3=tet->get_noeud3();
51  MG_NOEUD *no4=tet->get_noeud4();
52  double *xyz1=no1->get_coord();
53  double *xyz2=no2->get_coord();
54  double *xyz3=no3->get_coord();
55  double *xyz4=no4->get_coord();
56  double qual=OPERATEUR::qualite_tetra(xyz1,xyz2,xyz3,xyz4);
57  sol->ecrire(qual,i,0,0,0);
58  i++;
59  }
60 std::string nomsol2=nom+"_nd.sol";
61 int num=1;
62 if (carte!=NULL) num=2;
63 MG_SOLUTION* sol2=new MG_SOLUTION(mai,num,(char*)nomsol2.c_str(),mai->get_nb_mg_noeud(),"Carte de taille",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD);
65 sol2->change_legende(0,"Reelle");
66 LISTE_MG_NOEUD::iterator it2;i=0;
67 for (MG_NOEUD* no=mai->get_premier_noeud(it2);no!=NULL;no=mai->get_suivant_noeud(it2))
68 {
69 int nb_segment=no->get_lien_segment()->get_nb();
70 double val=0.;
71 for (int j=0;j<nb_segment;j++)
72  val=val+no->get_lien_segment()->get(j)->get_longueur();
73 val=val/nb_segment;
74 sol2->ecrire(val,i,0,0,0);
75 i++;
76 }
77 
78 if (carte==NULL) return;
79 sol2->active_solution(0);
80 sol2->change_legende(1,"Erreur");
81 i=0;
82 for (MG_NOEUD* no=mai->get_premier_noeud(it2);no!=NULL;no=mai->get_suivant_noeud(it2))
83 {
84 double val;
85 double *xyz=no->get_coord();
86 double tenseur[9];
87 carte->evaluer(xyz,tenseur);
88 val=1./sqrt(tenseur[0]);
89 val=(no->get_solution()-val)/val;
90 sol2->ecrire(val*100.,i,1,0,0);
91 i++;
92 }
93 }
94 
96 {
97 std::string nomsol=nom+"_tet.sol";
98 MG_SOLUTION* sol=new MG_SOLUTION(mai,1,(char*)nomsol.c_str(),mai->get_nb_mg_triangle(),"Qualite",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3);
100 sol->change_legende(0,"Gamma");
101 LISTE_MG_TRIANGLE::iterator it;int i=0;
102 for (MG_TRIANGLE* tri=mai->get_premier_triangle(it);tri!=NULL;tri=mai->get_suivant_triangle(it))
103  {
104  MG_NOEUD *no1=tri->get_noeud1();
105  MG_NOEUD *no2=tri->get_noeud2();
106  MG_NOEUD *no3=tri->get_noeud3();
107  double *xyz1=no1->get_coord();
108  double *xyz2=no2->get_coord();
109  double *xyz3=no3->get_coord();
110  double qual=OPERATEUR::qualite_triangle(xyz1,xyz2,xyz3);
111  sol->ecrire(qual,i,0,0,0);
112  i++;
113  }
114 std::string nomsol2=nom+"_nd.sol";
115 int num=1;
116 if (carte!=NULL) num=2;
117 MG_SOLUTION* sol2=new MG_SOLUTION(mai,num,(char*)nomsol2.c_str(),mai->get_nb_mg_noeud(),"Carte de taille",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD);
119 sol2->change_legende(0,"Reelle");
120 LISTE_MG_NOEUD::iterator it2;i=0;
121 for (MG_NOEUD* no=mai->get_premier_noeud(it2);no!=NULL;no=mai->get_suivant_noeud(it2))
122 {
123 int nb_segment=no->get_lien_segment()->get_nb();
124 double val=0.;
125 for (int j=0;j<nb_segment;j++)
126  val=val+no->get_lien_segment()->get(j)->get_longueur();
127 val=val/nb_segment;
128 sol2->ecrire(val,i,0,0,0);
129 i++;
130 }
131 
132 if (carte==NULL) return;
133 sol2->active_solution(0);
134 sol2->change_legende(1,"Erreur");
135 i=0;
136 for (MG_NOEUD* no=mai->get_premier_noeud(it2);no!=NULL;no=mai->get_suivant_noeud(it2))
137 {
138 double val;
139 double *xyz=no->get_coord();
140 double tenseur[9];
141 carte->evaluer(xyz,tenseur);
142 val=1./sqrt(tenseur[0]);
143 val=(no->get_solution()-val)/val;
144 sol2->ecrire(val*100.,i,1,0,0);
145 i++;
146 }
147 }
148 
149 
150 
152 {
153 std::string nomsol2=nom+"_nd.sol";
154 int num=1;
155 if (carte!=NULL) num=2;
156 MG_SOLUTION* sol2=new MG_SOLUTION(mai,num,(char*)nomsol2.c_str(),mai->get_nb_mg_noeud(),"Carte de taille",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD);
158 sol2->change_legende(0,"Reelle");
159 LISTE_MG_NOEUD::iterator it2;int i=0;
160 for (MG_NOEUD* no=mai->get_premier_noeud(it2);no!=NULL;no=mai->get_suivant_noeud(it2))
161 {
162 int nb_segment=no->get_lien_segment()->get_nb();
163 double val=0.;
164 for (int j=0;j<nb_segment;j++)
165  val=val+no->get_lien_segment()->get(j)->get_longueur();
166 val=val/nb_segment;
167 sol2->ecrire(val,i,0,0,0);
168 i++;
169 }
170 
171 if (carte==NULL) return;
172 sol2->active_solution(0);
173 sol2->change_legende(1,"Erreur");
174 i=0;
175 for (MG_NOEUD* no=mai->get_premier_noeud(it2);no!=NULL;no=mai->get_suivant_noeud(it2))
176 {
177 double val;
178 double *xyz=no->get_coord();
179 double tenseur[9];
180 carte->evaluer(xyz,tenseur);
181 val=1./sqrt(tenseur[0]);
182 val=(no->get_solution()-val)/val;
183 sol2->ecrire(val*100.,i,1,0,0);
184 i++;
185 }
186 }
MG_MAILLAGE_ALGOS::calcule_caracteristiques
static void calcule_caracteristiques(MG_MAILLAGE *mai, std::string nom, class FCT_TAILLE *carte)
Definition: mg_maillage_algos.cpp:32
MG_MAILLAGE::get_premier_noeud
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:548
fct_taille.h
gestionversion.h
mg_gestionnaire.h
mg_maillage_algos.h
MG_MAILLAGE::get_nb_mg_triangle
unsigned int get_nb_mg_triangle(void)
Definition: mg_maillage.cpp:814
MG_MAILLAGE::get_premier_tetra
MG_TETRA * get_premier_tetra(LISTE_MG_TETRA::iterator &it)
Definition: mg_maillage.cpp:1374
MG_SOLUTION
Definition: mg_solution.h:46
MG_TRIANGLE
Definition: mg_triangle.h:38
FCT_TAILLE
Definition: fct_taille.h:30
MG_TETRA
Definition: mg_tetra.h:37
MG_MAILLAGE::get_suivant_tetra
MG_TETRA * get_suivant_tetra(LISTE_MG_TETRA::iterator &it)
Definition: mg_maillage.cpp:1382
MG_SOLUTION::ecrire
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
Definition: mg_solution.cpp:309
MG_MAILLAGE_ALGOS::calcule_caracteristiques3
static void calcule_caracteristiques3(MG_MAILLAGE *mai, std::string nom, class FCT_TAILLE *carte)
Definition: mg_maillage_algos.cpp:39
MG_MAILLAGE::get_premier_triangle
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:912
MG_NOEUD
Definition: mg_noeud.h:41
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
MG_MAILLAGE_ALGOS::calcule_caracteristiques1
static void calcule_caracteristiques1(MG_MAILLAGE *mai, std::string nom, class FCT_TAILLE *carte)
Definition: mg_maillage_algos.cpp:151
MG_SOLUTION::active_solution
void active_solution(int num)
Definition: mg_solution.cpp:358
MG_MAILLAGE::get_nb_mg_segment
unsigned int get_nb_mg_segment(void)
Definition: mg_maillage.cpp:646
ot_mathematique.h
OPERATEUR::qualite_tetra
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
Definition: ot_mathematique.cpp:1673
MG_SOLUTION::change_legende
void change_legende(int num, std::string val)
Definition: mg_solution.cpp:328
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_MAILLAGE_ALGOS::calcule_caracteristiques2
static void calcule_caracteristiques2(MG_MAILLAGE *mai, std::string nom, class FCT_TAILLE *carte)
Definition: mg_maillage_algos.cpp:95
MG_MAILLAGE::get_gestionnaire
MG_GESTIONNAIRE * get_gestionnaire(void)
Definition: mg_maillage.cpp:2658
OPERATEUR::qualite_triangle
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
Definition: ot_mathematique.cpp:1647
MG_MAILLAGE::get_nb_mg_noeud
unsigned int get_nb_mg_noeud(void)
Definition: mg_maillage.cpp:476
MG_MAILLAGE::get_suivant_triangle
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:920
MG_MAILLAGE
Definition: mg_maillage.h:62
MG_MAILLAGE::get_nb_mg_tetra
unsigned int get_nb_mg_tetra(void)
Definition: mg_maillage.cpp:1262
MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3
@ ENTITE_ELEMENT3
Definition: mg_definition.h:86
MG_MAILLAGE::get_suivant_noeud
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:556
FCT_TAILLE::evaluer
virtual void evaluer(double *param, double *resultat)=0
mg_solution.h
MG_GESTIONNAIRE::ajouter_mg_solution
int ajouter_mg_solution(MG_SOLUTION *mgsol)
Definition: mg_gestionnaire.cpp:764
MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD
@ ENTITE_NOEUD
Definition: mg_definition.h:86