22 if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE || correction_petites_cellules == CORRECTION_PETITES_CELLULES::DIRECTION_PRIVILEGIEE_AVEC_LIMITATION)
24 for (
int num_face = 0; num_face < 6; num_face++)
26 flux[num_face] = -flux[num_face];
30 if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_DIRECTE)
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)
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++)
41 flux_max_positif = std::max(flux_max_positif, flux[num_face]);
42 flux_max_negatif = std::max(flux_max_negatif, -flux[num_face]);
44 if ((flux_max_negatif == 0.) && (flux_max_positif == 0.))
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;
53 for (
int num_face = 0; num_face < 6; num_face++)
55 flux[num_face] = direction_positive ? std::max(0., flux[num_face]) : std::max(0., -flux[num_face]);
58 else if (correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_SYMETRIQUE || correction_petites_cellules == CORRECTION_PETITES_CELLULES::CORRECTION_SYMETRIQUE_AVEC_LIMITATION)
60 for (
int num_face = 0; num_face < 6; num_face++)
62 flux[num_face] = std::abs(flux[num_face]);
67 Cerr <<
"Valeur inconnue de correction_petites_cellules" << finl;
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))
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));
82 int number_of_unlimited_cells = 0.;
83 double excess_fluxes = 0.;
84 double flux_room[6] = {0};
85 double total_room = 0.;
89 for (
int num_face = 0; num_face < 6; num_face++)
91 flux_max[num_face] = flux_max[num_face]*std::abs(somme_flux/quantite_totale);
94 for (
int num_face = 0; num_face < 6; num_face++)
96 if ((flux_max[num_face] != 0) && (flux[num_face] > flux_max[num_face]))
98 excess_fluxes += flux[num_face] - flux_max[num_face];
99 flux[num_face] = flux_max[num_face];
103 if (excess_fluxes != 0)
105 for (
int num_face = 0; num_face < 6; num_face++)
107 if (flux_max[num_face] != 0)
109 flux_room[num_face] = flux_max[num_face] - flux[num_face];
110 total_room += flux_room[num_face];
112 else if (flux_max[num_face] == 0 && flux[num_face] != 0)
114 number_of_unlimited_cells += 1;
119 double left_over_fluxes = std::max(0., excess_fluxes - total_room);
120 for (
int num_face = 0; num_face < 6; num_face++)
122 if (flux_max[num_face] == 0 && flux[num_face] != 0)
124 flux_room[num_face] = left_over_fluxes/number_of_unlimited_cells;
125 total_room += flux_room[num_face];
130 for (
int num_face = 0; num_face < 6; num_face++)
132 if (total_room != 0.)
134 flux[num_face] += (flux_room[num_face]/total_room)*std::min(excess_fluxes, total_room);
139 for (
int num_face = 0; num_face < 6; num_face++)
141 assert((flux_max[num_face] == 0.) || (flux[num_face] <= flux_max[num_face]*(1 + 1e-9)));