TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
ConcatAnsys.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <ConcatAnsys.h>
17#include <EFichier.h>
18#include <SFichier.h>
19
20Implemente_instanciable(ConcatAnsys,"ConcatAnsys",Interprete_geometrique_base);
21
23{
24 return Interprete::printOn(os);
25}
26
28{
29 return Interprete::readOn(is);
30}
31
33{
34 Nom nom,nom2,nomS,nom_dom;
35 is >> nom_dom >> nom;
36 associer_domaine(nom_dom);
37 Domaine& dom=domaine();
38 nomS=nom_du_cas();
39 nom2=nom_du_cas();
40 nom2+=Nom(".factforme");
41 Nom nomS2=nom_du_cas();
42 nomS2+=Nom(".facesrayo");
43 Domaine& domaine=dom;
44 // Definition du nombre de faces rayonnantes
45 int nombre_faces_rayonnantes=domaine.nb_bords()+domaine.nb_raccords();
46 // Tableau des facteurs de forme regroupes
47 DoubleTab FIJ(nombre_faces_rayonnantes,nombre_faces_rayonnantes);
48 DoubleVect SI(nombre_faces_rayonnantes);
49 int j,J,i,I;
50
51 Cerr << "Ouverture du fichier des bords " << nomS2 << finl;
52 SFichier fr(nomS2);
53 fr << nombre_faces_rayonnantes << " " << nombre_faces_rayonnantes << finl;
54 Cerr << "Ouverture du fichier Ansys " << nom << finl;
55 EFichier premiere_lecture_ansys(nom);
56 Nom motlu;
57 int nombre_faces_ansys;
58 // int meth=1;
59 premiere_lecture_ansys>>motlu;
60 if (motlu=="Number")
61 {
62 // meth=2;
63 // Correction car si le nombre de faces depasse 9999 il est illisible
64 // dans le fichier Ansys .vf !
65 /* while(motlu!="Surfaces")
66 premiere_lecture_ansys>>motlu;
67 premiere_lecture_ansys>>motlu; */
68 // On recupere donc le nombre de faces en comptant
69 // le nombre de valeurs lues de la premiere ligne de la matrice
70 // des facteurs de formes:
71 nombre_faces_ansys=-1;
72 while(motlu!="TOTAL=")
73 premiere_lecture_ansys>>motlu;
74 premiere_lecture_ansys>>motlu;
75 while(motlu!="Element" && motlu!="TOTAL=" && motlu!="*****")
76 {
77 premiere_lecture_ansys>>motlu;
78 if (motlu=="WARNING")
79 {
80 Cerr << "Warning trouve dans le fichier " << nom << ". Calcul des facteurs de " << finl;
81 Cerr << "forme interrompu. Contacter le support TRUST." << finl;
83 }
84 nombre_faces_ansys++;
85 }
86 }
87 else
88 {
89 while(motlu!="ELEMENTS=")
90 premiere_lecture_ansys>>motlu;
91 premiere_lecture_ansys >> nombre_faces_ansys;
92 }
93 Cerr << "Nombre de faces qui vont etre lus:" << nombre_faces_ansys << finl;
94 EFichier ansys(nom);
95 //
96 // Cas ou Ansys a regroupe les faces sur les bords (non_hidden==3)
97 //
98 int deja_regroupe_dans_ansys=0;
99 if (nombre_faces_rayonnantes==nombre_faces_ansys)
100 deja_regroupe_dans_ansys=1;
101
102 double min_total=1, max_total=0;
103 //
104 // Calcul du facteurs FIJ en fonction des Fij
105 //
106 for (I=0; I<nombre_faces_rayonnantes; I++)
107 {
108 Faces& faces=(I<domaine.nb_bords()?domaine.bord(I).faces():domaine.raccord(I-domaine.nb_bords())->faces());
109 int nb_faces=faces.nb_faces();
110 // Calcul des surfaces de chaque face
111 DoubleVect Si;
113 faces.calculer_surfaces(Si);
114 for (i=0; i<nb_faces; i++)
115 {
116 SI(I)+=Si(i);
117 }
118 // Ecriture dans le fichier des bords pour TRUST (avec par defaut une emissivite de 1)
119 fr << (I<domaine.nb_bords()?domaine.bord(I).le_nom():domaine.raccord(I-domaine.nb_bords())->le_nom()) << " " << SI(I) << " 1." << finl;
120 if (deja_regroupe_dans_ansys)
121 nb_faces=1;
122 for (i=0; i<nb_faces; i++)
123 {
124 double fij,total_lu;
125 // Lecture du fichier Ansys
126 ansys>>motlu;
127 while(motlu!="TOTAL=")
128 ansys>>motlu;
129 ansys>>total_lu;
130 Cerr << "\rTotal des facteurs de forme sur la ligne " <<I*nb_faces+i+1<< " : " << total_lu << finl;
131 for (J=0; J<nombre_faces_rayonnantes; J++)
132 {
133 double FiJ=0;
134 int nombre_faces=(J<domaine.nb_bords()?domaine.bord(J).faces().nb_faces():domaine.raccord(J-domaine.nb_bords())->faces().nb_faces());
135 if (deja_regroupe_dans_ansys)
136 nombre_faces=1;
137 for (j=0; j<nombre_faces; j++)
138 {
139 ansys>>fij;
140 FiJ+=fij;
141 }
142 if (deja_regroupe_dans_ansys)
143 FIJ(I,J)=FiJ;
144 else
145 FIJ(I,J)+=Si(i)*FiJ/SI(I);
146 }
147 if (sup_strict(total_lu,1.001))
148 {
149 Cerr << "La somme des facteurs de forme (" << total_lu << ") de la ligne " << I+1 << " depasse 1 !" << finl;
150 Cerr << "Il se peut que vous ayez fait un calcul Ansys avec" << finl;
151 Cerr << "option faces non cachees qui ne soit pas justifie." << finl;
153 }
154 else if (est_egal(total_lu,0))
155 {
156 Cerr << "La somme des facteurs de forme de la ligne " << I+1 << " vaut 0 !" << finl;
157 Cerr << "Cela concerne le bord " << (I<domaine.nb_bords()?domaine.bord(I).le_nom():domaine.raccord(I-domaine.nb_bords())->le_nom()) << finl;
158 if (est_egal(SI(I),0))
159 {
160 Cerr << "La surface de ce bord est nulle..." << finl;
161 }
163 {
164 Cerr << "Ce bord est peut etre sur l'axe de revolution de votre calcul 2D axisymetrique." << finl;
165 Cerr << "Retirez ce bord de votre maillage .geom et relancer le calcul des facteurs de forme." << finl;
166 }
167 else
168 {
169 Cerr << "Une face du maillage .geom est mal orientee." << finl;
170 Cerr << "Contactez le support TRUST." << finl;
171 }
173 }
174 else
175 {
176 min_total=std::min(min_total,total_lu);
177 max_total=std::max(max_total,total_lu);
178 }
179 }
180 }
181 //Cerr << FIJ << finl;
182 Cerr << "Somme des facteurs de forme sur la matrice Ansys lue: Min=" << min_total << " Max=" << max_total << finl;
183 if (min_total<0.9) Cerr << "Les facteurs de forme ne sont pas bien calcules. Essayer d'ameliorer la precision du calcul Ansys." << finl;
184 if (min_total<0.5) Cerr << "Il se peut qu'il y'ait un probleme dans le convertisseur TRUST->Ansys. Contacter le support TRUST." << finl;
185
186 min_total=1;
187 max_total=0;
188 for (I=0; I<nombre_faces_rayonnantes; I++)
189 {
190 double total_calcule=0;
191 for (J=0; J<nombre_faces_rayonnantes; J++)
192 total_calcule+=FIJ(I,J);
193 min_total=std::min(min_total,total_calcule);
194 max_total=std::max(max_total,total_calcule);
195 }
196 Cerr << "Somme des facteurs de forme apres regroupement: Min=" << min_total << " Max=" << max_total << finl;
197 //Cerr << FIJ << finl;
198 //
199 // On normalise
200 //
201 Cerr << "Debut symetrisation et normalisation des facteurs de forme." << finl;
202 DoubleTab Fij(FIJ);
203 DoubleTab Err(FIJ);
204 Fij=FIJ;
205 int inter=0;
206 double x=0,err=1;
207 while (inter++<2000 && err>Objet_U::precision_geom)
208 {
209 for (i=0; i<nombre_faces_rayonnantes; i++)
210 for (j=i+1; j<nombre_faces_rayonnantes; j++)
211 {
212 err=SI(i)*Fij(i,j)-SI(j)*Fij(j,i);
213 Fij(i,j)-=(err/2./SI(i));
214 Fij(j,i)+=(err/2./SI(j));
215 }
216 Err=Fij;
217 Err-=FIJ;
218 err=local_max_abs_vect(Err);
219 // on arrange pour que somme=1
220 //FIJ(i,j)=FIJ(i,j)/Sum(FIJ(i,j),j=1..N);
221 min_total=1.;
222 for (i=0; i<nombre_faces_rayonnantes; i++)
223 {
224 x=0;
225 for (j=0; j<nombre_faces_rayonnantes; j++)
226 x+=Fij(i,j);
227 for (j=0; j<nombre_faces_rayonnantes; j++)
228 Fij(i,j)/=x;
229 min_total=std::min(x,min_total);
230 }
231 // On affiche apres la symetrisation...
232 Cerr << "\rIteration " << inter << ": Residu="<<err<< " Min(somme normalisee des facteurs de forme)=" << min_total << " ";
233 if (inter==1)
234 Cerr << finl;
235
236 Err=Fij;
237 Err-=FIJ;
238 // FiJ=FIJ de l'etape precedente - FIJ de l'etape courante apres normalisattion
239 // on affecte la matrice modifie a FIJ
240 FIJ=Fij;
241 err=local_max_abs_vect(Err);
242 }
243 //Cerr << FIJ << finl;
244 if (min_total<0.999)
245 {
246 Cerr << "Erreur dans le calcul des facteurs de forme apres le regroupement." << finl;
247 Cerr << "Contacter le support TRUST." << finl;
249 }
250 Cerr << finl << "Ecriture du fichier " << nom2 << " contenant les facteurs de forme pour TRUST." << finl;
251 SFichier ff(nom2);
252 ff << nombre_faces_rayonnantes << finl;
253 for (I=0; I<nombre_faces_rayonnantes; I++)
254 {
255 for (J=0; J<nombre_faces_rayonnantes; J++)
256 ff << FIJ(I,J) << " ";
257 ff << finl;
258 }
259 Cerr << "Ecriture du fichier " << nomS2 << " contenant les faces rayonnantes." << finl;
260 return is;
261}
262
class ConcatAnsys Realise un maillage en decoupant chaque pave en 40 tetraedres
Definition ConcatAnsys.h:31
Entree & interpreter_(Entree &) override
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Definition EFichier.h:29
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
void associer_domaine(const Domaine_t &z)
Definition Faces.h:94
void calculer_surfaces(DoubleVect_t &surf) const
Calcule la surface des faces.
Definition Faces.cpp:495
int_t nb_faces() const
Definition Faces.h:66
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:76
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
static double precision_geom
Definition Objet_U.h:86
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
Definition Objet_U.cpp:146
static int bidim_axi
Definition Objet_U.h:102
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
Classe de base des flux de sortie.
Definition Sortie.h:52