TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
DebogFT.cpp
1/****************************************************************************
2* Copyright (c) 2022, 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#include <DebogFT.h>
16// #include <IJK_Field.h>
17#include <Param.h>
18#include <TRUSTTabs.h>
19#include <communications.h>
20#include <Maillage_FT_Disc.h>
21
22Implemente_instanciable(DebogFT,"DebogFT",Interprete) ;
27double DebogFT::seuil_absolu_ = 1e-4;
28double DebogFT::seuil_relatif_ = 1e-8;
31{
33 return os;
34}
36{
37 return is;
38}
39// XD DebogFT interprete DebogFT BRACE not_set
41{
42 filename_ = "DEBOG.txt";
43 Param param(que_suis_je());
44 param.ajouter("mode", &debog_mode_); // XD_ADD_P chaine(into=["disabled","write_pass","check_pass"])
45 // XD_CONT not_set
46 param.dictionnaire("disabled", (int)DISABLED);
47 param.dictionnaire("write_pass", (int)WRITE_PASS);
48 param.dictionnaire("check_pass", (int)CHECK_PASS);
49 param.ajouter("filename", &filename_); // XD_ADD_P chaine
50 // XD_CONT not_set
51 param.ajouter("seuil_absolu", &seuil_absolu_); // XD_ADD_P floattant
52 // XD_CONT not_set
53 param.ajouter("seuil_relatif", &seuil_relatif_); // XD_ADD_P floattant
54 // XD_CONT not_set
55 param.ajouter("seuil_minimum_relatif", &seuil_minimum_relatif_); // XD_ADD_P floattant
56 // XD_CONT not_set
57 param.lire_avec_accolades(is);
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 DebogFT::compute_signature_sommets(const Maillage_FT_Disc& mesh, const ArrOfDouble& data, 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 for (int i = 0; i < sig_size; i++)
83 signature[i] = 0.;
84 const int nbsommets = mesh.nb_sommets();
85 const DoubleTab& sommets = mesh.sommets();
86 for (int i = 0; i < nbsommets; i++)
87 {
88 if (mesh.sommet_virtuel(i))
89 continue;
90 const double d = data[i];
91 const double coord_x = sommets(i,0);
92 const double coord_y = sommets(i,1);
93 const double coord_z = sommets(i,2);
94 for (int l = 0; l < sig_size; l++)
95 {
96 const double f = facteurs[l];
97 signature[l] += d * cos(f * coord_x) * cos(f * coord_y) * cos(f * coord_z);
98 }
99 }
100 mp_sum_for_each_item(signature);
101}
102
103void DebogFT::verifier_maillage_ft(const char *msg, const Maillage_FT_Disc& mesh)
104{
105 if (debog_mode_ == DISABLED)
106 return;
107 ArrOfDouble sig;
108 ArrOfDouble data(mesh.nb_sommets());
109 data = 1.;
110 compute_signature_sommets(mesh, data, sig);
111
112 DebogFT::verifier_(msg, sig);
113}
114void DebogFT::verifier_tableau_sommets(const char *msg, const Maillage_FT_Disc& mesh, const ArrOfDouble& data)
115{
116 if (debog_mode_ == DISABLED)
117 return;
118 ArrOfDouble sig;
119 compute_signature_sommets(mesh, data, sig);
120
121 DebogFT::verifier_(msg, sig);
122}
123void DebogFT::verifier_tableau_sommets(const char *msg, const Maillage_FT_Disc& mesh, const DoubleTab& tab)
124{
125 if (debog_mode_ == DISABLED)
126 return;
127 ArrOfDouble sig0, sig1;
128 ArrOfDouble data(mesh.nb_sommets());
129 for (int compo = 0; compo < tab.dimension(1); compo++)
130 {
131 const int n = mesh.nb_sommets();
132 for (int i = 0; i < n; i++)
133 data[i] = tab(i,compo);
134 compute_signature_sommets(mesh, data, sig1);
135 if (compo == 0)
136 sig0 = sig1;
137 else
138 sig0 += sig1;
139 }
140
141 DebogFT::verifier_(msg, sig0);
142}
143
144int debogft_ijk_compteur_stop_if = -1; // mettre ici le numero du passage ou on veut s'arreter avec gdb
145
146void DebogFT::verifier_(const char *msg, const ArrOfDouble& sig)
147{
148 static int compteur = 0;
149 compteur++;
150 // (faire "set compteur_stop_if=valeur" dans gdb)
151 // et mettre un point d'arret sur le Cerr:
152 if (debogft_ijk_compteur_stop_if == compteur)
153 {
154 Cerr << "DebogFT::verifier_, compteur = " << compteur << "On y est !" << finl;
155 }
156
158 {
159 Nom s("");
160 char ss[1000];
161 for (int i = 0; i < sig.size_array(); i++)
162 {
163 snprintf(ss, 1000, "%24.16e ", sig[i]);
164 s += ss;
165 }
166 s += msg;
167 Journal() << "DEBOG1:" << s << finl;
168 if (debog_mode_ == WRITE_PASS)
169 outfile_ << s << finl;
170 else
171 {
172 ArrOfDouble sig2(sig.size_array());
173 Nom s2("");
174 for (int i = 0; i < sig.size_array(); i++)
175 {
176 infile_ >> sig2[i];
177 snprintf(ss, 1000, "%24.16e ", sig2[i]);
178 s2 += ss;
179 }
180 std::string ligne;
181 std::getline(infile_.get_ifstream(), ligne);
182 Journal() << "DEBOG2:" << s2 << ligne.c_str() << finl;
183 bool erreur = false;
184 for (int i = 0; i < sig.size_array(); i++)
185 {
186 double m = std::max(std::fabs(sig[i]),std::fabs(sig2[i]));
187 m = std::max(seuil_minimum_relatif_, m);
188 if (std::fabs(sig[i] - sig2[i]) > seuil_absolu_
189 || std::fabs(sig[i] - sig2[i]) / m > seuil_relatif_)
190 erreur = true;
191 }
192 if (erreur)
193 {
194 Cerr << "DEBOG: erreur" << finl << "THIS:" << s << finl << "REF: " << s2 << finl;
195 }
196 }
197 }
198}
: class DebogIJK
Definition DebogFT.h:33
static SFichier outfile_
Definition DebogFT.h:48
Entree & interpreter(Entree &) override
Definition DebogFT.cpp:40
@ CHECK_PASS
Definition DebogFT.h:37
@ WRITE_PASS
Definition DebogFT.h:37
@ DISABLED
Definition DebogFT.h:37
static void compute_signature_sommets(const Maillage_FT_Disc &, const ArrOfDouble &data, ArrOfDouble &signature)
Definition DebogFT.cpp:72
static double seuil_minimum_relatif_
Definition DebogFT.h:44
static int debog_mode_
Definition DebogFT.h:45
static Nom filename_
Definition DebogFT.h:46
static void verifier_(const char *msg, const ArrOfDouble &sig)
Definition DebogFT.cpp:146
static double seuil_absolu_
Definition DebogFT.h:44
static double seuil_relatif_
Definition DebogFT.h:44
static EFichier infile_
Definition DebogFT.h:47
static void verifier_tableau_sommets(const char *msg, const Maillage_FT_Disc &, const ArrOfDouble &)
Definition DebogFT.cpp:114
static void verifier_maillage_ft(const char *msg, const Maillage_FT_Disc &)
Definition DebogFT.cpp:103
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
Classe de base des objets "interprete".
Definition Interprete.h:38
: class Maillage_FT_Disc Cette classe decrit un maillage:
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
const DoubleTab & sommets() const
renvoie le tableau des sommets (reels et virtuels) dimension(0) = nombre de sommets,
int sommet_virtuel(int i) const
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)
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133