19#include <alien/ref/import_export/SystemReader.h>
24#include <alien/ref/AlienRefSemantic.h>
30#ifdef ALIEN_USE_LIBXML2
31#include <libxml/parser.h>
39SystemReader::SystemReader(
40std::string
const& filename, std::string format, IMessagePassingMng* parallel_mng)
44, m_parallel_mng(parallel_mng)
49 m_parallel_mng->commRank();
50 m_parallel_mng->commSize();
54SystemReader::~SystemReader() {}
56template <
typename FileNodeT>
57void SystemReader::_readMatrixInfo(Importer& importer, FileNodeT& parent_node,
int& nrows,
58 int& ncols,
int& nnz,
int& blk_size,
int& blk_size2)
60 FileNodeT matrix_info_node = importer.openFileNode(parent_node,
"matrix-info");
61 importer.read(matrix_info_node,
"nrows", nrows);
62 importer.read(matrix_info_node,
"ncols", ncols);
63 importer.read(matrix_info_node,
"nnz", nnz);
65 std::vector<int>& i32buffer = importer.i32buffer;
67 importer.read(matrix_info_node,
"blk-size", i32buffer);
68 blk_size = i32buffer[0];
69 blk_size2 = i32buffer[1];
71 importer.closeFileNode(matrix_info_node);
74template <
typename FileNodeT>
75void SystemReader::_readCSRProfile(Importer& importer, FileNodeT& parent_node,
int& nrows,
76 int& nnz, std::vector<int>& kcol, std::vector<int>& cols)
78 FileNodeT profile_node = importer.openFileNode(parent_node,
"profile");
80 importer.read(profile_node,
"nrows", nrows);
81 importer.read(profile_node,
"nnz", nnz);
83 kcol.resize(nrows + 1);
84 importer.read(profile_node,
"kcol", kcol);
87 importer.read(profile_node,
"cols", cols);
89 importer.closeFileNode(profile_node);
92template <
typename FileNodeT>
93void SystemReader::_readMatrixValues(Importer& importer, FileNodeT& parent_node,
int& size,
94 int& blk_size,
int& blk_size2, std::vector<double>& values)
96 std::vector<int>& i32buffer = importer.i32buffer;
97 FileNodeT data_node = importer.openFileNode(parent_node,
"data");
100 FileNodeT info_node = importer.openFileNode(data_node,
"struct-info");
102 importer.read(info_node,
"size", size);
105 i32buffer.reserve(2);
106 importer.read(info_node,
"blk-size", i32buffer);
107 blk_size = i32buffer[0];
108 blk_size = i32buffer[1];
110 importer.closeFileNode(info_node);
112 values.resize(size * blk_size * blk_size2);
113 importer.read(data_node,
"values", values);
115 importer.closeFileNode(data_node);
118void SystemReader::read(Matrix& A)
121 typedef Importer::FileNode FileNode;
123 Importer importer(m_filename, m_format, m_prec);
129 std::vector<int> kcol;
130 std::vector<int> cols;
131 std::vector<double> values;
133 FileNode root_node = importer.openFileNode(
"system");
135 FileNode matrix_node = importer.openFileNode(root_node,
"matrix");
140 importer, matrix_node, nrows, ncols, nnz, file_blk_size, file_blk_size2);
141 if (file_blk_size != blk_size || file_blk_size2 != blk_size)
142 throw FatalErrorException(
143 A_FUNCINFO,
"Incompatible block size with imported system");
145 const auto& dist = A.distribution();
146 int offset = dist.rowOffset();
147 int lsize = dist.localRowSize();
149 if (offset + lsize > nrows)
150 throw FatalErrorException(
151 A_FUNCINFO,
"Incompatible space size with imported system");
158 _readCSRProfile(importer, matrix_node, file_nrows, file_nnz, kcol, cols);
160 if (file_nrows != nrows || file_nnz != nnz)
161 throw FatalErrorException(A_FUNCINFO,
"Incoherent matrix profile");
166 for (
int irow = offset; irow < offset + lsize; ++irow) {
167 for (
int k = kcol[irow]; k < kcol[irow + 1]; ++k) {
168 profiler.addMatrixEntry(irow, cols[k]);
177 importer, matrix_node, file_nnz, file_blk_size, file_blk_size2, values);
179 if (file_nnz != nnz || file_blk_size != 1 || file_blk_size2 != 1)
180 throw FatalErrorException(A_FUNCINFO,
"Incoherent matrix values");
183 A, Alien::ProfiledMatrixOptions::eResetValues);
185 for (
int irow = offset; irow < offset + lsize; ++irow) {
186 for (
int k = kcol[irow]; k < kcol[irow + 1]; ++k) {
187 builder(irow, cols[k]) = values[k];
191 importer.closeFileNode(matrix_node);
193 importer.closeFileNode(root_node);
196void SystemReader::read(BlockMatrix& A)
198 typedef Importer::FileNode FileNode;
200 Importer importer(m_filename, m_format, m_prec);
207 std::vector<int> kcol;
208 std::vector<int> cols;
209 std::vector<double> values;
211 FileNode root_node = importer.openFileNode(
"system");
213 FileNode matrix_node = importer.openFileNode(root_node,
"matrix");
218 importer, matrix_node, nrows, ncols, nnz, file_blk_size, file_blk_size2);
220 if (file_blk_size != file_blk_size2)
221 throw FatalErrorException(A_FUNCINFO,
"Non square block not supported");
223 blk_size = file_blk_size;
224 blk_size2 = blk_size;
227 A = BlockMatrix(nrows, nrows, block, m_parallel_mng);
229 const auto& dist = A.distribution();
231 int offset = dist.rowOffset();
232 int lsize = dist.localRowSize();
234 if (offset + lsize > nrows)
235 throw FatalErrorException(
236 A_FUNCINFO,
"Incompatible space size with imported system");
242 _readCSRProfile(importer, matrix_node, file_nrows, file_nnz, kcol, cols);
244 if (file_nrows != nrows || file_nnz != nnz)
245 throw FatalErrorException(A_FUNCINFO,
"Incoherent matrix profile");
250 for (
int irow = offset; irow < offset + lsize; ++irow) {
251 for (
int k = kcol[irow]; k < kcol[irow + 1]; ++k)
252 profiler.addMatrixEntry(irow, cols[k]);
259 importer, matrix_node, file_nnz, file_blk_size, file_blk_size2, values);
261 if (file_nnz != nnz || file_blk_size != blk_size || file_blk_size2 != blk_size2)
262 throw FatalErrorException(A_FUNCINFO,
"Incoherent matrix values");
266 A, Alien::ProfiledBlockMatrixBuilderOptions::eResetValues);
272 for (
int irow = offset; irow < offset + lsize; ++irow) {
273 for (
int k = kcol[irow]; k < kcol[irow + 1]; ++k)
274 builder(irow, cols[k]) =
275 Array2View<double>(&values[k * blk_size * blk_size], blk_size, blk_size);
279 importer.closeFileNode(matrix_node);
281 importer.closeFileNode(root_node);
Block elements for block matrices.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --