TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Proprietes_part_vol.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 <Proprietes_part_vol.h>
17#include <EFichier.h>
18#include <Motcle.h>
19#include <TRUSTVect.h>
20#include <TRUSTTabFT.h>
21#include <Param.h>
22
23Implemente_instanciable_sans_constructeur(Proprietes_part_vol,"Proprietes_part_vol",Objet_U);
24
25Proprietes_part_vol::Proprietes_part_vol()
26{
29 temperature_p_.resize(0,1);
30 masse_volumique_p_.resize(0,1);
31 diametre_p_.resize(0,1);
32}
33
35{
37 return os;
38}
39
40
41
42/*! @brief Definition des param pour lecture des proprietes sur un flot d'entree.
43 *
44 * Format de lecture :
45 * -cas 1 lecture dans un fichier (motcle fichier)
46 * -cas 2 specification des valeurs uniformes (motcle distribution)
47 * Appel a lire_distribution()
48 *
49 */
51{
52 param.ajouter_non_std("fichier",(this));
53 param.ajouter_non_std("distribution",(this));
54}
55
57{
58 int retval = 1;
59 if (mot=="fichier")
60 {
62 Nom nomfic;
63 is >> nomfic;
64 EFichier fic;
65 Cerr << "Reading the file " << nomfic << finl;
66 if (!fic.ouvrir(nomfic))
67 {
68 Cerr << " Error while opening the file "<< nomfic << finl;
70 }
72 nb_particules_ = vitesse_p_.dimension(0);
73 }
74 else if (mot=="distribution")
75 {
78 }
79 else retval = -1;
80
81 return retval;
82}
83
85{
86 if (flag_was_initialized)
87 {
88 Cerr<<"Proprietes_part_vol: Both keywords 'fichier' and 'distribution' encountered."<<finl;
89 Cerr<<" Only one of these keywords can be selected."<<finl;
90 Cerr<<" Please, see the reference manual for more details."<<finl;
92 }
93 flag_was_initialized = true;
94
95}
96//Dimensionnement de delta_v_ et initialisation a 0
97//Dimensionnement de volume_p_ et initialisation a :
98// -cas 2D : pi*dp*dp/4
99// -cas 3D : pi*dp*dp*dp/6
101{
102 //Dimensionnement de deltat_v_
103 //Valeurs initialisees a zero car pas de sens en premiere iteration
104 //pour le terme source de masse ajoutee
105 int dim =Objet_U::dimension;
106 deltat_v_.resize(nb_particules_,dim);
107 deltat_v_=0.;
108
109 //Calcul du volume des particules
110 using Kokkos::numbers::pi;
111 double dp;
112 volume_p_.resize(nb_particules_,1);
113
114 if (dim==2)
115 {
116 for (int i=0; i<nb_particules_; i++)
117 {
118 dp = diametre_p_(i,0);
119 volume_p_(i,0) = (pi/4.)*dp*dp;
120 }
121 }
122 else if (dim==3)
123 {
124 for (int i=0; i<nb_particules_; i++)
125 {
126 dp = diametre_p_(i,0);
127 volume_p_(i,0) = (pi/6.)*dp*dp*dp;
128 }
129 }
130 else
131 {
132 Cerr<<"Method Proprietes_part_vol::completer()"<<finl;
133 Cerr<<"The case dimension "<<dim<<" is not treated."<<finl;
135 }
136}
137
138//Methode qui permet a un objet exterieur de modifier la valeur de nb_particules_
140{
141 nb_particules_ = nb_part;
142}
143
144//Nettoyage par suppression des particules qui ne sont plus utilisees
145//La particule i est supprimee si som_utilise(i)=0
146void Proprietes_part_vol::nettoyer(const ArrOfInt& som_utilises)
147{
148 // Compteur de sommets apres suppression
149 int n = 0;
150 for (int i = 0; i<nb_particules_; i++)
151 {
152 if (som_utilises[i])
153 {
154 for (int dim=0; dim<dimension; dim++)
155 {
156 vitesse_p_(n,dim) = vitesse_p_(i,dim);
157 deltat_v_(n,dim) = deltat_v_(i,dim);
158 }
159 temperature_p_(n,0) = temperature_p_(i,0);
161 diametre_p_(n,0) = diametre_p_(i,0);
162 volume_p_(n,0) = volume_p_(i,0);
163 n++;
164 }
165 }
166
167 vitesse_p_.resize(n,dimension);
168 temperature_p_.resize(n,1);
169 masse_volumique_p_.resize(n,1);
170 diametre_p_.resize(n,1);
171 volume_p_.resize(n,1);
172 nb_particules_ = n;
173}
174
175//Ajout des proprietes contenues dans proprietes_tmp a celles de l objet courant
177{
178 const DoubleTab& vitesse_par = proprietes_tmp.vitesse_particules();
179 const DoubleTab& delta_vit = proprietes_tmp.delta_v();
180 const DoubleTab& temperature_par = proprietes_tmp.temperature_particules();
181 const DoubleTab& masse_vol_par = proprietes_tmp.masse_vol_particules();
182 const DoubleTab& diametre_par = proprietes_tmp.diametre_particules();
183 const DoubleTab& volume_par = proprietes_tmp.volume_particules();
184
185 const int nb_part_tmp = proprietes_tmp.nb_particules();
186 const int nb_part_tot = nb_particules_ + nb_part_tmp;
187 int par, par_tmp;
188 int k;
189
190 int dim1 = vitesse_p_.dimension(1);
191 vitesse_p_.resize(nb_part_tot,dim1);
192 deltat_v_.resize(nb_part_tot,dim1);
193 temperature_p_.resize(nb_part_tot,1);
194 masse_volumique_p_.resize(nb_part_tot,1);
195 diametre_p_.resize(nb_part_tot,1);
196 volume_p_.resize(nb_part_tot,1);
197
198 for (par_tmp=0 ; par_tmp<nb_part_tmp ; par_tmp++)
199 {
200 par = par_tmp + nb_particules_;
201 for (k=0 ; k<dim1 ; k++)
202 {
203 vitesse_p_(par,k) = vitesse_par(par_tmp,k);
204 deltat_v_(par,k) = delta_vit(par_tmp,k);
205 }
206
207 temperature_p_(par,0) = temperature_par(par_tmp,0);
208 masse_volumique_p_(par,0) = masse_vol_par(par_tmp,0);
209 diametre_p_(par,0) = diametre_par(par_tmp,0);
210 volume_p_(par,0) = volume_par(par_tmp,0);
211 }
212
213 nb_particules_ = nb_part_tot;
214}
215
216
217// Lecture des valeurs (uniformes) de la vitesse, de la temperature,
218// de la densite, du diametre
219// Format de lecture :
220// "distribution" "nb_particules" val_nb_particules
221// "vitesse" val_1 val_2 [val_3]
222// "temperaturee val_temp
223// "masse_volumique" val_rho
224// "diametre" val_diam
226{
227 int dim = Objet_U::dimension;
228 ArrOfDouble vitesse(dim);
229 double temperature = 0;
230 double masse_volumique = 0;
231 double diametre = 0;
232
233 Param param_distrib(que_suis_je());
234 param_distrib.ajouter("nb_particules",&nb_particules_,Param::REQUIRED);
235 param_distrib.ajouter_arr_size_predefinie("vitesse",&vitesse,Param::REQUIRED);
236 param_distrib.ajouter("temperature",&temperature,Param::REQUIRED);
237 param_distrib.ajouter("masse_volumique",&masse_volumique,Param::REQUIRED);
238 param_distrib.ajouter("diametre",&diametre,Param::REQUIRED);
239 param_distrib.lire_avec_accolades_depuis(is);
240
241 vitesse_p_.resize(nb_particules_,dim);
244 diametre_p_.resize(nb_particules_,1);
245
246 for (int j=0; j<dim; j++)
247 {
248 for (int i=0; i<nb_particules_; i++)
249 vitesse_p_(i,j) = vitesse[j];
250 }
251
252 for (int i=0; i<nb_particules_; i++)
253 {
254 temperature_p_(i,0) = temperature;
255 masse_volumique_p_(i,0) = masse_volumique;
256 diametre_p_(i,0) = diametre;
257 }
258}
259
260
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Definition EFichier.h:29
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in)
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
virtual void set_param(Param &) const
Definition Objet_U.h:135
friend class Entree
Definition Objet_U.h:76
static int dimension
Definition Objet_U.h:99
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_arr_size_predefinie(const char *keyword, const ArrOfInt *value, Param::Nature nat=Param::OPTIONAL)
Register an ArrOfInt whose size has already been fixed.
Definition Param.cpp:411
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
@ REQUIRED
Definition Param.h:115
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
Definition Param.cpp:32
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe qui porte les proprietes de particules.
DoubleTab & masse_vol_particules()
void fixer_nb_particules(const int nb_part)
DoubleTab & vitesse_particules()
void nettoyer(const ArrOfInt &som_utilises)
void lire_distribution(Entree &is)
DoubleTab & diametre_particules()
void ajouter_proprietes(const Proprietes_part_vol &proprietes_tmp)
DoubleTab & volume_particules()
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
DoubleTab & temperature_particules()
Classe de base des flux de sortie.
Definition Sortie.h:52