[Coin-ipopt] MUMPS on MinGW?
Damien Hocking
damien at khubla.com
Wed Nov 28 02:07:36 EST 2007
Compiling MUMPS on MinGW can be a bit tricky, because with MinGW you're
mixing compiler types that aren't supported (so far, but the MUMPS devs
are very helpful). Having said that, here's the fixes for the tricky
bits. I just used Netlib blas for this example. I'll run through
everything to explain it, and I've attached a Makefile.inc that will
work. There are other minor changes to files in the MUMPS distribution
that you need to make.
The biggest pain is that although MinGW follows the *Nix conventions, it
defines the preprocessor symbol _WIN32 as well. This borks the case of
exported symbols in the MUMPS code for gfortran, so that symbol needs to
be undefined as part of the preprocessor options. I've attached a
Makefile.inc that has the right preprocessor definitions. I used the
sjlj versions of gcc4 for MinGW. There's no pthreads in the base MinGW
either, so you need to define WITHOUT_PTHREAD as well in the CDEFS.
Everything I changed in the makefile has #### at the start and I used
the gfortran sequential makefile as a starting point.
The MUMPS makefiles aren't quite consistent with their of CDEFS from
Makefile.inc, and the libseq code doesn't use it when it should. I've
attached a fixed makefile, called Makefile.libseq that you should use in
the libseq directory (save it as Makefile, not Makefile.libseq, like I
did 10 minutes ago when I tested it again...).
The PORD ordering code needs an include file change for the
"sys/times.h" problem. Change it to "sys/time.h" in PORD/include/space.h.
Finally, in dmumps_io_basic.c, there's some code that looks like this
towards the top:
#ifndef _WIN32
strcpy(name,dmumps_ooc_file_prefix);
fd=mkstemp(name);
if(fd<0){
ret_code=-99;
return ret_code;
}
else{
close(fd);
}
#else
sprintf(name,"%s_%d",dmumps_ooc_file_prefix,((dmumps_files+type)->dmumps_io_current_file_number)+1);
#endif
Comment out or remove all that, and insert the line
sprintf(name,"%s_%d",dmumps_ooc_file_prefix,((dmumps_files+type)->dmumps_io_current_file_number)+1);
MinGW doesn't have a mkstemp function (it tries to use that when you
undefine _WIN32), and it's not critical, it's just a log file.
That's all you need to get MUMPS going. Enjoy.
Damien
Andreas Waechter wrote:
> Hi John,
>
> I have never tried to compile MUMPS under MinGW, mainly because I didn't
> have a Fortran 90 compiler for Windows (someone recently told me that
> there is now a gfortran version for MinGW, which is I guess what you are
> using).
>
> There is a mailing list for MUMPS, where the developers usually very
> quickly help out. I assume that they are also quite interested to have
> MUMPS working on MinGW, so you might want to give it a try to contact
> them that way. There is a link to a "MUMPS Users' mailing list" on the
> MUMPS website, http://graal.ens-lyon.fr/MUMPS/.
>
> As for BLAS, you could just download the BLAS sources from netlib and
> compile them before compiling MUMPS. Even better, you could try to
> install the optimized Atlas implementation of BLAS
> (http://math-atlas.sourceforge.net/) which probably will give you much
> better performance than the netlib BLAS for large problems.
>
> If you find out how to compile Ipopt with MUMPS on MinGW, it would be
> great if you could write down your experience somewhere on the Ipopt
> wiki page, e.g., at the "Hints and Tricks" page
> https://projects.coin-or.org/Ipopt/wiki/HintsAndTricks
>
> Thanks,
>
> Andreas
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Makefile.libseq
Url: http://list.coin-or.org/pipermail/ipopt/attachments/20071128/ca460c38/attachment.pl
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Makefile.inc
Url: http://list.coin-or.org/pipermail/ipopt/attachments/20071128/ca460c38/attachment-0001.pl
More information about the Coin-ipopt
mailing list