1 |
francois |
1158 |
//####//------------------------------------------------------------ |
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 |
|
|
//####// mgopt.cpp |
15 |
|
|
//####// |
16 |
|
|
//####//------------------------------------------------------------ |
17 |
|
|
//####//------------------------------------------------------------ |
18 |
|
|
//####// COPYRIGHT 2000-2024 |
19 |
|
|
//####// jeu 13 jun 2024 11:58:57 EDT |
20 |
|
|
//####//------------------------------------------------------------ |
21 |
|
|
//####//------------------------------------------------------------ |
22 |
francois |
239 |
#include "gestionversion.h" |
23 |
|
|
#include "mgopt.h" |
24 |
|
|
#include "mg_file.h" |
25 |
|
|
#include "fct_generateur_frontiere.h" |
26 |
|
|
#include "fct_generateur_constante.h" |
27 |
|
|
#include "fct_generateur_fichier.h" |
28 |
francois |
468 |
#include "fct_taille_fem_solution.h" |
29 |
francois |
510 |
#include "fct_taille_fem_solution_generateur_constant.h" |
30 |
francois |
239 |
#include "mailleur_bloc.h" |
31 |
francois |
243 |
#include "mg_export.h" |
32 |
francois |
883 |
#include "mailleur_fem.h" |
33 |
francois |
239 |
#include <string.h> |
34 |
|
|
|
35 |
|
|
|
36 |
|
|
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
|
|
|
41 |
|
|
|
42 |
|
|
|
43 |
|
|
|
44 |
|
|
|
45 |
|
|
|
46 |
francois |
494 |
MGOPT::MGOPT(bool save):gestd(NULL),gestnd(NULL),carte(NULL),savedbg(save) |
47 |
francois |
239 |
{ |
48 |
francois |
494 |
strcpy(nomfichierdbg,"mailleurautomatiqueoptimisation.magicdbg"); |
49 |
francois |
396 |
params.ajouter("maille",0.,OT_PARAMETRES::DOUBLE,"0. le maillage est effectue ou numero de maillage a utiliser" ); |
50 |
|
|
params.ajouter("dg",7.,OT_PARAMETRES::DOUBLE,"Ecart nodal constant de la carte de taille"); |
51 |
francois |
468 |
params.ajouter("typecarte",1.,OT_PARAMETRES::DOUBLE,"0. calcul d'une nouvelle carte de taille 1. utilisation d'une carte existante 2. calcul d'une nouvelle carte de taille (nouvelle version) 3. utilisation d'une carte existante (nouvelle version)"); |
52 |
francois |
396 |
params.ajouter("fechantillonnage",20.,OT_PARAMETRES::DOUBLE,"Nombre de cellules de la carte de taille dans une direction"); |
53 |
|
|
params.ajouter("festimation",1.,OT_PARAMETRES::DOUBLE,"nombre d'échantillons dans une direction"); |
54 |
|
|
params.ajouter("fichiercarte","bielle.ctt",OT_PARAMETRES::STRING,"Fichier carte de taille a utiliser quand typecarte vaut 1."); |
55 |
|
|
params.ajouter("degre",1.,OT_PARAMETRES::DOUBLE,"1. maillage lineaire 2. maillage quadratique"); |
56 |
|
|
params.ajouter("enregistrementsimple",0.,OT_PARAMETRES::DOUBLE,"1. Enregistrement dans un format simplifie"); |
57 |
francois |
725 |
param.ajouter("Affiche_Code_Aster",0,OT_PARAMETRES::DOUBLE,"0. Affichage redirigé vers le fichier aster.log 1 affichage dans un terminal"); |
58 |
|
|
char fichier[500]; |
59 |
|
|
sprintf(fichier,"%s/.magic",getenv("HOME")); |
60 |
|
|
param.lire(fichier); |
61 |
|
|
param.enregistrer(fichier); |
62 |
|
|
|
63 |
francois |
239 |
} |
64 |
|
|
|
65 |
francois |
494 |
MGOPT::MGOPT(MGOPT &mdd):savedbg(mdd.savedbg) |
66 |
francois |
239 |
{ |
67 |
francois |
494 |
strcpy(nomfichierdbg,mdd.nomfichierdbg); |
68 |
francois |
239 |
params=mdd.params; |
69 |
|
|
} |
70 |
|
|
|
71 |
|
|
|
72 |
|
|
MGOPT::~MGOPT() |
73 |
|
|
{ |
74 |
|
|
if (gestd!=NULL) delete gestd; |
75 |
couturad |
740 |
if (gestnd!=NULL) delete gestnd; |
76 |
francois |
239 |
if (carte!=NULL) delete carte; |
77 |
|
|
} |
78 |
|
|
|
79 |
francois |
493 |
|
80 |
|
|
void MGOPT::affiche(char *mess) |
81 |
|
|
{ |
82 |
|
|
if (affichageactif==1) affiche_ptr(mess); |
83 |
|
|
} |
84 |
|
|
|
85 |
francois |
239 |
void MGOPT::active_affichage(void (*fonc)(char*)) |
86 |
|
|
{ |
87 |
francois |
493 |
affiche_ptr=fonc; |
88 |
francois |
239 |
affichageactif=1; |
89 |
|
|
} |
90 |
|
|
void MGOPT::lire_params(char *fichier) |
91 |
|
|
{ |
92 |
|
|
params.vide(); |
93 |
|
|
params.lire(fichier); |
94 |
|
|
} |
95 |
|
|
|
96 |
|
|
void MGOPT::optimise(char *fichier) |
97 |
|
|
{ |
98 |
francois |
272 |
affiche((char*)""); |
99 |
|
|
affiche((char*)"*************************"); |
100 |
|
|
affiche((char*)"Optimisation de topologie"); |
101 |
|
|
affiche((char*)"*************************"); |
102 |
|
|
affiche((char*)""); |
103 |
|
|
affiche((char*)""); |
104 |
|
|
affiche((char*)""); |
105 |
|
|
affiche((char*)"Écriture d'un fichier de parametres par défaut"); |
106 |
francois |
239 |
params.enregistrer(fichier); |
107 |
|
|
} |
108 |
|
|
|
109 |
francois |
706 |
void MGOPT::optimise(char *nomgestd,char *nomgestnd,char *nomsortie,char *nomparam,char *nomparamaster) |
110 |
francois |
239 |
{ |
111 |
francois |
272 |
affiche((char*)""); |
112 |
|
|
affiche((char*)"*************************"); |
113 |
|
|
affiche((char*)"Optimisation de topologie"); |
114 |
|
|
affiche((char*)"*************************"); |
115 |
|
|
affiche((char*)""); |
116 |
|
|
affiche((char*)""); |
117 |
|
|
affiche((char*)""); |
118 |
francois |
271 |
time_t heuredeb = time(NULL); |
119 |
|
|
tdebut = *localtime(&heuredeb); |
120 |
francois |
239 |
if (nomparam!=NULL) lire_params(nomparam); |
121 |
|
|
char *p=strchr(nomgestd,'.'); |
122 |
|
|
strncpy(nometude,nomgestd,p-nomgestd); |
123 |
|
|
nometude[p-nomgestd]=0; |
124 |
francois |
243 |
p=strchr(nomsortie,'.'); |
125 |
|
|
strncpy(nometudesortie,nomsortie,p-nomsortie); |
126 |
|
|
nometudesortie[p-nomsortie]=0; |
127 |
francois |
272 |
affiche((char*)"Preparation du modèle"); |
128 |
francois |
239 |
gestd=new MG_FILE(nomgestd); |
129 |
|
|
gestnd=new MG_FILE(nomgestnd); |
130 |
|
|
unsigned long maille=(unsigned long)params.get_valeur("maille"); |
131 |
|
|
FEM_MAILLAGE* fem; |
132 |
|
|
if (maille==0) fem=prepare_model(gestd,gestnd); |
133 |
|
|
else fem=gestd->get_fem_maillageid(maille); |
134 |
francois |
272 |
affiche((char*)"Debut optimisation"); |
135 |
francois |
706 |
optimisation(0,fem,nomparamaster); |
136 |
francois |
272 |
affiche((char*)"Enregistrement resultat"); |
137 |
francois |
962 |
char nomsortiend[500]; |
138 |
|
|
strcpy(nomsortiend,nometudesortie); |
139 |
|
|
strcat(nomsortiend,"_nd.magic"); |
140 |
francois |
239 |
gestd->enregistrer(nomsortie); |
141 |
francois |
962 |
gestnd->enregistrer(nomsortiend); |
142 |
francois |
384 |
int sauvesimple=params.get_valeur("enregistrementsimple"); |
143 |
|
|
if (sauvesimple==1) |
144 |
|
|
{ |
145 |
|
|
affiche((char*)"Enregistrement resultat simplifie"); |
146 |
francois |
1043 |
char nomfichier[2000]; |
147 |
francois |
384 |
sprintf(nomfichier,"%s.opt",nometudesortie); |
148 |
|
|
enregistre_simple(nomfichier,fem); |
149 |
|
|
} |
150 |
francois |
272 |
affiche((char*)"Enregistrement resultat sous GMSH"); |
151 |
francois |
243 |
MG_EXPORT exp; |
152 |
francois |
1043 |
char nomfichier[2000]; |
153 |
francois |
243 |
sprintf(nomfichier,"%s_mg",nometudesortie); |
154 |
|
|
exp.gmsh(fem->get_mg_maillage(),nomfichier); |
155 |
|
|
sprintf(nomfichier,"%s_fem",nometudesortie); |
156 |
|
|
exp.gmsh(fem,nomfichier); |
157 |
francois |
239 |
} |
158 |
|
|
|
159 |
|
|
FEM_MAILLAGE* MGOPT::prepare_model(MG_GESTIONNAIRE *gestd,MG_GESTIONNAIRE *gestnd) |
160 |
|
|
{ |
161 |
francois |
272 |
affiche((char*)"Carte de taille"); |
162 |
francois |
239 |
int typecarte=(int)params.get_valeur("typecarte"); |
163 |
|
|
if (typecarte==0) |
164 |
|
|
{ |
165 |
francois |
272 |
affiche((char*)" Calcul"); |
166 |
francois |
239 |
double eng=params.get_valeur("dg"); |
167 |
|
|
int fechan=(int)params.get_valeur("fechantillonnage"); |
168 |
|
|
int festim=(int)params.get_valeur("festimation"); |
169 |
|
|
carte=new FCT_GENERATEUR_CONSTANTE(*gestd,eng); |
170 |
francois |
510 |
FCT_GENERATEUR_CONSTANTE *carte2=(FCT_GENERATEUR_CONSTANTE*)carte; |
171 |
francois |
239 |
carte2->construit(fechan,festim); |
172 |
francois |
1043 |
char nomfichiersortie[3000]; |
173 |
francois |
239 |
sprintf(nomfichiersortie,"%s.ctt",nometude); |
174 |
|
|
carte2->enregistrer(nomfichiersortie); |
175 |
|
|
} |
176 |
francois |
468 |
else if (typecarte==1) |
177 |
francois |
239 |
{ |
178 |
francois |
272 |
affiche((char*)" Lecture"); |
179 |
francois |
239 |
carte=new FCT_GENERATEUR_3D<4>; |
180 |
|
|
std::string fichiercarte=params.get_nom("fichiercarte"); |
181 |
|
|
carte->lire((char *)fichiercarte.c_str()); |
182 |
|
|
} |
183 |
francois |
510 |
else if (typecarte==2) |
184 |
|
|
{ |
185 |
|
|
affiche((char*)" Calcul"); |
186 |
|
|
double eng=params.get_valeur("dg"); |
187 |
|
|
int fechan=(int)params.get_valeur("fechantillonnage"); |
188 |
|
|
int festim=(int)params.get_valeur("festimation"); |
189 |
francois |
1043 |
char nomfichiersortie[3000]; |
190 |
francois |
510 |
sprintf(nomfichiersortie,"%sctt.sol",nometude); |
191 |
|
|
carte=new FCT_TAILLE_FEM_SOLUTION_GENERATEUR_CONSTANT(NULL,gestd->get_mg_geometrie(0),eng,fechan,festim,festim,festim,nomfichiersortie); |
192 |
|
|
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_CONSTANT *carte2=(FCT_TAILLE_FEM_SOLUTION_GENERATEUR_CONSTANT*)carte; |
193 |
|
|
carte2->construit(); |
194 |
|
|
sprintf(nomfichiersortie,"%s",nometude); |
195 |
|
|
carte2->enregistrer(nomfichiersortie); |
196 |
|
|
} |
197 |
francois |
468 |
else if (typecarte==3) |
198 |
francois |
510 |
{ |
199 |
|
|
affiche((char*)" Lecture"); |
200 |
|
|
std::string fichiercarte=params.get_nom("fichiercarte"); |
201 |
|
|
carte=new FCT_TAILLE_FEM_SOLUTION((char*)fichiercarte.c_str()); |
202 |
|
|
} |
203 |
francois |
272 |
affiche((char*)"Maillage par le mailleur bloc"); |
204 |
francois |
239 |
FCT_TAILLE* metrique=carte; |
205 |
francois |
494 |
MAILLEUR_BLOC m(gestd,gestnd,0,0,metrique,savedbg); |
206 |
|
|
if (savedbg) m.change_nom_fichierdbg(nomfichierdbg); |
207 |
francois |
493 |
if (affichageactif==1) m.active_affichage(affiche_ptr); |
208 |
francois |
239 |
m.maille(); |
209 |
francois |
272 |
affiche((char*)"Creation du maillage FEM"); |
210 |
francois |
239 |
MG_MAILLAGE* mai=gestd->get_mg_maillage(gestd->get_nb_mg_maillage()-1); |
211 |
|
|
int degre=params.get_valeur("degre"); |
212 |
|
|
FEM_MAILLAGE* fem=new FEM_MAILLAGE(mai->get_mg_geometrie(),mai,degre); |
213 |
|
|
gestd->ajouter_fem_maillage(fem); |
214 |
francois |
883 |
MAILLEUR_FEM mf; |
215 |
|
|
mf.maille(fem,0); |
216 |
francois |
239 |
return fem; |
217 |
francois |
384 |
} |
218 |
|
|
|
219 |
|
|
|
220 |
|
|
void MGOPT::enregistre_simple(char* nomfichier,class FEM_MAILLAGE* fem) |
221 |
|
|
{ |
222 |
|
|
FILE* out=fopen(nomfichier,"wt"); |
223 |
|
|
fprintf(out,"%d %d\n",fem->get_nb_fem_noeud(),fem->get_nb_fem_element3()); |
224 |
|
|
LISTE_FEM_NOEUD::iterator it; |
225 |
|
|
int i=0; |
226 |
|
|
for (FEM_NOEUD* no=fem->get_premier_noeud(it);no!=NULL;no=fem->get_suivant_noeud(it)) |
227 |
|
|
{ |
228 |
|
|
i++; |
229 |
|
|
no->change_numero(i); |
230 |
|
|
fprintf(out,"%d %lf %lf %lf\n",i,no->get_x(),no->get_y(),no->get_z()); |
231 |
|
|
} |
232 |
|
|
LISTE_FEM_ELEMENT3::iterator it2; |
233 |
|
|
i=0; |
234 |
|
|
for (FEM_ELEMENT3* tet=fem->get_premier_element3(it2);tet!=NULL;tet=fem->get_suivant_element3(it2)) |
235 |
|
|
{ |
236 |
|
|
i++; |
237 |
francois |
1056 |
char origine[12]; |
238 |
|
|
if (tet->get_mg_element_maillage()->get_origine()==MAGIC::ORIGINE::IMPOSE) |
239 |
|
|
strcpy(origine,"nondesign"); |
240 |
|
|
else |
241 |
|
|
strcpy(origine,"design"); |
242 |
|
|
fprintf(out,"%d %d %d %d %d %lf %s\n",i,tet->get_fem_noeud(0)->get_numero(),tet->get_fem_noeud(1)->get_numero(),tet->get_fem_noeud(2)->get_numero(),tet->get_fem_noeud(3)->get_numero(),tet->get_solution(),origine); |
243 |
francois |
384 |
} |
244 |
|
|
|
245 |
|
|
fclose(out); |
246 |
|
|
|
247 |
francois |
494 |
} |
248 |
|
|
|
249 |
|
|
void MGOPT::change_nom_fichierdbg(char *nom) |
250 |
|
|
{ |
251 |
|
|
strcpy(nomfichierdbg,nom); |
252 |
francois |
1043 |
} |