42#include "arcane/aleph/AlephArcane.h"
43#include "arcane/aleph/cuda/AlephCuda.h"
51CNC_Matrix::CNC_Matrix(
long m,
long n, Storage storage) {
53 allocate(m,n,storage,
false) ;
58CNC_Matrix::CNC_Matrix(
long n, Storage storage,
bool symmetric_storage) {
60 allocate(n,n,storage,symmetric_storage) ;
65CNC_Matrix::CNC_Matrix(
long n ) {
75 allocate(n,n,storage_,
false) ;
80CNC_Matrix::~CNC_Matrix() {
86CNC_Matrix::CNC_Matrix() {
96 rows_are_stored_ = false ;
97 columns_are_stored_ = false ;
98 symmetric_storage_ = false ;
99 symmetric_tag_ = false ;
104long CNC_Matrix::m()
const {
return m_ ; }
106long CNC_Matrix::n()
const {
return n_ ; }
108long CNC_Matrix::diag_size()
const {
return diag_size_ ;}
111long CNC_Matrix::nnz()
const {
113 if(rows_are_stored()) {
114 for(
long i=0; i<m(); i++) {
115 result += row(i).nb_coeffs() ;
117 }
else if(columns_are_stored()) {
118 for(
long j=0;
j<n();
j++) {
119 result += column(
j).nb_coeffs() ;
127bool CNC_Matrix::rows_are_stored()
const {
128 return rows_are_stored_ ;
131bool CNC_Matrix::columns_are_stored()
const {
132 return columns_are_stored_ ;
135CNC_Matrix::Storage CNC_Matrix::storage()
const {
139bool CNC_Matrix::has_symmetric_storage()
const {
140 return symmetric_storage_ ;
143bool CNC_Matrix::is_square()
const {
147bool CNC_Matrix::is_symmetric()
const {
148 return (symmetric_storage_ || symmetric_tag_) ;
155void CNC_Matrix::set_symmetric_tag(
bool x) {
194double CNC_Matrix::diag(
long i)
const {
201void CNC_Matrix::add(
long i,
long j,
double val) {
202 if(symmetric_storage_ &&
j > i) {
208 if(rows_are_stored_) {
211 if(columns_are_stored_) {
212 column(
j).add(i,
val) ;
218void CNC_Matrix::sort() {
219 if(rows_are_stored_) {
220 for(
long i=0; i<m_; i++) {
224 if(columns_are_stored_) {
225 for(
long j=0;
j<n_;
j++) {
233void CNC_Matrix::zero() {
234 if(rows_are_stored_) {
235 for(
long i=0; i<m_; i++) {
239 if(columns_are_stored_) {
240 for(
long j=0;
j<n_;
j++) {
244 for(
long i=0; i<diag_size_; i++) {
251void CNC_Matrix::clear() {
252 if(rows_are_stored_) {
253 for(
long i=0; i<m_; i++) {
257 if(columns_are_stored_) {
258 for(
long j=0;
j<n_;
j++) {
262 for(
long i=0; i<diag_size_; i++) {
269void CNC_Matrix::deallocate() {
274 if ( row_ !=
NULL )
delete[] row_ ;
275 if ( column_ !=
NULL )
delete[] column_ ;
276 if ( diag_ !=
NULL )
delete[] diag_ ;
282 rows_are_stored_ =
false ;
283 columns_are_stored_ =
false ;
284 symmetric_storage_ =
false ;
289void CNC_Matrix::allocate(
long m,
long n, Storage storage,
bool symmetric_storage){
292 diag_size_ = (m<n)?(m):(n) ;
293 symmetric_storage_ = symmetric_storage ;
294 symmetric_tag_ = false ;
300 rows_are_stored_ = true ;
301 columns_are_stored_ = false ;
304 rows_are_stored_ = false ;
305 columns_are_stored_ = true ;
307 case ROWS_AND_COLUMNS:
308 rows_are_stored_ = true ;
309 columns_are_stored_ = true ;
312 diag_ =
new double[diag_size_] ;
313 for(
long i=0; i<diag_size_; i++) {
317 if(rows_are_stored_) {
318 row_ =
new CNCSparseRowColumn[m] ;
323 if(columns_are_stored_) {
324 column_ =
new CNCSparseRowColumn[n] ;
Lecteur des fichiers de maillage via la bibliothèque LIMA.