Ошибка определения местоположения нарушения прав доступа для инициализации Intel MKL PARDISO

У меня проблема с использованием Intel MKL PARDISO, Я могу запустить пример, предоставленный библиотекой для реальных симметричных матриц, pardiso_sym_c.c, который находится ниже.

MKL_INT n = 8;
MKL_INT ia[9] = { 1, 5, 8, 10, 12, 15, 17, 18, 19 };
MKL_INT ja[18] =
{ 1,    3,       6, 7,
2, 3,    5,
3,             8,
4,       7,
5, 6, 7,
6,    8,
7,
8
};
double a[18] =
{ 7.0,      1.0,           2.0, 7.0,
-4.0, 8.0,      2.0,
1.0,                     5.0,
7.0,           9.0,
5.0, 1.0, 5.0,
-1.0,      5.0,
11.0,
5.0
};

MKL_INT mtype = -2;   /* Real symmetric matrix */

MKL_INT nrhs = 1;     /* Number of right hand sides. */

/* Internal solver memory pointer pt, */
/* 32-bit: int pt[64]; 64-bit: long int pt[64] */
/* or void *pt[64] should be OK on both architectures */
void *pt[64];

/* Pardiso control parameters. */
MKL_INT iparm[64];
MKL_INT maxfct, mnum, phase, error, msglvl;
/* Auxiliary variables. */
MKL_INT i;
double ddum;          /* Double dummy */
MKL_INT idum;         /* Integer dummy. */

/* -------------------------------------------------------------------- */
/* .. Setup Pardiso control parameters. */
/* -------------------------------------------------------------------- */
for (i = 0; i < 64; i++)
{
iparm[i] = 0;
}
iparm[0] = 1;         /* No solver default */
iparm[1] = 2;         /* Fill-in reordering from METIS */
iparm[3] = 0;         /* No iterative-direct algorithm */
iparm[4] = 0;         /* No user fill-in reducing permutation */
iparm[5] = 0;         /* Write solution into x */
iparm[6] = 0;         /* Not in use */
iparm[7] = 2;         /* Max numbers of iterative refinement steps */
iparm[8] = 0;         /* Not in use */
iparm[9] = 13;        /* Perturb the pivot elements with 1E-13 */
iparm[10] = 1;        /* Use nonsymmetric permutation and scaling MPS */
iparm[11] = 0;        /* Not in use */
iparm[12] = 0;        /* Maximum weighted matching algorithm is switched-off (default for symmetric). Try iparm[12] = 1 in case of inappropriate accuracy */
iparm[13] = 0;        /* Output: Number of perturbed pivots */
iparm[14] = 0;        /* Not in use */
iparm[15] = 0;        /* Not in use */
iparm[16] = 0;        /* Not in use */
iparm[17] = -1;       /* Output: Number of nonzeros in the factor LU */
iparm[18] = -1;       /* Output: Mflops for LU factorization */
iparm[19] = 0;        /* Output: Numbers of CG Iterations */
maxfct = 1;           /* Maximum number of numerical factorizations. */
mnum = 1;         /* Which factorization to use. */
msglvl = 1;           /* Print statistical information in file */
error = 0;            /* Initialize error flag */

/* -------------------------------------------------------------------- */
/* .. Initialize the internal solver memory pointer. This is only */
/* necessary for the FIRST call of the PARDISO solver. */
/* -------------------------------------------------------------------- */
for (i = 0; i < 64; i++)
{
pt[i] = 0;
}
/* -------------------------------------------------------------------- */
/* .. Reordering and Symbolic Factorization. This step also allocates */
/* all memory that is necessary for the factorization. */
/* -------------------------------------------------------------------- */
phase = 11; // Analysis phase: https://software.intel.com/en-us/mkl-developer-reference-c-pardiso#BEA1BEA6-A0C0-46C4-A8EC-EC42BA473E1D
pardiso(pt, &maxfct, &mnum, &mtype, &phase,
&n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, &ddum, &ddum, &error);

Приведенный выше код работает без проблем.

В моей системе уравнений Ax=b, A также является реальной симметричной матрицей и имеет размер 18x18, Верхняя треугольная матрица A хранится как CSR формат:

MKL_INT n = 18;

double a[72] = {1.948975, 0.066884, -0.150949, -0.261933, -0.325631, -0.180171, -0.051572, -0.318613, -0.353708, -0.131304, 2.330696, -0.261933, -0.471526, -0.347310, -0.488919, 0.073609, -0.504371, 0.103671, 0.110624, 0.008506, -0.425317, 1.948975, 0.066884, -0.051572, -0.353708, -0.318613, -0.325631, -0.180171, -0.131304, 1.625462, 0.103671, -0.417045, -0.326084, 2.330696, -0.504371, 0.008506, 0.110624, -0.488919, -0.471526, 0.073609, -0.425317, 1.578165, -0.247065, -0.391888, 0.120848, 1.687572, -0.410749, 0.120848, 1.817920, -0.448414, 1.687572, -0.417045, -0.410749, 0.120848, 1.425970, -0.170845, -0.247065, 1.708300, -0.391888, -0.448414, 1.425970, -0.170845, 1.578165, 0.120848, 1.625462, -0.326084, 1.708300, -0.448414, 1.817920, -0.448414, 1.710851, 1.710851};

MKL_INT ja[72] = {0, 1, 2, 4, 9, 10, 12, 14, 15, 17, 1, 2, 3, 4, 5, 7, 8, 13, 14, 15, 17, 2, 4, 5, 7, 10, 11, 14, 16, 3, 4, 6, 7, 4, 6, 7, 10, 12, 13, 15, 16, 5, 11, 14, 17, 6, 7, 16, 7, 16, 8, 13, 15, 17, 9, 10, 12, 10, 12, 16, 11, 14, 12, 16, 13, 15, 14, 17, 15, 17, 16, 17};

MKL_INT ia[19] = {0, 10, 21, 29, 33, 41, 45, 48, 50, 54, 57, 60, 62, 64, 66, 68, 70, 71, 72};

Я подтвердил достоверность приведенных выше данных CSR, которые представляют собой разреженную симметричную матрицу размера 18x18 в MATLAB (см. рисунок ниже, где показана верхняя треугольная часть)

введите описание изображения здесь

Разреженная матрица в pardiso_sym_c.c была заменена другой реальной симметричной матрицей другого размера. Я использую Visual Studio 2017 и получаю следующее сообщение об ошибке на этапе анализа PARDISO алгоритм, т.е. phase = 11, Эта ошибка не возникает, когда матрица спреза является той, которая представлена ​​в pardiso_sym_c.c, Я только изменил матрицу ввода и хочу использовать остальную часть PARDISO Настройки.

 pardiso(pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nrhs, iparm, &msglvl, &ddum, &ddum, &error);

Access violation writing location

Может ли кто-нибудь любезно помочь мне с этим вопросом?

0

Решение

Задача ещё не решена.

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

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

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