16#include <Matrice_Morse_Sym.h>
17#include <Matrice_Bloc_Sym.h>
18#include <MD_Vector_tools.h>
19#include <MD_Vector_base.h>
20#include <TRUSTTab_parts.h>
32 s <<
" { omega "<<
omega_ <<
" } ";
39 param.ajouter(
"omega", &
omega_);
41 param.lire_avec_accolades(is);
45 Cerr <<
"SSOR::readOn, omega is not within [0, 2]: SSOR not activated (you should use precond nul instead) " << finl;
97 operator_egal(solution, b);
101 operator_egal(solution, b);
106 ssor(matrice, solution);
112 ssor(matrice, solution);
119 ssor(matrice, solution);
123 Cerr <<
"SSOR::preconditionner not coded for type " << la_matrice.
que_suis_je() << finl;
130void traite_diagonale(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
132 const int nb_lignes_a_traiter = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
135 const double psi = (2. - omega) / omega;
136 const double *coeff_fortran = coeff.addr() - 1;
137 const auto *tab1_ptr = tab1.addr();
138 double *vect_ptr = vecteur.addr();
139 for (
int i = nb_lignes_a_traiter; i; i--, tab1_ptr++, vect_ptr++)
141 const auto j = *tab1_ptr;
143 const double coeff_i_i = coeff_fortran[j];
144 (*vect_ptr) *= psi * coeff_i_i;
148enum class descente_enum { NORMAL , NORMAL_ASSERT , DIAG , DIAG_ASSERT };
150template<descente_enum _TYPE_>
151void descente_generique(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
153 static constexpr bool IS_NORMAL_ASSERT = (_TYPE_ == descente_enum::NORMAL_ASSERT), IS_DIAG_ASSERT = (_TYPE_ == descente_enum::DIAG_ASSERT), NOT_DIAG = (_TYPE_ != descente_enum::DIAG && _TYPE_ != descente_enum::DIAG_ASSERT);
157 const int nb_lignes_a_traiter = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
159 double *
const sol_fortran = vecteur.addr() - 1;
160 const auto *tab1_ptr = tab1.addr();
161 assert(nb_lignes_a_traiter <= tab1.size_array() + 1);
162 assert(*tab1_ptr == 1);
163 const int *tab2_ptr = tab2.addr();
164 const double *coeff_ptr = coeff.addr();
165 auto last_tab1_de_i = *tab1_ptr;
167 for (
int i = 1; i <= nb_lignes_a_traiter; i++, tab1_ptr++)
169 const auto tab1_de_i = *tab1_ptr;
170 const int nvois = (int)(tab1_de_i - last_tab1_de_i);
172 if (IS_NORMAL_ASSERT || IS_DIAG_ASSERT) assert(nvois >= 0 && (tab1_de_i - 1) <= tab2.size_array());
174 last_tab1_de_i = tab1_de_i;
181 if (IS_NORMAL_ASSERT) assert(nvois >= 1 && (*tab2_ptr) == i && (*coeff_ptr) > 0.);
183 const double omega_coeff_i_i = omega / (*coeff_ptr);
184 v_i = sol_fortran[i] *= omega_coeff_i_i;
191 v_i = sol_fortran[i] *= omega;
194 for (
int j = nvois-1; j; j--, tab2_ptr++, coeff_ptr++)
196 const int i2 = *tab2_ptr;
197 const double coeff_i_i2 = *coeff_ptr;
199 if (IS_NORMAL_ASSERT || IS_DIAG_ASSERT) assert(i2 > i && i2 <= nb_lignes_a_traiter);
202 sol_fortran[i2] -= coeff_i_i2 * v_i;
208void descente(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
210 descente_generique<descente_enum::NORMAL>(omega,mat,vecteur);
213void descente_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
215 descente_generique<descente_enum::NORMAL_ASSERT>(omega,mat,vecteur);
218void descente_diag_ok_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
220 descente_generique<descente_enum::NORMAL_ASSERT>(omega,mat,vecteur);
223void descente_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
225 descente_generique<descente_enum::DIAG>(omega,mat,vecteur);
228void descente_assert_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
230 descente_generique<descente_enum::DIAG_ASSERT>(omega,mat,vecteur);
235void descente_bloc_extradiag_assert(
const Matrice_Morse& mat,
const DoubleVect& vecteur, DoubleVect& vecteur2)
240 const int nb_lignes = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
241 const double *vecteur_ptr = vecteur.addr();
242 double *vecteur2_fortran_ptr = vecteur2.
addr() - 1;
243 const int *tab2_fortran_ptr = tab2.addr() - 1;
244 const double *coeff_fortran_ptr = coeff.addr() - 1;
245 assert(coeff.size_array() == tab2.size_array());
246 for (
int i_ligne = 0; i_ligne < nb_lignes; i_ligne++, vecteur_ptr++)
249 const double v_i = *vecteur_ptr;
250 auto index = tab1[i_ligne];
251 const auto index_fin = tab1[i_ligne + 1];
253 assert(index > 0 && index_fin >= index && index_fin <= tab2.size_array() + 1);
254 const int *tab2_ptr = tab2_fortran_ptr + index;
255 const double *coeff_ptr = coeff_fortran_ptr + index;
256 for (; index < index_fin; index++, tab2_ptr++, coeff_ptr++)
258 const int i_colonne = *tab2_ptr;
259 assert(i_colonne >= 1 && i_colonne <= vecteur2.
size_array());
260 const double c = *coeff_ptr;
262 vecteur2_fortran_ptr[i_colonne] -= c * v_i;
268template<descente_enum _TYPE_>
269void descente_generique(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
271 static constexpr bool IS_NORMAL_ASSERT = (_TYPE_ == descente_enum::NORMAL_ASSERT), IS_DIAG_ASSERT = (_TYPE_ == descente_enum::DIAG_ASSERT), NOT_DIAG = (_TYPE_ != descente_enum::DIAG && _TYPE_ != descente_enum::DIAG_ASSERT);
275 const int nb_lignes_a_traiter = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
277 double *
const sol_fortran = vecteur.addr() - 1;
278 const int *flags_ptr = items_a_traiter.
addr();
279 assert(nb_lignes_a_traiter <= items_a_traiter.
size_array());
280 const auto *tab1_ptr = tab1.addr();
281 assert(nb_lignes_a_traiter <= tab1.size_array() + 1);
282 assert(*tab1_ptr == 1);
283 const int *tab2_ptr = tab2.addr();
284 const double *coeff_ptr = coeff.addr();
285 auto last_tab1_de_i = *tab1_ptr;
287 for (
int i = 1; i <= nb_lignes_a_traiter; i++, tab1_ptr++)
289 const auto tab1_de_i = *tab1_ptr;
290 const int nvois = (int)(tab1_de_i - last_tab1_de_i);
292 if (IS_NORMAL_ASSERT || IS_DIAG_ASSERT) assert(nvois >= 0 && (tab1_de_i - 1) <= tab2.size_array());
294 last_tab1_de_i = tab1_de_i;
296 if (IS_NORMAL_ASSERT || IS_DIAG_ASSERT) assert((flags_ptr - items_a_traiter.
addr()) == (i-1));
298 const int item_a_traiter = *(flags_ptr++);
305 if (IS_NORMAL_ASSERT) assert(nvois >= 1 && (*tab2_ptr) == i && (*coeff_ptr) > 0.);
307 const double omega_coeff_i_i = omega / (*coeff_ptr);
308 v_i = sol_fortran[i] *= omega_coeff_i_i;
315 v_i = sol_fortran[i] *= omega;
318 for (
int j = nvois-1; j; j--, tab2_ptr++, coeff_ptr++)
320 const int i2 = *tab2_ptr;
321 const double coeff_i_i2 = *coeff_ptr;
323 if (IS_NORMAL_ASSERT || IS_DIAG_ASSERT) assert(i2 > i && i2 <= vecteur.size_totale());
327 sol_fortran[i2] -= coeff_i_i2 * v_i;
342 const int fin = vecteur.size_totale();
343 for (
int i = nb_lignes_a_traiter+1; i <= fin; i++)
348void descente(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
350 descente_generique<descente_enum::NORMAL>(omega,mat,vecteur,items_a_traiter);
353void descente_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
355 descente_generique<descente_enum::NORMAL_ASSERT>(omega,mat,vecteur,items_a_traiter);
358void descente_diag_ok_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
360 descente_generique<descente_enum::NORMAL_ASSERT>(omega,mat,vecteur,items_a_traiter);
363void descente_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
365 descente_generique<descente_enum::DIAG>(omega,mat,vecteur,items_a_traiter);
368void descente_assert_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
370 descente_generique<descente_enum::DIAG_ASSERT>(omega,mat,vecteur,items_a_traiter);
375void descente_bloc_extradiag_assert(
const Matrice_Morse& mat,
const DoubleVect& vecteur, DoubleVect& vecteur2,
const ArrOfInt& items_a_traiter)
380 const int nb_lignes = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
381 const int *flags_ptr = items_a_traiter.
addr();
382 const double *vecteur_ptr = vecteur.addr();
383 double *vecteur2_fortran_ptr = vecteur2.
addr() - 1;
384 const int *tab2_fortran_ptr = tab2.addr() - 1;
385 const double *coeff_fortran_ptr = coeff.addr() - 1;
386 assert(coeff.size_array() == tab2.size_array());
387 for (
int i_ligne = 0; i_ligne < nb_lignes; i_ligne++, vecteur_ptr++)
391 const double v_i = *vecteur_ptr;
392 auto index = tab1[i_ligne];
393 const auto index_fin = tab1[i_ligne + 1];
395 assert(index > 0 && index_fin >= index && index_fin <= tab2.size_array() + 1);
396 const int *tab2_ptr = tab2_fortran_ptr + index;
397 const double *coeff_ptr = coeff_fortran_ptr + index;
398 for (; index < index_fin; index++, tab2_ptr++, coeff_ptr++)
400 const int i_colonne = *tab2_ptr;
401 assert(i_colonne >= 1 && i_colonne <= vecteur2.
size_array());
402 const double c = *coeff_ptr;
404 vecteur2_fortran_ptr[i_colonne] -= c * v_i;
410enum class remontee_enum { NORMAL , NORMAL_ASSERT , DIAG_OK_ASSERT , DIAG , DIAG_ASSERT };
412template<remontee_enum _TYPE_>
413void remontee_generique(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
415 static constexpr bool IS_NORMAL_ASSERT = (_TYPE_ == remontee_enum::NORMAL_ASSERT), IS_DIAG_OK_ASSERT = (_TYPE_ == remontee_enum::DIAG_OK_ASSERT), IS_DIAG_ASSERT = (_TYPE_ == remontee_enum::DIAG_ASSERT),
416 NOT_DIAG = (_TYPE_ != remontee_enum::DIAG && _TYPE_ != remontee_enum::DIAG_ASSERT);
421 const int nb_lignes_a_traiter = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
422 const double psi = IS_DIAG_OK_ASSERT ? -1e10 : (2. - omega) / omega;
425 const double *
const sol_fortran = vecteur.addr() - 1;
426 const auto *tab1_ptr = tab1.addr() + nb_lignes_a_traiter;
427 auto last_tab1_de_i = *tab1_ptr;
432 const int *tab2_ptr = tab2.addr() + last_tab1_de_i - 2;
433 const double *coeff_ptr = coeff.addr() + last_tab1_de_i - 2;
434 double *soli_ptr = vecteur.addr() + nb_lignes_a_traiter - 1;
435 for (
int i = nb_lignes_a_traiter; i; i--, tab1_ptr--, soli_ptr--)
437 const auto tab1_de_i = *tab1_ptr;
438 const int nvois = (int)(last_tab1_de_i - tab1_de_i);
440 if (IS_NORMAL_ASSERT || IS_DIAG_OK_ASSERT || IS_DIAG_ASSERT) assert(nvois >= 0 && tab1_de_i > 0);
442 last_tab1_de_i = tab1_de_i;
449 for (
int j = nvois - 1; j; j--, tab2_ptr--, coeff_ptr--)
451 const int i2 = *tab2_ptr;
452 const double coeff_i_i2 = *coeff_ptr;
455 x += coeff_i_i2 * sol_fortran[i2];
461 if (IS_NORMAL_ASSERT || IS_DIAG_OK_ASSERT) assert((*tab2_ptr) == i);
463 const double coeff_i_i = *coeff_ptr;
464 const double omega_coeff_i_i = omega / coeff_i_i;
466 *soli_ptr = IS_DIAG_OK_ASSERT ? ((*soli_ptr) - x) * omega_coeff_i_i : (*soli_ptr) * psi * omega - x * omega_coeff_i_i;
473 *soli_ptr = ((*soli_ptr) * psi - x) * omega;
478 assert((*soli_ptr) == 0.);
485void remontee(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
487 remontee_generique<remontee_enum::NORMAL>(omega,mat,vecteur);
490void remontee_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
492 remontee_generique<remontee_enum::NORMAL_ASSERT>(omega,mat,vecteur);
495void remontee_diag_ok_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
497 remontee_generique<remontee_enum::DIAG_OK_ASSERT>(omega,mat,vecteur);
500void remontee_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
502 remontee_generique<remontee_enum::DIAG>(omega,mat,vecteur);
505void remontee_assert_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur)
507 remontee_generique<remontee_enum::DIAG_ASSERT>(omega,mat,vecteur);
512void remontee_bloc_extradiag_assert(
const Matrice_Morse& mat, DoubleVect& vecteur,
const DoubleVect& vecteur2)
517 const int nb_lignes = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
518 double *vecteur_ptr = vecteur.addr();
519 const double *vecteur2_fortran_ptr = vecteur2.
addr() - 1;
520 const int *tab2_fortran_ptr = tab2.addr() - 1;
521 const double *coeff_fortran_ptr = coeff.addr() - 1;
522 assert(coeff.size_array() == tab2.size_array());
523 for (
int i_ligne = 0; i_ligne < nb_lignes; i_ligne++, vecteur_ptr++)
526 double x = *vecteur_ptr;
527 auto index = tab1[i_ligne];
528 const auto index_fin = tab1[i_ligne + 1];
530 assert(index > 0 && index_fin >= index && index_fin <= tab2.size_array() + 1);
531 const int *tab2_ptr = tab2_fortran_ptr + index;
532 const double *coeff_ptr = coeff_fortran_ptr + index;
533 for (; index < index_fin; index++, tab2_ptr++, coeff_ptr++)
535 const int i_colonne = *tab2_ptr;
536 assert(i_colonne >= 1 && i_colonne <= vecteur2.
size_array());
537 const double c = *coeff_ptr;
538 const double x2 = vecteur2_fortran_ptr[i_colonne];
547template<remontee_enum _TYPE_>
548void remontee_generique(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
550 static constexpr bool IS_NORMAL_ASSERT = (_TYPE_ == remontee_enum::NORMAL_ASSERT), IS_DIAG_OK_ASSERT = (_TYPE_ == remontee_enum::DIAG_OK_ASSERT), IS_DIAG_ASSERT = (_TYPE_ == remontee_enum::DIAG_ASSERT),
551 NOT_DIAG = (_TYPE_ != remontee_enum::DIAG && _TYPE_ != remontee_enum::DIAG_ASSERT);
556 const int nb_lignes_a_traiter = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
557 const int *flags_ptr = items_a_traiter.
addr() + nb_lignes_a_traiter - 1;
558 assert(nb_lignes_a_traiter <= items_a_traiter.
size_array());
559 const double psi = IS_DIAG_OK_ASSERT ? -1e10 : (2. - omega) / omega;
562 const double *
const sol_fortran = vecteur.addr() - 1;
563 const auto *tab1_ptr = tab1.addr() + nb_lignes_a_traiter;
564 auto last_tab1_de_i = *tab1_ptr;
569 const int *tab2_ptr = tab2.addr() + last_tab1_de_i - 2;
570 const double *coeff_ptr = coeff.addr() + last_tab1_de_i - 2;
571 double * soli_ptr = vecteur.addr() + nb_lignes_a_traiter - 1;
572 for (
int i = nb_lignes_a_traiter; i; i--, tab1_ptr--, soli_ptr--)
574 const auto tab1_de_i = *tab1_ptr;
575 const int nvois = (int)(last_tab1_de_i - tab1_de_i);
576 if (IS_NORMAL_ASSERT || IS_DIAG_OK_ASSERT || IS_DIAG_ASSERT) assert(nvois >= 0 && tab1_de_i > 0);
578 last_tab1_de_i = tab1_de_i;
585 for (
int j = nvois-1; j; j--, tab2_ptr--, coeff_ptr--)
587 const int i2 = *tab2_ptr;
588 const double coeff_i_i2 = *coeff_ptr;
591 x += coeff_i_i2 * sol_fortran[i2];
596 if (IS_NORMAL_ASSERT || IS_DIAG_OK_ASSERT) assert((*tab2_ptr) == i);
598 const double coeff_i_i = *coeff_ptr;
599 const double omega_coeff_i_i = omega / coeff_i_i;
601 *soli_ptr = IS_DIAG_OK_ASSERT ? ((*soli_ptr) - x) * omega_coeff_i_i : (*soli_ptr) * psi * omega - x * omega_coeff_i_i;
608 *soli_ptr = ((*soli_ptr) * psi - x) * omega;
613 assert((*soli_ptr) == 0.);
620void remontee(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
622 remontee_generique<remontee_enum::NORMAL>(omega,mat,vecteur,items_a_traiter);
625void remontee_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
627 remontee_generique<remontee_enum::NORMAL_ASSERT>(omega,mat,vecteur,items_a_traiter);
630void remontee_diag_ok_assert(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
632 remontee_generique<remontee_enum::DIAG_OK_ASSERT>(omega,mat,vecteur,items_a_traiter);
635void remontee_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
637 remontee_generique<remontee_enum::DIAG>(omega,mat,vecteur,items_a_traiter);
640void remontee_assert_precond_diag(
const double omega,
const Matrice_Morse& mat, DoubleVect& vecteur,
const ArrOfInt& items_a_traiter)
642 remontee_generique<remontee_enum::DIAG_ASSERT>(omega,mat,vecteur,items_a_traiter);
647void remontee_bloc_extradiag_assert(
const Matrice_Morse& mat, DoubleVect& vecteur,
const DoubleVect& vecteur2,
const ArrOfInt& items_a_traiter)
652 const int nb_lignes = vecteur.size_reelle_ok() ? vecteur.size_reelle() : vecteur.size_totale();
653 const int *flags_ptr = items_a_traiter.
addr();
654 double *vecteur_ptr = vecteur.addr();
655 const double *vecteur2_fortran_ptr = vecteur2.
addr() - 1;
656 const int *tab2_fortran_ptr = tab2.addr() - 1;
657 const double *coeff_fortran_ptr = coeff.addr() - 1;
658 assert(coeff.size_array() == tab2.size_array());
659 for (
int i_ligne = 0; i_ligne < nb_lignes; i_ligne++, vecteur_ptr++)
663 double x = *vecteur_ptr;
664 auto index = tab1[i_ligne];
665 const auto index_fin = tab1[i_ligne + 1];
667 assert(index > 0 && index_fin >= index && index_fin <= tab2.size_array() + 1);
668 const int *tab2_ptr = tab2_fortran_ptr + index;
669 const double *coeff_ptr = coeff_fortran_ptr + index;
670 for (; index < index_fin; index++, tab2_ptr++, coeff_ptr++)
672 const int i_colonne = *tab2_ptr;
673 assert(i_colonne >= 1 && i_colonne <= vecteur2.
size_array());
674 const double c = *coeff_ptr;
675 const double x2 = vecteur2_fortran_ptr[i_colonne];
689 const auto& tab2 = matrice.
get_tab2();
690 if (tab2.size_array() > 0 && tab2[0] == 1)
702 descente_assert(
omega_, matrice, solution);
703 remontee_assert(
omega_, matrice, solution);
715 descente(
omega_, matrice, solution);
716 remontee(
omega_, matrice, solution);
732 descente_assert_precond_diag(
omega_, matrice, solution);
733 remontee_assert_precond_diag(
omega_, matrice, solution);
745 descente_precond_diag(
omega_, matrice, solution);
746 remontee_precond_diag(
omega_, matrice, solution);
755 DoubleTab_parts s_parts(solution);
756 ConstIntTab_parts items_parts;
759 const int nb_parts = s_parts.
size();
760 assert(s_parts.
size() == nb_parts);
765 for (i_part = 0; i_part < nb_parts; i_part++)
769 DoubleVect& partie = s_parts[i_part];
772 else descente_diag_ok_assert(
omega_, MB00, partie);
775 for (
int j_part = i_part + 1; j_part < nb_parts; j_part++)
779 DoubleVect& partie_j = s_parts[j_part];
782 if (
algo_items_communs_) descente_bloc_extradiag_assert(MB00bis, partie, partie_j, items_parts[i_part]);
783 else descente_bloc_extradiag_assert(MB00bis, partie, partie_j);
787 for (i_part = 0; i_part < nb_parts; i_part++)
791 DoubleVect& partie = s_parts[i_part];
792 traite_diagonale(
omega_, MB00, partie);
796 for (i_part = nb_parts - 1; i_part >= 0; i_part--)
800 DoubleVect& partie = s_parts[i_part];
802 else remontee_diag_ok_assert(
omega_, MB00bis, partie);
805 for (
int j_part = 0; j_part < i_part; j_part++)
809 DoubleVect& partie_j = s_parts[j_part];
811 if (
algo_items_communs_) remontee_bloc_extradiag_assert(MB00, partie_j, partie, items_parts[j_part]);
812 else remontee_bloc_extradiag_assert(MB00, partie_j, partie);
void initialize(const TRUSTVect< _TYPE_ > &)
Class defining operators and methods for all reading operation in an input flow (file,...
Classe Matrice_Base Classe de base de la hierarchie des matrices.
const Matrice & get_bloc(int i, int j) const override
int nb_bloc_lignes() const
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
const auto & get_tab1() const
const auto & get_coeff() const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
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.
virtual void prepare_(const Matrice_Base &, const DoubleVect &)
this method must be overloaded if some preparation is necessary.
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static double mp_sum(double)
Calcule la somme de x sur tous les processeurs du groupe courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void prepare_(const Matrice_Base &, const DoubleVect &secmem) override
this method must be overloaded if some preparation is necessary.
void ssor(const Matrice_Morse_Sym &, DoubleVect &)
int preconditionner_(const Matrice_Base &, const DoubleVect &secmem, DoubleVect &solution) override
Calcule la solution du systeme lineaire: A * solution = b avec la methode de relaxation SSOR.
Classe de base des flux de sortie.
_SIZE_ size_array() const
_SIZE_ size_totale() const
virtual const MD_Vector & get_md_vector() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")