21#include <arccore/base/ArccoreGlobal.h>
22#include <alien/import_export/Reader.h>
26#include <archive_entry.h>
33class ALIEN_EXPORT SuiteSparseArchiveSystemReader
36 SuiteSparseArchiveSystemReader() =
delete;
37 SuiteSparseArchiveSystemReader(SuiteSparseArchiveSystemReader
const&) =
delete;
38 SuiteSparseArchiveSystemReader& operator=(SuiteSparseArchiveSystemReader
const&) =
delete;
40 explicit SuiteSparseArchiveSystemReader(std::string
const& filename);
41 ~SuiteSparseArchiveSystemReader();
43 template <
typename MatrixT>
44 void readMatrix(MatrixT& A);
46 template <
typename VectorT>
47 void readVector(VectorT& rhs);
50 std::string m_filename;
51 archive* m_archive =
nullptr;
54template <
typename MatrixT>
55void SuiteSparseArchiveSystemReader::readMatrix(MatrixT& A)
57 m_archive = archive_read_new();
58 archive_read_support_filter_gzip(m_archive);
59 archive_read_support_format_tar(m_archive);
61 auto r = archive_read_open_filename(m_archive, m_filename.c_str(), 10240);
62 if (r != ARCHIVE_OK) {
63 throw FatalErrorException(A_FUNCINFO,
"Open archive " + m_filename);
67 bool matrix_found =
false;
68 archive_entry* entry =
nullptr;
69 auto pos = m_filename.find_last_of(
'/');
70 std::string matrix_name(m_filename, pos + 1, m_filename.size() - pos - 1 - 7);
72 while (archive_read_next_header(m_archive, &entry) == ARCHIVE_OK) {
74 if (archive_entry_pathname(entry) == std::string(matrix_name +
"/" + matrix_name +
".mtx")) {
78 archive_read_data_skip(m_archive);
82 throw FatalErrorException(A_FUNCINFO,
"Matrix not found in " + m_filename);
85 LibArchiveReader reader(m_archive);
86 loadMMMatrixFromReader<MatrixT, LibArchiveReader>(A, reader);
88 r = archive_read_close(m_archive);
89 if (r != ARCHIVE_OK) {
90 throw FatalErrorException(A_FUNCINFO,
"Close archive " + m_filename);
93 r = archive_free(m_archive);
94 if (r != ARCHIVE_OK) {
95 throw FatalErrorException(A_FUNCINFO,
"Free archive");
99template <
typename VectorT>
100void SuiteSparseArchiveSystemReader::readVector(VectorT& rhs)
102 m_archive = archive_read_new();
103 archive_read_support_filter_gzip(m_archive);
104 archive_read_support_format_tar(m_archive);
106 auto r = archive_read_open_filename(m_archive, m_filename.c_str(), 10240);
107 if (r != ARCHIVE_OK) {
108 throw FatalErrorException(A_FUNCINFO,
"Open archive " + m_filename);
111 bool vector_found =
false;
112 archive_entry* entry =
nullptr;
113 auto pos = m_filename.find_last_of(
'/');
114 std::string matrix_name(m_filename, pos + 1, m_filename.size() - pos - 1 - 7);
116 while (archive_read_next_header(m_archive, &entry) == ARCHIVE_OK) {
118 if (archive_entry_pathname(entry) == std::string(matrix_name +
"/" + matrix_name +
"_b.mtx")) {
122 archive_read_data_skip(m_archive);
127 LibArchiveReader reader(m_archive);
128 loadMMRhsFromReader<VectorT, LibArchiveReader>(rhs, reader);
131 r = archive_read_close(m_archive);
132 if (r != ARCHIVE_OK) {
133 throw FatalErrorException(A_FUNCINFO,
"Close archive " + m_filename);
136 r = archive_free(m_archive);
137 if (r != ARCHIVE_OK) {
138 throw FatalErrorException(A_FUNCINFO,
"Free archive");
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --