- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi there,
I am using the mkl_dss.f77 to solve large sparse non-linear equations by iteratively calling the dss_solver. I just spotted that although I set the same initial values, I could not obtain a same result for every time. And I found this is due to the dss_solver gives results with slightly difference every time and the difference adds up in the iteration process which leads to a non-stable solve for the large sparse non-linear equations.
How can I make the mkl_dss solver to have repetitive accuracy? Anyone could give me some advice on this subject?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
It is better to use Pardiso interface for this aim. In Pardiso interface you can use CNR mode of MKL or set iparm[33] to maximum number of threads - both approach will provide stable results from run to run.
Thanks,
Alex
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Alex,
Thank you for your reply.
The reason I did not use Pardiso is that DSS provides the function dss_reorder which could help to save time since I only need to reorder once in the iteration process.
So if I want to keep using DSS, any suggestion for me to make its output stable?
Regards,
Tianyu
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
and also matrix checker option available with Pardiso API too. see ipatr(27). This functionality is not available for DSS API.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Tianyu,
Almost all that can be done via DSS interface can be implemented via PARDISO. Reordering step DSS_reorder correspondent to pardiso call with ido=11. But it is not quite good approach to call reordering only once for all matrix except symmetric-positive define, because good reordering step for all other matrix significantly depend on matrix value. Can you provide some pseudo-code of you algorithm that we can change to show how it can be done via PARDISO interface?
Thanks,
Alex
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here is my codes.
Thank you so much.
SUBROUTINE NFDSS_SOLVE(XDIFF,IU,JU,UM,nRow0,ITER,Idum) INCLUDE 'mkl_dss.f77' !INCLUDE 'mkl_pardiso.f77' INTEGER IU(*), JU(*), Idum(*), nRow0, nRow, ITER REAL UM(*), XDIFF(*) INTEGER tIU(:), tJU(:) DOUBLE PRECISION tUM(:), tXDIFF(:), tX(:) ALLOCATABLE tIU, tJU, tUM, tXDIFF, tX INTEGER nNonZeros, nNonZeros0 INTEGER*8 handle INTEGER error nNonZeros0=IU(nRow0+1)-1; nRow=nRow0-2; nNonZeros=nNonZeros0-2; ALLOCATE(tIU(nRow+1)) ALLOCATE(tXDIFF(nRow)) ALLOCATE(tX(nRow)) ALLOCATE(tJU(nNonZeros)) ALLOCATE(tUM(nNonZeros)) tIU(1:nRow+1)=IU(3:nRow+3)-2 tJU(1:nNonZeros)=JU(3:nNonZeros+2)-2 tUM(1:nNonZeros)=UM(3:nNonZeros+2) tXDIFF(1:nRow)=XDIFF(3:nRow+3) C--------------------------------------------------------------------------- C Initialize the solver C--------------------------------------------------------------------------- error = dss_create(handle, MKL_DSS_DEFAULTS+MKL_DSS_OOC_VARIABLE) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 C--------------------------------------------------------------------------- C--------------------------------------------------------------------------- C Define the non-zero structure of the matrix C--------------------------------------------------------------------------- error = dss_define_structure( handle, MKL_DSS_NON_SYMMETRIC, & tIU, nRow, nRow, tJU, nNonZeros ) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 C--------------------------------------------------------------------------- C--------------------------------------------------------------------------- C Reorder the matrix C--------------------------------------------------------------------------- IF (ITER.EQ.1) THEN error = dss_reorder( handle, MKL_DSS_GET_ORDER, Idum) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 ELSE error = dss_reorder( handle, MKL_DSS_MY_ORDER, Idum) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 ENDIF C--------------------------------------------------------------------------- C Factor the matrix C--------------------------------------------------------------------------- error = dss_factor_real( handle, MKL_DSS_DEFAULTS, tUM) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 C--------------------------------------------------------------------------- C Get the solution vector C--------------------------------------------------------------------------- error = dss_solve_real( handle, MKL_DSS_DEFAULTS, & tXDIFF, 1, tX) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 C--------------------------------------------------------------------------- C--------------------------------------------------------------------------- C Deallocate solver storage C--------------------------------------------------------------------------- error = dss_delete( handle, MKL_DSS_DEFAULTS ) IF (error .NE. MKL_DSS_SUCCESS ) GOTO 999 C--------------------------------------------------------------------------- GOTO 1999 999 WRITE(*,*) "Solver returned error code ", error 1999 XDIFF(3:nRow+2)= tX(1:nRow) DEALLOCATE(tIU,tJU,tUM,tXDIFF,tX) RETURN END
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page