TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Solv_GCP.h
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#ifndef Solv_GCP_included
17#define Solv_GCP_included
18
19#include <Matrice_SuperMorse.h>
20#include <Matrice_Morse_Sym.h>
21#include <solv_iteratif.h>
22#include <Precond_base.h>
23#include <TRUST_Deriv.h>
24
26{
27 Declare_instanciable_sans_constructeur(Solv_GCP);
28public:
29 Solv_GCP();
30 int resoudre_systeme(const Matrice_Base&, const DoubleVect&, DoubleVect&) override;
31 int resoudre_systeme(const Matrice_Base&, const DoubleVect&, DoubleVect&, int) override;
32 inline const OWN_PTR(Precond_base)& get_precond() const { return le_precond_; }
33 inline OWN_PTR(Precond_base)& get_precond() { return le_precond_; }
34 inline void set_precond(const OWN_PTR(Precond_base)& pre) { le_precond_ = pre; }
35 void reinit() override;
37 {
38 return !le_precond_ || le_precond_->supporte_matrice_morse_sym();
39 }
40 // GCP does not need that b has an updated virtual space...
41 int get_flag_updated_input() const override { return 0; }
42
43protected:
44 void prepare_data(const Matrice_Base& matrice, const DoubleVect& secmem, DoubleVect& solution);
45 int resoudre_(const Matrice_Base&, const DoubleVect&, DoubleVect&, int);
46
47 bool optimized_ = false;
48 OWN_PTR(Precond_base) le_precond_;
49 // Parametre du jdd: veut-on appliquer un preconditionnement diagonal global ?
50 // Dans ce cas, on copie la matrice, on multiplie la matrice a gauche et a droite par 1/sqrt(diagonale)
51 // et on multiplie second membre avant et solution apres par la meme chose.
52 // (attention, cela change la metrique du produit scalaire, donc l'interpretation du seuil):
53 // A * X = B
54 // <=> D * A * X = D * B (avec D = 1 / sqrt(diagonale))
55 // <=> (D * A * D) * Y = D * B, et X = D * Y
56 // Propriete: les termes diagonaux de D * A * D sont egaux a 1
57 bool precond_diag_ = false;
58 // Un tableau avec items virtuels
60 // Quatre tableaux sans items virtuels (on pourrait mettre des espaces virtuels a tous les vecteurs,
61 // mais cela economise de la place dans le cache).
62 DoubleVect resu_;
63 DoubleVect residu_;
64 // tmp_p_ pointe sur la meme domaine que tmp_p_avec_items_virt_
65 // (on cree cet alias car les operations entre vecteurs verifient que
66 // les tailles et structures paralleles sont identiques,
67 // par exemple le preconditionneur...)
68 DoubleVect tmp_p_;
69 DoubleVect tmp_solution_;
70 // Matrice des coefficients reels-reels
72 // Matrice des coefficients reels-virtuels (stockage sans les lignes vides)
74 // le Domaine de memoire dans lequel on stocke les vecteurs temporaires et eventuellement
75 // les matrices (ne pas lire dedans, il y a aussi des entiers !)
76 // Je prends des double pour etre certain que le domaine alloueee est correctement alignee en memoire
77 ArrOfDouble tmp_data_block_;
78 // Tableau de renumerotation entre le second membre et les vecteurs temporaires
79 // (suppression des items communs et virtuels non utilises)
80 IntVect renum_;
81 // Si on veut appliquer le preconditionnement diagonal,
82 // inverse de la racine carree des termes diagonaux de la matrice
83 // Attention, on met l'espace virtuel de ce vecteur a jour car on en a besoin
84 // pour D*A*D
85 DoubleVect inv_sqrt_diag_;
86 int reinit_ = 0; // 0=> rien n'est pret 1=> memoire allouee, coeffs matrice a copier, 2=> ok
87 int nb_it_max_ = -1;
88};
89
90#endif /* Solv_GCP_included */
Classe Matrice_Base Classe de base de la hierarchie des matrices.
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
: Matrice avec un stockage encore plus creux que Matrice_Morse: On stocke uniquement les lignes non v...
int get_flag_updated_input() const override
Definition Solv_GCP.h:41
DoubleVect resu_
Definition Solv_GCP.h:62
bool optimized_
Definition Solv_GCP.h:47
DoubleVect tmp_solution_
Definition Solv_GCP.h:69
int nb_it_max_
Definition Solv_GCP.h:87
DoubleVect residu_
Definition Solv_GCP.h:63
void set_precond(const OWN_PTR(Precond_base)&pre)
Definition Solv_GCP.h:34
ArrOfDouble tmp_data_block_
Definition Solv_GCP.h:77
DoubleVect tmp_p_
Definition Solv_GCP.h:68
void reinit() override
Definition Solv_GCP.cpp:129
bool precond_diag_
Definition Solv_GCP.h:57
int supporte_matrice_morse_sym() override
Definition Solv_GCP.h:36
DoubleVect inv_sqrt_diag_
Definition Solv_GCP.h:85
OWN_PTR(Precond_base) le_precond_
Matrice_SuperMorse tmp_mat_virt_
Definition Solv_GCP.h:73
IntVect renum_
Definition Solv_GCP.h:80
int resoudre_(const Matrice_Base &, const DoubleVect &, DoubleVect &, int)
Definition Solv_GCP.cpp:422
int reinit_
Definition Solv_GCP.h:86
int resoudre_systeme(const Matrice_Base &, const DoubleVect &, DoubleVect &) override
Definition Solv_GCP.cpp:111
const OWN_PTR(Precond_base) &get_precond() const
Definition Solv_GCP.h:32
OWN_PTR(Precond_base) &get_precond()
Definition Solv_GCP.h:33
void prepare_data(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Definition Solv_GCP.cpp:138
DoubleVect tmp_p_avec_items_virt_
Definition Solv_GCP.h:59
Matrice_Morse_Sym tmp_mat_
Definition Solv_GCP.h:71