Giter Site home page Giter Site logo

Comments (10)

oseikuffuor1 avatar oseikuffuor1 commented on June 13, 2024

@valonbb have you tried the HYPRE_ILU options? This is the replacement for EUCLID and I believe some of the options have support for zero diagonals. Alternatively, you can perturb your input matrix with small entries corresponding to the zero pivots, prior to calling EUCLID.

from hypre.

valonbb avatar valonbb commented on June 13, 2024

@oseikuffuor1 Initially that is what I have done, used HYPRE_ILU, rather than EUCLID, but I have found its behaviour to not be very robust with varying number of mpi processes. Replacing zero pivots with small entries sound like a good idea, what range of "small numbers" (relative to drop tol or min/max of matrix at hand) would you recommend to use to replace zero pivots?

Thanks a lot for all your help.

from hypre.

oseikuffuor1 avatar oseikuffuor1 commented on June 13, 2024

@valonbb something small, relative to the entries in the matrix should be good. droptol * min/max is fine if you know what min and max are. You can also pick something a few orders of magnitude smaller than your min (nonzero) diagonal entry.

Have you tried any reordering techniques (RCM, AMD, etc)? If you have access to the matrix info, you could also keep the zero (or small) diagonals close to the lower part of the matrix to increase the chances of nonzero pivots during the factorization.

from hypre.

valonbb avatar valonbb commented on June 13, 2024

@oseikuffuor1 Thank you for your suggestions. I have not actually tried using any reordering techniques, as it does not seem that EUCLID supports that explicitly, but sure that can be done before EUCLID is called.

you could also keep the zero (or small) diagonals close to the lower part of the matrix to increase the chances of nonzero pivots during the factorization.

Yes, I have access to matrix. Would this mean some further permutation of matrix to push smaller diagonal values on the lower part? I am not sure if I understood this correctly.

Thanks a lot for all your help, very much appreciated

from hypre.

oseikuffuor1 avatar oseikuffuor1 commented on June 13, 2024

@valonbb Yes, if you have access to the matrix, then permuting like you said could help. Keep in mind that depending on the structure of the matrix, that will also affect the fill-in pattern of the resulting factorization. I assume if you are using EUCLID then you are relying on ILU(k) routines? Also, did perturbing small entries not help?

from hypre.

valonbb avatar valonbb commented on June 13, 2024

@oseikuffuor1 Yes perturbing small entries actually help and it does seem to work well so far - thanks a lot for your suggestion and all your help. You are certainly right, this would depend on the structure of the matrix and so affecting fill-ins in the factorization. Yes, I am relying on ILUK as I think EUCLID supports ILUT in the sequential operation, only?

from hypre.

oseikuffuor1 avatar oseikuffuor1 commented on June 13, 2024

@valonbb Yes EUCLID's ILUT can only be used sequentially, unfortunately. Curious, are you using the block Jacobi option for EUCLID or the default parallel ILU option? I am still surprised that HYPRE_ILU does not work for your problem. Are you able to share what the structure of your system looks like?

from hypre.

valonbb avatar valonbb commented on June 13, 2024

Hi @oseikuffuor1,

Thanks a lot for your reply and apologise that it is taking this long from my side to reply.

I am mainly using EUCLID default option PILU, rather than block Jacobi. Although, the pivot is now fixed based on your suggestions – thanks a lot for your help, I find EUCLID to be relatively slow compare to ILU (sequentially).

I am indeed able to share matrix structure with you, please find attached the matrix in IJ format and matrix market format, hopefully this helps.
A.txt - matrix market format
IJ.A.txt - IJ format

For this problem I have used BiCGSTAB solver and ILU preconditioner along with these parameters:

HYPRE_BiCGSTABSetMaxIter(solver, 1000);
HYPRE_BiCGSTABSetTol(solver, 1,0e-10);

HYPRE_ILUSetMaxIter(precond, 1);
HYPRE_ILUSetTol(precond, 0.);
HYPRE_ILUSetType(precond, 31); /* I have also used other options here: 0, 1, 10, 11, 31 */
HYPRE_ILUSetDropThreshold(precond, 1.0e-3);

When I run this sequentially, that is using mpirun -np 1 – I get
number of iterations = 9
final residual norm = 1.98434e-11

Whereas using 2 processes – mpirun -np 2
number of iterations: 1000
final residual norm: 0.99994
Suggesting that solution has not converged. I find similar behaviour with changing the type of ilu and also varying number of processors. Also, increasing maximum number of iterations does not seem to help.

I very much appreciate your time to look after this - thanks a lot for all your help.

from hypre.

oseikuffuor1 avatar oseikuffuor1 commented on June 13, 2024

@valonbb thanks for the data. Can you also share the data for the two processor case? You can use hypre's IJMatrixPrint routine and it should print the matrix decomposed as you have it on the two processors (so two systems, one for each processor).

from hypre.

valonbb avatar valonbb commented on June 13, 2024

@oseikuffuor1 yes, please find below the matrix decomposed across processors:
IJ.out.A.00001.txt
IJ.out.A.00000.txt

Thanks a lot for your help.

from hypre.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.