Ошибка «Не называет тип», даже если заголовочный файл включен - PullRequest
0 голосов
/ 25 сентября 2019

Ниже приводится сообщение об ошибке, которое я получаю:

enter image description here

Это «ошибка типа не называется», которая обычно происходит, еслифайл заголовка не включен или существует циклическая зависимость между файлами заголовка.

Ниже приведены файлы, которые, как говорят, вызвали ошибку:

Фрагмент 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, он выглядит как тольковызываются имитирующие заголовочные файлы, поэтому я не понимаю, как может быть циклическая зависимость.

Я извиняюсь, если код немного длинный и сложный.Но я застрял на этом некоторое время.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...