Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.

PARDISO and Nonlinear Systems

greiner08
Beginner
318 Views

Hi,

I have been experimenting with the PARDISO solver, solving a system of linear equations

Ax=b

The example file 'pardiso_unsym_c.c' contains the variables

double *a : corresponds to the matrix A in the equation above
double *b : corresponds to the vector b in the equation above
double *x: corresponds to the vector x in the equation above

It has proven to be very fast for my purposes. I've also noticed a nonlinear example case 'pardiso_nonlinear.c' which contains an "Example of solving nonlinear problem using PARDISO and Sparse BLAS". Is there an expression of the specific nonlinear problem being tackled in the example? I would like to adapt the example to solve a system of semilinear equations I have (Ax=b, where b is a function of x). But I am unsure of what the variables pertain to. Specifically, the variables

double *a
double *f
double *u

Any help/documentation would be appreciated.

0 Kudos
2 Replies
mecej4
Honored Contributor III
318 Views

I remember seeing a similar example in the MKL Cookbook, see https://software.intel.com/en-us/forums/intel-math-kernel-library/topic/557295 . If, indeed, the problem is the same as the one described in https://software.intel.com/en-us/node/507039 (please check first), it is notable that (i) the grid used is very coarse, (ii) the nonlinearity is removable (by use of the Kirchhoff transformation), and (iii) the finite-difference equations can be reduced to four unknowns, and can be solved with pencil and paper easily. The code should be taken to be for illustration only.

0 Kudos
greiner08
Beginner
318 Views

Hi mecej4,

Thanks for the reply. It was a great help. I now understand the example, which is a procedure for a system A(u)u = g

- Set u to initial value u0.

- Calculate residual r = A(u)u - g.

- Do while ||r|| < tolerance:

    - Solve system A(u)w = g for w.

    - Set u = w.

    - Calculate residual r = A(u)u - g

(the above is in the documentation you linked to). I believe I can adapt this procedure for my semilinear case Au = g(u) I.e.

- Set u to initial value u0.

- Calculate residual r = Au - g(u).

- Do while ||r|| < tolerance:

    - Solve system Aw = g(u) for w.

    - Set u = w.

    - Calculate residual r = Au - g(u)

Thanks again

0 Kudos
Reply