- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Could someone help me by telling me how I can modify the function MKL_PARDISO_PIVOT
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
Thanks for posting in Intel Communities.
For more information related to MKL_PARDISO_PIVOT, please refer to the below link:
You could also refer to the example provided under below path based on your usage and requirement.
C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\examples\examples_core_c.zip\c\sparse_directsolvers\source\pardiso_sym_getdiag.c (or)
C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\examples\examples_core_c.zip\c\sparse_directsolvers\source\pardiso_unsym_diag_pivot.c
In addition, Could you please elaborate on your issue, it helps in understanding your issue better.
Best regards,
Sri Raj Aryan.K
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
First of all I would like to thank your answer. The best solution for me it is the replacement of mkl_pardiso_pivot, but in fortran I can not. And the solution, if I am not wrong, it is the redefinition in C, and then mix with fortran.
Do you think if it is correct my solution.
Javi
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
Thanks for getting back. As requested by you, For more information related to MKL_PARDISO_PIVOT in fortran, you could go through to the below link:
You could also refer to the Fortran examples provided under the below path based on your use case.
C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\examples\examples_core_f.zip\f\sparse_directsolvers\source
Best regards,
Sri Raj Aryan.K
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
A gentle reminder:
Has the information provided helped? Could you please let us know if you need any other details?
Best regards,
Sri Raj Aryan.K
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for yours answer. I had checked the examples in C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0\examples\examples_core_f.zip\f\sparse_directsolvers\source
And I could not find any example about rewrite the function mkl_pardiso_pivot or how it could be used.
Could you say to me where I can fin some exemples where mkl_pardiso_pivot is used.
Thank you,
Javi
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
We are looking into your issue internally and we will update you soon.
Thanks and Regards,
Sri Raj Aryan.K
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have made a simple example, which works for symmetric, indefinite but it do not for real and symmetric positive definite. And I don't know why.
program Console2
implicit none
!Ax = b
real(8):: A(5), b(5), x(6)
integer:: rows(6), columns(5), iparm(64), maxfct, mnum, mtype, phase, n, nrhs, error, msglvl, perm(1), i
integer:: pt(64)
pt = 0
n = 5
mnum = 1
maxfct = 1
nrhs = 1
error = 0 ! initialize error flag
msglvl = 1 ! print statistical information
mtype = -2 ! symmetric, indefinite
!mtype = 2 ! real and symmetric positive definite
A = (/10.0d0, 20.0d0, 0.0000000001d0, 40.0d0, 50.0d0/)
rows = (/1,2,3,4,5,6/)
columns = (/1,2,3,4,5/)
b = (/10.0d0, 20.0d0, 30.0d0, 40.0d0, 50.0d0/)
x = 0.0d0
iparm = 0
!iparm(1) = 1 ! no solver default
!iparm(2) = 2 ! fill-in reordering from METIS
!iparm(4) = 0 ! no iterative-direct algorithm
!iparm(5) = 0 ! no user fill-in reducing permutation
!iparm(6) = 0 ! =0 solution on the first n components of x
!iparm(8) = 2 ! numbers of iterative refinement steps
!iparm(10) = 8 ! perturb the pivot elements with 1E-13
!iparm(11) = 1 ! use nonsymmetric permutation and scaling MPS
!iparm(13) = 0 ! maximum weighted matching algorithm is switched-off (default for symmetric). Try iparm(13) = 1 in case of inappropriate accuracy
!iparm(14) = 0 ! Output: number of perturbed pivots
!iparm(18) = -1 ! Output: number of nonzeros in the factor LU
!iparm(19) = -1 ! Output: Mflops for LU factorization
!iparm(20) = 0 ! Output: Numbers of CG Iterations
!iparm(56) = 1 !You can use the mkl_pardiso_pivot callback routine to control pivot elements which appear during numerical factorization
phase = 11 ! only reordering and symbolic factorization
CALL pardiso(pt, maxfct, mnum, mtype, phase, n, A, rows, columns, perm, nrhs, iparm, msglvl, b, x, error)
write(*,*) 'phase = 11. Error: ',error
phase = 22 ! only factorization
CALL pardiso(pt, maxfct, mnum, mtype, phase, n, A, rows, columns, perm, nrhs, iparm, msglvl, b, x, error)
write(*,*) 'phase = 22. Error: ',error
if( error == -4) then
write(*,*) 'Pivot zero: ', iparm(30)
end if
phase = 33 ! only solution
CALL pardiso(pt, maxfct, mnum, mtype, phase, n, A, rows, columns, perm, nrhs, iparm, msglvl, b, x, error)
write(*,*) 'phase = 33. Error: ',error
do i = 1, 5
write(*,*) x(i)
end do
end program Console2
subroutine mkl_pardiso_pivot (ai, bi, eps)
real(8):: ai, bi, eps
if( bi < eps ) then
bi = 30.0d0
end if
end subroutine
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
>> First of all I would like to thank your answer. The best solution for me it is the replacement of mkl_pardiso_pivot, but in fortran I can not. And the solution, if I am not wrong, it is the redefinition in C, and then mix with fortran.
Here is the code in C and Fortran of mkl_pardiso_pivot
In C:
int mkl_pardiso_pivot( const double*aii, double*bii, const double*eps )
{
if ( (*bii > *eps) || ( *bii < -*eps ) )
return 0;
if ( *bii > 0 )
*bii = *eps;
else
*bii = -*eps;
return 1;
}
In Fortran:
FUNCTION mkl_pardiso_pivot(ai, bi, eps)
DOUBLE, INTENT(IN) :: ai
DOUBLE, INTENT(INOUT) :: bi
DOUBLE, INTENT(IN) :: eps
IF ( (bi > eps) .OR. (bi < (.NOT. eps)) ) THEN
RETURN 0
END IF
IF (bi > 0) THEN
bi = eps
ELSE
bi = (.NOT. eps)
END IF
RETURN 1
END FUNCTION mkl_pardiso_pivot
Could you please let us know if it is helpful?
Thanks and Regards,
Aryan.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am sorry, but it isn't. The behavior is exactly like my example. It works for mytype = -2, but not for mytype = 2. And I am interested in mytype = 2.
Can you help me?
Yours,
Javi
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
We are working on your issue internally and we will update you soon.
Thanks and Regards,
Sri Raj Aryan.K
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Waiting for it
Thank you.
Javi
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
Apologies for the delay in response.
We would like to know regarding
>>"it works for mtype = -2, but not for mtype = 2".
Do you mean that if MKL PARDISO detects zero, then MKL Pardiso doesn't stop execution and/or doesn't return an error = -4?
Thanks and Regards,
Aryan.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
for type =2, and with a diagonal matriz, diferent zero numbers only in the main diagonal of matriz and zero the rest of matriz. If one number is negative or zero MKL_PARDISO return an error = -4. But if the number is positive and close to zero return error = 0, and if I tyr to use the diagonal and pivoting control ( iparm(56) = 1 ), I can't. I have detected that the program doesn't acces to mkl_pardiso_pivot.
However the same problem but type = -2, I don't have this problem and I can control the pivoting using mkl_pardiso_pivot.
If you need more information, please say to me.
Thanks,
Javi
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Javi_Dopazo,
For mtype=2 (i.e., real and symmetric positive definite), it is expected to have behavior as follows:
- The MKL_PARDISO returns an error code of -4, if any number on the main diagonal is either negative or zero.
- The MKL_PARDISO returns an error code of 0, if the number on the main diagonal is positive and close to zero.
Notably, explicitly setting 0.0 instead of 0.000000001d, while mtype=2, then Pardiso returns -4 as expected.
Thanks & Regards,
Aryan
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Any new
Javi
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Apologies for the wait in getting back to you.
We are working on your issue internally and we will provide you with an update shortly.
Thanks & Regards,
Aryan.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page