16#include <Multigrille_base.h>
20#include <Schema_Comm_Vecteurs.h>
21#include <communications.h>
22#include <Matrice_Morse_Sym.h>
23#include <IJK_VDF_converter.h>
25#ifdef DUMP_LATA_ALL_LEVELS
26#include <IJK_lata_dump.h>
27#include <IJK_Lata_writer.h>
31#ifdef DUMP_X_B_AND_RESIDUE_IN_FILE
33static int global_count_dump_in_file = 0;
48 param.
ajouter(
"relax_jacobi", &relax_jacobi_);
51 param.
ajouter(
"pre_smooth_steps", &pre_smooth_steps_);
58 param.
ajouter(
"smooth_steps", &smooth_steps_);
62 param.
ajouter(
"nb_full_mg_steps", &nb_full_mg_steps_);
64 param.
ajouter(
"solveur_grossier", &solveur_grossier_);
68 param.
ajouter(
"check_residu", &check_residu_);
69 param.
ajouter(
"seuil", &seuil_);
73 param.
ajouter(
"iterations_gcp", &max_iter_gcp_);
74 param.
ajouter(
"iterations_gmres", &max_iter_gmres_);
75 param.
ajouter(
"solv_jacobi", &solv_jacobi_);
76 param.
ajouter(
"n_krilov", &n_krilov_);
86 param.
ajouter(
"iterations_mixed_solver", &max_iter_mixed_solver_);
101 relax_jacobi_.resize_array(1);
102 relax_jacobi_[0] = 0.65;
103 max_iter_mixed_solver_ = 4;
114#ifdef DUMP_X_B_AND_RESIDUE_IN_FILE
115void dump_x_b_residue_in_file(
const IJK_Field_float& x,
const IJK_Field_float& b,
116 IJK_Field_float& residu,
int grid_level,
int step_number,
122 const int ni = x.
ni();
127 snprintf(ss, 4,
"%03d", step_number);
130 n +=
Nom(grid_level);
133 f.setf(ios::scientific);
134 for (
int i = 0; i < ni; i++)
136 const float xx = x(i,j_fix, k_fix);
137 const float bb = b(i,j_fix, k_fix);
138 const float rr = residu(i,j_fix, k_fix);
139 f << i <<
" " << xx <<
" " << bb <<
" " << rr << finl;
141 Cout <<
"STEP " << global_count_dump_in_file <<
" at grid level " << grid_level <<
" " << comment << finl;
142 global_count_dump_in_file++;
146void dump_x_b_residue_in_file(
const IJK_Field_double& x,
const IJK_Field_double& b, IJK_Field_double& residu,
147 int grid_level,
int step_number,
Nom comment)
152 const int ni = x.
ni();
157 snprintf(ss, 4,
"%03d", step_number);
160 n +=
Nom(grid_level);
163 f.setf(ios::scientific);
164 for (
int i = 0; i < ni; i++)
166 const double xx = x(i,j_fix, k_fix);
167 const double bb = b(i,j_fix, k_fix);
168 const double rr = residu(i,j_fix, k_fix);
169 f << i <<
" " << xx <<
" " << bb <<
" " << rr << finl;
171 Cout <<
"STEP " << global_count_dump_in_file <<
" at grid level " << grid_level <<
" " << comment << finl;
172 global_count_dump_in_file++;
206 if (level > pre_smooth_steps_.size_array() - 1)
207 i1 = pre_smooth_steps_.size_array() - 1;
208 if (level > smooth_steps_.size_array() - 1)
209 i2 = smooth_steps_.size_array() - 1;
210 int nsweeps = std::max(pre_smooth_steps_[i1], smooth_steps_[i2]) + 1;
230 norm_residue =
multigrille(ijk_x, ijk_b, ijk_residu);
231 if (norm_residue > seuil_)
233 Cerr <<
"Error in Multigrille_base: single precision pure multigrid solver did not converge to requested precision ("
234 << seuil_ <<
")\n Residue at end of solver= " << norm_residue << finl;
254 if (max_iter_gcp_ > 0)
258 else if (max_iter_gmres_ > 0)
262 else if (solv_jacobi_ > 0)
264 static int fcount = 0;
266 for (
int i = 0; i < solv_jacobi_; i++)
276 const double norm_residue =
multigrille(ijk_x, ijk_b, ijk_residu);
277 if (norm_residue > seuil_)
279 Cerr <<
"Error in Multigrille_base: double precision pure multigrid solver did not converge to requested precision ("
280 << seuil_ <<
")\n Residue at end of solver= " << norm_residue << finl;
294 const int ni = ijk_x.
ni();
295 const int nj = ijk_x.
nj();
296 const int nk = ijk_x.
nk();
298 for (
int k = 0; k < nk; k++)
299 for (
int j = 0; j < nj; j++)
300 for (
int i = 0; i < ni; i++)
301 float_b(i, j, k) = (float)ijk_b(i, j, k);
307 for (
int k = 0; k < nk; k++)
308 for (
int j = 0; j < nj; j++)
309 for (
int i = 0; i < ni; i++)
310 float_b(i, j, k) = (float)(-ijk_residu(i, j, k));
320 const double single_precision_residue =
multigrille(float_x, float_b, float_residue);
323 for (
int k = 0; k < nk; k++)
324 for (
int j = 0; j < nj; j++)
325 for (
int i = 0; i < ni; i++)
326 ijk_x(i, j, k) += float_x(i, j, k);
328 if (single_precision_residue < seuil_)
333 const double nr = norme_ijk(ijk_residu);
335 Cout <<
"Mixed precision solver iteration " << iteration
336 <<
" singleprecision residue= " << single_precision_residue
337 <<
" doubleprecision residue= " << nr << finl;
340 if (iteration > max_iter_mixed_solver_)
344 if (norme_residu_gcp < seuil_)
348 Cerr <<
"Error in Multigrille_base: mixed precision solver did not converge in "
349 << max_iter_mixed_solver_ <<
" iterations." << finl;
350 Cerr <<
" seuil is " << seuil_ <<
" and the norm of the GCP residu is " << norme_residu_gcp;
Class defining operators and methods for all reading operation in an input flow (file,...
void shift_k_origin(int n)
void echange_espace_virtuel(int ghost)
Exchange data over "ghost" number of cells.
Classe Matrice_Base Classe de base de la hierarchie des matrices.
virtual int needed_kshift_for_jacobi(int level) const =0
virtual void ajouter_param(Param &)
virtual double multigrille_failure()=0
virtual void prepare_secmem(IJK_Field_float &x) const =0
void solve_ijk_in_storage_template()
virtual IJK_Field_float & get_storage_float(StorageId, int level)=0
virtual void dump_lata(const Nom &field, const IJK_Field_float &data, int tstep) const =0
int get_flag_updated_input() const override
virtual IJK_Field_double & get_storage_double(StorageId, int level)=0
const int precision_double_
int resoudre_systeme(const Matrice_Base &a, const DoubleVect &b, DoubleVect &x, int) override
void resoudre_avec_gmres(IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &x, IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &b, IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &residu)
void resoudre_avec_gcp(IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &x, IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &b, IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &residu)
double multigrille(IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &x, const IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &b, IJK_Field_template< _TYPE_, _TYPE_ARRAY_ > &residu)
const int precision_float_
void resoudre_systeme_template(const Matrice_Base &a, const DoubleVect &b, DoubleVect &x)
virtual void jacobi_residu(IJK_Field_float &x, const IJK_Field_float *secmem, const int grid_level, const int n_jacobi, IJK_Field_float *residu) const =0
int nsweeps_jacobi_residu(int level) const
class Nom Une chaine de caractere pour nommer les objets de TRUST
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
void dictionnaire(const char *option_name, int value)
Add an (option name, integer value) entry to the dictionary attached to a previously registered integ...
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Classe de base des flux de sortie.