MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mgopt.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 //####// mgopt.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:57 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "gestionversion.h"
23 #include "mgopt.h"
24 #include "mg_file.h"
27 #include "fct_generateur_fichier.h"
30 #include "mailleur_bloc.h"
31 #include "mg_export.h"
32 #include "mailleur_fem.h"
33 #include <string.h>
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 MGOPT::MGOPT(bool save):gestd(NULL),gestnd(NULL),carte(NULL),savedbg(save)
47 {
48 strcpy(nomfichierdbg,"mailleurautomatiqueoptimisation.magicdbg");
49 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 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 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 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 }
64 
65 MGOPT::MGOPT(MGOPT &mdd):savedbg(mdd.savedbg)
66 {
67 strcpy(nomfichierdbg,mdd.nomfichierdbg);
68 params=mdd.params;
69 }
70 
71 
73 {
74 if (gestd!=NULL) delete gestd;
75 if (gestnd!=NULL) delete gestnd;
76 if (carte!=NULL) delete carte;
77 }
78 
79 
80 void MGOPT::affiche(char *mess)
81 {
82 if (affichageactif==1) affiche_ptr(mess);
83 }
84 
85 void MGOPT::active_affichage(void (*fonc)(char*))
86 {
87 affiche_ptr=fonc;
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 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 params.enregistrer(fichier);
107 }
108 
109 void MGOPT::optimise(char *nomgestd,char *nomgestnd,char *nomsortie,char *nomparam,char *nomparamaster)
110 {
111 affiche((char*)"");
112 affiche((char*)"*************************");
113 affiche((char*)"Optimisation de topologie");
114 affiche((char*)"*************************");
115 affiche((char*)"");
116 affiche((char*)"");
117 affiche((char*)"");
118 time_t heuredeb = time(NULL);
119 tdebut = *localtime(&heuredeb);
120 if (nomparam!=NULL) lire_params(nomparam);
121 char *p=strchr(nomgestd,'.');
122 strncpy(nometude,nomgestd,p-nomgestd);
123 nometude[p-nomgestd]=0;
124 p=strchr(nomsortie,'.');
125 strncpy(nometudesortie,nomsortie,p-nomsortie);
126 nometudesortie[p-nomsortie]=0;
127 affiche((char*)"Preparation du modèle");
128 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 affiche((char*)"Debut optimisation");
135 optimisation(0,fem,nomparamaster);
136 affiche((char*)"Enregistrement resultat");
137 char nomsortiend[500];
138 strcpy(nomsortiend,nometudesortie);
139 strcat(nomsortiend,"_nd.magic");
140 gestd->enregistrer(nomsortie);
141 gestnd->enregistrer(nomsortiend);
142 int sauvesimple=params.get_valeur("enregistrementsimple");
143 if (sauvesimple==1)
144  {
145  affiche((char*)"Enregistrement resultat simplifie");
146  char nomfichier[2000];
147  sprintf(nomfichier,"%s.opt",nometudesortie);
148  enregistre_simple(nomfichier,fem);
149  }
150 affiche((char*)"Enregistrement resultat sous GMSH");
151 MG_EXPORT exp;
152 char nomfichier[2000];
153 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 }
158 
160 {
161 affiche((char*)"Carte de taille");
162 int typecarte=(int)params.get_valeur("typecarte");
163 if (typecarte==0)
164  {
165  affiche((char*)" Calcul");
166  double eng=params.get_valeur("dg");
167  int fechan=(int)params.get_valeur("fechantillonnage");
168  int festim=(int)params.get_valeur("festimation");
171  carte2->construit(fechan,festim);
172  char nomfichiersortie[3000];
173  sprintf(nomfichiersortie,"%s.ctt",nometude);
174  carte2->enregistrer(nomfichiersortie);
175  }
176 else if (typecarte==1)
177  {
178  affiche((char*)" Lecture");
180  std::string fichiercarte=params.get_nom("fichiercarte");
181  carte->lire((char *)fichiercarte.c_str());
182  }
183 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  char nomfichiersortie[3000];
190  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);
193  carte2->construit();
194  sprintf(nomfichiersortie,"%s",nometude);
195  carte2->enregistrer(nomfichiersortie);
196  }
197 else if (typecarte==3)
198  {
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 affiche((char*)"Maillage par le mailleur bloc");
204 FCT_TAILLE* metrique=carte;
205 MAILLEUR_BLOC m(gestd,gestnd,0,0,metrique,savedbg);
206 if (savedbg) m.change_nom_fichierdbg(nomfichierdbg);
207 if (affichageactif==1) m.active_affichage(affiche_ptr);
208 m.maille();
209 affiche((char*)"Creation du maillage FEM");
211 int degre=params.get_valeur("degre");
212 FEM_MAILLAGE* fem=new FEM_MAILLAGE(mai->get_mg_geometrie(),mai,degre);
214 MAILLEUR_FEM mf;
215 mf.maille(fem,0);
216 return fem;
217 }
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  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  }
244 
245 fclose(out);
246 
247 }
248 
250 {
251  strcpy(nomfichierdbg,nom);
252 }
MG_EXPORT
Definition: mg_export.h:33
fct_taille_fem_solution_generateur_constant.h
MG_GESTIONNAIRE::enregistrer
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
Definition: mg_gestionnaire.cpp:1070
MGOPT::lire_params
virtual void lire_params(char *fichier)
Definition: mgopt.cpp:90
FEM_MAILLAGE::get_suivant_element3
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:680
mgopt.h
MGOPT::optimisation
virtual void optimisation(int num_adapt, class FEM_MAILLAGE *fem, char *nomparamaster, int iter=0)=0
gestionversion.h
MG_GESTIONNAIRE::ajouter_fem_maillage
int ajouter_fem_maillage(FEM_MAILLAGE *femmai)
Definition: mg_gestionnaire.cpp:641
MGOPT::optimise
virtual void optimise(char *nomgestd, char *nomgestnd, char *nomsortie, char *nomparam, char *nomparamaster)
Definition: mgopt.cpp:109
MGOPT::nometudesortie
char nometudesortie[500]
Definition: mgopt.h:56
MGOPT::gestnd
class MG_FILE * gestnd
Definition: mgopt.h:58
FCT_TAILLE_FEM_SOLUTION
Definition: fct_taille_fem_solution.h:37
OT_PARAMETRES::get_valeur
double get_valeur(std::string chaine, int num=0)
Definition: ot_parametres.cpp:191
MGOPT::change_nom_fichierdbg
virtual void change_nom_fichierdbg(char *nom)
Definition: mgopt.cpp:249
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_CONSTANT
Definition: fct_taille_fem_solution_generateur_constant.h:34
MGOPT::affichageactif
int affichageactif
Definition: mgopt.h:52
FCT_TAILLE_FEM_SOLUTION_GENERATEUR_ISOTROPE::construit
virtual void construit(void)
Definition: fct_taille_fem_solution_generateur_isotrope.cpp:66
FCT_GENERATEUR_3D::enregistrer
virtual void enregistrer(char *chemin)
Definition: fct_generateur_3d.cpp:238
FCT_GENERATEUR_3D< 4 >
OT_PARAMETRES::STRING
@ STRING
Definition: ot_parametres.h:38
OT_PARAMETRES::ajouter
void ajouter(std::string chaine, double valeur, int typep, std::string aide="")
Definition: ot_parametres.cpp:61
mg_file.h
FEM_ELEMENT3
Definition: fem_element3.h:34
FEM_MAILLAGE::get_premier_noeud
FEM_NOEUD * get_premier_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:174
FCT_TAILLE
Definition: fct_taille.h:30
FCT_TAILLE::lire
virtual void lire(char *nom)=0
MG_GESTIONNAIRE
Definition: mg_gestionnaire.h:57
MGOPT::active_affichage
virtual void active_affichage(void(*fonc)(char *))
Definition: mgopt.cpp:85
MGOPT::param
OT_PARAMETRES param
Definition: mgopt.h:54
FEM_MAILLAGE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(void)
Definition: fem_maillage.cpp:93
FEM_MAILLAGE::get_nb_fem_noeud
unsigned int get_nb_fem_noeud(void)
Definition: fem_maillage.cpp:190
MGOPT::tdebut
struct tm tdebut
Definition: mgopt.h:49
fct_generateur_frontiere.h
fct_generateur_constante.h
MAILLEUR_BLOC
Definition: mailleur_bloc.h:38
mg_export.h
MGOPT::params
OT_PARAMETRES params
Definition: mgopt.h:53
OT_PARAMETRES::get_nom
std::string get_nom(std::string chaine)
Definition: ot_parametres.cpp:266
MGOPT::MGOPT
MGOPT(bool save)
Definition: mgopt.cpp:46
FEM_MAILLAGE
Definition: fem_maillage.h:66
MGOPT
Definition: mgopt.h:30
OT_PARAMETRES::DOUBLE
@ DOUBLE
Definition: ot_parametres.h:38
mailleur_bloc.h
MGOPT::affiche
void affiche(char *mess)
Definition: mgopt.cpp:80
MG_EXPORT::gmsh
void gmsh(class MG_MAILLAGE *mai, std::string fichier)
Definition: mg_export.cpp:803
MG_GESTIONNAIRE::get_fem_maillageid
FEM_MAILLAGE * get_fem_maillageid(unsigned long num)
Definition: mg_gestionnaire.cpp:658
MAGIC::ORIGINE::IMPOSE
@ IMPOSE
Definition: mg_definition.h:79
MGOPT::prepare_model
virtual class FEM_MAILLAGE * prepare_model(class MG_GESTIONNAIRE *gestd, MG_GESTIONNAIRE *gestnd)
Definition: mgopt.cpp:159
FEM_MAILLAGE::get_nb_fem_element3
unsigned int get_nb_fem_element3(void)
Definition: fem_maillage.cpp:605
MG_GESTIONNAIRE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(unsigned int num)
Definition: mg_gestionnaire.cpp:550
MAILLEUR_FEM::maille
virtual int maille(class FEM_MAILLAGE *fem, bool courbure_discrete=false, int num=0)
Definition: mailleur_fem.cpp:66
MGOPT::savedbg
bool savedbg
Definition: mgopt.h:60
MG_FILE
Definition: mg_file.h:31
MAILLEUR_FEM
Definition: mailleur_fem.h:31
FEM_NOEUD
Definition: fem_noeud.h:35
FCT_TAILLE_FEM_SOLUTION::enregistrer
virtual void enregistrer(char *nom)
Definition: fct_taille_fem_solution.cpp:337
OT_PARAMETRES::enregistrer
void enregistrer(char *nom)
Definition: ot_parametres.cpp:132
MGOPT::~MGOPT
virtual ~MGOPT()
Definition: mgopt.cpp:72
OT_PARAMETRES::vide
void vide(void)
Definition: ot_parametres.cpp:317
MGOPT::gestd
class MG_FILE * gestd
Definition: mgopt.h:57
MG_MAILLAGE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(void)
Definition: mg_maillage.cpp:410
fct_taille_fem_solution.h
MG_GESTIONNAIRE::get_nb_mg_maillage
unsigned int get_nb_mg_maillage(void)
Definition: mg_gestionnaire.cpp:579
MGOPT::enregistre_simple
virtual void enregistre_simple(char *nomfichier, class FEM_MAILLAGE *fem)
Definition: mgopt.cpp:220
OT_PARAMETRES::lire
int lire(char *nom)
Definition: ot_parametres.cpp:144
fct_generateur_fichier.h
MG_MAILLAGE
Definition: mg_maillage.h:62
FEM_MAILLAGE::get_suivant_noeud
FEM_NOEUD * get_suivant_noeud(LISTE_FEM_NOEUD::iterator &it)
Definition: fem_maillage.cpp:182
mailleur_fem.h
FCT_GENERATEUR_CONSTANTE
Definition: fct_generateur_constante.h:32
MGOPT::nomfichierdbg
char nomfichierdbg[500]
Definition: mgopt.h:61
FCT_GENERATEUR_CONSTANTE::construit
void construit(int pas_echan=20, int pas_estim=20, class MG_GROUPE_TOPOLOGIQUE *mggt=NULL)
Definition: fct_generateur_constante.cpp:44
MGOPT::nometude
char nometude[500]
Definition: mgopt.h:55
MG_GESTIONNAIRE::get_mg_geometrie
MG_GEOMETRIE * get_mg_geometrie(unsigned int num)
Definition: mg_gestionnaire.cpp:331
MGOPT::carte
class FCT_TAILLE * carte
Definition: mgopt.h:59
MGOPT::affiche_ptr
void(* affiche_ptr)(char *mess)
Definition: mgopt.h:51
FEM_MAILLAGE::get_premier_element3
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
Definition: fem_maillage.cpp:672
m
#define m(i, j)