16#include <Matrix_tools.h>
18#include <Matrice_Base.h>
19#include <Matrice_Nulle.h>
20#include <Matrice_Diagonale.h>
21#include <Matrice_Morse.h>
22#include <Matrice_Morse_Sym.h>
24#include <Array_tools.h>
33 StencilCoeffs coefficients;
47 std::vector<const double *>& coeffs)
50 StencilCoeffs coefficients;
56 auto deref_fun = [](
const double* src) {
return *src; };
58 std::transform(coeffs.begin(), coeffs.end(), coefficients.
addr(), deref_fun);
75 StencilCoeffs coefficients;
86template <
typename _TYPE_,
typename _SIZE_>
89 const _SIZE_ size = stencil.
dimension( 0 );
90 for ( _SIZE_ i=1; i<size; ++i )
92 _TYPE_ delta1 = stencil( i-1, 0 ) - stencil( i, 0 );
93 _TYPE_ delta2 = stencil( i-1, 1 ) - stencil( i, 1 );
94 _TYPE_ delta = ( delta1 == 0 ) ? delta2 : delta1;
107 Cerr <<
"non-normalized stencil" << finl;
112 for (
int i=0; i<size; ++i )
114 int delta = stencil( i, 0 ) - stencil( i, 1 );
117 Cerr <<
"( " << i <<
" ) line index > column index : ( " << stencil( i, 0 ) <<
", " << stencil( i, 1 ) <<
" )" << finl;
125template <
typename _SIZE_>
131 const _SIZE_ nb_coefficients = stencil.
dimension( 0 );
136 if ( nb_coefficients > 0 )
140 for (_SIZE_ i=0; i<nb_coefficients; ++i )
142 assert( stencil( i ,0 ) >= 0 );
143 assert( stencil( i ,0 ) < nb_lines );
144 assert( stencil( i ,1 ) >= 0 );
145 assert( stencil( i ,1 ) < nb_columns );
147 tab1[stencil(i, 0) + 1] += 1;
148 tab2[i] = stencil(i, 1) + 1;
150 for (
int i=0; i<nb_lines; ++i )
151 tab1[i + 1] += tab1[i];
165 const int nb_columns,
166 const Stencil& stencil,
168 const bool& attach_stencil_to_matrix )
172 const int nb_coefficients = stencil.
dimension( 0 );
173 matrix.
dimensionner( nb_lines, nb_columns, nb_coefficients );
177 if ( nb_coefficients > 0 )
181 for (
int i=0; i<nb_coefficients; ++i )
183 tab1[stencil(i, 0) + 1] += 1;
184 tab2[i] = stencil(i, 1) + 1;
186 for (
int i=0; i<nb_lines; ++i )
187 tab1[i + 1] += tab1[i];
190 if( attach_stencil_to_matrix )
195 const int nb_columns,
196 const Stencil& stencil,
197 const StencilCoeffs& coefficients,
203 const int nb_coefficients = stencil.
dimension( 0 );
204 assert( nb_coefficients == coefficients.
size_array( ) );
210 if ( nb_coefficients > 0 )
214 for (
int i=0; i<nb_coefficients; ++i )
216 assert( stencil( i ,0 ) >= 0 );
217 assert( stencil( i ,0 ) < nb_lines );
218 assert( stencil( i ,1 ) >= 0 );
219 assert( stencil( i ,1 ) < nb_columns );
225 for (
int i=0; i<nb_lines; ++i )
236 const Stencil& stencil,
241 const int nb_coefficients = stencil.
dimension( 0 );
247 if ( nb_coefficients > 0 )
251 for (
int i=0; i<nb_coefficients; ++i )
253 assert( stencil( i ,0 ) >= 0 );
254 assert( stencil( i ,0 ) < order );
255 assert( stencil( i ,1 ) >= 0 );
256 assert( stencil( i ,1 ) < order );
257 assert( stencil( i, 0 ) <= stencil( i, 1 ) );
262 for (
int i=0; i<order; ++i )
272 const Stencil& stencil,
273 const StencilCoeffs& coefficients,
279 const int nb_coefficients = stencil.
dimension( 0 );
280 assert( nb_coefficients == coefficients.
size_array( ) );
286 if ( nb_coefficients > 0 )
290 for (
int i=0; i<nb_coefficients; ++i )
292 assert( stencil( i ,0 ) >= 0 );
293 assert( stencil( i ,0 ) < order );
294 assert( stencil( i ,1 ) >= 0 );
295 assert( stencil( i ,1 ) < order );
296 assert( stencil( i, 0 ) <= stencil( i, 1 ) );
302 for (
int i=0; i<order; ++i )
316 assert( A.valeur( ).nb_lignes( ) == B.valeur( ).nb_lignes( ) );
317 assert( A.valeur( ).nb_colonnes( ) == B.valeur( ).nb_colonnes( ) );
320 A.valeur( ).get_stencil( A_stencil );
321 const int A_size = (int)A_stencil.
dimension( 0 );
324 B.valeur( ).get_stencil( B_stencil );
325 const int B_size = (int)B_stencil.
dimension( 0 );
327 int size = A_size + B_size;
330 stencil.
resize( size, 2 );
332 for (
int i=0; i<A_size; ++i )
334 stencil( i , 0 ) = A_stencil( i, 0 );
335 stencil( i , 1 ) = A_stencil( i, 1 ) ;
338 for (
int i=0; i<B_size; ++i )
340 stencil( i+A_size , 0 ) = B_stencil( i, 0 );
341 stencil( i+A_size , 1 ) = B_stencil( i, 1 ) ;
344 tableau_trier_retirer_doublons( stencil );
346 C.typer(
"Matrice_Morse" );
350 A.valeur( ).nb_colonnes( ),
359 assert( A.valeur( ).nb_lignes( ) == A.valeur( ).nb_lignes( ) );
360 assert( A.valeur( ).nb_lignes( ) == B.valeur( ).nb_lignes( ) );
361 assert( A.valeur( ).nb_colonnes( ) == B.valeur( ).nb_colonnes( ) );
364 A.valeur( ).get_symmetric_stencil( A_stencil );
365 const int A_size = (int)A_stencil.
dimension( 0 );
368 B.valeur( ).get_symmetric_stencil( B_stencil );
369 const int B_size = (int)B_stencil.
dimension( 0 );
371 int size = A_size + B_size;
374 stencil.
resize( size, 2 );
376 for (
int i=0; i<A_size; ++i )
378 stencil( i , 0 ) = A_stencil( i, 0 );
379 stencil( i , 1 ) = A_stencil( i, 1 ) ;
382 for (
int i=0; i<B_size; ++i )
384 stencil( i+A_size , 0 ) = B_stencil( i, 0 );
385 stencil( i+A_size , 1 ) = B_stencil( i, 1 ) ;
388 tableau_trier_retirer_doublons( stencil );
390 C.typer(
"Matrice_Morse_Sym" );
412 StencilCoeffs A_coefficients;
413 A.valeur( ).get_stencil_and_coefficients( A_stencil,
417 StencilCoeffs B_coefficients;
418 B.valeur( ).get_stencil_and_coefficients( B_stencil,
427 for (
int i=0; i<nb_lines; ++i )
430 auto k1 = C_.
get_tab1()( i + 1 ) - 1;
432 for (
auto k=k0; k<k1; ++k )
436 if ( ( A_k < A_stencil.
dimension( 0 ) ) && ( A_stencil( A_k, 0 ) == i ) && ( A_stencil( A_k, 1 ) == j ) )
442 if ( ( B_k < B_stencil.
dimension( 0 ) ) && ( B_stencil( B_k, 0 ) == i ) && ( B_stencil( B_k, 1 ) == j ) )
450 assert( A_k == A_coefficients.
size_array( ) );
451 assert( B_k == B_coefficients.
size_array( ) );
466 StencilCoeffs A_coefficients;
467 A.valeur( ).get_symmetric_stencil_and_coefficients( A_stencil,
471 StencilCoeffs B_coefficients;
472 B.valeur( ).get_symmetric_stencil_and_coefficients( B_stencil,
481 for (
int i=0; i<nb_lines; ++i )
484 auto k1 = C_.
get_tab1()( i + 1 ) - 1;
486 for (
auto k=k0; k<k1; ++k )
490 if ( ( A_k < A_stencil.
dimension( 0 ) ) && ( A_stencil( A_k, 0 ) == i ) && ( A_stencil( A_k, 1 ) == j ) )
496 if ( ( B_k < B_stencil.
dimension( 0 ) ) && ( B_stencil( B_k, 0 ) == i ) && ( B_stencil( B_k, 1 ) == j ) )
504 assert( A_k == A_coefficients.
size_array( ) );
505 assert( B_k == B_coefficients.
size_array( ) );
515 const int nb_columns,
516 const Stencil& stencil )
518 if ( nb_lines != nb_columns )
530 for (
int i=0; i<size; ++i )
532 if ( stencil( i, 0 ) != stencil( i, 1 ) )
537 if ( stencil( i, 0 ) >= nb_lines )
542 if ( stencil( i, 1 ) >= nb_columns )
552 const int nb_columns,
553 const Stencil& stencil,
555 const bool& attach_stencil_to_matrix)
559 matrix.typer(
"Matrice_Nulle" );
567 matrix.typer(
"Matrice_Diagonale" );
570 if( attach_stencil_to_matrix )
577 matrix.typer(
"Matrice_Morse" );
583 attach_stencil_to_matrix );
590 const bool& attach_stencil_to_matrix )
594 const int nb_lines = matrix.valeur( ).nb_lignes( );
595 const int nb_columns = matrix.valeur( ).nb_colonnes( );
597 Stencil full_stencil;
598 matrix.valeur( ).get_stencil( full_stencil );
602 const int old_size = full_stencil.
size( ) / 2 ;
604 full_stencil.
resize( old_size + size, 2);
606 for (
int i=0; i<size; ++i )
608 full_stencil( old_size + i , 0 ) = stencil( i, 0 );
609 full_stencil( old_size + i , 1 ) = stencil( i, 1 );
612 tableau_trier_retirer_doublons( full_stencil );
618 attach_stencil_to_matrix );
626 const bool& inverse )
632 for(
int i=0; i<nb_lignes; i++ )
634 const int nnz_i = (int)(tab1[ i+1 ] - tab1[ i ]);
635 for(
int k=0; k<nnz_i; k++)
637 const int j = tab2[nnz_tot + k] - 1 ;
638 double& coefficient = mat.
coef( i, j );
640 coefficient *= 1./diag[ i ] ;
642 coefficient *= diag[ i ] ;
650 const bool& inverse )
656 for(
int i=0; i<nb_lignes; i++ )
658 const int nnz_i = (int)(tab1[ i+1 ] - tab1[ i ]);
659 for(
int k=0; k<nnz_i; k++)
661 const int j = tab2[nnz_tot + k] - 1 ;
662 double& coefficient = mat.
coef( i, j );
664 coefficient *= 1./diag[ j ] ;
666 coefficient *= diag[ j ] ;
675 const bool& inverse )
681 for(
int i=0; i<nb_lignes; i++ )
683 const int nnz_i = (int)(tab1[ i+1 ] - tab1[ i ]);
684 for(
int k=0; k<nnz_i; k++)
686 const int j = tab2[nnz_tot + k] - 1 ;
687 double& coefficient = mat.
coef( i, j );
689 coefficient *= 1./diag ;
691 coefficient *= diag ;
699 const bool& inverse )
708 auto old_tab1 = tab1;
709 tab1.reset(), tab1.resize(nl + 1);
710 for (
int i = 0; i <= nl; i++) tab1(i) = old_tab1(std::min(i, old_tab1.size_array() - 1));
Classe Matrice_Base Classe de base de la hierarchie des matrices.
void set_stencil(const Stencil &stencil)
virtual int nb_lignes() const =0
Return local number of lines (=size on the current proc).
virtual int nb_colonnes() const =0
Return local number of columns (=size on the current proc).
virtual void get_symmetric_stencil_and_coefficients(Stencil &stencil, StencilCoeffs &coefficients) const
virtual void get_stencil_and_coeff_ptrs(Stencil &stencil, std::vector< const double * > &coeff_ptr) const
virtual void get_stencil_and_coefficients(Stencil &stencil, StencilCoeffs &coefficients) const
Classe Matrice_Diagonale Represente une matrice diagonale.
void dimensionner(int size)
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
bool check_sorted_symmetric_morse_matrix_structure() const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
bool check_sorted_morse_matrix_structure() const
const auto & get_tab2() const
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const auto & get_tab1() const
void set_nb_columns(const int)
double coef(int i, int j) const
void set_symmetric(const int)
int nb_lignes() const override
Return local number of lines (=size on the current proc).
void dimensionner(int order)
Classe Matrice Classe generique de la hierarchie des matrices.
_SIZE_ size_array() const
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
: Tableau a n entrees pour n<= 4.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const