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

## PARDISO and Nonlinear Systems

Beginner
345 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.

2 Replies
Honored Contributor III
345 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.

Beginner
345 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