ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/aster/src/mgopt.cpp
Revision: 883
Committed: Thu Apr 20 13:38:18 2017 UTC (8 years, 4 months ago) by francois
File size: 7304 byte(s)
Log Message:
Creation d'un mailleur FEM pour pouvoir avoir des stratégies paramétrées de maillage. L'ancienne méthode construit disparait et est remplacée par l'utilisation d'un MAILLEUR_FEM.
Stratégie de quadratisation mise en place : déplacer les noeuds pour s'assurer que les tetras quadratiques présentent une distortion au dessu d'une borne inférieure. Mais ces noeuds quittent la géométrie.

Les paramètres dans ~/.magic.

File Contents

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