TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Cut_cell_correction_petites_cellules.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 <Cut_cell_correction_petites_cellules.h>
17#include <IJK_Thermal_cut_cell.h>
18#include <Process.h>
19
20void Cut_cell_correction_petites_cellules::modification_flux_petites_cellules(CORRECTION_PETITES_CELLULES correction_petites_cellules, double quantite_totale, double flux[6])
21{
22 if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE || correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_AVEC_LIMITATION)
23 {
24 for (int num_face = 0; num_face < 6; num_face++)
25 {
26 flux[num_face] = -flux[num_face];
27 }
28 }
29
30 if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_DIRECTE)
31 {
32 // Ne fait rien
33 }
34 else if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE || correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_2 || correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_AVEC_LIMITATION || correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_AVEC_LIMITATION_2)
35 {
36 int direction_positive = quantite_totale > 0;
37 double flux_max_positif = 0.;
38 double flux_max_negatif = 0.;
39 for (int num_face = 0; num_face < 6; num_face++)
40 {
41 flux_max_positif = std::max(flux_max_positif, flux[num_face]);
42 flux_max_negatif = std::max(flux_max_negatif, -flux[num_face]);
43 }
44 if ((flux_max_negatif == 0.) && (flux_max_positif == 0.))
45 {
46 //Cerr << "Warning: for cell " << n << " no change is made due to lack of suitable fluxes; for information temperature_remplissage=" << temperature_remplissage << " and temperature_centre=" << temperature_centre << finl;
47 return;
48 }
49
50 direction_positive = (flux_max_negatif < flux_max_positif/10.) ? 1 : direction_positive;
51 direction_positive = (flux_max_positif < flux_max_negatif/10.) ? 0 : direction_positive;
52
53 for (int num_face = 0; num_face < 6; num_face++)
54 {
55 flux[num_face] = direction_positive ? std::max(0., flux[num_face]) : std::max(0., -flux[num_face]);
56 }
57 }
58 else if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_SYMETRIQUE || correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_SYMETRIQUE_AVEC_LIMITATION)
59 {
60 for (int num_face = 0; num_face < 6; num_face++)
61 {
62 flux[num_face] = std::abs(flux[num_face]);
63 }
64 }
65 else
66 {
67 Cerr << "Valeur inconnue de correction_petites_cellules" << finl;
69 }
70}
71
72void Cut_cell_correction_petites_cellules::limitation_flux_avec_flux_max(CORRECTION_PETITES_CELLULES correction_petites_cellules, double quantite_totale, double somme_flux, double flux_max[6], double flux[6])
73{
74 // Ne fait rien si l'option n'inclue pas une limitation ou egalement
75 // si le changmeent total a effectuer est nul
76 if (quantite_totale != 0 && (correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_AVEC_LIMITATION || correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_AVEC_LIMITATION_2 || correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_SYMETRIQUE_AVEC_LIMITATION))
77 {
78 // Je pense que tous les flux et flux_max sont positifs
79 assert((flux[0] >= 0 && flux[1] >= 0 && flux[2] >= 0 && flux[3] >= 0 && flux[4] >= 0 && flux[5] >= 0));
80 assert((flux_max[0] >= 0 && flux_max[1] >= 0 && flux_max[2] >= 0 && flux_max[3] >= 0 && flux_max[4] >= 0 && flux_max[5] >= 0));
81
82 int number_of_unlimited_cells = 0.; // Compte le nombre de flux sans limite
83 double excess_fluxes = 0.; // Ce qu'il faut repartir a la suite de la limitation
84 double flux_room[6] = {0}; // Espace disponible pour la repartition les flux (0 = pas de limites)
85 double total_room = 0.;
86
87 // Les flux reels sont de la forme (flux[num_face]/somme_flux)*quantite_totale
88 // On corrige flux_max pour qu'il soit comparable aux flux
89 for (int num_face = 0; num_face < 6; num_face++)
90 {
91 flux_max[num_face] = flux_max[num_face]*std::abs(somme_flux/quantite_totale);
92 }
93
94 for (int num_face = 0; num_face < 6; num_face++)
95 {
96 if ((flux_max[num_face] != 0) && (flux[num_face] > flux_max[num_face]))
97 {
98 excess_fluxes += flux[num_face] - flux_max[num_face];
99 flux[num_face] = flux_max[num_face];
100 }
101 }
102
103 if (excess_fluxes != 0)
104 {
105 for (int num_face = 0; num_face < 6; num_face++)
106 {
107 if (flux_max[num_face] != 0)
108 {
109 flux_room[num_face] = flux_max[num_face] - flux[num_face];
110 total_room += flux_room[num_face];
111 }
112 else if (flux_max[num_face] == 0 && flux[num_face] != 0)
113 {
114 number_of_unlimited_cells += 1;
115 }
116 }
117
118 // Si le compte n'est pas suffisant, les flux sans limites sont mis a contribution
119 double left_over_fluxes = std::max(0., excess_fluxes - total_room);
120 for (int num_face = 0; num_face < 6; num_face++)
121 {
122 if (flux_max[num_face] == 0 && flux[num_face] != 0)
123 {
124 flux_room[num_face] = left_over_fluxes/number_of_unlimited_cells;
125 total_room += flux_room[num_face];
126 }
127 }
128
129 // Correction des flux : Aucune correction si pas d'espace disponible, meme si l'exces subsiste
130 for (int num_face = 0; num_face < 6; num_face++)
131 {
132 if (total_room != 0.)
133 {
134 flux[num_face] += (flux_room[num_face]/total_room)*std::min(excess_fluxes, total_room);
135 }
136 }
137 }
138
139 for (int num_face = 0; num_face < 6; num_face++)
140 {
141 assert((flux_max[num_face] == 0.) || (flux[num_face] <= flux_max[num_face]*(1 + 1e-9)));
142 }
143 }
144}
145
147{
148 double somme_flux = 0.;
149 for (int num_face = 0; num_face < 6; num_face++)
150 {
151 somme_flux += flux[num_face];
152 }
153 return somme_flux;
154}
155
static void modification_flux_petites_cellules(CORRECTION_PETITES_CELLULES correction_petites_cellules, double quantite_totale, double flux[6])
static void limitation_flux_avec_flux_max(CORRECTION_PETITES_CELLULES correction_petites_cellules, double quantite_totale, double somme_flux, double flux_max[6], double flux[6])
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455