ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/aster/src/mgopt.cpp
Revision: 384
Committed: Mon Jan 14 23:58:36 2013 UTC (12 years, 4 months ago) by francois
Original Path: magic/lib/optimisation/src/mgopt.cpp
File size: 5356 byte(s)
Log Message:
Ajout d'une sortie en format simplifie pour l'optimisation SIMP (pour le cours)

File Contents

# User Rev Content
1 francois 239 #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 francois 243 #include "mg_export.h"
9 francois 239 #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 francois 243 params.ajouter("maille",0.,"0. le maillage est effectue ou numero de maillage a utiliser" );
26     params.ajouter("dg",7.,"Ecart nodal constant de la carte de taille");
27     params.ajouter("typecarte",1.,"0. calcul d'une nouvelle carte de taille 1. utilisation d'une carte existante");
28     params.ajouter("fechantillonnage",20.,"Nombre de cellules de la carte de taille dans une direction");
29     params.ajouter("festimation",1.,"nombre d'échantillons dans une direction");
30     params.ajouter("fichiercarte","bielle.ctt","Fichier carte de taille a utiliser quand typecarte vaut 1.");
31     params.ajouter("degre",1.,"1. maillage lineaire 2. maillage quadratique");
32 francois 384 params.ajouter("enregistrementsimple",0.,"1. Enregistrement dans un format simplifie");
33 francois 239 }
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 francois 272 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 francois 239 params.enregistrer(fichier);
70     }
71    
72     void MGOPT::optimise(char *nomgestd,char *nomgestnd,char *nomsortie,char *nomparam)
73     {
74 francois 272 affiche((char*)"");
75     affiche((char*)"*************************");
76     affiche((char*)"Optimisation de topologie");
77     affiche((char*)"*************************");
78     affiche((char*)"");
79     affiche((char*)"");
80     affiche((char*)"");
81 francois 271 time_t heuredeb = time(NULL);
82     tdebut = *localtime(&heuredeb);
83 francois 239 if (nomparam!=NULL) lire_params(nomparam);
84     char *p=strchr(nomgestd,'.');
85     strncpy(nometude,nomgestd,p-nomgestd);
86     nometude[p-nomgestd]=0;
87 francois 243 p=strchr(nomsortie,'.');
88     strncpy(nometudesortie,nomsortie,p-nomsortie);
89     nometudesortie[p-nomsortie]=0;
90 francois 272 affiche((char*)"Preparation du modèle");
91 francois 239 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 francois 272 affiche((char*)"Debut optimisation");
98 francois 239 optimisation(fem);
99 francois 272 affiche((char*)"Enregistrement resultat");
100 francois 239 gestd->enregistrer(nomsortie);
101 francois 384 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 francois 272 affiche((char*)"Enregistrement resultat sous GMSH");
110 francois 243 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 francois 239 }
117    
118     FEM_MAILLAGE* MGOPT::prepare_model(MG_GESTIONNAIRE *gestd,MG_GESTIONNAIRE *gestnd)
119     {
120 francois 272 affiche((char*)"Carte de taille");
121 francois 239 int typecarte=(int)params.get_valeur("typecarte");
122     if (typecarte==0)
123     {
124 francois 272 affiche((char*)" Calcul");
125 francois 239 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 francois 272 affiche((char*)" Lecture");
138 francois 239 carte=new FCT_GENERATEUR_3D<4>;
139     std::string fichiercarte=params.get_nom("fichiercarte");
140     carte->lire((char *)fichiercarte.c_str());
141     }
142 francois 272 affiche((char*)"Maillage par le mailleur bloc");
143 francois 239 FCT_TAILLE* metrique=carte;
144     MAILLEUR_BLOC m(gestd,gestnd,0,0,metrique);
145     m.active_affichage(affiche);
146     m.maille();
147 francois 272 affiche((char*)"Creation du maillage FEM");
148 francois 239 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 francois 384 }
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 francois 239 }