TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
DebogIJK.cpp
1/****************************************************************************
2* Copyright (c) 2026, 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
17#include <DebogIJK.h>
18#include <IJK_Field.h>
19#include <Param.h>
20#include <TRUSTTabs.h>
21#include <Process.h>
22
23Implemente_instanciable(DebogIJK,"DebogIJK",Interprete) ;
24
29double DebogIJK::seuil_absolu_ = 1e-4;
30double DebogIJK::seuil_relatif_ = 1e-8;
32
34{
36 return os;
37}
38
40{
41 return is;
42}
43
45{
46 filename_ = "DEBOG.txt";
47 Param param(que_suis_je());
48 param.ajouter("mode", &debog_mode_);
49 param.dictionnaire("disabled", (int)DISABLED);
50 param.dictionnaire("write_pass", (int)WRITE_PASS);
51 param.dictionnaire("check_pass", (int)CHECK_PASS);
52 param.ajouter("filename", &filename_);
53 param.ajouter("seuil_absolu", &seuil_absolu_);
54 param.ajouter("seuil_relatif", &seuil_relatif_);
55 param.ajouter("seuil_minimum_relatif", &seuil_minimum_relatif_);
56 param.lire_avec_accolades(is);
57
58 if (je_suis_maitre())
59 {
61 outfile_.ouvrir(filename_);
63 infile_.ouvrir(filename_);
64 }
65 return is;
66}
67
68// Calcule une signature numerique du champ. On veut une signature qui varie
69// lineairement avec les valeurs du champ et qui detecte de petites variations.
70// On va calculer quelques sommes ponderees des valeurs du champ avec des
71// ponderations pseudo-aleatoires.
72void DebogIJK::compute_signature(const IJK_Field_float& field, ArrOfDouble& signature)
73{
74 const int sig_size = 5;
75 signature.resize_array(sig_size);
76 ArrOfDouble facteurs(sig_size);
77
78 // Generation de facteurs, nombres irrationnels et non multiples entre eux
79 facteurs[0] = 1.35914091422952;
80 for (int i = 1; i < sig_size; i++)
81 facteurs[i] = facteurs[i-1] * facteurs[0];
82
83 for (int i = 0; i < sig_size; i++)
84 signature[i] = 0.;
85
86 VECT(DoubleTab) sig_factors(3);
87 for (int dir = 0; dir < 3; dir++)
88 {
89 const int n = field.nb_elem_local(dir);
90 sig_factors[dir].resize(n, sig_size);
91 const int offset = field.get_domaine().get_offset_local(dir);
92 for (int i = 0; i < n; i++)
93 for (int j = 0; j < sig_size; j++)
94 sig_factors[dir](i,j) = cos(facteurs[j] * (i+offset));
95 }
96
97 const int ni = field.ni();
98 const int nj = field.nj();
99 const int nk = field.nk();
100 for (int k = 0; k < nk; k++)
101 {
102 for (int j = 0; j < nj; j++)
103 {
104 for (int i = 0; i < ni; i++)
105 {
106 double data = field(i,j,k);
107 for (int l = 0; l < sig_size; l++)
108 {
109 signature[l] += data * sig_factors[0](i,l) * sig_factors[1](j,l) * sig_factors[2](k,l);
110 }
111 }
112 }
113 }
114 mp_sum_for_each_item(signature);
115}
116
117void DebogIJK::verifier(const char *msg, const IJK_Field_float& f)
118{
119 if (debog_mode_ == DISABLED)
120 return;
121 ArrOfDouble sig;
122 compute_signature(f, sig);
124 {
125 Nom s("");
126 char ss[1000];
127 for (int i = 0; i < sig.size_array(); i++)
128 {
129 snprintf(ss, 1000, "%20.13g ", sig[i]);
130 s += ss;
131 }
132 s += msg;
133 Journal() << "DEBOG1:" << s << finl;
134 if (debog_mode_ == WRITE_PASS)
135 outfile_ << s << finl;
136 else
137 {
138 ArrOfDouble sig2(sig.size_array());
139 Nom s2("");
140 for (int i = 0; i < sig.size_array(); i++)
141 {
142 infile_ >> sig2[i];
143 snprintf(ss, 1000, "%20.13g ", sig2[i]);
144 s2 += ss;
145 }
146 std::string ligne;
147 std::getline(infile_.get_ifstream(), ligne);
148 Journal() << "DEBOG2:" << s2 << ligne.c_str() << finl;
149
150 bool erreur = false;
151 for (int i = 0; i < sig.size_array(); i++)
152 {
153 double m = std::max(fabs(sig[i]),fabs(sig2[i]));
154 m = std::max(seuil_minimum_relatif_, m);
155 if (fabs(sig[i] - sig2[i]) > seuil_absolu_
156 || fabs(sig[i] - sig2[i]) / m > seuil_relatif_)
157 erreur = true;
158 }
159 if (erreur)
160 {
161 Cerr << "DEBOG: erreur" << finl << "THIS:" << s << finl << "REF: " << s2 << finl;
162 }
163 }
164 }
165}
166// Calcule une signature numerique du champ. On veut une signature qui varie
167// lineairement avec les valeurs du champ et qui detecte de petites variations.
168// On va calculer quelques sommes ponderees des valeurs du champ avec des
169// ponderations pseudo-aleatoires.
170void DebogIJK::compute_signature(const IJK_Field_double& field, ArrOfDouble& signature)
171{
172 const int sig_size = 5;
173 signature.resize_array(sig_size);
174 ArrOfDouble facteurs(sig_size);
175
176 // Generation de facteurs, nombres irrationnels et non multiples entre eux
177 facteurs[0] = 1.35914091422952;
178 for (int i = 1; i < sig_size; i++)
179 facteurs[i] = facteurs[i-1] * facteurs[0];
180
181 for (int i = 0; i < sig_size; i++)
182 signature[i] = 0.;
183
184 VECT(DoubleTab) sig_factors(3);
185 for (int dir = 0; dir < 3; dir++)
186 {
187 const int n = field.nb_elem_local(dir);
188 sig_factors[dir].resize(n, sig_size);
189 const int offset = field.get_domaine().get_offset_local(dir);
190 for (int i = 0; i < n; i++)
191 for (int j = 0; j < sig_size; j++)
192 sig_factors[dir](i,j) = cos(facteurs[j] * (i+offset));
193 }
194
195 const int ni = field.ni();
196 const int nj = field.nj();
197 const int nk = field.nk();
198 for (int k = 0; k < nk; k++)
199 {
200 for (int j = 0; j < nj; j++)
201 {
202 for (int i = 0; i < ni; i++)
203 {
204 double data = field(i,j,k);
205 for (int l = 0; l < sig_size; l++)
206 {
207 signature[l] += data * sig_factors[0](i,l) * sig_factors[1](j,l) * sig_factors[2](k,l);
208 }
209 }
210 }
211 }
212 mp_sum_for_each_item(signature);
213}
214
215void DebogIJK::verifier(const char *msg, const IJK_Field_double& f)
216{
217 if (debog_mode_ == DISABLED)
218 return;
219 ArrOfDouble sig;
220 compute_signature(f, sig);
222 {
223 Nom s("");
224 char ss[1000];
225 for (int i = 0; i < sig.size_array(); i++)
226 {
227 snprintf(ss, 1000, "%20.13g ", sig[i]);
228 s += ss;
229 }
230 s += msg;
231 Journal() << "DEBOG1:" << s << finl;
232 if (debog_mode_ == WRITE_PASS)
233 outfile_ << s << finl;
234 else
235 {
236 ArrOfDouble sig2(sig.size_array());
237 Nom s2("");
238 for (int i = 0; i < sig.size_array(); i++)
239 {
240 infile_ >> sig2[i];
241 snprintf(ss, 1000, "%20.13g ", sig2[i]);
242 s2 += ss;
243 }
244 std::string ligne;
245 std::getline(infile_.get_ifstream(), ligne);
246 Journal() << "DEBOG2:" << s2 << ligne.c_str() << finl;
247
248 bool erreur = false;
249 for (int i = 0; i < sig.size_array(); i++)
250 {
251 double m = std::max(fabs(sig[i]),fabs(sig2[i]));
252 m = std::max(seuil_minimum_relatif_, m);
253 if (fabs(sig[i] - sig2[i]) > seuil_absolu_
254 || fabs(sig[i] - sig2[i]) / m > seuil_relatif_)
255 erreur = true;
256 }
257 if (erreur)
258 {
259 Cerr << "DEBOG: erreur" << finl << "THIS:" << s << finl << "REF: " << s2 << finl;
260 }
261 }
262 }
263}
264
: class DebogIJK
Definition DebogIJK.h:33
static void compute_signature(const IJK_Field_float &, ArrOfDouble &signature)
Definition DebogIJK.cpp:72
static Nom filename_
Definition DebogIJK.h:45
static SFichier outfile_
Definition DebogIJK.h:47
static void verifier(const char *msg, const IJK_Field_float &)
Definition DebogIJK.cpp:117
static int debog_mode_
Definition DebogIJK.h:44
@ WRITE_PASS
Definition DebogIJK.h:38
@ CHECK_PASS
Definition DebogIJK.h:38
@ DISABLED
Definition DebogIJK.h:38
static double seuil_minimum_relatif_
Definition DebogIJK.h:43
static double seuil_relatif_
Definition DebogIJK.h:43
static EFichier infile_
Definition DebogIJK.h:46
Entree & interpreter(Entree &) override
Definition DebogIJK.cpp:44
static double seuil_absolu_
Definition DebogIJK.h:43
int get_offset_local(int direction) const
Returns the local offset in requested direction.
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
const Domaine_IJK & get_domaine() const
Classe de base des objets "interprete".
Definition Interprete.h:38
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
friend class Entree
Definition Objet_U.h:76
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void dictionnaire(const char *option_name, int value)
Add an (option name, integer value) entry to the dictionary attached to a previously registered integ...
Definition Param.cpp:293
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
int lire_avec_accolades(Entree &is)
Alias of lire_avec_accolades_depuis.
Definition Param.h:577
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
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
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)