ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/optimisation/src/mgopt.cpp
Revision: 396
Committed: Thu Apr 18 15:09:10 2013 UTC (12 years, 4 months ago) by francois
File size: 5532 byte(s)
Log Message:
Ajout du type pour OT_PARMETRES afin de pourvoir les reecrire comme y faut

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