ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/aster/src/mgopt.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (10 months, 4 weeks ago) by francois
File size: 8699 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

# User Rev Content
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 }