*** Обнаружено разрушение стека *** Ошибка при возврате функции с использованием функции FEAST

У меня есть длинная программа, в которой у меня есть функция для вычисления собственных значений большой матрицы с использованием FEAST. Прямо при возврате этой функции я получаю * Обнаружено разрушение стека * ошибка и я теряю все результаты. Вот моя функция

    void Model::eigensolver(double* val, int* ia, int* ja, const int n, int m0, std::string outfilename)
{
// compute Eigenvalues and Eigenvectors by calling FEAST library from MKL
const char uplo='U';
MKL_INT fpm[128], loop;
feastinit(fpm);
//fpm[0]=1;
const double emin=-1,emax=100;
MKL_INT eig_found=0;
double res,epsout;
double *eigenvalues= new double [m0];
double *eig_vec = new double [m0*_dof];
int info;
std::cout << "Everything ready, making call to FEAST." << std::endl;
dfeast_scsrev(&uplo, &n, val, ia, ja, fpm, &epsout, &loop, &emin, &emax, &m0, eigenvalues, eig_vec, &eig_found, &res, &info );
if (info != 0) {
std::cout << "Something is wrong in eigensolver. Info=" << info << std::endl;
exit(0);
}

std::cout << loop << " iterations taken to converge." << std::endl;
std::cout << eig_found << " eigenvalues found in the interval." << std::endl;
std::ofstream evals;
evals.open("evals.dat");
std::cout<<"The eigenfrequencies are:"<<std::endl;
for (int i = 0; i < eig_found; i++)
evals << eigenvalues[i] << std::endl;
evals.close();
delete[] eigenvalues;
delete[] eig_vec;
std::cout << "Writen eigenvalues to file evals.dat." << std::endl;
return;
}

Dfeast_scsrev — это функция из библиотеки FEAST (также является частью intel MKL). Ошибка происходит прямо при возврате (т.е. после того, как «Записано собственное значение в файл evals.dat.» Печатается). В зависимости от проблемы, которую я запускаю, иногда я также получаю ошибку сегментации прямо в той же точке.

Если я уберу вызов функции FEAST, ошибки не будет. Итак, я запутался в том, что я делаю неправильно. Я пытаюсь использовать valgrind, но из-за размера моего кода выполнение занимает много времени.

1

Решение

Глядя на документы в https://software.intel.com/en-us/node/521749, я вижу это res следует указать на «Массив длины m0». Ваш res только один double, Конечно, dfeast_scsrev не знает этого и пишет с удовольствием за границей, тем самым разрушая ваш стек.

Итак, исправление:

double *res = new double [m0]; вместо double res;

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]