26#include <alien/ref/import_export/SystemWriter.h>
36#ifdef ALIEN_USE_LIBXML2
37#include <libxml/parser.h>
38#include <libxml/xmlmemory.h>
41#include <alien/kernels/simple_csr/SimpleCSRMatrix.h>
42#include <alien/kernels/simple_csr/SimpleCSRVector.h>
47#include <alien/ref/data/block/BlockMatrix.h>
48#include <alien/ref/data/block/BlockVector.h>
49#include <alien/ref/data/scalar/Matrix.h>
50#include <alien/ref/data/scalar/Vector.h>
51#include <alien/ref/import_export/SystemInfo.h>
52#include <alien/ref/import_export/SystemReader.h>
57SystemWriter::SystemWriter(
58std::string
const& filename, std::string format, IMessagePassingMng* parallel_mng)
62, m_parallel_mng(parallel_mng)
67 m_rank = m_parallel_mng->commRank();
68 m_nproc = m_parallel_mng->commSize();
69 std::stringstream suf;
70 suf <<
"-R" << m_rank <<
"P" << m_nproc;
71 m_filename = filename + suf.str();
74 m_filename = filename;
80 m_conv_crit_to_str[SolutionInfo::N2_ABS_RES] = std::string(
"||Ax-b||2");
81 m_conv_crit_to_str[SolutionInfo::N2_RELATIVE2RHS_RES] =
82 std::string(
"||Ax-b||2 / ||b||2");
83 m_conv_crit_to_str[SolutionInfo::N2_RELATIVE2X0_RES] =
84 std::string(
"||Ax-b||2 / ||x0||2");
87SystemWriter::~SystemWriter() {}
89template <
typename FileNodeT>
90void SystemWriter::_writeMatrixInfo(Exporter& exporter, FileNodeT& parent_node,
int nrows,
91 int ncols,
int nnz,
int blk_size,
int blk_size2)
93 FileNodeT matrix_info_node = exporter.createFileNode(parent_node,
"matrix-info");
95 exporter.write(matrix_info_node,
"nrows", nrows);
96 exporter.write(matrix_info_node,
"ncols", ncols);
97 exporter.write(matrix_info_node,
"nnz", nnz);
99 std::vector<int>& i32buffer = exporter.i32buffer;
100 i32buffer.reserve(2);
101 i32buffer.push_back(blk_size);
102 i32buffer.push_back(blk_size2);
103 exporter.write(matrix_info_node,
"blk-size", i32buffer);
106 exporter.closeFileNode(matrix_info_node);
109template <
typename FileNodeT>
110void SystemWriter::_writeCSRProfile(Exporter& exporter, FileNodeT& parent_node,
int nrows,
111 int nnz,
int const* kcol,
int const* cols)
113 std::vector<int>& i32buffer = exporter.i32buffer;
114 FileNodeT profile_node = exporter.createFileNode(parent_node,
"profile");
115 exporter.write(profile_node,
"profile-type", std::string(
"CSR"));
117 exporter.write(profile_node,
"nrows", nrows);
118 exporter.write(profile_node,
"nnz", nnz);
121 i32buffer.reserve(nrows + 1);
122 for (Integer i = 0; i < nrows + 1; ++i)
123 i32buffer.push_back(kcol[i]);
124 exporter.write(profile_node,
"kcol", i32buffer);
127 i32buffer.reserve(nnz);
128 for (Integer i = 0; i < nnz; ++i)
129 i32buffer.push_back(cols[i]);
130 exporter.write(profile_node,
"cols", i32buffer);
132 exporter.closeFileNode(profile_node);
135template <
typename FileNodeT>
136void SystemWriter::_writeMatrixValues(Exporter& exporter, FileNodeT& parent_node,
int nnz,
137 int blk_size,
int blk_size2,
double const* values)
139 std::vector<double>& rbuffer = exporter.rbuffer;
140 std::vector<int>& i32buffer = exporter.i32buffer;
141 FileNodeT data_node = exporter.createFileNode(parent_node,
"data");
144 FileNodeT info_node = exporter.createFileNode(data_node,
"struct-info");
146 exporter.write(info_node,
"size", nnz);
149 i32buffer.reserve(2);
150 i32buffer.push_back(blk_size);
151 i32buffer.push_back(blk_size2);
152 exporter.write(info_node,
"blk-size", i32buffer);
154 exporter.closeFileNode(info_node);
156 rbuffer.reserve(nnz * blk_size * blk_size2);
157 for (Integer i = 0; i < nnz * blk_size * blk_size2; ++i)
158 rbuffer.push_back(values[i]);
159 exporter.write(data_node,
"values", rbuffer);
161 exporter.closeFileNode(data_node);
164template <
typename FileNodeT>
165void SystemWriter::_writeVector(Exporter& exporter, FileNodeT& parent_node,
int nrows,
166 int blk_size,
double const* values)
168 std::vector<double>& rbuffer = exporter.rbuffer;
169 FileNodeT data_node = exporter.createFileNode(parent_node,
"data");
171 FileNodeT info_node = exporter.createFileNode(data_node,
"struct-info");
173 exporter.write(info_node,
"size", nrows);
174 exporter.write(info_node,
"blk-size", blk_size);
176 exporter.closeFileNode(info_node);
179 rbuffer.reserve(nrows * blk_size);
180 for (Integer i = 0; i < nrows * blk_size; ++i)
181 rbuffer.push_back(values[i]);
182 exporter.write(data_node,
"values", rbuffer);
184 exporter.closeFileNode(data_node);
187template <
typename FileNodeT>
188void SystemWriter::_writeSolutionInfo(
189Exporter& exporter, FileNodeT& parent_node,
const SolutionInfo& sol_info)
192 FileNodeT solution_info_node = exporter.createFileNode(parent_node,
"solution_info");
194 exporter.write(parent_node,
"conv-crit", m_conv_crit_to_str[sol_info.m_conv_crit]);
195 exporter.write(parent_node,
"conv-crit-value", sol_info.m_conv_crit_value);
196 exporter.write(parent_node,
"solver-comment", sol_info.m_solver_comment);
198 exporter.closeFileNode(solution_info_node);
201template <
typename FileNodeT>
202void SystemWriter::_beginDump(Exporter*& exporter, FileNodeT& base_node)
204 exporter =
new Exporter(m_filename, m_format, m_prec);
205 base_node = exporter->createFileNode(
"system");
208template <
typename FileNodeT>
209void SystemWriter::_endDump(Exporter* exporter, FileNodeT& base_node)
211 exporter->closeFileNode(base_node);
215void SystemWriter::dump(Matrix
const& A)
217 const SimpleCSRMatrix<Real>& csr = A.impl()->get<BackEnd::tag::simplecsr>();
218 const SimpleCSRMatrix<Real>::ProfileType& profile = csr.getProfile();
219 int nrows = profile.getNRows();
221 int nnz = profile.getNnz();
222 typedef Exporter::FileNode FileNode;
226 _beginDump(exporter, root_node);
228 FileNode matrix_node = exporter->createFileNode(root_node,
"matrix");
230 _writeMatrixInfo(*exporter, matrix_node, nrows, nrows, nnz, blk_size, blk_size);
232 const int* cols = profile.cols();
233 const int* kcol = profile.kcol();
234 _writeCSRProfile(*exporter, matrix_node, nrows, nnz, kcol, cols);
236 const double* values = csr.getAddressData();
237 _writeMatrixValues(*exporter, matrix_node, nnz, blk_size, blk_size, values);
239 exporter->closeFileNode(matrix_node);
241 _endDump(exporter, root_node);
244void SystemWriter::dump(Matrix
const& A, Vector
const& rhs)
248 const SimpleCSRMatrix<Real>& csr = A.impl()->get<BackEnd::tag::simplecsr>();
249 const SimpleCSRMatrix<Real>::ProfileType& profile = csr.getProfile();
250 int nrows = profile.getNRows();
252 int nnz = profile.getNnz();
253 typedef Exporter::FileNode FileNode;
257 _beginDump(exporter, root_node);
259 FileNode matrix_node = exporter->createFileNode(root_node,
"matrix");
261 _writeMatrixInfo(*exporter, matrix_node, nrows, nrows, nnz, blk_size, blk_size);
263 const int* cols = profile.cols();
264 const int* kcol = profile.kcol();
265 _writeCSRProfile(*exporter, matrix_node, nrows, nnz, kcol, cols);
267 const double* values = csr.getAddressData();
268 _writeMatrixValues(*exporter, matrix_node, nnz, blk_size, blk_size, values);
270 exporter->closeFileNode(matrix_node);
272 FileNode vector_node = exporter->createFileNode(root_node,
"rhs-0");
274 const SimpleCSRVector<Real>& v = rhs.impl()->get<BackEnd::tag::simplecsr>();
275 const double* values = v.getAddressData();
276 _writeVector(*exporter, vector_node, nrows, blk_size, values);
278 exporter->closeFileNode(vector_node);
280 _endDump(exporter, root_node);
283void SystemWriter::dump(
284Matrix
const& A, Vector
const& rhs, Vector
const& sol, SolutionInfo
const& sol_info)
286 const SimpleCSRMatrix<Real>& csr = A.impl()->get<BackEnd::tag::simplecsr>();
287 const SimpleCSRMatrix<Real>::ProfileType& profile = csr.getProfile();
288 int nrows = profile.getNRows();
290 int nnz = profile.getNnz();
291 typedef Exporter::FileNode FileNode;
295 _beginDump(exporter, root_node);
297 FileNode matrix_node = exporter->createFileNode(root_node,
"matrix");
299 _writeMatrixInfo(*exporter, matrix_node, nrows, nrows, nnz, blk_size, blk_size);
301 const int* cols = profile.cols();
302 const int* kcol = profile.kcol();
303 _writeCSRProfile(*exporter, matrix_node, nrows, nnz, kcol, cols);
305 const double* values = csr.getAddressData();
306 _writeMatrixValues(*exporter, matrix_node, nnz, blk_size, blk_size, values);
308 exporter->closeFileNode(matrix_node);
310 FileNode rhs_node = exporter->createFileNode(root_node,
"rhs-0");
312 const SimpleCSRVector<Real>& v = rhs.impl()->get<BackEnd::tag::simplecsr>();
313 const double* values = v.getAddressData();
314 _writeVector(*exporter, rhs_node, nrows, blk_size, values);
316 exporter->closeFileNode(rhs_node);
318 FileNode solution_node = exporter->createFileNode(root_node,
"solution-0");
321 _writeSolutionInfo(*exporter, solution_node, sol_info);
323 exporter->write(solution_node,
"rhs-ref", std::string(
"rhs-0"));
325 FileNode solution_vector_node =
326 exporter->createFileNode(solution_node,
"solution-vector");
327 const SimpleCSRVector<Real>& v = sol.impl()->get<BackEnd::tag::simplecsr>();
328 const double* values = v.getAddressData();
329 _writeVector(*exporter, solution_vector_node, nrows, blk_size, values);
330 exporter->closeFileNode(solution_vector_node);
332 exporter->closeFileNode(solution_node);
334 _endDump(exporter, root_node);
337void SystemWriter::dump(BlockMatrix
const& A, BlockVector
const& rhs)
339 const SimpleCSRMatrix<Real>& csr = A.impl()->get<BackEnd::tag::simplecsr>();
340 const SimpleCSRMatrix<Real>::ProfileType& profile = csr.getProfile();
341 int nrows = profile.getNRows();
342 int blk_size = A.block().size();
343 int nnz = profile.getNnz();
344 typedef Exporter::FileNode FileNode;
348 _beginDump(exporter, root_node);
350 FileNode matrix_node = exporter->createFileNode(root_node,
"matrix");
352 _writeMatrixInfo(*exporter, matrix_node, nrows, nrows, nnz, blk_size, blk_size);
354 const int* cols = profile.cols();
355 const int* kcol = profile.kcol();
356 _writeCSRProfile(*exporter, matrix_node, nrows, nnz, kcol, cols);
358 const double* values = csr.getAddressData();
359 _writeMatrixValues(*exporter, matrix_node, nnz, blk_size, blk_size, values);
361 exporter->closeFileNode(matrix_node);
363 FileNode vector_node = exporter->createFileNode(root_node,
"rhs-0");
365 const SimpleCSRVector<Real>& v = rhs.impl()->get<BackEnd::tag::simplecsr>();
366 const double* values = v.getAddressData();
367 _writeVector(*exporter, vector_node, nrows, blk_size, values);
369 exporter->closeFileNode(vector_node);
370 _endDump(exporter, root_node);
373void SystemWriter::dump(BlockMatrix
const& A, BlockVector
const& rhs, BlockVector
const& sol,
374 SolutionInfo
const& sol_info)
376 const SimpleCSRMatrix<Real>& csr = A.impl()->get<BackEnd::tag::simplecsr>();
377 const SimpleCSRMatrix<Real>::ProfileType& profile = csr.getProfile();
378 int nrows = profile.getNRows();
379 int blk_size = A.block().size();
380 int nnz = profile.getNnz();
381 typedef Exporter::FileNode FileNode;
385 _beginDump(exporter, root_node);
387 FileNode matrix_node = exporter->createFileNode(root_node,
"matrix");
389 _writeMatrixInfo(*exporter, matrix_node, nrows, nrows, nnz, blk_size, blk_size);
391 const int* cols = profile.cols();
392 const int* kcol = profile.kcol();
393 _writeCSRProfile(*exporter, matrix_node, nrows, nnz, kcol, cols);
395 const double* values = csr.getAddressData();
396 _writeMatrixValues(*exporter, matrix_node, nnz, blk_size, blk_size, values);
398 exporter->closeFileNode(matrix_node);
400 FileNode rhs_node = exporter->createFileNode(root_node,
"rhs-0");
402 const SimpleCSRVector<Real>& v = rhs.impl()->get<BackEnd::tag::simplecsr>();
403 const double* values = v.getAddressData();
404 _writeVector(*exporter, rhs_node, nrows, blk_size, values);
407 exporter->closeFileNode(rhs_node);
409 FileNode sol_node = exporter->createFileNode(root_node,
"sol");
411 const SimpleCSRVector<Real>& v = sol.impl()->get<BackEnd::tag::simplecsr>();
412 const double* values = v.getAddressData();
413 _writeVector(*exporter, sol_node, nrows, blk_size, values);
415 exporter->closeFileNode(rhs_node);
417 _endDump(exporter, root_node);
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --