Ниже приводится сообщение об ошибке, которое я получаю:
Это «ошибка типа не называется», которая обычно происходит, еслифайл заголовка не включен или существует циклическая зависимость между файлами заголовка.
Ниже приведены файлы, которые, как говорят, вызвали ошибку:
Фрагмент SparseGenRealShiftSolvePardiso.h:
#ifndef SPARSE_GEN_REAL_SHIFT_SOLVE_PARDISO_H
#define SPARSE_GEN_REAL_SHIFT_SOLVE_PARDISO_H
#include <SolverPardiso.h>
#include <Eigen/Core>
#include <Eigen/SparseCore>
#include <Eigen/SparseLU>
#include <stdexcept>
namespace Spectra {
///
/// \ingroup MatOp
///
/// This class defines the shift-solve operation on a sparse real matrix \f$A\f$,
/// i.e., calculating \f$y=(A-\sigma I)^{-1}x\f$ for any real \f$\sigma\f$ and
/// vector \f$x\f$. It is mainly used in the GenEigsRealShiftSolverPardiso eigen solver.
///
template <typename Scalar,int Flags = 0, typename StorageIndex = int>
class SparseGenRealShiftSolvePardiso
{
private:
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> Vector;
typedef Eigen::Map<const Vector> MapConstVec;
typedef Eigen::Map<Vector> MapVec;
typedef Eigen::SparseMatrix<Scalar, Flags, StorageIndex> SparseMatrix;
typedef const Eigen::Ref<const SparseMatrix> ConstGenericSparseMatrix;
Eigen::SparseMatrix<double,Eigen::RowMajor> m_mat;
const int m_n;
// Eigen::SparseLU<SparseMatrix> m_solver;
// SparseMatrix& m_mat;
mutable SolverPardiso<Eigen::SparseMatrix<double,Eigen::RowMajor> > m_solver; // << THIS IS THE PROBLEM
Фрагмент TimeStepperEigenFitSI.h:
#ifndef TimeStepperEigenFitSI_h
#define TimeStepperEigenFitSI_h
#include <SolverPardiso.h>
#include <World.h>
#include <Assembler.h>
#include <TimeStepper.h>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <UtilitiesEigen.h>
#include <UtilitiesMATLAB.h>
#include <Eigen/SparseCholesky>
#include <EigenFit.h>
#include <limits>
#include <Eigen/Eigenvalues>
#include <unsupported/Eigen/MatrixFunctions>
#include <math.h>
#include <algorithm>
Фрагмент EigenFit.h:
#ifndef EigenFit_h
#define EigenFit_h
#include <SolverPardiso.h>
#include <FEMIncludes.h>
#include <GaussIncludes.h>
#include <UtilitiesFEM.h>
#include <State.h>
#include <ParticleSystemIncludes.h>
#include <ConstraintFixedPoint.h>
#include <unsupported/Eigen/SparseExtra>
#include <sys/stat.h>
#include <igl/sortrows.h>
#include <igl/histc.h>
#include <igl/unique_rows.h>
#include <igl/hausdorff.h>
#include <fstream>
#include <SparseGenRealShiftSolvePardiso.h>
#include <igl/boundary_facets.h>
#include <resultsUtilities.h>
Фрагмент exampleEigenFit.cpp:
#include <functional>
#include <Qt3DIncludes.h>
#include <GaussIncludes.h>
#include <FEMIncludes.h>
//Any extra things I need such as constraints
#include <ConstraintFixedPoint.h>
#include <TimeStepperEigenFitSI.h>
#include <resultsUtilities.h>
#include <EigenFit.h>
#include <fstream>
#include <igl/boundary_facets.h>
#include <igl/volume.h>
#include <igl/writePLY.h>
#include <time.h>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <iostream>
Фрагмент SolverPardiso.h , который находится в папке SolversLinear, которая, как вы можетесм. из порядка компиляции, сначала компилируется перед exampleEigenFit.cpp:
#ifndef SolverPardiso_h // OLD
#define SolverPardiso_h
// #ifndef SolverPardiso // ADDED
// #define SolverPardiso // ADDED
#ifdef GAUSS_PARDISO
extern "C" void pardisoinit (void *, int *, int *, int *, double *, int *);
extern "C" void pardiso (void *, int *, int *, int *, int *, int *,
double *, int *, int *, int *, int *, int *,
int *, double *, double *, int *, double *);
extern "C" void pardiso_chkmatrix (int *, int *, double *, int *, int *, int *);
extern "C" void pardiso_chkvec (int *, int *, double *, int *);
extern "C" void pardiso_printstats (int *, int *, double *, int *, int *, int *,
double *, int *);
#include <cstdio>
#include <cstdlib>
#include <cmath>
template<typename MatrixType>
class SolverPardiso
{
public:
protected:
private:
};
template <>
class SolverPardiso<Eigen::SparseMatrix<double, Eigen::RowMajor> >
{
public:
using SparseMatrix = Eigen::SparseMatrix<double, Eigen::RowMajor>;
//Pardiso stuff
//default matrix type = unsymmetric
//only the upper triangle of symmetric matrices must be passed to pardiso
SolverPardiso(int matrixType = 11, unsigned int numProcessors = 8) {
m_matrixType = matrixType;
//Annoying license file stuff
int error = 0;
int solver = 0; /* use sparse direct solver */
pardisoinit (m_ptr, &m_matrixType, &solver, m_integerParams, m_doubleParams, &error);
if (error != 0)
{
if (error == -10 )
printf("No license file found \n");
if (error == -11 )
printf("License is expired \n");
if (error == -12 )
printf("Wrong username or hostname \n");
exit(0);
}
else
printf("[PARDISO]: License check was successful ... \n");
//Number of Processors
m_integerParams[2] = numProcessors;
m_maxfct = 1; //perform at most one factorization
m_mnum = 1; // use factorization 1
m_nrhs = 1; //1 right hand side for now
m_displayStats = 0;
}
Во-первых, файл заголовка SolverPardiso.h включен в SparseGenRealShiftSolvePardiso.h, так что исключается, что файл заголовка не включается, иоснованный на заголовочном файле SolverPardiso.h, он выглядит как тольковызываются имитирующие заголовочные файлы, поэтому я не понимаю, как может быть циклическая зависимость.
Я извиняюсь, если код немного длинный и сложный.Но я застрял на этом некоторое время.
Спасибо.