TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Algorithmes_Transport_FT_Disc.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 <Algorithmes_Transport_FT_Disc.h>
17#include <Parser.h>
18#include <TRUSTArray.h>
19#include <TRUSTTab.h>
20#include <Domaine_VF.h>
21
22Implemente_instanciable(Algorithmes_Transport_FT_Disc,"Algorithmes_Transport_FT_Disc",Objet_U);
23
24
25/*! @brief readOn : appel interdit
26 *
27 */
29{
30 assert(0);
31 return is;
32}
33
34/*! @brief printOn : appel interdit
35 *
36 */
38{
39 assert(0);
40 return os;
41}
42
43/*! @brief Calcul des grandeurs suivantes en fonction de l'indicatrice de phase.
44 *
45 * On calcule la somme sur tous les processeurs.
46 *
47 * @param (indicatrice) le tableau des valeurs d'un champ aux elements de domaine_vf (entree) Le champ est suppose constant par element.
48 * @param (volume_total) (sortie) le volume total du domaine = INTEGRALE(d omega)
49 * @param (volume_phase_1) (sortie) integrale de volume de l'indicatrice de phase, egale au volume de la phase 1 = INTEGRALE(indicatrice * d omega)
50 * @param (barycentre) En entree: on attend un tableau de meme dimension que les coordonnees En sortie: iso-barycentre de la zone = INTEGRALE(X * d omega) / volume_phase_1
51 * @param (barycentre_phase_1) En entree: idem que barycentre En sortie: barycentre de la phase_1 calcule comme INTEGRALE(indicatrice * X * d omega) / volume_phase_1
52 */
54 const Domaine_VF& domaine_vf,
55 const DoubleTab& indicatrice,
56 double& volume_total,
57 double& volume_phase_1,
58 ArrOfDouble& barycentre,
59 ArrOfDouble& barycentre_phase_1)
60{
61 const DoubleTab& xp = domaine_vf.xp();
62 const int dim = xp.line_size();
63 assert(barycentre.size_array() == dim);
64 assert(barycentre_phase_1.size_array() == dim);
65 // Volumes des elements
66 const DoubleVect& volumes = domaine_vf.volumes();
67 const int nb_elem = indicatrice.size();
68 assert(nb_elem == domaine_vf.nb_elem());
69 int i;
70 double somme_v = 0.; // Somme des volumes
71 double somme_vI = 0.; // Somme des volumes de phase 1
72 double somme_v_x[3] = { 0., 0., 0. }; // Somme des xp[i] * volume
73 double somme_vI_x[3] = { 0., 0., 0. }; // Somme des xp[i] * volume * indicatrice
74 for (i = 0; i < nb_elem; i++)
75 {
76 const double I = indicatrice[i];
77 const double v = volumes[i];
78 const double vI = v * I;
79 somme_v += v;
80 somme_vI += vI;
81 int j;
82 for (j = 0; j < dim; j++)
83 {
84 const double x = xp(i, j);
85 somme_v_x[j] += v * x;
86 somme_vI_x[j] += vI * x;
87 }
88 }
89 volume_total = mp_sum(somme_v);
90 volume_phase_1 = mp_sum(somme_vI);
91 for (i = 0; i < dim; i++)
92 {
93 const double sv = mp_sum(somme_v_x[i]);
94 const double svI = mp_sum(somme_vI_x[i]);
95 double b = 0.;
96 double bI = 0.;
97 if (volume_total > 0.)
98 b = sv / volume_total;
99 if (volume_phase_1 > 0.)
100 bI = svI / volume_phase_1;
101 barycentre[i] = b;
102 barycentre_phase_1[i] = bI;
103 }
104}
105
106/*! @brief evalue les fonctions px, py et pz en (x,y,z,t) (essentiellement utilise dans integrer_vitesse_imposee)
107 *
108 * @param (px, py, pz) Trois fonctions qui comprennent au moins 4 parametres.
109 * @param (vx, vy, vz) References aux variables ou on stocke le resultat vx=px(x,y,z,t) vy=py(x,y,z,t) vz=pz(x,y,z,t)
110 */
111void eval_vitesse(double x, double y, double z, double t,
112 Parser& px, Parser& py, Parser& pz,
113 double& vx, double& vy, double& vz)
114{
115 int i0=0, i1=1, i2=2, i3=3;
116 px.setVar(i0,x);
117 px.setVar(i1,y);
118 px.setVar(i2,z);
119 px.setVar(i3,t);
120
121 vx = px.eval();
122 py.setVar(i0,x);
123 py.setVar(i1,y);
124 py.setVar(i2,z);
125 py.setVar(i3,t);
126
127 vy = py.eval();
128 pz.setVar(i0,x);
129 pz.setVar(i1,y);
130 pz.setVar(i2,z);
131 pz.setVar(i3,t);
132 vz = pz.eval();
133}
134
135/*! @brief Integre le systeme differentiel d/dt(x)=vx(x,y,z,t)
136 *
137 * d/dt(y)=vy(x,y,z,t)
138 * d/dt(z)=vy(x,y,z,t)
139 * entre "t=temps" et "t=temps+dt" par un unique pas de Runge Kutta ordre 4
140 * Parametres: x,y,z
141 * Signification: Position initiale (en t=temps) en entree, position finale
142 * (en t=temps+dt) en sortie.
143 *
144 */
145void integrer_vitesse_imposee(
146 Parser& parser_vx, Parser& parser_vy, Parser& parser_vz,
147 double temps, double dt, double& x, double& y, double& z)
148{
149 // Runge Kutta ordre 3:
150 double vx, vy, vz;
151 eval_vitesse(x,
152 y,
153 z,
154 temps,
155 parser_vx,parser_vy,parser_vz,vx,vy,vz);
156 double vx1,vy1,vz1;
157 eval_vitesse(x + vx * dt * 0.5,
158 y + vy * dt * 0.5,
159 z + vz * dt * 0.5,
160 temps + dt * 0.5,
161 parser_vx,parser_vy,parser_vz,vx1,vy1,vz1);
162 double vx2,vy2,vz2;
163 eval_vitesse(x + vx1 * dt * 0.5,
164 y + vy1 * dt * 0.5,
165 z + vz1 * dt * 0.5,
166 temps + dt * 0.5,
167 parser_vx,parser_vy,parser_vz,vx2,vy2,vz2);
168 double vx3,vy3,vz3;
169 eval_vitesse(x + vx2 * dt,
170 y + vy2 * dt,
171 z + vz2 * dt,
172 temps + dt,
173 parser_vx,parser_vy,parser_vz,vx3,vy3,vz3);
174
175 x += (vx + 2.*vx1 + 2.*vx2 + vx3) / 6. * dt;
176 y += (vy + 2.*vy1 + 2.*vy2 + vy3) / 6. * dt;
177 z += (vz + 2.*vz1 + 2.*vz2 + vz3) / 6. * dt;
178}
179
: classe Algorithmes_Transport_FT_Disc
virtual void calculer_moments_indicatrice(const Domaine_VF &domaine_vf, const DoubleTab &indicatrice, double &volume_total, double &volume_phase_1, ArrOfDouble &barycentre, ArrOfDouble &barycentre_phase_1)
Calcul des grandeurs suivantes en fonction de l'indicatrice de phase.
class Domaine_VF
Definition Domaine_VF.h:44
double volumes(int i) const
Definition Domaine_VF.h:113
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Representation des donnees de la classe Parser.
Definition Parser.h:39
void setVar(const char *sv, double val)
Definition Parser.h:73
double eval()
Definition Parser.h:68
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
Definition Process.cpp:146
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const
_SIZE_ size() const
Definition TRUSTVect.tpp:45
int line_size() const
Definition TRUSTVect.tpp:67