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

dss_define_structure

eide
Beginner
481 Views
Hi,

I want to use the direct sparse solver with the intel fortran interface from the mkl library.
The matrix I want to invert is symmetric complex non-hermitian.
Can someone give me a hint what the correct option in dss_define_structure, dss_factor_complex would be.
I use a 64bit linux cluster version of mkl10.


I tried the following:

...
error = DSS_CREATE( handle, MKL_DSS_DEFAULTS )
if(error /= MKL_DSS_SUCCESS)print*,'ERROR'

error = DSS_DEFINE_STRUCTURE( handle, MKL_DSS_SYMMETRIC, rowindex, ndf_hb, ndf_hb, columns, totnon )
if(error /= MKL_DSS_SUCCESS)print*,'ERROR'

error = DSS_REORDER( handle, MKL_DSS_DEFAULTS, perm )
if(error /= MKL_DSS_SUCCESS)print*,'ERROR'

error = DSS_FACTOR_COMPLEX( handle, MKL_DSS_DEFAULTS, values )
if(error /= MKL_DSS_SUCCESS)print*,'ERROR'

error = DSS_DELETE( handle, MKL_DSS_DEFAULTS )
if(error /= MKL_DSS_SUCCESS)print*,'ERROR'
...

which gives a segmentation fault :

forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
libpthread.so.0 000000303AC0E9DD Unknown Unknown Unknown
libiomp5.so 00002B734B6A989E Unknown Unknown Unknown
forrtl: severe (174): SIGSEGV, segmentation fault occurred

The size of the input arrays values,columns and rowindex are correct - I checked several times.
Thanks in advance.

Eide
0 Kudos
5 Replies
Gennady_F_Intel
Moderator
481 Views
would you please show the libraries which you use for linking this example.
0 Kudos
eide
Beginner
481 Views
Hi,

I used the dss_sym_f90 from the example directory coming with the mkl lib as a template.

In the source code I have:

INCLUDE 'mkl_dss.f90' as the first line

and

use mkl_dss

to compile I use the following:

ifort -w -I/prog/Intel/mkl10cluster/include -fpp *.f90 -L/prog/Intel/mkl10cluster/lib/em64t /prog/Intel/mkl10cluster/lib/em64t/libmkl_solver_lp64.a /prog/Intel/mkl10cluster/lib/em64t/libmkl_intel_lp64.a -Wl,--start-group /prog/Intel/mkl10cluster/lib/em64t/libmkl_intel_thread.a /prog/Intel/mkl10cluster/lib/em64t/libmkl_core.a -Wl,--end-group -L/prog/Intel/mkl10cluster/lib/em64t -liomp5 -lpthread -lm -o x_out

which i took from the makefile in the example directory.
Thanks for your help.

Eide
0 Kudos
Gennady_F_Intel
Moderator
481 Views
Eide, I compiled this example from the latest version (10.3.8) and the test ran well. here is the output produced
pow of determinant is 0.000
base of determinant is 2.250
Determinant is 2.250
Solution Array: -326.333 983.000 163.417 398.000 61.500
--Gennady
0 Kudos
eide
Beginner
481 Views
Hi Gennady,


I used the dss_sym_f90 just as a template of how to use the solver. My problem is different in some characteristics.
The matrix I want to solve is 210000 by 210000 with ca 23 * 10**6 non zero entries, symmetric with complex values on the diagonal(therefore non-hermitian). In the array "values" I did put all non zero values(not just the upper triangle).
When I put all non zero elements in the "values" arrays do I have to choose MKL_DSS_NON_SYMMETRIC in the line with:

error = DSS_DEFINE_STRUCTURE( handle, MKL_DSS_SYMMETRIC, rowindex, ndf_hb, ndf_hb, columns, totnon )

????

And if so - what would be the corresponding option in the dss_solve_complex line. There are 4 possibilities:

The opt argument should contain one of the following options:

  • MKL_DSS_POSITIVE_DEFINITE,

  • MKL_DSS_INDEFINITE,

  • MKL_DSS_HERMITIAN_POSITIVE_DEFINITE,

  • MKL_DSS_HERMITIAN_INDEFINITE ,

see documentation:

http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/win/mkl/refman/ssr/ssr_DSSIntro.html


Or can dss not solve a symmetric, complex, non-hermitian linear system ?
Thanks in advance.
(btw the example dss_sym_f90 works also on my system with the same result as you get)


Eide
0 Kudos
eide
Beginner
481 Views
Hi,

the solution if you have a symmetric non hermitian matrix is:

1) put all non zero elements in the input array (not only the upper triangle)
2) declare the structure as non symmetric (although it's symmetric)
-> DSS_DEFINE_STRUCTURE( handle, MKL_DSS_NON_SYMMETRIC, rowindex, nrows, nrows, columns, totalnonzero)
3) choose the correct factorzation - in this case LDL^T
-> DSS_FACTOR_COMPLEX( handle, MKL_DSS_POSITIVE_DEFINITE, values)

It works fine : )
0 Kudos
Reply